Compare commits
No commits in common. "0.7.0" and "3" have entirely different histories.
17
.editorconfig
Normal 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
@ -0,0 +1,2 @@
|
||||
client/dist/
|
||||
client/lang/
|
1
.eslintrc.js
Normal file
@ -0,0 +1 @@
|
||||
module.exports = require('@silverstripe/eslint-config/.eslintrc');
|
7
.gitattributes
vendored
Normal 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
@ -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
|
16
.github/workflows/deploy-userhelp-docs.yml
vendored
Normal 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
@ -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
@ -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
@ -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
|
6
.gitignore
vendored
Normal file → Executable file
@ -1 +1,5 @@
|
||||
.DS_Store
|
||||
/vendor/*
|
||||
.sass-cache/*
|
||||
/node_modules/
|
||||
**/*.js.map
|
||||
**/*.css.map
|
||||
|
179
.sass-lint.yml
Normal 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
|
22
.travis.yml
@ -1,22 +0,0 @@
|
||||
# See https://github.com/silverstripe-labs/silverstripe-travis-support for setup details
|
||||
|
||||
language: php
|
||||
php:
|
||||
- 5.3
|
||||
|
||||
env:
|
||||
- DB=MYSQL CORE_RELEASE=3.1
|
||||
- DB=PGSQL CORE_RELEASE=master
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- php: 5.4
|
||||
env: DB=MYSQL CORE_RELEASE=master
|
||||
|
||||
before_script:
|
||||
- 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:
|
||||
- phpunit blog/tests/
|
@ -1,8 +1,9 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[silverstripe-blog.master]
|
||||
[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
@ -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
|
42
ChangeLog
@ -1,42 +0,0 @@
|
||||
ChangeLog
|
||||
|
||||
0.2.0
|
||||
|
||||
Features
|
||||
- Blogs can now be configured to use HTML instead of BBCode
|
||||
- Tags now follow the rel-tag microformat standard
|
||||
- Blog module is now translatable
|
||||
- The entries shown on the BlogHolder when not browsing by date/tag can now be restricted to only show entries that are younger than a user specified age
|
||||
- The RSS feed name can now be changed in the CMS
|
||||
- Added support for receiving trackback pings
|
||||
- Added SubscribeRSSWidget for linking directly to the blog RSS feed
|
||||
- Tag widget title is now editable
|
||||
- Added empty relationship statics so BlogEntry and BlogHolder can be decorated by a DataObjectDecorator
|
||||
- Use pagination summary, so a full list of pages isnt generated
|
||||
- Added Date variable to RSSWidget feed items, so Date can be used in template if wanted
|
||||
- Cast Title variable on RSSWidget feed items, so Title can have Text functions called in the template if wanted
|
||||
|
||||
Bugfixes
|
||||
- Removed deprecated calls to sapphire, and made other fixes to support sapphire 2.3.0
|
||||
- Don't use PHP short tags
|
||||
- Don't display $Content on a BlogHolder, as it isnt editable in the CMS
|
||||
- Prevent infinite loops when an RSSWidget on a blog points to itself
|
||||
- Fix URL segment generation
|
||||
- RSS feed is now sorted by date, newest first
|
||||
- Fixed pagination
|
||||
- Fixed summaries on BlogHolder
|
||||
- Fixed issues with display by month when blog post is on last month of the day
|
||||
- BlogEntry::Tags() was renamed to TagsCollection() to prevent conflicts with the database fields called Tags
|
||||
- Fixed invalid use of single quotes in BlogEntryForm HTML
|
||||
- Fixed extra <p> tags around blog content
|
||||
- Default parent needs to be a string instead of an array
|
||||
- Fixed escaping in BlogHolder
|
||||
- Use themedCSS instead of hardlinking paths
|
||||
- Fixed rss feed caching
|
||||
- Fixed archive widget showing months and years for unpublished posts
|
||||
- SetDate doesn't need to be called, as the date is automatically set
|
||||
|
||||
|
||||
0.1
|
||||
|
||||
Initial release
|
17
LICENSE
@ -1,17 +0,0 @@
|
||||
Copyright (c) 2013, SilverStripe Limited - www.silverstripe.com
|
||||
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.
|
||||
* Neither the name of SilverStripe nor the names of its contributors may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
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 OWNER 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.
|
120
README.md
Normal file → Executable file
@ -1,112 +1,40 @@
|
||||
# Blog Module
|
||||
# Silverstripe Blog Module
|
||||
|
||||
[![Build Status](https://secure.travis-ci.org/silverstripe/silverstripe-blog.png?branch=master)](http://travis-ci.org/silverstripe/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/)
|
||||
|
||||
## Introduction
|
||||
## Documentation
|
||||
|
||||
The blog module allows you to post blogs on your SilverStripe. It includes the ability to post blogs using a site front-end form. Blogs are summarised on the blog holder page type, with more detail viewable when a specific blog is clicked.
|
||||
|
||||
## Maintainer Contact ##
|
||||
|
||||
* Saophalkun Ponlu (phalkunz at silverstripe dot com)
|
||||
* Carlos Barberis (carlos at silverstripe dot com)
|
||||
* [User guide](docs/en/userguide/index.md)
|
||||
* [Developer documentation](docs/en/index.md)
|
||||
|
||||
## Requirements
|
||||
|
||||
* Silverstripe 3.1
|
||||
* silverstripe-widgets module
|
||||
* 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+
|
||||
|
||||
## Feature Overview
|
||||
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).
|
||||
|
||||
* Front-end blog post form
|
||||
* Posts allow bbcode
|
||||
* RSS feed for blog and also feeds for comments on posts
|
||||
* Easily customizable
|
||||
* Tag cloud widget
|
||||
* Archive widget
|
||||
* Blog management widget
|
||||
* RSS widget (will likely move in future)
|
||||
### Suggested Modules
|
||||
|
||||
## Configuration Options
|
||||
* Silverstripe Widgets Module
|
||||
* Silverstripe Comments Module
|
||||
|
||||
### Use WYSIWYG editing instead of bbcode
|
||||
## Installation
|
||||
|
||||
Out of the box the blog module uses bbcode, just like the forum module. If you want to go back to using the standard page editing toolbar you need to add the following code to your mysite/_config.php file
|
||||
```
|
||||
composer require silverstripe/blog
|
||||
```
|
||||
|
||||
:::php
|
||||
BlogEntry::allow_wysiwyg_editing();
|
||||
## Upgrading
|
||||
|
||||
### Upgrading from 2.x to 3.x
|
||||
|
||||
## Page types
|
||||
Aside from the framework and CMS upgrades required the blog module should not require anything extra to be completed.
|
||||
|
||||
We have chosen to go with the following page types to include with the blog module:
|
||||
### Upgrading legacy blog to 2.x
|
||||
|
||||
* BlogHolder: The BlogHolder shows BlogEntrys, and provides a way to search etc.It would also contain methods to post new blogs.
|
||||
|
||||
* BlogEntry: This is simply an entry/post for the blog.
|
||||
|
||||
|
||||
## Simple form for adding a post
|
||||
|
||||
There is a blog management widget, that includes a link "Post new blog entry", which takes the user to [site/CurrentBlogHolder]/post (this is a good url to bookmark if you will be using it to blog regularly). This shows a blog entry form, which requires a subject and some content at the least. Clicking "Post blog entry" takes the user back to the blog. A login form will show if the user is not logged in. The entered author name is stored in a cookie. Initially the shown name will be the user's name.
|
||||
|
||||
#### BBcode support
|
||||
|
||||
* BBCode can be entered into the form.
|
||||
|
||||
* A bbcode tags help box shows when the "BBCode help" link is clicked. Javascript is required for this to work.
|
||||
|
||||
See [:PEAR:BBCodeParser](/PEAR/BBCodeParser) for more details.
|
||||
|
||||
#### Modifying the blog entry form
|
||||
|
||||
You may want to add or remove certain fields from the blog entry form. This can be done in **BlogHolder.php**. You will need to modify the $fields FieldSet object in the BlogEntryForm function. [tutorial 3](tutorial/3-forms#creating_the_form) shows you how to do this.
|
||||
|
||||
You will likely need to play around with the form and associated css to get the form looking how you want it.
|
||||
|
||||
## View Archived Blogs
|
||||
|
||||
Blog archives can be viewed by year/month by appending the year, followed by a forward slash, then the numerical month, to the end of the blogholder URL. Alternately, just the year can be appended to view entries for that year.
|
||||
|
||||
for example: mysite/blog/2007/6 would show blog entries for June 2007
|
||||
|
||||
or: mysite/blog/2007 would show blog entries for 2007
|
||||
|
||||
## Comments and Spam Protection
|
||||
|
||||
See [:pagecomment](/pagecomment) for creating Askimet-protected comments for every page.
|
||||
|
||||
## Widgets
|
||||
|
||||
The module comes with a couple of default widgets, which rely on the "silverstripe/widgets"
|
||||
module being installed. Since widgets are based on database records and relations
|
||||
to pages, they need to be enabled through an `Extension` class in your `config.yml`:
|
||||
|
||||
:::yml
|
||||
BlogTree:
|
||||
extensions:
|
||||
- WidgetPageExtension
|
||||
BlogEntry:
|
||||
extensions:
|
||||
- WidgetPageExtension
|
||||
|
||||
Alternatively, you can simply enable the extension on your `Page` records
|
||||
to have it available globally.
|
||||
|
||||
## Working with the theme
|
||||
|
||||
The blog comes set up to use the `\themes\blackcandy_blog\` directory by default.
|
||||
|
||||
* See [:themes](/themes)
|
||||
|
||||
## Contributing
|
||||
|
||||
### Translations
|
||||
|
||||
Translations of the natural language strings are managed through a
|
||||
third party translation interface, transifex.com.
|
||||
Newly added strings will be periodically uploaded there for translation,
|
||||
and any new translations will be merged back to the project source code.
|
||||
|
||||
Please use https://www.transifex.com/projects/p/silverstripe-blog/ to contribute translations,
|
||||
rather than sending pull requests with YAML files.
|
||||
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.
|
||||
|
1
_config.php
Normal file → Executable file
@ -0,0 +1 @@
|
||||
<?php
|
17
_config/comments.yml
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
Name: blogcommentsconfig
|
||||
Only:
|
||||
moduleexists: comments
|
||||
---
|
||||
SilverStripe\Comments\Model\Comment:
|
||||
extensions:
|
||||
- SilverStripe\Blog\Model\BlogCommentExtension
|
||||
|
||||
---
|
||||
Name: blogcommentnotifications
|
||||
Only:
|
||||
moduleexists: 'comment-notifications'
|
||||
---
|
||||
SilverStripe\Blog\Model\BlogPost:
|
||||
extensions:
|
||||
- SilverStripe\Blog\Model\BlogPostNotifications
|
16
_config/config.yml
Normal file → Executable file
@ -1,3 +1,15 @@
|
||||
LeftAndMain:
|
||||
---
|
||||
Name: blogconfig
|
||||
---
|
||||
SilverStripe\Security\Member:
|
||||
extensions:
|
||||
- BlogLeftMainExtension
|
||||
- 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
@ -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
|
@ -1,6 +0,0 @@
|
||||
---
|
||||
Name: metaweblogroutes
|
||||
---
|
||||
Director:
|
||||
rules:
|
||||
'metaweblog': 'MetaWeblogController'
|
29
behat.yml
Normal 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
@ -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
@ -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
@ -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
After Width: | Height: | Size: 550 B |
142
client/src/bundles/cms.js
Normal 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()
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
16
client/src/bundles/gridfieldaddbydbfield.js
Normal 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
@ -0,0 +1,2 @@
|
||||
import 'bundles/cms';
|
||||
import 'bundles/gridfieldaddbydbfield';
|
2
client/src/main.scss
Normal file
@ -0,0 +1,2 @@
|
||||
@import "styles/blog";
|
||||
@import "styles/cms";
|
76
client/src/styles/blog.scss
Normal 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
@ -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
@ -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).
|
@ -1,282 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* An individual blog entry page type.
|
||||
*
|
||||
* @package blog
|
||||
*/
|
||||
class BlogEntry extends Page {
|
||||
|
||||
private static $db = array(
|
||||
"Date" => "SS_Datetime",
|
||||
"Author" => "Text",
|
||||
"Tags" => "Text"
|
||||
);
|
||||
|
||||
private static $default_parent = 'BlogHolder';
|
||||
|
||||
private static $can_be_root = false;
|
||||
|
||||
private static $icon = "blog/images/blogpage-file.png";
|
||||
|
||||
private static $description = "An individual blog entry";
|
||||
|
||||
private static $singular_name = 'Blog Entry Page';
|
||||
|
||||
private static $plural_name = 'Blog Entry Pages';
|
||||
|
||||
private static $has_one = array();
|
||||
|
||||
private static $has_many = array();
|
||||
|
||||
private static $many_many = array();
|
||||
|
||||
private static $belongs_many_many = array();
|
||||
|
||||
private static $defaults = array(
|
||||
"ProvideComments" => true,
|
||||
'ShowInMenus' => false
|
||||
);
|
||||
|
||||
/**
|
||||
* Is WYSIWYG editing allowed?
|
||||
* @var boolean
|
||||
*/
|
||||
static $allow_wysiwyg_editing = true;
|
||||
|
||||
/**
|
||||
* Overload so that the default date is today.
|
||||
*/
|
||||
public function populateDefaults(){
|
||||
parent::populateDefaults();
|
||||
|
||||
$this->setField('Date', date('Y-m-d H:i:s', strtotime('now')));
|
||||
}
|
||||
|
||||
function getCMSFields() {
|
||||
Requirements::javascript('blog/javascript/bbcodehelp.js');
|
||||
Requirements::themedCSS('bbcodehelp');
|
||||
|
||||
$firstName = Member::currentUser() ? Member::currentUser()->FirstName : '';
|
||||
$codeparser = new BBCodeParser();
|
||||
|
||||
SiteTree::disableCMSFieldsExtensions();
|
||||
$fields = parent::getCMSFields();
|
||||
SiteTree::enableCMSFieldsExtensions();
|
||||
|
||||
if(!self::$allow_wysiwyg_editing) {
|
||||
$fields->removeFieldFromTab("Root.Main","Content");
|
||||
$fields->addFieldToTab("Root.Main", new TextareaField("Content", _t("BlogEntry.CN", "Content"), 20));
|
||||
}
|
||||
|
||||
$fields->addFieldToTab("Root.Main", $dateField = new DatetimeField("Date", _t("BlogEntry.DT", "Date")),"Content");
|
||||
$dateField->getDateField()->setConfig('showcalendar', true);
|
||||
$dateField->getTimeField()->setConfig('timeformat', 'H:m:s');
|
||||
$fields->addFieldToTab("Root.Main", new TextField("Author", _t("BlogEntry.AU", "Author"), $firstName),"Content");
|
||||
|
||||
if(!self::$allow_wysiwyg_editing) {
|
||||
$fields->addFieldToTab("Root.Main", new LiteralField("BBCodeHelper", "<div id='BBCode' class='field'>" .
|
||||
"<a id=\"BBCodeHint\" target='new'>" . _t("BlogEntry.BBH", "BBCode help") . "</a>" .
|
||||
"<div id='BBTagsHolder' style='display:none;'>".$codeparser->useable_tagsHTML()."</div></div>"));
|
||||
}
|
||||
|
||||
$fields->addFieldToTab("Root.Main", new TextField("Tags", _t("BlogEntry.TS", "Tags (comma sep.)")),"Content");
|
||||
|
||||
$this->extend('updateCMSFields', $fields);
|
||||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Safely split and parse all distinct tags assigned to this BlogEntry
|
||||
*
|
||||
* @return array Associative array of lowercase tag to native case tags
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the tags added to this blog entry
|
||||
*
|
||||
* @return ArrayList List of ArrayData with Tag, Link, and URLTag keys
|
||||
*/
|
||||
public function TagsCollection() {
|
||||
|
||||
$tags = $this->TagNames();
|
||||
$output = new ArrayList();
|
||||
|
||||
$link = ($parent = $this->getParent()) ? $parent->Link('tag') : '';
|
||||
foreach($tags as $tag => $tagLabel) {
|
||||
$urlKey = urlencode($tag);
|
||||
$output->push(new ArrayData(array(
|
||||
'Tag' => $tagLabel,
|
||||
'Link' => Controller::join_links($link, $urlKey),
|
||||
'URLTag' => $urlKey
|
||||
)));
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function Content() {
|
||||
if(self::$allow_wysiwyg_editing) {
|
||||
return $this->getField('Content');
|
||||
} else {
|
||||
$parser = new BBCodeParser($this->Content);
|
||||
$content = new HTMLText('Content');
|
||||
$content->value = $parser->parse();
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* To be used by RSSFeed. If RSSFeed uses Content field, it doesn't pull in correctly parsed content.
|
||||
*/
|
||||
function RSSContent() {
|
||||
return $this->Content();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a bbcode parsed summary of the blog entry
|
||||
* @deprecated
|
||||
*/
|
||||
function ParagraphSummary(){
|
||||
user_error("BlogEntry::ParagraphSummary() is deprecated; use BlogEntry::Content()", E_USER_NOTICE);
|
||||
|
||||
$val = $this->Content();
|
||||
$content = $val;
|
||||
|
||||
if(!($content instanceof HTMLText)) {
|
||||
$content = new HTMLText('Content');
|
||||
$content->value = $val;
|
||||
}
|
||||
|
||||
return $content->FirstParagraph('html');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the bbcode parsed content
|
||||
* @deprecated
|
||||
*/
|
||||
function ParsedContent() {
|
||||
user_error("BlogEntry::ParsedContent() is deprecated; use BlogEntry::Content()", E_USER_NOTICE);
|
||||
return $this->Content();
|
||||
}
|
||||
|
||||
/**
|
||||
* Link for editing this blog entry
|
||||
*/
|
||||
function EditURL() {
|
||||
return ($this->getParent()) ? $this->getParent()->Link('post') . '/' . $this->ID . '/' : false;
|
||||
}
|
||||
|
||||
function IsOwner() {
|
||||
if(method_exists($this->Parent(), 'IsOwner')) {
|
||||
return $this->Parent()->IsOwner();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this to enable WYSIWYG editing on your blog entries.
|
||||
* By default the blog uses BBCode
|
||||
*/
|
||||
static function allow_wysiwyg_editing() {
|
||||
self::$allow_wysiwyg_editing = true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the previous blog entry from this section of blog pages.
|
||||
*
|
||||
* @return BlogEntry
|
||||
*/
|
||||
function PreviousBlogEntry() {
|
||||
return DataObject::get_one(
|
||||
'BlogEntry',
|
||||
"\"SiteTree\".\"ParentID\" = '$this->ParentID' AND \"BlogEntry\".\"Date\" < '$this->Date'",
|
||||
true,
|
||||
'Date DESC'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the next blog entry from this section of blog pages.
|
||||
*
|
||||
* @return BlogEntry
|
||||
*/
|
||||
function NextBlogEntry() {
|
||||
return DataObject::get_one(
|
||||
'BlogEntry',
|
||||
"\"SiteTree\".\"ParentID\" = '$this->ParentID' AND \"BlogEntry\".\"Date\" > '$this->Date'",
|
||||
true,
|
||||
'Date ASC'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the blog holder of this entry
|
||||
*
|
||||
* @return BlogHolder
|
||||
*/
|
||||
function getBlogHolder() {
|
||||
$holder = null;
|
||||
if($this->ParentID && $this->Parent()->ClassName == 'BlogHolder') {
|
||||
$holder = $this->Parent();
|
||||
}
|
||||
|
||||
return $holder;
|
||||
}
|
||||
}
|
||||
|
||||
class BlogEntry_Controller extends Page_Controller {
|
||||
|
||||
private static $allowed_actions = array(
|
||||
'index',
|
||||
'unpublishPost',
|
||||
'PageComments',
|
||||
'SearchForm'
|
||||
);
|
||||
|
||||
function init() {
|
||||
parent::init();
|
||||
|
||||
Requirements::themedCSS("blog","blog");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a link to unpublish the blog entry
|
||||
*/
|
||||
function unpublishPost() {
|
||||
if(!$this->IsOwner()) {
|
||||
Security::permissionFailure(
|
||||
$this,
|
||||
'Unpublishing blogs is an administrator task. Please log in.'
|
||||
);
|
||||
} else {
|
||||
$SQL_id = (int) $this->ID;
|
||||
|
||||
$page = DataObject::get_by_id('SiteTree', $SQL_id);
|
||||
$page->deleteFromStage('Live');
|
||||
$page->flushCache();
|
||||
|
||||
$this->redirect($this->getParent()->Link());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Temporary workaround for compatibility with 'comments' module
|
||||
* (has been extracted from sapphire/trunk in 12/2010).
|
||||
*
|
||||
* @return Form
|
||||
*/
|
||||
function PageComments() {
|
||||
if($this->hasMethod('CommentsForm')) return $this->CommentsForm();
|
||||
else if(method_exists('Page_Controller', 'PageComments')) return parent::PageComments();
|
||||
}
|
||||
|
||||
}
|
@ -1,321 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package blog
|
||||
*/
|
||||
|
||||
/**
|
||||
* Blog holder to display summarised blog entries.
|
||||
*
|
||||
* A blog holder is the leaf end of a BlogTree, but can also be used standalone in simpler circumstances.
|
||||
* BlogHolders can only hold BlogEntries, BlogTrees can only hold BlogTrees and BlogHolders
|
||||
* BlogHolders have a form on them for easy posting, and an owner that can post to them, BlogTrees don't
|
||||
*/
|
||||
class BlogHolder extends BlogTree implements PermissionProvider {
|
||||
|
||||
private static $icon = "blog/images/blogholder-file.png";
|
||||
|
||||
private static $description = "Displays listings of blog entries";
|
||||
|
||||
private static $singular_name = 'Blog Holder Page';
|
||||
|
||||
private static $plural_name = 'Blog Holder Pages';
|
||||
|
||||
private static $db = array(
|
||||
'AllowCustomAuthors' => 'Boolean',
|
||||
'ShowFullEntry' => 'Boolean',
|
||||
);
|
||||
|
||||
private static $has_one = array(
|
||||
'Owner' => 'Member',
|
||||
);
|
||||
|
||||
private static $allowed_children = array(
|
||||
'BlogEntry'
|
||||
);
|
||||
|
||||
function getCMSFields() {
|
||||
$blogOwners = $this->blogOwners();
|
||||
|
||||
SiteTree::disableCMSFieldsExtensions();
|
||||
$fields = parent::getCMSFields();
|
||||
SiteTree::enableCMSFieldsExtensions();
|
||||
|
||||
$fields->addFieldToTab(
|
||||
'Root.Main',
|
||||
DropdownField::create('OwnerID', 'Blog owner', $blogOwners->map('ID', 'Name')->toArray())
|
||||
->setEmptyString('(None)')
|
||||
->setHasEmptyDefault(true),
|
||||
"Content"
|
||||
);
|
||||
$fields->addFieldToTab('Root.Main', new CheckboxField('AllowCustomAuthors', 'Allow non-admins to have a custom author field'), "Content");
|
||||
$fields->addFieldToTab(
|
||||
"Root.Main",
|
||||
CheckboxField::create("ShowFullEntry", "Show Full Entry")
|
||||
->setDescription('Show full content in overviews rather than summary'),
|
||||
"Content"
|
||||
);
|
||||
|
||||
$this->extend('updateCMSFields', $fields);
|
||||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get members who have BLOGMANAGEMENT and ADMIN permission
|
||||
*/
|
||||
|
||||
function blogOwners($sort = array('FirstName'=>'ASC','Surname'=>'ASC'), $direction = null) {
|
||||
|
||||
$members = Permission::get_members_by_permission(array('ADMIN','BLOGMANAGEMENT'));
|
||||
$members->sort($sort);
|
||||
|
||||
$this->extend('extendBlogOwners', $members);
|
||||
|
||||
return $members;
|
||||
}
|
||||
|
||||
public function BlogHolderIDs() {
|
||||
return array( $this->ID );
|
||||
}
|
||||
|
||||
/*
|
||||
* @todo: These next few functions don't really belong in the model. Can we remove them?
|
||||
*/
|
||||
|
||||
/**
|
||||
* Only display the blog entries that have the specified tag
|
||||
*/
|
||||
function ShowTag() {
|
||||
if($this->request->latestParam('Action') == 'tag') {
|
||||
return Convert::raw2xml(Director::urlParam('ID'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if url has "/post"
|
||||
*/
|
||||
function isPost() {
|
||||
return $this->request->latestParam('Action') == 'post';
|
||||
}
|
||||
|
||||
/**
|
||||
* Link for creating a new blog entry
|
||||
*/
|
||||
function postURL(){
|
||||
return $this->Link('post');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the current user is an admin, or is the owner of this blog
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
function IsOwner() {
|
||||
return (Permission::check('BLOGMANAGEMENT') || Permission::check('ADMIN'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create default blog setup
|
||||
*/
|
||||
function requireDefaultRecords() {
|
||||
parent::requireDefaultRecords();
|
||||
|
||||
// Skip creation of default records
|
||||
if(!self::config()->create_default_pages) return;
|
||||
|
||||
$blogHolder = DataObject::get_one('BlogHolder');
|
||||
//TODO: This does not check for whether this blogholder is an orphan or not
|
||||
if(!$blogHolder) {
|
||||
$blogholder = new BlogHolder();
|
||||
$blogholder->Title = "Blog";
|
||||
$blogholder->URLSegment = "blog";
|
||||
$blogholder->Status = "Published";
|
||||
$blogholder->write();
|
||||
$blogholder->publish("Stage", "Live");
|
||||
|
||||
// Add default widgets to first found WidgetArea relationship
|
||||
if(class_exists('WidgetArea')) {
|
||||
foreach($this->has_one() as $name => $class) {
|
||||
if($class == 'WidgetArea' || is_subclass_of($class, 'WidgetArea')) {
|
||||
$relationName = "{$name}ID";
|
||||
$widgetarea = new WidgetArea();
|
||||
$widgetarea->write();
|
||||
|
||||
$blogholder->$relationName = $widgetarea->ID;
|
||||
$blogholder->write();
|
||||
$blogholder->publish("Stage", "Live");
|
||||
|
||||
$managementwidget = new BlogManagementWidget();
|
||||
$managementwidget->ParentID = $widgetarea->ID;
|
||||
$managementwidget->write();
|
||||
|
||||
$tagcloudwidget = new TagCloudWidget();
|
||||
$tagcloudwidget->ParentID = $widgetarea->ID;
|
||||
$tagcloudwidget->write();
|
||||
|
||||
$archivewidget = new ArchiveWidget();
|
||||
$archivewidget->ParentID = $widgetarea->ID;
|
||||
$archivewidget->write();
|
||||
|
||||
$widgetarea->write();
|
||||
|
||||
break; // only apply to one
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$blog = new BlogEntry();
|
||||
$blog->Title = _t('BlogHolder.SUCTITLE', "SilverStripe blog module successfully installed");
|
||||
$blog->URLSegment = 'sample-blog-entry';
|
||||
$blog->Tags = _t('BlogHolder.SUCTAGS',"silverstripe, blog");
|
||||
$blog->Content = _t('BlogHolder.SUCCONTENT',"<p>Congratulations, the SilverStripe blog module has been successfully installed. This blog entry can be safely deleted. You can configure aspects of your blog in <a href=\"admin\">the CMS</a>.</p>");
|
||||
$blog->Status = "Published";
|
||||
$blog->ParentID = $blogholder->ID;
|
||||
$blog->write();
|
||||
$blog->publish("Stage", "Live");
|
||||
|
||||
DB::alteration_message("Blog page created","created");
|
||||
}
|
||||
}
|
||||
|
||||
function providePermissions() {
|
||||
return array("BLOGMANAGEMENT" => "Blog management");
|
||||
}
|
||||
}
|
||||
|
||||
class BlogHolder_Controller extends BlogTree_Controller {
|
||||
|
||||
private static $allowed_actions = array(
|
||||
'index',
|
||||
'tag',
|
||||
'date',
|
||||
'metaweblog',
|
||||
'postblog' => 'BLOGMANAGEMENT',
|
||||
'post',
|
||||
'BlogEntryForm' => 'BLOGMANAGEMENT',
|
||||
);
|
||||
|
||||
function init() {
|
||||
parent::init();
|
||||
Requirements::themedCSS("bbcodehelp");
|
||||
}
|
||||
|
||||
/**
|
||||
* Return list of usable tags for help
|
||||
*/
|
||||
function BBTags() {
|
||||
return BBCodeParser::usable_tags();
|
||||
}
|
||||
|
||||
/**
|
||||
* Post a new blog entry
|
||||
*/
|
||||
function post(){
|
||||
if(!Permission::check('BLOGMANAGEMENT')) return Security::permissionFailure();
|
||||
$page = $this->customise(array(
|
||||
'Content' => false,
|
||||
'Form' => $this->BlogEntryForm()
|
||||
));
|
||||
|
||||
return $page->renderWith('Page');
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple form for creating blog entries
|
||||
*/
|
||||
function BlogEntryForm() {
|
||||
if(!Permission::check('BLOGMANAGEMENT')) return Security::permissionFailure();
|
||||
|
||||
|
||||
$id = 0;
|
||||
if($this->request->latestParam('ID')) {
|
||||
$id = (int) $this->request->latestParam('ID');
|
||||
}
|
||||
|
||||
$codeparser = new BBCodeParser();
|
||||
$membername = Member::currentUser() ? Member::currentUser()->getName() : "";
|
||||
|
||||
if(BlogEntry::$allow_wysiwyg_editing) {
|
||||
$contentfield = new HtmlEditorField("BlogPost", _t("BlogEntry.CN"));
|
||||
} else {
|
||||
$contentfield = new CompositeField(
|
||||
new LiteralField("BBCodeHelper","<a id=\"BBCodeHint\" target='new'>"._t("BlogEntry.BBH")."</a><div class='clear'><!-- --></div>" ),
|
||||
new TextareaField("BlogPost", _t("BlogEntry.CN"),20), // This is called BlogPost as the id #Content is generally used already
|
||||
new LiteralField("BBCodeTags","<div id=\"BBTagsHolder\">".$codeparser->useable_tagsHTML()."</div>")
|
||||
);
|
||||
}
|
||||
if(class_exists('TagField')) {
|
||||
$tagfield = new TagField('Tags', null, null, 'BlogEntry');
|
||||
$tagfield->setSeparator(', ');
|
||||
} else {
|
||||
$tagfield = new TextField('Tags');
|
||||
}
|
||||
|
||||
$field = 'TextField';
|
||||
if(!$this->AllowCustomAuthors && !Permission::check('ADMIN')) {
|
||||
$field = 'ReadonlyField';
|
||||
}
|
||||
$fields = new FieldList(
|
||||
new HiddenField("ID", "ID"),
|
||||
new TextField("Title", _t('BlogHolder.SJ', "Subject")),
|
||||
new $field("Author", _t('BlogEntry.AU'), $membername),
|
||||
$contentfield,
|
||||
$tagfield,
|
||||
new LiteralField("Tagsnote"," <label id='tagsnote'>"._t('BlogHolder.TE', "For example: sport, personal, science fiction")."<br/>" .
|
||||
_t('BlogHolder.SPUC', "Please separate tags using commas.")."</label>")
|
||||
);
|
||||
|
||||
$submitAction = new FormAction('postblog', _t('BlogHolder.POST', 'Post blog entry'));
|
||||
|
||||
$actions = new FieldList($submitAction);
|
||||
$validator = new RequiredFields('Title','BlogPost');
|
||||
|
||||
$form = new Form($this, 'BlogEntryForm',$fields, $actions,$validator);
|
||||
|
||||
if($id != 0) {
|
||||
$entry = DataObject::get_by_id('BlogEntry', $id);
|
||||
if($entry->IsOwner()) {
|
||||
$form->loadDataFrom($entry);
|
||||
$form->Fields()->fieldByName('BlogPost')->setValue($entry->Content);
|
||||
|
||||
}
|
||||
} else {
|
||||
$form->loadDataFrom(array("Author" => Cookie::get("BlogHolder_Name")));
|
||||
}
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
function postblog($data, $form) {
|
||||
if(!Permission::check('BLOGMANAGEMENT')) return Security::permissionFailure();
|
||||
|
||||
Cookie::set("BlogHolder_Name", $data['Author']);
|
||||
$blogentry = false;
|
||||
|
||||
if(isset($data['ID']) && $data['ID']) {
|
||||
$blogentry = DataObject::get_by_id("BlogEntry", $data['ID']);
|
||||
if(!$blogentry->IsOwner()) {
|
||||
unset($blogentry);
|
||||
}
|
||||
}
|
||||
|
||||
if(!$blogentry) {
|
||||
$blogentry = new BlogEntry();
|
||||
}
|
||||
|
||||
$form->saveInto($blogentry);
|
||||
$blogentry->ParentID = $this->ID;
|
||||
|
||||
$blogentry->Content = str_replace("\r\n", "\n", $form->Fields()->fieldByName('BlogPost')->dataValue());
|
||||
|
||||
if(Object::has_extension($this->ClassName, 'Translatable')) {
|
||||
$blogentry->Locale = $this->Locale;
|
||||
}
|
||||
|
||||
$blogentry->writeToStage("Stage");
|
||||
$blogentry->publish("Stage", "Live");
|
||||
|
||||
$this->redirect($this->Link());
|
||||
}
|
||||
}
|
@ -1,39 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Influences the page list behaviour of blog entries in the CMS.
|
||||
* Adds author and "post date" fields.
|
||||
*/
|
||||
class BlogLeftMainExtension extends Extension {
|
||||
function updateListView($listView) {
|
||||
$parentId = $listView->getController()->getRequest()->requestVar('ParentID');
|
||||
$parent = ($parentId) ? Page::get()->byId($parentId) : new Page();
|
||||
|
||||
// Only apply logic for this page type
|
||||
if($parent && $parent instanceof BlogHolder) {
|
||||
$gridField = $listView->Fields()->dataFieldByName('Page');
|
||||
if($gridField) {
|
||||
// Sort by post date
|
||||
$list = $gridField->getList();
|
||||
$list = $list->leftJoin('BlogEntry', '"BlogEntry"."ID" = "SiteTree"."ID"');
|
||||
$gridField->setList($list->sort('Date', 'DESC'));
|
||||
|
||||
// Change columns
|
||||
$cols = $gridField->getConfig()->getComponentByType('GridFieldDataColumns');
|
||||
if($cols) {
|
||||
$fields = $cols->getDisplayFields($gridField);
|
||||
$castings = $cols->getFieldCasting($gridField);
|
||||
|
||||
// Add author to columns
|
||||
$fields['Author'] = _t("BlogEntry.AU", "Author");
|
||||
// Add post date and remove duplicate "created" date
|
||||
$fields['Date'] = _t("BlogEntry.DT", "Date");
|
||||
$castings['Date'] = 'SS_Datetime->Ago';
|
||||
if(isset($fields['Created'])) unset($fields['Created']);
|
||||
|
||||
$cols->setDisplayFields($fields);
|
||||
$cols->setFieldCasting($castings);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,404 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package blog
|
||||
*/
|
||||
|
||||
/**
|
||||
* Blog tree is a way to group Blogs. It allows a tree of "Blog Holders".
|
||||
* Viewing branch nodes shows all blog entries from all blog holder children
|
||||
*/
|
||||
|
||||
class BlogTree extends Page {
|
||||
|
||||
private static $icon = "blog/images/blogtree-file.png";
|
||||
|
||||
private static $description = "A grouping of blogs";
|
||||
|
||||
private static $singular_name = 'Blog Tree Page';
|
||||
|
||||
private static $plural_name = 'Blog Tree Pages';
|
||||
|
||||
// Default number of blog entries to show
|
||||
static $default_entries_limit = 10;
|
||||
|
||||
private static $db = array(
|
||||
'Name' => 'Varchar(255)',
|
||||
'LandingPageFreshness' => 'Varchar',
|
||||
);
|
||||
|
||||
private static $defaults = array(
|
||||
);
|
||||
|
||||
private static $has_one = array();
|
||||
|
||||
private static $has_many = array();
|
||||
|
||||
private static $allowed_children = array(
|
||||
'BlogTree', 'BlogHolder'
|
||||
);
|
||||
|
||||
/*
|
||||
* Finds the BlogTree object most related to the current page.
|
||||
* - If this page is a BlogTree, use that
|
||||
* - If this page is a BlogEntry, use the parent Holder
|
||||
* - Otherwise, try and find a 'top-level' BlogTree
|
||||
*
|
||||
* @param $page allows you to force a specific page, otherwise,
|
||||
* uses current
|
||||
* @return BlogTree
|
||||
*/
|
||||
static function current($page = null) {
|
||||
|
||||
if (!$page && Controller::has_curr()) {
|
||||
$controller = Controller::curr();
|
||||
if ($controller->hasMethod('data')) {
|
||||
$page = $controller->data();
|
||||
}
|
||||
}
|
||||
|
||||
if ($page) {
|
||||
// If we _are_ a BlogTree, use us
|
||||
if ($page instanceof BlogTree) return $page;
|
||||
|
||||
// If page is a virtual page use that
|
||||
if($page instanceof VirtualPage && $page->CopyContentFrom() instanceof BlogTree) return $page;
|
||||
|
||||
// Or, if we a a BlogEntry underneath a BlogTree, use our parent
|
||||
if($page->is_a("BlogEntry")) {
|
||||
$parent = $page->getParent();
|
||||
if($parent instanceof BlogTree) return $parent;
|
||||
}
|
||||
}
|
||||
|
||||
// Try to find a top-level BlogTree
|
||||
$top = DataObject::get_one('BlogTree', "\"ParentID\" = '0'");
|
||||
if($top) return $top;
|
||||
|
||||
// Try to find any BlogTree that is not inside another BlogTree
|
||||
if($blogTrees=DataObject::get('BlogTree')) foreach($blogTrees as $tree) {
|
||||
if(!($tree->getParent() instanceof BlogTree)) return $tree;
|
||||
}
|
||||
|
||||
// This shouldn't be possible, but assuming the above fails, just return anything you can get
|
||||
return $blogTrees->first();
|
||||
}
|
||||
|
||||
/* ----------- ACCESSOR OVERRIDES -------------- */
|
||||
|
||||
public function getLandingPageFreshness() {
|
||||
$freshness = $this->getField('LandingPageFreshness');
|
||||
// If we want to inherit freshness, try that first
|
||||
if ($freshness == "INHERIT" && $this->getParent()) $freshness = $this->getParent()->LandingPageFreshness;
|
||||
// If we don't have a parent, or the inherited result was still inherit, use default
|
||||
if ($freshness == "INHERIT") $freshness = '';
|
||||
return $freshness;
|
||||
}
|
||||
|
||||
/* ----------- CMS CONTROL -------------- */
|
||||
|
||||
function getSettingsFields() {
|
||||
$fields = parent::getSettingsFields();
|
||||
|
||||
$fields->addFieldToTab(
|
||||
'Root.Settings',
|
||||
new DropdownField(
|
||||
'LandingPageFreshness',
|
||||
'When you first open the blog, how many entries should I show',
|
||||
array(
|
||||
"" => "All entries",
|
||||
"1" => "Last month's entries",
|
||||
"2" => "Last 2 months' entries",
|
||||
"3" => "Last 3 months' entries",
|
||||
"4" => "Last 4 months' entries",
|
||||
"5" => "Last 5 months' entries",
|
||||
"6" => "Last 6 months' entries",
|
||||
"7" => "Last 7 months' entries",
|
||||
"8" => "Last 8 months' entries",
|
||||
"9" => "Last 9 months' entries",
|
||||
"10" => "Last 10 months' entries",
|
||||
"11" => "Last 11 months' entries",
|
||||
"12" => "Last year's entries",
|
||||
"INHERIT" => "Take value from parent Blog Tree"
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
/* ----------- New accessors -------------- */
|
||||
|
||||
public function loadDescendantBlogHolderIDListInto(&$idList) {
|
||||
if ($children = $this->AllChildren()) {
|
||||
foreach($children as $child) {
|
||||
if(in_array($child->ID, $idList)) continue;
|
||||
|
||||
if($child instanceof BlogHolder) {
|
||||
$idList[] = $child->ID;
|
||||
} elseif($child instanceof BlogTree) {
|
||||
$child->loadDescendantBlogHolderIDListInto($idList);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Build a list of all IDs for BlogHolders that are children of us
|
||||
public function BlogHolderIDs() {
|
||||
$holderIDs = array();
|
||||
$this->loadDescendantBlogHolderIDListInto($holderIDs);
|
||||
return $holderIDs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get entries in this blog.
|
||||
*
|
||||
* @param string $limit A clause to insert into the limit clause.
|
||||
* @param string $tag Only get blog entries with this tag
|
||||
* @param string $date Only get blog entries on this date - either a year, or a year-month eg '2008' or '2008-02'
|
||||
* @param callable $retrieveCallback A function to call with pagetype, filter and limit for custom blog
|
||||
* sorting or filtering
|
||||
* @param string $filter Filter condition
|
||||
* @return PaginatedList The list of entries in a paginated list
|
||||
*/
|
||||
public function Entries($limit = '', $tag = '', $date = '', $retrieveCallback = null, $filter = '') {
|
||||
|
||||
$tagCheck = '';
|
||||
$dateCheck = '';
|
||||
|
||||
if($tag) {
|
||||
$SQL_tag = Convert::raw2sql($tag);
|
||||
$tagCheck = "AND \"BlogEntry\".\"Tags\" LIKE '%$SQL_tag%'";
|
||||
}
|
||||
|
||||
if($date) {
|
||||
// Some systems still use the / seperator for date presentation
|
||||
if( strpos($date, '-') ) $seperator = '-';
|
||||
elseif( strpos($date, '/') ) $seperator = '/';
|
||||
|
||||
if(isset($seperator) && !empty($seperator)) {
|
||||
// The 2 in the explode argument will tell it to only create 2 elements
|
||||
// i.e. in this instance the $year and $month fields respectively
|
||||
list($year,$month) = explode( $seperator, $date, 2);
|
||||
|
||||
$year = (int)$year;
|
||||
$month = (int)$month;
|
||||
|
||||
if($year && $month) {
|
||||
if(method_exists(DB::getConn(), 'formattedDatetimeClause')) {
|
||||
$db_date=DB::getConn()->formattedDatetimeClause('"BlogEntry"."Date"', '%m');
|
||||
$dateCheck = "AND CAST($db_date AS " . DB::getConn()->dbDataType('unsigned integer') . ") = $month AND " . DB::getConn()->formattedDatetimeClause('"BlogEntry"."Date"', '%Y') . " = '$year'";
|
||||
} else {
|
||||
$dateCheck = "AND MONTH(\"BlogEntry\".\"Date\") = '$month' AND YEAR(\"BlogEntry\".\"Date\") = '$year'";
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$year = (int) $date;
|
||||
if($year) {
|
||||
if(method_exists(DB::getConn(), 'formattedDatetimeClause')) {
|
||||
$dateCheck = "AND " . DB::getConn()->formattedDatetimeClause('"BlogEntry"."Date"', '%Y') . " = '$year'";
|
||||
} else {
|
||||
$dateCheck = "AND YEAR(\"BlogEntry\".\"Date\") = '$year'";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Build a list of all IDs for BlogHolders that are children of us
|
||||
$holderIDs = $this->BlogHolderIDs();
|
||||
|
||||
// If no BlogHolders, no BlogEntries. So return false
|
||||
if(empty($holderIDs)) return false;
|
||||
|
||||
// Otherwise, do the actual query
|
||||
if($filter) $filter .= ' AND ';
|
||||
$filter .= '"SiteTree"."ParentID" IN (' . implode(',', $holderIDs) . ") $tagCheck $dateCheck";
|
||||
|
||||
$order = '"BlogEntry"."Date" DESC';
|
||||
|
||||
// By specifying a callback, you can alter the SQL, or sort on something other than date.
|
||||
if($retrieveCallback) return call_user_func($retrieveCallback, 'BlogEntry', $filter, $limit, $order);
|
||||
|
||||
$entries = BlogEntry::get()->where($filter)->sort($order);
|
||||
|
||||
$list = new PaginatedList($entries, Controller::curr()->request);
|
||||
$list->setPageLength($limit);
|
||||
return $list;
|
||||
}
|
||||
}
|
||||
|
||||
class BlogTree_Controller extends Page_Controller {
|
||||
|
||||
private static $allowed_actions = array(
|
||||
'index',
|
||||
'rss',
|
||||
'tag',
|
||||
'date'
|
||||
);
|
||||
|
||||
private static $casting = array(
|
||||
'SelectedTag' => 'Text',
|
||||
'SelectedAuthor' => 'Text'
|
||||
);
|
||||
|
||||
function init() {
|
||||
parent::init();
|
||||
|
||||
$this->IncludeBlogRSS();
|
||||
|
||||
Requirements::themedCSS("blog","blog");
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine selected BlogEntry items to show on this page
|
||||
*
|
||||
* @param int $limit
|
||||
* @return PaginatedList
|
||||
*/
|
||||
public function BlogEntries($limit = null) {
|
||||
require_once('Zend/Date.php');
|
||||
|
||||
if($limit === null) $limit = BlogTree::$default_entries_limit;
|
||||
|
||||
// only use freshness if no action is present (might be displaying tags or rss)
|
||||
if ($this->LandingPageFreshness && !$this->request->param('Action')) {
|
||||
$d = new Zend_Date(SS_Datetime::now()->getValue());
|
||||
$d->sub($this->LandingPageFreshness, Zend_Date::MONTH);
|
||||
$date = $d->toString('YYYY-MM-dd');
|
||||
|
||||
$filter = "\"BlogEntry\".\"Date\" > '$date'";
|
||||
} else {
|
||||
$filter = '';
|
||||
}
|
||||
// allow filtering by author field and some blogs have an authorID field which
|
||||
// may allow filtering by id
|
||||
if(isset($_GET['author']) && isset($_GET['authorID'])) {
|
||||
$author = Convert::raw2sql($_GET['author']);
|
||||
$id = Convert::raw2sql($_GET['authorID']);
|
||||
|
||||
$filter .= " \"BlogEntry\".\"Author\" LIKE '". $author . "' OR \"BlogEntry\".\"AuthorID\" = '". $id ."'";
|
||||
}
|
||||
else if(isset($_GET['author'])) {
|
||||
$filter .= " \"BlogEntry\".\"Author\" LIKE '". Convert::raw2sql($_GET['author']) . "'";
|
||||
}
|
||||
else if(isset($_GET['authorID'])) {
|
||||
$filter .= " \"BlogEntry\".\"AuthorID\" = '". Convert::raw2sql($_GET['authorID']). "'";
|
||||
}
|
||||
|
||||
$date = $this->SelectedDate();
|
||||
|
||||
return $this->Entries($limit, $this->SelectedTag(), ($date) ? $date : '', null, $filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* This will create a <link> tag point to the RSS feed
|
||||
*/
|
||||
public function IncludeBlogRSS() {
|
||||
RSSFeed::linkToFeed($this->Link('rss'), _t('BlogHolder.RSSFEED',"RSS feed of these blogs"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the rss feed for this blog holder's entries
|
||||
*/
|
||||
public function rss() {
|
||||
global $project_name;
|
||||
|
||||
$blogName = $this->Title;
|
||||
$altBlogName = $project_name . ' blog';
|
||||
|
||||
$entries = $this->Entries(20);
|
||||
|
||||
if($entries) {
|
||||
$rss = new RSSFeed($entries, $this->Link('rss'), ($blogName ? $blogName : $altBlogName), "", "Title", "RSSContent");
|
||||
return $rss->outputToBrowser();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Protection against infinite loops when an RSS widget pointing to this page is added to this page
|
||||
*/
|
||||
public function defaultAction($action) {
|
||||
if(stristr($_SERVER['HTTP_USER_AGENT'], 'SimplePie')) return $this->rss();
|
||||
|
||||
return parent::defaultAction($action);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the currently viewing tag used in the template as $Tag
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function SelectedTag() {
|
||||
if ($this->request->latestParam('Action') == 'tag') {
|
||||
$tag = $this->request->latestParam('ID');
|
||||
return urldecode($tag);
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the selected date from the blog tree
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function SelectedDate() {
|
||||
if($this->request->latestParam('Action') == 'date') {
|
||||
$year = $this->request->latestParam('ID');
|
||||
$month = $this->request->latestParam('OtherID');
|
||||
|
||||
if(is_numeric($year) && is_numeric($month) && $month < 13) {
|
||||
|
||||
$date = $year .'-'. $month;
|
||||
return $date;
|
||||
|
||||
} else {
|
||||
|
||||
if(is_numeric($year)) return $year;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function SelectedAuthor() {
|
||||
if($this->request->getVar('author')) {
|
||||
$hasAuthor = BlogEntry::get()->filter('Author', $this->request->getVar('author'))->Count();
|
||||
return $hasAuthor
|
||||
? $this->request->getVar('author')
|
||||
: null;
|
||||
} elseif($this->request->getVar('authorID')) {
|
||||
$hasAuthor = BlogEntry::get()->filter('AuthorID', $this->request->getVar('authorID'))->Count();
|
||||
if($hasAuthor) {
|
||||
$member = Member::get()->byId($this->request->getVar('authorID'));
|
||||
if($member) {
|
||||
if($member->hasMethod('BlogAuthorTitle')) {
|
||||
return $member->BlogAuthorTitle;
|
||||
} else {
|
||||
return $member->Title;
|
||||
}
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function SelectedNiceDate(){
|
||||
$date = $this->SelectedDate();
|
||||
|
||||
if(strpos($date, '-')) {
|
||||
$date = explode("-",$date);
|
||||
return date("F", mktime(0, 0, 0, $date[1], 1, date('Y'))). " " .date("Y", mktime(0, 0, 0, date('m'), 1, $date[0]));
|
||||
|
||||
} else {
|
||||
return date("Y", mktime(0, 0, 0, date('m'), 1, $date));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,105 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once(BASE_PATH . '/blog/thirdparty/xmlrpc/xmlrpc.php');
|
||||
require_once(BASE_PATH . '/blog/thirdparty/xmlrpc/xmlrpcs.php');
|
||||
require_once(BASE_PATH . '/blog/thirdparty/xmlrpc/xmlrpc_wrappers.php');
|
||||
|
||||
/**
|
||||
* MetaWeblogController provides the MetaWeblog API for SilverStripe blogs.
|
||||
*/
|
||||
class MetaWeblogController extends Controller {
|
||||
function index($request) {
|
||||
|
||||
// Create an xmlrpc server, and set up the method calls
|
||||
$service = new xmlrpc_server(array(
|
||||
"blogger.getUsersBlogs" => array(
|
||||
"function" => array($this, "getUsersBlogs")
|
||||
),
|
||||
"metaWeblog.getRecentPosts" => array(
|
||||
'function' => array($this, 'getRecentPosts')
|
||||
),
|
||||
'metaWeblog.getCategories' => array(
|
||||
'function' => array($this, 'getCategories')
|
||||
)
|
||||
), false);
|
||||
|
||||
// Use nice php functions, and call the service
|
||||
$service->functions_parameters_type = 'phpvals';
|
||||
$service->service();
|
||||
|
||||
// Tell SilverStripe not to try render a template
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of BlogHolders the user has access to.
|
||||
*/
|
||||
function getUsersBlogs($appkey, $username, $password) {
|
||||
$member = MemberAuthenticator::authenticate(array(
|
||||
'Email' => $username,
|
||||
'Password' => $password,
|
||||
));
|
||||
|
||||
// TODO Throw approriate error.
|
||||
if(!$member) die();
|
||||
|
||||
$blogholders = DataObject::get('BlogHolder');
|
||||
|
||||
$response = array();
|
||||
|
||||
foreach($blogholders as $bh) {
|
||||
if(!$bh->canAddChildren($member)) continue;
|
||||
|
||||
$bgarr = array();
|
||||
$bgarr['url'] = $bh->AbsoluteLink();
|
||||
$bgarr['blogid'] = (int) $bh->ID;
|
||||
$bgarr['blogname'] = $bh->Title;
|
||||
|
||||
$response[] = $bgarr;
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most recent posts on a blog.
|
||||
*/
|
||||
function getRecentPosts($blogid, $username, $password, $numberOfPosts) {
|
||||
$member = MemberAuthenticator::authenticate(array(
|
||||
'Email' => $username,
|
||||
'Password' => $password,
|
||||
));
|
||||
|
||||
// TODO Throw approriate error.
|
||||
if(!$member) die();
|
||||
|
||||
$posts = DataObject::get('BlogEntry', '"ParentID" = ' . (int) $blogid, '"Date" DESC');
|
||||
|
||||
$res = array();
|
||||
$postsSoFar = 0;
|
||||
|
||||
foreach($posts as $post) {
|
||||
if(!$post->canEdit($member)) continue;
|
||||
|
||||
$parr = array();
|
||||
|
||||
$parr['title'] = $post->Title;
|
||||
$parr['link'] = $post->AbsoluteLink();
|
||||
$parr['description'] = $post->Content;
|
||||
$parr['postid'] = (int) $post->ID;
|
||||
|
||||
$res[] = $parr;
|
||||
|
||||
if(++$postsSoFar >= $numberOfPosts) break;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
function getCategories() {
|
||||
//TODO dummy function
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -1,152 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once("model/DB.php");
|
||||
|
||||
class TypoImport extends Controller {
|
||||
/**
|
||||
* Imports product status and price change updates.
|
||||
*
|
||||
*/
|
||||
|
||||
function testinstall() {
|
||||
echo "Ok";
|
||||
}
|
||||
|
||||
/**
|
||||
* Imports blog entries and comments from a Potgres-based typo installation into a SilverStripe blog
|
||||
*/
|
||||
function import(){
|
||||
// some of the guys in the contents table are articles, some are contents. Distinguished by type = "Article" or "Comment"
|
||||
// fields are: id, title, author, body, body_html, extended, excerpt, keywords, created_at, updated_at, extended_html, user_id, permalink, guid, [13]
|
||||
// text_filter_id, whiteboard, type, article_id, email, url, ip, blog_name, name, published, allow_pings, allow_comments, blog_id
|
||||
// published_at, state, status_confirmed
|
||||
|
||||
|
||||
$dbconn = pg_connect("host=orwell port=5432 dbname=typo_prod user=postgres password=possty");
|
||||
|
||||
// create a new blogholder and call it "imported blog"
|
||||
$bholder = new BlogHolder();
|
||||
$bholder->Title = "imported blog";
|
||||
|
||||
// write it!
|
||||
$bholder->write();
|
||||
$bholder->publish("Stage", "Live");
|
||||
|
||||
// get the typo articles
|
||||
$result = pg_query($dbconn, "SELECT * FROM contents WHERE type='Article'");
|
||||
|
||||
while ($row = pg_fetch_row($result)) {
|
||||
|
||||
// title [1]
|
||||
// author [2]
|
||||
// body [3]
|
||||
// body_html [4] (type rendered and cached the html here. This is the preferred blog entry content for migration)
|
||||
// keywords (space separated) [7] (tags table is just a list of the unique variants of these keywords)
|
||||
// created_at [8]
|
||||
// permalink [12] (this is like the url in sitetree, prolly not needed)
|
||||
// email [18] (address of the commenter)
|
||||
// url [19] (url of the commenter)
|
||||
|
||||
$title = $row[1];
|
||||
$author = $row[2];
|
||||
$blog_entry = $row[4];
|
||||
$keywords = $row[7];
|
||||
$created_at = $row[8];
|
||||
|
||||
// sometimes it's empty. If it is, grab the body
|
||||
if ($blog_entry == ""){
|
||||
// use "body"
|
||||
$blog_entry = $row[3];
|
||||
}
|
||||
echo "blog_entry: $blog_entry";
|
||||
echo "<br />\n";
|
||||
|
||||
// put the typo blog entry in the SS database
|
||||
$newEntry = new BlogEntry();
|
||||
$newEntry->Title = $title;
|
||||
$newEntry->Author = $author;
|
||||
$newEntry->Content = $blog_entry;
|
||||
$newEntry->Tags = $keywords;
|
||||
$newEntry->Date = $created_at;
|
||||
|
||||
// tie each blog entry back to the blogholder we created initially
|
||||
$newEntry->ParentID = $bholder->ID;
|
||||
|
||||
// write it!
|
||||
$newEntry->write();
|
||||
$newEntry->publish("Stage", "Live");
|
||||
|
||||
// grab the id so we can get the comments
|
||||
$old_article_id = $row[0];
|
||||
|
||||
// get the comments
|
||||
$result2 = pg_query($dbconn, "SELECT * FROM contents WHERE type = 'Comment' AND article_id = $old_article_id");
|
||||
|
||||
while ($row2 = pg_fetch_row($result2)) {
|
||||
// grab the body_html
|
||||
$comment = $row2[4];
|
||||
|
||||
// sometimes it's empty. If it is, grab the body
|
||||
if ($comment == ""){
|
||||
// use "body"
|
||||
$comment = $row2[3];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$Cauthor = $row2[2];
|
||||
$Ccreated_at = $row2[8];
|
||||
|
||||
// put the typo blog comment in the SS database
|
||||
$newCEntry = new PageComment();
|
||||
$newCEntry->Name = $Cauthor;
|
||||
$newCEntry->Comment = $comment;
|
||||
$newCEntry->Created = $created_at;
|
||||
|
||||
// need to grab the newly inserted blog entry's id
|
||||
$newCEntry->ParentID = $newEntry->ID;
|
||||
|
||||
// write it!
|
||||
$newCEntry->write();
|
||||
|
||||
echo "comment: $comment";
|
||||
echo "<br />\n";
|
||||
}
|
||||
|
||||
$newEntry->flushCache();
|
||||
|
||||
// fix up the specialchars
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"×\", \"x\")");
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"’\", \"’\")");
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"‘\", \"‘\")");
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"—\", \"—\")");
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"“\", \"“\")");
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"”\", \"”\")");
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"–\", \"–\")");
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"—\", \"—\")");
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"…\", \"…\")");
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"™\", \"™\")");
|
||||
pg_query($dbconn, "UPDATE SiteTree SET Content = REPLACE(Content, \"&\", \"&\")");
|
||||
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"×\", \"x\")");
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"’\", \"’\")");
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"‘\", \"‘\")");
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"—\", \"—\")");
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"“\", \"“\")");
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"”\", \"”\")");
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"–\", \"–\")");
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"—\", \"—\")");
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"…\", \"…\")");
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"™\", \"™\")");
|
||||
pg_query($dbconn, "UPDATE PageComment SET Comment = REPLACE(Comment, \"&\", \"&\")");
|
||||
|
||||
|
||||
}
|
||||
|
||||
pg_close($dbconn);
|
||||
|
||||
} // end function
|
||||
|
||||
} // end class
|
||||
?>
|
@ -1,117 +0,0 @@
|
||||
<?php
|
||||
|
||||
if(class_exists('Widget')) {
|
||||
|
||||
/**
|
||||
* Shows a widget with viewing blog entries
|
||||
* by months or years.
|
||||
*
|
||||
* @package blog
|
||||
*/
|
||||
class ArchiveWidget extends Widget {
|
||||
|
||||
private static $db = array(
|
||||
'DisplayMode' => 'Varchar'
|
||||
);
|
||||
|
||||
private static $defaults = array(
|
||||
'DisplayMode' => 'month'
|
||||
);
|
||||
|
||||
private static $title = 'Browse by Date';
|
||||
|
||||
private static $cmsTitle = 'Blog Archive';
|
||||
|
||||
private static $description =
|
||||
'Show a list of months or years in which there are blog posts, and provide links to them.';
|
||||
|
||||
function getCMSFields() {
|
||||
$fields = parent::getCMSFields();
|
||||
|
||||
$fields->merge(
|
||||
|
||||
new FieldList(
|
||||
new OptionsetField(
|
||||
'DisplayMode',
|
||||
_t('ArchiveWidget.DispBY', 'Display by'),
|
||||
array(
|
||||
'month' => _t('ArchiveWidget.MONTH', 'month'),
|
||||
'year' => _t('ArchiveWidget.YEAR', 'year')
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
$this->extend('updateCMSFields', $fields);
|
||||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
function getDates() {
|
||||
Requirements::themedCSS('archivewidget');
|
||||
|
||||
$results = new ArrayList();
|
||||
$container = BlogTree::current();
|
||||
$ids = $container->BlogHolderIDs();
|
||||
|
||||
$stage = Versioned::current_stage();
|
||||
$suffix = (!$stage || $stage == 'Stage') ? "" : "_$stage";
|
||||
|
||||
if(method_exists(DB::getConn(), 'formattedDatetimeClause')) {
|
||||
$monthclause = DB::getConn()->formattedDatetimeClause('"Date"', '%m');
|
||||
$yearclause = DB::getConn()->formattedDatetimeClause('"Date"', '%Y');
|
||||
} else {
|
||||
$monthclause = 'MONTH("Date")';
|
||||
$yearclause = 'YEAR("Date")';
|
||||
}
|
||||
|
||||
if($this->DisplayMode == 'month') {
|
||||
$sqlResults = DB::query("
|
||||
SELECT DISTINCT CAST($monthclause AS " . DB::getConn()->dbDataType('unsigned integer') . ")
|
||||
AS \"Month\",
|
||||
$yearclause AS \"Year\"
|
||||
FROM \"SiteTree$suffix\" INNER JOIN \"BlogEntry$suffix\"
|
||||
ON \"SiteTree$suffix\".\"ID\" = \"BlogEntry$suffix\".\"ID\"
|
||||
WHERE \"ParentID\" IN (" . implode(', ', $ids) . ")
|
||||
ORDER BY \"Year\" DESC, \"Month\" DESC;"
|
||||
);
|
||||
} else {
|
||||
$sqlResults = DB::query("
|
||||
SELECT DISTINCT $yearclause AS \"Year\"
|
||||
FROM \"SiteTree$suffix\" INNER JOIN \"BlogEntry$suffix\"
|
||||
ON \"SiteTree$suffix\".\"ID\" = \"BlogEntry$suffix\".\"ID\"
|
||||
WHERE \"ParentID\" IN (" . implode(', ', $ids) . ")
|
||||
ORDER BY \"Year\" DESC"
|
||||
);
|
||||
}
|
||||
|
||||
if($sqlResults) foreach($sqlResults as $sqlResult) {
|
||||
$isMonthDisplay = $this->DisplayMode == 'month';
|
||||
|
||||
$monthVal = (isset($sqlResult['Month'])) ? (int) $sqlResult['Month'] : 1;
|
||||
$month = ($isMonthDisplay) ? $monthVal : 1;
|
||||
$year = ($sqlResult['Year']) ? (int) $sqlResult['Year'] : date('Y');
|
||||
|
||||
$date = DBField::create_field('Date', array(
|
||||
'Day' => 1,
|
||||
'Month' => $month,
|
||||
'Year' => $year
|
||||
));
|
||||
|
||||
if($isMonthDisplay) {
|
||||
$link = $container->Link('date') . '/' . $sqlResult['Year'] . '/' . sprintf("%'02d", $monthVal);
|
||||
} else {
|
||||
$link = $container->Link('date') . '/' . $sqlResult['Year'];
|
||||
}
|
||||
|
||||
$results->push(new ArrayData(array(
|
||||
'Date' => $date,
|
||||
'Link' => $link
|
||||
)));
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
if(class_exists('Widget')) {
|
||||
|
||||
/**
|
||||
* Blog Management Widget
|
||||
*
|
||||
* @package blog
|
||||
*/
|
||||
class BlogManagementWidget extends Widget {
|
||||
|
||||
private static $title = "Blog Management";
|
||||
|
||||
private static $cmsTitle = "Blog Management";
|
||||
|
||||
private static $description =
|
||||
"Provide a number of links useful for administering a blog. Only shown if the user is an admin.";
|
||||
|
||||
function CommentText() {
|
||||
|
||||
if(!class_exists('Comment')) return false;
|
||||
$unmoderatedcount = DB::query("SELECT COUNT(*) FROM \"Comment\" WHERE \"Moderated\"=1")->value();
|
||||
if($unmoderatedcount == 1) {
|
||||
return _t("BlogManagementWidget.UNM1", "You have 1 unmoderated comment");
|
||||
} else if($unmoderatedcount > 1) {
|
||||
return sprintf(_t("BlogManagementWidget.UNMM", "You have %i unmoderated comments"), $unmoderatedcount);
|
||||
} else {
|
||||
return _t("BlogManagementWidget.COMADM", "Comment administration");
|
||||
}
|
||||
}
|
||||
|
||||
function CommentLink() {
|
||||
|
||||
if(!Permission::check('BLOGMANAGEMENT') || !class_exists('Comment')) return false;
|
||||
$unmoderatedcount = DB::query("SELECT COUNT(*) FROM \"Comment\" WHERE \"Moderated\"=1")->value();
|
||||
|
||||
if($unmoderatedcount > 0) {
|
||||
return "admin/comments/unmoderated";
|
||||
} else {
|
||||
return "admin/comments";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class BlogManagementWidget_Controller extends Widget_Controller {
|
||||
|
||||
function WidgetHolder() {
|
||||
if(Permission::check("BLOGMANAGEMENT")) {
|
||||
return $this->renderWith("WidgetHolder");
|
||||
}
|
||||
}
|
||||
|
||||
function PostLink() {
|
||||
$container = BlogTree::current();
|
||||
return ($container && $container->ClassName != "BlogTree") ? $container->Link('post') : false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,109 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (class_exists('Widget')) {
|
||||
|
||||
/**
|
||||
* Presents a list of items from an RSS feed url
|
||||
*
|
||||
* @package blog
|
||||
*/
|
||||
class RSSWidget extends Widget {
|
||||
|
||||
private static $db = array(
|
||||
"RSSTitle" => "Text",
|
||||
"RssUrl" => "Text",
|
||||
"NumberToShow" => "Int"
|
||||
);
|
||||
|
||||
private static $defaults = array(
|
||||
"NumberToShow" => 10,
|
||||
"RSSTitle" => 'RSS Feed'
|
||||
);
|
||||
|
||||
private static $cmsTitle = "RSS Feed";
|
||||
|
||||
private static $description = "Downloads another page's RSS feed and displays items in a list.";
|
||||
|
||||
/**
|
||||
* If the RssUrl is relative, convert it to absolute with the
|
||||
* current baseURL to avoid confusing simplepie.
|
||||
* Passing relative URLs to simplepie will result
|
||||
* in strange DNS lookups and request timeouts.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getAbsoluteRssUrl() {
|
||||
$urlParts = parse_url($this->RssUrl);
|
||||
if(!isset($urlParts['host']) || !$urlParts['host']) {
|
||||
return Director::absoluteBaseURL() . $this->RssUrl;
|
||||
} else {
|
||||
return $this->RssUrl;
|
||||
}
|
||||
}
|
||||
|
||||
function getCMSFields() {
|
||||
$fields = parent::getCMSFields();
|
||||
|
||||
$fields->merge(
|
||||
new FieldList(
|
||||
new TextField("RSSTitle", _t('RSSWidget.CT', "Custom title for the feed")),
|
||||
new TextField("RssUrl", _t(
|
||||
'RSSWidget.URL',
|
||||
"URL of the other page's RSS feed. Please make sure this URL points to an RSS feed."
|
||||
)),
|
||||
new NumericField("NumberToShow", _t('RSSWidget.NTS', "Number of Items to show"))
|
||||
)
|
||||
);
|
||||
|
||||
$this->extend('updateCMSFields', $fields);
|
||||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
function Title() {
|
||||
return ($this->RSSTitle) ? $this->RSSTitle : _t('RSSWidget.DEFAULTTITLE', 'RSS Feed');
|
||||
}
|
||||
|
||||
function getFeedItems() {
|
||||
$output = new ArrayList();
|
||||
|
||||
// Protection against infinite loops when an RSS widget pointing to this page is added to this page
|
||||
if(stristr($_SERVER['HTTP_USER_AGENT'], 'SimplePie')) {
|
||||
return $output;
|
||||
}
|
||||
|
||||
if(!class_exists('SimplePie')) {
|
||||
throw new LogicException(
|
||||
'Please install the "simplepie/simplepie" library by adding it to the "require" '
|
||||
+ 'section of your composer.json'
|
||||
);
|
||||
}
|
||||
|
||||
$t1 = microtime(true);
|
||||
$feed = new SimplePie();
|
||||
$feed->set_feed_url($this->AbsoluteRssUrl);
|
||||
$feed->set_cache_location(TEMP_FOLDER);
|
||||
$feed->init();
|
||||
if($items = $feed->get_items(0, $this->NumberToShow)) {
|
||||
foreach($items as $item) {
|
||||
|
||||
// Cast the Date
|
||||
$date = new Date('Date');
|
||||
$date->setValue($item->get_date());
|
||||
|
||||
// Cast the Title
|
||||
$title = new Text('Title');
|
||||
$title->setValue(html_entity_decode($item->get_title()));
|
||||
|
||||
$output->push(new ArrayData(array(
|
||||
'Title' => $title,
|
||||
'Date' => $date,
|
||||
'Link' => $item->get_link()
|
||||
)));
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
<?php
|
||||
|
||||
if(class_exists('Widget')) {
|
||||
|
||||
/**
|
||||
* A simple widget that just shows a link
|
||||
* to this website's blog RSS, with an RSS
|
||||
* icon.
|
||||
*
|
||||
* @package blog
|
||||
*/
|
||||
class SubscribeRSSWidget extends Widget {
|
||||
|
||||
private static $title = 'Subscribe via RSS';
|
||||
|
||||
private static $cmsTitle = 'Subscribe via RSS widget';
|
||||
|
||||
private static $description = 'Shows a link allowing a user to subscribe to this blog via RSS.';
|
||||
|
||||
/**
|
||||
* Return an absolute URL based on the BlogHolder
|
||||
* that this widget is located on.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRSSLink() {
|
||||
Requirements::themedCSS('subscribersswidget');
|
||||
$container = BlogTree::current();
|
||||
if ($container) return $container->Link('rss');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,155 +0,0 @@
|
||||
<?php
|
||||
|
||||
if(class_exists('Widget')) {
|
||||
|
||||
/**
|
||||
* A list of tags associated with blog posts
|
||||
*
|
||||
* @package blog
|
||||
*/
|
||||
class TagCloudWidget extends Widget {
|
||||
|
||||
private static $db = array(
|
||||
"Title" => "Varchar",
|
||||
"Limit" => "Int",
|
||||
"Sortby" => "Varchar"
|
||||
);
|
||||
|
||||
private static $defaults = array(
|
||||
"Title" => "Tag Cloud",
|
||||
"Limit" => "0",
|
||||
"Sortby" => "alphabet"
|
||||
);
|
||||
|
||||
private static $cmsTitle = "Tag Cloud";
|
||||
|
||||
private static $description = "Shows a tag cloud of tags on your blog.";
|
||||
|
||||
/**
|
||||
* List of popularity classes in order of least to most popular
|
||||
*
|
||||
* @config
|
||||
* @var array
|
||||
*/
|
||||
private static $popularities = array(
|
||||
'not-popular',
|
||||
'not-very-popular',
|
||||
'somewhat-popular',
|
||||
'popular',
|
||||
'very-popular',
|
||||
'ultra-popular'
|
||||
);
|
||||
|
||||
public function getCMSFields() {
|
||||
|
||||
$this->beforeUpdateCMSFields(function($fields) {
|
||||
$fields->merge(
|
||||
new FieldList(
|
||||
new TextField("Title", _t("TagCloudWidget.TILE", "Title")),
|
||||
new TextField("Limit", _t("TagCloudWidget.LIMIT", "Limit number of tags")),
|
||||
new OptionsetField(
|
||||
"Sortby",
|
||||
_t("TagCloudWidget.SORTBY", "Sort by"),
|
||||
array(
|
||||
"alphabet" => _t("TagCloudWidget.SBAL", "alphabet"),
|
||||
"frequency" => _t("TagCloudWidget.SBFREQ", "frequency")
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
return parent::getCMSFields();
|
||||
}
|
||||
|
||||
function Title() {
|
||||
return $this->Title ? $this->Title : _t('TagCloudWidget.DEFAULTTITLE', 'Tag Cloud');
|
||||
}
|
||||
|
||||
/**
|
||||
* Current BlogTree used as the container for this tagcloud.
|
||||
* Used by {@link TagCloudWidgetTest} for testing
|
||||
*
|
||||
* @var BlogTree
|
||||
*/
|
||||
public static $container = null;
|
||||
|
||||
/**
|
||||
* Return all sorted tags in the system
|
||||
*
|
||||
* @return ArrayList
|
||||
*/
|
||||
function getTagsCollection() {
|
||||
Requirements::themedCSS("tagcloud");
|
||||
|
||||
// Ensure there is a valid BlogTree with entries
|
||||
$container = BlogTree::current(self::$container);
|
||||
if( !$container
|
||||
|| !($entries = $container->Entries())
|
||||
|| $entries->count() == 0
|
||||
) return null;
|
||||
|
||||
// Extract all tags from each entry
|
||||
$tagCounts = array(); // Mapping of tag => frequency
|
||||
$tagLabels = array(); // Mapping of tag => label
|
||||
foreach($entries as $entry) {
|
||||
$theseTags = $entry->TagNames();
|
||||
foreach($theseTags as $tag => $tagLabel) {
|
||||
$tagLabels[$tag] = $tagLabel;
|
||||
//getting the count into key => value map
|
||||
$tagCounts[$tag] = isset($tagCounts[$tag]) ? $tagCounts[$tag] + 1 : 1;
|
||||
}
|
||||
}
|
||||
if(empty($tagCounts)) return null;
|
||||
$minCount = min($tagCounts);
|
||||
$maxCount = max($tagCounts);
|
||||
|
||||
// Apply sorting mechanism
|
||||
if($this->Sortby == "alphabet") {
|
||||
// Sort by name
|
||||
ksort($tagCounts);
|
||||
} else {
|
||||
// Sort by frequency
|
||||
uasort($tagCounts, function($a, $b) {
|
||||
return $b - $a;
|
||||
});
|
||||
}
|
||||
|
||||
// Apply limiting
|
||||
if($this->Limit > 0) $tagCounts = array_slice($tagCounts, 0, $this->Limit, true);
|
||||
|
||||
// Calculate buckets of popularities
|
||||
$numsizes = count(array_unique($tagCounts)); //Work out the number of different sizes
|
||||
$popularities = self::config()->popularities;
|
||||
$buckets = count($popularities);
|
||||
|
||||
// If there are more frequencies than buckets, divide frequencies into buckets
|
||||
if ($numsizes > $buckets) $numsizes = $buckets;
|
||||
|
||||
// Adjust offset to use central buckets (if using a subset of available buckets)
|
||||
$offset = round(($buckets - $numsizes)/2);
|
||||
|
||||
$output = new ArrayList();
|
||||
foreach($tagCounts as $tag => $count) {
|
||||
|
||||
// Find position of $count in the selected range, adjusted for bucket range used
|
||||
if($maxCount == $minCount) {
|
||||
$popularity = $offset;
|
||||
} else {
|
||||
$popularity = round(
|
||||
($count-$minCount) / ($maxCount-$minCount) * ($numsizes-1)
|
||||
) + $offset;
|
||||
}
|
||||
$class = $popularities[$popularity];
|
||||
|
||||
$output->push(new ArrayData(array(
|
||||
"Tag" => $tagLabels[$tag],
|
||||
"Count" => $count,
|
||||
"Class" => $class,
|
||||
"Link" => Controller::join_links($container->Link('tag'), urlencode($tag))
|
||||
)));
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
}
|
84
composer.json
Normal file → Executable file
@ -1,28 +1,58 @@
|
||||
{
|
||||
"name": "silverstripe/blog",
|
||||
"description": "The blog module allows you to post blogs on your SilverStripe. It includes the ability to post blogs using a site front-end form. Blogs are summarised on the blog holder page type, with more detail viewable when a specific blog is clicked.",
|
||||
"type": "silverstripe-module",
|
||||
"keywords": ["silverstripe", "blog"],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Saophalkun Ponlu",
|
||||
"email": "phalkunz@silverstripe.com"
|
||||
},
|
||||
{
|
||||
"name": "Carlos Barberis",
|
||||
"email": "carlos@silverstripe.com"
|
||||
}
|
||||
],
|
||||
|
||||
"require":
|
||||
{
|
||||
"silverstripe/cms": "~3.1"
|
||||
},
|
||||
"suggest":
|
||||
{
|
||||
"silverstripe/widgets": "Additional 'sidebar features', e.g. a list of recent posts and a tagcloud",
|
||||
"silverstripe/comments": "Enable user comments on any page type, including blog posts",
|
||||
"simplepie/simplepie": "Parse RSS feeds, required for the RSS widget"
|
||||
},
|
||||
"minimum-stability": "dev"
|
||||
}
|
||||
"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
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
.archiveMonths{
|
||||
|
||||
}
|
||||
|
||||
ul.archiveYears li{
|
||||
display: inline;
|
||||
font-size: 1.2em !important;
|
||||
margin:0 !important;
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
/*
|
||||
Foundational BBHelper formatting
|
||||
*/
|
||||
|
||||
ul.bbcodeExamples li {
|
||||
list-style-type:none;
|
||||
font-size: 1em;
|
||||
}
|
||||
ul.bbcodeExamples li.last {
|
||||
border: none;
|
||||
}
|
||||
|
||||
ul.bbcodeExamples li span.example {
|
||||
|
||||
}
|
||||
|
||||
#BBTagsHolder{
|
||||
color: #777;
|
||||
padding: 5px;
|
||||
width: 270px;
|
||||
background-color: #fff;
|
||||
font-size:0.8em;
|
||||
}
|
||||
|
||||
.bbcodeExamples{
|
||||
margin: 0 !important;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#BBCodeHint{
|
||||
cursor: pointer;
|
||||
}
|
16
css/blog.css
@ -1,16 +0,0 @@
|
||||
.BlogError {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.BlogError p {
|
||||
color: #fff;
|
||||
display: inline;
|
||||
background-color: #f77;
|
||||
padding: 7px;
|
||||
font-weight:bold;
|
||||
}
|
||||
|
||||
.edit-post {
|
||||
clear:both;
|
||||
padding-top:10px;
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
.subscribeLink {
|
||||
background: url(../images/feed-icon-14x14.png) no-repeat left center;
|
||||
padding-left: 20px;
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
.tagcloud .not-popular { font-size: .9em; }
|
||||
.tagcloud .not-very-popular { font-size: 1em; }
|
||||
.tagcloud .somewhat-popular { font-size: 1.3em; }
|
||||
.tagcloud .popular { font-size: 1.6em; }
|
||||
.tagcloud .very-popular { font-size: 1.9em; }
|
||||
.tagcloud .ultra-popular { font-size: 2.2em; }
|
@ -1,45 +0,0 @@
|
||||
# Blog Module
|
||||
|
||||
## Introduction
|
||||
|
||||
The blog module allows you to post blogs on your SilverStripe. It includes the ability to post blogs using a site front-end form. Blogs are summarised on the blog holder page type, with more detail viewable when a specific blog is clicked.
|
||||
|
||||
## Feature Overview
|
||||
|
||||
- Front-end blog post form
|
||||
- Posts allow bbcode
|
||||
- RSS feed for blog and also feeds for comments on posts
|
||||
- Easily customizable
|
||||
- Tag cloud widget
|
||||
- Archive widget
|
||||
- Blog management widget
|
||||
- RSS widget (will likely move in future)
|
||||
|
||||
## Page types
|
||||
|
||||
We have chosen to go with the following page types to include with the blog module:
|
||||
|
||||
- **BlogTree** This is a holder of BlogHolder. If your site has only one blog holder, you won't need this page type.
|
||||
- **BlogHolder** The BlogHolder shows BlogEntries, and provides a way to search etc.It would also contain methods to post new blogs.
|
||||
- BlogEntry: This is simply an entry/post for the blog.
|
||||
|
||||
## View Archived Blogs
|
||||
|
||||
Blog archives can be viewed by `year/month` by appending the year, followed by a forward slash, then the numerical month, to the end of the BlogHolder URL. Alternately, just the year can be appended to view entries for that year.
|
||||
|
||||
for example:
|
||||
|
||||
- `mysite/blog/2007/6` would show blog entries for June 2007
|
||||
- `mysite/blog/2007` would show blog entries for 2007
|
||||
|
||||
## Comments and Spam Protection
|
||||
|
||||
See [PageComment](http://doc.silverstripe.org/pagecomment).
|
||||
|
||||
## Widgets
|
||||
|
||||
See [Widgets](http://doc.silverstripe.org/widgets).
|
||||
|
||||
## Working with the theme
|
||||
|
||||
The blog comes set up to use the `\themes\blackcandy_blog\` directory by default. See [themes](http://doc.silverstripe.org/themes).
|
0
docs/_manifest_exclude
Normal file
BIN
docs/en/_images/blog-post-management.png
Normal file
After Width: | Height: | Size: 53 KiB |
16
docs/en/configuring-blog-posts.md
Normal 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
|
||||
```
|
13
docs/en/configuring-featured-images.md
Normal 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.
|
76
docs/en/configuring-large-websites.md
Normal 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.
|
||||
|
17
docs/en/configuring-notifications.md
Normal 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
|
||||
```
|
||||
|
5
docs/en/configuring-pagination.md
Normal 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).
|
12
docs/en/configuring-user-profiles.md
Normal 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
|
||||
```
|
18
docs/en/configuring-widgets.md
Normal 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
@ -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)
|
||||
|
BIN
docs/en/userguide/_images/blog-settings-pagination.png
Normal file
After Width: | Height: | Size: 326 KiB |
BIN
docs/en/userguide/_images/blogging-add-blog-post.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
docs/en/userguide/_images/blogging-add-blog.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
docs/en/userguide/_images/blogging-banner-summary.png
Normal file
After Width: | Height: | Size: 125 KiB |
BIN
docs/en/userguide/_images/blogging-options.png
Normal file
After Width: | Height: | Size: 161 KiB |
BIN
docs/en/userguide/_images/blogpost-add-tags-categories.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
docs/en/userguide/_images/comments.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
docs/en/userguide/_images/post-publish-date.png
Normal file
After Width: | Height: | Size: 114 KiB |
BIN
docs/en/userguide/_images/widgets-archive.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
docs/en/userguide/_images/widgets-categories.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
docs/en/userguide/_images/widgets-recent-posts.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
docs/en/userguide/_images/widgets-tags.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
docs/en/userguide/_images/widgets.png
Normal file
After Width: | Height: | Size: 82 KiB |
32
docs/en/userguide/adding-blog-posts.md
Normal 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)
|
9
docs/en/userguide/custom-publish-dates.md
Normal file
@ -0,0 +1,9 @@
|
||||
---
|
||||
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.
|
||||
|
||||
![](_images/post-publish-date.png)
|
20
docs/en/userguide/index.md
Normal 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)
|
14
docs/en/userguide/managing-comments.md
Normal 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)
|
9
docs/en/userguide/pagination.md
Normal 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)
|
47
docs/en/userguide/roles.md
Normal file
@ -0,0 +1,47 @@
|
||||
---
|
||||
title: Roles
|
||||
---
|
||||
|
||||
# Roles
|
||||
|
||||
Blog authoring and management can be delegated to users at up to three different levels. Users assigned to a blog
|
||||
using one of the below methods will be automatically assigned to the "Blog users" group and granted basic CMS access.
|
||||
|
||||
Note: If it's necessary to restrict access to non-blog pages to any of the below users, ensure that
|
||||
the "Who can edit pages on this site?" option under Settings is changed from "Anyone who can log-in to the CMS"
|
||||
to a specific selection of groups.
|
||||
|
||||
## Editor
|
||||
|
||||
An editor has control over specific Blogs, and their respective BlogPost subpages. Short of being able to assign
|
||||
other editors to a Blog, they are able to handle most changes to their assigned section.
|
||||
|
||||
Editors have these permissions:
|
||||
|
||||
* Update or Publish any BlogPost in their Blog
|
||||
* Update or Publish their Blog
|
||||
* Assign/Unassign writers to their Blog
|
||||
* Assign/Unassign contributors to their Blog
|
||||
* Assign/Unassign any member as an author of a particular BlogPost
|
||||
|
||||
## Writer
|
||||
|
||||
A writer is able to handle most tasks involving writing and publishing BlogPosts. While they
|
||||
are not able to edit a Blog directly, they are able to add new BlogPost entries within a Blog.
|
||||
They can't edit BlogPosts, however, that they are not been assigned to or have authored themselves.
|
||||
|
||||
Writers have these permissions:
|
||||
|
||||
* Update or Publish any BlogPost they have authored (or are assigned as author of)
|
||||
* Assign/Unassign any member as an author of a particular BlogPost they have authored
|
||||
(or are assigned as author of)
|
||||
|
||||
## Contributor
|
||||
|
||||
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.
|
||||
|
||||
Contributors have these permissions:
|
||||
|
||||
* Update or edit any BlogPost they have authored (or are assigned as author of)
|
7
docs/en/userguide/rss-feed.md
Normal file
@ -0,0 +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/
|
9
docs/en/userguide/tags-and-categories.md
Normal 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)
|
48
docs/en/userguide/using-widgets.md
Normal file
@ -0,0 +1,48 @@
|
||||
---
|
||||
title: Using widgets
|
||||
---
|
||||
|
||||
# Using Widgets
|
||||
|
||||
**This guide assumes you have the optional [Widgets](https://addons.silverstripe.org/add-ons/silverstripe/widgets/) module installed**
|
||||
|
||||
![](_images/widgets.png)
|
||||
|
||||
To add a widget - simply click the *plus* icon and the widget will be appear in the "Widgets currently used" column.
|
||||
|
||||
After you've finished adding widgets, publish your blog, and your freshly minted widgets will appear in your blog's sidebar.
|
||||
|
||||
## 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
|
||||
|
||||
The blog categories widget lets your readers easily find the content they're interested in.
|
||||
|
||||
![](_images/widgets-categories.png)
|
||||
|
||||
### Recent Posts
|
||||
|
||||
The recent posts widget is great for providing quick links to your latest content.
|
||||
|
||||
![](_images/widgets-recent-posts.png)
|
||||
|
||||
### 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)
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 689 B |
Before Width: | Height: | Size: 1.7 KiB |
@ -1,12 +0,0 @@
|
||||
(function($) {
|
||||
$.entwine('ss', function($){
|
||||
|
||||
$('#BBCodeHint').entwine({
|
||||
onclick: function() {
|
||||
$('#BBTagsHolder').toggle();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
}(jQuery));
|
||||
|
0
lang/_manifest_exclude
Executable file
106
lang/ar.yml
@ -1,79 +1,29 @@
|
||||
ar:
|
||||
ArchiveWidget:
|
||||
DispBY: "استعراض بواسطة"
|
||||
MONTH: "شهر"
|
||||
PLURALNAME: "مربعات الأرشيف"
|
||||
SINGULARNAME: "مربع الأرشيف"
|
||||
YEAR: "سنة"
|
||||
BlogEntry:
|
||||
AU: "الكاتب"
|
||||
BBH: "مساعدة BBCode"
|
||||
CN: "المحتوى"
|
||||
DT: "تاريخ"
|
||||
PLURALNAME: "تدوينات المدونة"
|
||||
SINGULARNAME: "تدوينة المدونة"
|
||||
TS: "وسوم (فاصلة,بين,الوسوم)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "التعليقات"
|
||||
EDITTHIS: "تحرير التدوينة"
|
||||
POSTEDBY: "نشرت بواسطة"
|
||||
POSTEDON: "في"
|
||||
TAGS: "الوسوم:"
|
||||
UNPUBLISHTHIS: "عدم نشر التدوينة"
|
||||
VIEWALLPOSTTAGGED: "عرض جميع التدوينات"
|
||||
BlogHolder:
|
||||
PLURALNAME: "حاويات المدونة"
|
||||
POST: "Post blog entry"
|
||||
RSSFEED: "RSS لهذه المدونة"
|
||||
SINGULARNAME: "حاوية المدونة"
|
||||
SJ: "الموضوع"
|
||||
SPUC: "فضلاً افصل بين الوسوم بفاصلة"
|
||||
SUCCONTENT: "مبروك, تم تركيب Silverstripe blog بنجاح. هذه المدونة يمكن حذفها بأمان.يمكن تعديل المدونة عبر عبر رابط [url=admin]إدارة المحتوى[/url]"
|
||||
SUCTAGS: "َsilverstripe , blog"
|
||||
SUCTITLE: "تم تركيب SilverStripe Blog بنجاح"
|
||||
TE: "مثال:رياضة,شخصية,علمية"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "لا يوجد مدخلات"
|
||||
VIEWINGTAGGED: "عرض المخلات الموسومة بـ"
|
||||
BlogManagementWidget:
|
||||
COMADM: "إدارة التعليقات"
|
||||
PLURALNAME: "مربعات إدارة المدونة"
|
||||
SINGULARNAME: "مربع إدارة المدونة"
|
||||
UNM1: "يوجد تعليق واحد لا يحتاج إلى موافقة"
|
||||
UNMM: "يوجد %i تعليقات لا تحتاج إلى موافقة"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "خروج"
|
||||
POSTNEW: "نشر تدوينة جديدة"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "التعليقات"
|
||||
POSTEDBY: "بواسطة"
|
||||
POSTEDON: "في"
|
||||
VIEWFULL: "عرض كامل التدوينة"
|
||||
BlogTree:
|
||||
# 50
|
||||
PLURALNAME: "Blog Tres"
|
||||
# 50
|
||||
SINGULARNAME: "Blog Tree"
|
||||
RSSWidget:
|
||||
CT: "العنوان المخصص للخلاصة"
|
||||
NTS: "عدد العناصر لعرضها"
|
||||
PLURALNAME: "مربعات الخلاصات RSS"
|
||||
SINGULARNAME: "مربع الخلاصات RSS"
|
||||
URL: "رابط الخلاصة"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "مربعات الاشتراك في الخلاصات RSS"
|
||||
SINGULARNAME: "مربع الاشتراك في الخلاصات RSS"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "اشتراك"
|
||||
SUBSCRIBETITLE: "الاشتراك في المدونة عن طريق الخلاصات RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "العدد المحدد للوسوم"
|
||||
PLURALNAME: "مربعات الوسوم السحابية"
|
||||
SBAL: "هجائي"
|
||||
SBFREQ: "تكرار"
|
||||
SINGULARNAME: "مربع الوسوم السحابيةَ"
|
||||
SORTBY: "ترتيب"
|
||||
TILE: "العنوان"
|
||||
TrackBackPing:
|
||||
PLURALNAME: "تنبيهات التعقيبات"
|
||||
SINGULARNAME: "تنبيه التعقيبات"
|
||||
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: عنوان
|
||||
|
53
lang/bg.yml
@ -1,53 +0,0 @@
|
||||
bg:
|
||||
ArchiveWidget:
|
||||
DispBY: "Покажи по"
|
||||
MONTH: "месец"
|
||||
YEAR: "година"
|
||||
BlogEntry:
|
||||
AU: "Автор"
|
||||
BBH: "BBCode помощ"
|
||||
CN: "Съдържание"
|
||||
DT: "Дата"
|
||||
TS: "Марки (разделени със запетайка)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Коментари"
|
||||
EDITTHIS: "Промени тази статия"
|
||||
POSTEDBY: "Публикувано от"
|
||||
POSTEDON: "на"
|
||||
TAGS: "Марки:"
|
||||
UNPUBLISHTHIS: "Премахни от публикация тази статия"
|
||||
VIEWALLPOSTTAGGED: "Прегледай всички маркирани статий"
|
||||
BlogHolder:
|
||||
POST: "Публикувай блог статия"
|
||||
RSSFEED: "RSS емисия за този блог"
|
||||
SJ: "Предмет"
|
||||
SPUC: "Моля разделете марките използвайки запетайки."
|
||||
SUCCONTENT: "Поздравления, SilverStripe blog модула беше инсталиран успешно. Тази блог статия може да бъде изтрита. Сега можете да конфигурирате аспектите на вашият блог (например кои widgets ще се показват) в [url=admin]CMS системата[/url]."
|
||||
SUCTAGS: "silverstripe, блог"
|
||||
SUCTITLE: "SilverStripe блог модул успешно инсталиран"
|
||||
TE: "Например: спорт, наука, здраве"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Няма никакви блог статий"
|
||||
VIEWINGTAGGED: "Разглеждане на статий маркирани с"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Администрация за коментари"
|
||||
UNM1: "Вие имате 1 непрегледан коментар"
|
||||
UNMM: "Вие имате %i непрегледани коментара"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Излез"
|
||||
POSTNEW: "Публикувайте нова блог статия"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Коментари"
|
||||
POSTEDBY: "Публикувано от"
|
||||
POSTEDON: "на"
|
||||
VIEWFULL: "Разгледай цялата статия"
|
||||
RSSWidget:
|
||||
CT: "Собствено заглавие за емисията"
|
||||
NTS: "Брой на предмети за показване"
|
||||
URL: "Адрес на RSS емисия"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Ограничете броя на тагове"
|
||||
SBAL: "азбука"
|
||||
SBFREQ: "честота"
|
||||
SORTBY: "Сортирай по"
|
||||
TILE: "Заглавие"
|
98
lang/cs.yml
@ -1,98 +0,0 @@
|
||||
cs:
|
||||
ArchiveWidget:
|
||||
DispBY: "Zobrazovat podle"
|
||||
MONTH: "měsíců"
|
||||
# 50
|
||||
PLURALNAME: "Doplněk - Archiv"
|
||||
# 50
|
||||
SINGULARNAME: "Doplňky - Archiv"
|
||||
YEAR: "roků"
|
||||
BlogEntry:
|
||||
AU: "Autor"
|
||||
BBH: "Nápověda k BBCode"
|
||||
CN: "Obsah"
|
||||
DT: "Datum"
|
||||
# 50
|
||||
PLURALNAME: "Blog - Příspěvek"
|
||||
# 50
|
||||
SINGULARNAME: "Blog - Příspěvky"
|
||||
TS: "Štítky (odděleno čárkou)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Komentáře"
|
||||
EDITTHIS: "Upravit příspěvek"
|
||||
POSTEDBY: "Napsal"
|
||||
POSTEDON: "v"
|
||||
TAGS: "Štítky:"
|
||||
UNPUBLISHTHIS: "Zneveřejnit tento příspěvek"
|
||||
VIEWALLPOSTTAGGED: "Zobrazit všehchny příspěvky se štítkem"
|
||||
BlogHolder:
|
||||
# 50
|
||||
PLURALNAME: "Blog - Kategorie"
|
||||
POST: "Vložit příspěvek"
|
||||
RSSFEED: "RSS vlákno těchto blogů"
|
||||
# 50
|
||||
SINGULARNAME: "Blog - Kategorie"
|
||||
SJ: "Předmět"
|
||||
SPUC: "Prosím oddělujte jednotlivé štítky pomocí čárky."
|
||||
SUCCONTENT: "Gratulujeme, modul SilverStripe blog byl úspěšně nainstalován. Tento příspěvek můžete bez obav smazat. Nastavení Vašeho blogu (Napříkad dopňky zobrazené v postranním menu) můžete upravit na adrese [url=admin]Administrace CMS[/url]."
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "Modul blog pro CMS SilverStripe byl úspěšně nainstalován"
|
||||
TE: "Například: sport, osobní, sci-fi"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Tento blog nemá žádné příspěvky."
|
||||
VIEWINGTAGGED: "Zobrazeny příspěvky obsahující štítek"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Správa obsahu"
|
||||
# 50
|
||||
PLURALNAME: "Doplňky - Správa blogu"
|
||||
# 50
|
||||
SINGULARNAME: "Doplňek - Správa blogu"
|
||||
UNM1: "Máte 1 nemoderovaný komentář"
|
||||
UNM2: "Máte 2 nemoderované komentáře"
|
||||
UNM3: "Máte 3 nemoderované komentáře"
|
||||
UNM4: "Máte 4 nemoderované komentáře"
|
||||
UNMM: "Máte %i nemoderovaných komentářů"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Odhlásit"
|
||||
POSTNEW: "Vložit nový příspěvek"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Komentáře"
|
||||
POSTEDBY: "Napsal"
|
||||
POSTEDON: "v"
|
||||
VIEWFULL: "Zobrazit celý příspěvek - "
|
||||
BlogTree:
|
||||
# 50
|
||||
PLURALNAME: "Blog - Strom blogů"
|
||||
# 50
|
||||
SINGULARNAME: "Blog - Strom blogů"
|
||||
RSSWidget:
|
||||
CT: "Vlastní titulek pro RSS vlákno"
|
||||
NTS: "Počet zobrazených položek"
|
||||
# 50
|
||||
PLURALNAME: "Doplněk - RSS"
|
||||
# 50
|
||||
SINGULARNAME: "Doplňky - RSS"
|
||||
URL: "URL adresa cizího RSS vlákna. Prosím ujistěte se, že tato URL vede opravdu na RSS vlákno."
|
||||
SubscribeRSSWidget:
|
||||
# 50
|
||||
PLURALNAME: "Doplněk - Přihlásit k odběru RSS"
|
||||
# 50
|
||||
SINGULARNAME: "Doplněk - Přihlásit k odběru RSS"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Odebírat"
|
||||
SUBSCRIBETITLE: "Přihlásit k odběru tohoto blogu pomocí RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Limit počtu štítků"
|
||||
# 50
|
||||
PLURALNAME: "Doplňky - Mrak štítků"
|
||||
SBAL: "abecedy"
|
||||
SBFREQ: "frekvence"
|
||||
# 50
|
||||
SINGULARNAME: "Doplněk - Mrak štítků"
|
||||
SORTBY: "Seřadit pdole"
|
||||
TILE: "Název"
|
||||
TrackBackPing:
|
||||
# 50
|
||||
PLURALNAME: "Track Back Pings"
|
||||
# 50
|
||||
SINGULARNAME: "Track Back Ping"
|
120
lang/da.yml
@ -1,93 +1,29 @@
|
||||
da:
|
||||
ArchiveWidget:
|
||||
DispBY: 'Vis efter'
|
||||
MONTH: måned
|
||||
PLURALNAME: 'Arkiv-widgets'
|
||||
SINGULARNAME: 'Arkiv-widget'
|
||||
YEAR: år
|
||||
BlogEntry:
|
||||
AU: Forfatter
|
||||
BBH: 'BBCode hjælp'
|
||||
CN: Indhold
|
||||
DT: Dato
|
||||
PLURALNAME: 'Blogindlæg Sider'
|
||||
SINGULARNAME: 'Blogindlæg Side'
|
||||
TS: 'Tags (kommasep.)'
|
||||
DESCRIPTION: 'Et enkelt blog-indlæg'
|
||||
BlogEntry_ss:
|
||||
COMMENTS: kommentarer
|
||||
EDITTHIS: 'Rediger dette indlæg'
|
||||
POSTEDBY: 'Indsendt af'
|
||||
TAGS: 'Tags:'
|
||||
UNPUBLISHTHIS: 'Upublicér dette indlæg'
|
||||
VIEWALLPOSTTAGGED: 'Vis alle indlæg tagged '
|
||||
BlogHolder:
|
||||
PLURALNAME: 'Blogholder Sider'
|
||||
POST: 'Send blog indlæg'
|
||||
RSSFEED: 'RSS feed af denne blog'
|
||||
SINGULARNAME: 'Blogholder Side'
|
||||
SJ: Emne
|
||||
SPUC: 'Husk at seperere tags med komma'
|
||||
SUCCONTENT: 'Tillykke, SilverStripe blog modul er installeret succesfuldt. Dette blog indlæg kan du trygt slette. Du kan konfigurere bloggen som du har lyst (f.eks. widgets placeret i sidepanelet)'
|
||||
SUCTAGS: 'Silverstripe, blog'
|
||||
SUCTITLE: 'SilverStripe Blog modul installeret succesfuldt'
|
||||
TE: 'F.eks. sport, personligt, science fiction'
|
||||
DESCRIPTION: 'Viser en liste af blogindlæg'
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: 'Der er ingen blog indlæg'
|
||||
VIEWINGTAGGED: 'Se indlæg tagged med'
|
||||
VIEWINGPOSTEDBY: 'Viser indlæg indsendt af'
|
||||
VIEWINGPOSTEDIN: 'Viser indlæg sendt ind af'
|
||||
BlogManagementWidget:
|
||||
COMADM: 'Kommentaradministration'
|
||||
PLURALNAME: 'Blog-administrations-widgets'
|
||||
SINGULARNAME: 'Blog-administrations-widget'
|
||||
UNM1: 'Du har 1 uvurderet kommentar'
|
||||
UNMM: 'Du har %i uvurderede kommentarer'
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: Log ud
|
||||
POSTNEW: 'Send et nyt blog indlæg'
|
||||
BlogSummary_ss:
|
||||
COMMENTS: kommentarer
|
||||
POSTEDBY: 'Indsendt af'
|
||||
VIEWFULL: 'Se hele indlægget med titlen -'
|
||||
READFULLPOST: 'Læs hele indlægget'
|
||||
SUMMARYCOMMENTS: kommentar(er)
|
||||
TAGS: Tags
|
||||
BlogTree:
|
||||
PLURALNAME: 'Blogtræ Sider'
|
||||
SINGULARNAME: 'Blogtræ Side'
|
||||
DESCRIPTION: 'En gruppe af blogs'
|
||||
RSSWidget:
|
||||
CT: 'Brugerdefineret title for dette feed'
|
||||
NTS: 'Antal af viste indlæg '
|
||||
PLURALNAME: 'RSS-widgets'
|
||||
SINGULARNAME: 'RSS-widget'
|
||||
URL: 'URL eller RSS Feed'
|
||||
DEFAULTTITLE: 'RSS Feed'
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: 'Abonnér på RSS-widgets'
|
||||
SINGULARNAME: 'Abonnér på RSS-widget'
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: Abonnér
|
||||
SUBSCRIBETITLE: 'Abonnér på denne blog via RSS'
|
||||
TagCloudWidget:
|
||||
LIMIT: 'Begrænsning af antalle af tags'
|
||||
PLURALNAME: 'Tagcloud-widgets'
|
||||
SBAL: alfabet
|
||||
SBFREQ: frekvens
|
||||
SINGULARNAME: 'Tagcloud-widget'
|
||||
SORTBY: 'Sorter efter'
|
||||
TILE: Titel
|
||||
DEFAULTTITLE: 'Tagcloud'
|
||||
TrackBackPing:
|
||||
PLURALNAME: 'Track Back Ping'
|
||||
SINGULARNAME: 'Track Back Ping'
|
||||
BlogTree_ss:
|
||||
NOENTRIES: 'Der er ingen blog indlæg'
|
||||
VIEWINGPOSTEDBY: 'Viser indlæg indsendt af'
|
||||
VIEWINGPOSTEDIN: 'Viser indlæg indsendt af'
|
||||
VIEWINGTAGGED: 'Se indlæg tagged med'
|
||||
SiteTree:
|
||||
PLURALNAME: Sider
|
||||
SINGULARNAME: Side
|
||||
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'
|
||||
|
228
lang/de.yml
@ -1,74 +1,156 @@
|
||||
de:
|
||||
ArchiveWidget:
|
||||
DispBY: "Anzeige nach"
|
||||
MONTH: "Monat"
|
||||
PLURALNAME: "Archiv-Widgets"
|
||||
SINGULARNAME: "Archiv-Widget"
|
||||
YEAR: "Jahr"
|
||||
BlogEntry:
|
||||
AU: "Autor"
|
||||
BBH: "BBCode Hilfe"
|
||||
CN: "Inhalt"
|
||||
DT: "Datum"
|
||||
PLURALNAME: "Blog-Einträge"
|
||||
SINGULARNAME: "Blog-Eintrag"
|
||||
TS: "Tags (Komma getrennt)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Kommentare"
|
||||
EDITTHIS: "Eintrag bearbeiten"
|
||||
POSTEDBY: "Eintrag von"
|
||||
POSTEDON: "am"
|
||||
TAGS: "Tags:"
|
||||
UNPUBLISHTHIS: "Eintrag zurückziehen"
|
||||
VIEWALLPOSTTAGGED: "Alle Beiträge mit Tag"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Blog-Besitzer"
|
||||
POST: "Eintrag senden"
|
||||
RSSFEED: "RSS Feed dieser Blogs"
|
||||
SINGULARNAME: "Blog-Besitzer"
|
||||
SJ: "Betreff"
|
||||
SPUC: "Bitte Tags mit Kommata trennen."
|
||||
SUCCONTENT: "Herzlichen Glückwunsch, das SilverStripe Blog Modul wurde erfolgreich installiert. Dieser Blog-Eintrag kann sicher gelöscht werden. Sie können die Blog-Einstellungen (z.B. die angezeigten Widgets in der Sidebar) im admin-Bereich verändern."
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "SilverStripe Blog Module erfolgreich installiert"
|
||||
TE: "Zum Beispiel: sport, musik, video"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Es gibt keine Blog Einträge"
|
||||
VIEWINGTAGGED: "Anzeige der Einträge mit Tag"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Kommentare bearbeiten"
|
||||
PLURALNAME: "Blog-Verwaltungs-Widgets"
|
||||
SINGULARNAME: "Blog-Verwaltungs-Widget"
|
||||
UNM1: "Sie haben 1 noch nicht moderierten Kommentar"
|
||||
UNMM: "Sie haben %i noch nicht moderierte Kommentare"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Logout"
|
||||
POSTNEW: "Neuen Eintrag schreiben"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Kommentare"
|
||||
POSTEDBY: "Verfasst von"
|
||||
POSTEDON: "am"
|
||||
VIEWFULL: "Detaillierte Ansicht von dem Titel --"
|
||||
RSSWidget:
|
||||
CT: "Eigener Titel für den feed"
|
||||
NTS: "Anzahl der angezeigten Items"
|
||||
PLURALNAME: "RSS-Widgets"
|
||||
SINGULARNAME: "RSS-Widget"
|
||||
URL: "URL des RSS Feed der anderen Seite. Bitte vergewissern Sie sich, dass diese URL auf einen RSS Feed verweist."
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "RSS-Abonnier-Widgets"
|
||||
SINGULARNAME: "RSS-Abonnier-Widget"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Abonnieren"
|
||||
SUBSCRIBETITLE: "Abonniere diesen Blog per RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Anzahl der erlaubten Tags"
|
||||
PLURALNAME: "Tag-Cloud-Widgets"
|
||||
SBAL: "Alphabet"
|
||||
SBFREQ: "Häufigkeit"
|
||||
SINGULARNAME: "Tag-Cloud-Widget"
|
||||
SORTBY: "Sortiert nach"
|
||||
TILE: "Titel"
|
||||
TrackBackPing:
|
||||
PLURALNAME: "Ping-Verfolgung"
|
||||
SINGULARNAME: "Ping-Verfolgung"
|
||||
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'
|
||||
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'
|
||||
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
|
||||
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
|
||||
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
|
||||
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'
|
||||
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
|
||||
Blog: Blog
|
||||
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.'
|
||||
|
275
lang/en.yml
@ -1,95 +1,182 @@
|
||||
en:
|
||||
ArchiveWidget:
|
||||
DispBY: 'Display by'
|
||||
MONTH: month
|
||||
PLURALNAME: 'Archive Widgets'
|
||||
SINGULARNAME: 'Archive Widget'
|
||||
YEAR: year
|
||||
BlogEntry:
|
||||
AU: Author
|
||||
BBH: 'BBCode help'
|
||||
CN: Content
|
||||
DT: Date
|
||||
PLURALNAME: 'Blog Entry Pages'
|
||||
SINGULARNAME: 'Blog Entry Page'
|
||||
TS: 'Tags (comma sep.)'
|
||||
DESCRIPTION: 'An individual blog entry'
|
||||
BlogEntry_ss:
|
||||
COMMENTS: Comments
|
||||
EDITTHIS: 'Edit this post'
|
||||
POSTEDBY: 'Posted by'
|
||||
POSTEDON: on
|
||||
TAGS: 'Tags:'
|
||||
UNPUBLISHTHIS: 'Unpublish this post'
|
||||
VIEWALLPOSTTAGGED: 'View all posts tagged'
|
||||
BlogHolder:
|
||||
PLURALNAME: 'Blog Holder Pages'
|
||||
POST: 'Post blog entry'
|
||||
RSSFEED: 'RSS feed of these blogs'
|
||||
SINGULARNAME: 'Blog Holder Page'
|
||||
SJ: Subject
|
||||
SPUC: 'Please separate tags using commas.'
|
||||
SUCCONTENT: '<p>Congratulations, the SilverStripe blog module has been successfully installed. This blog entry can be safely deleted. You can configure aspects of your blog in <a href="admin">the CMS</a>.</p>'
|
||||
SUCTAGS: 'silverstripe, blog'
|
||||
SUCTITLE: 'SilverStripe blog module successfully installed'
|
||||
TE: 'For example: sport, personal, science fiction'
|
||||
DESCRIPTION: 'Displays listings of blog entries'
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: 'There are no blog entries'
|
||||
VIEWINGTAGGED: 'Viewing entries tagged with'
|
||||
VIEWINGPOSTEDBY: 'Viewing entries posted by'
|
||||
VIEWINGPOSTEDIN: 'Viewing entries posted in'
|
||||
BlogManagementWidget:
|
||||
COMADM: 'Comment administration'
|
||||
PLURALNAME: 'Blog Management Widgets'
|
||||
SINGULARNAME: 'Blog Management Widget'
|
||||
UNM1: 'You have 1 unmoderated comment'
|
||||
UNMM: 'You have %i unmoderated comments'
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: Logout
|
||||
POSTNEW: 'Post a new blog entry'
|
||||
BlogSummary_ss:
|
||||
COMMENTS: Comments
|
||||
POSTEDBY: 'Posted by'
|
||||
POSTEDON: on
|
||||
VIEWFULL: 'View full post titled -'
|
||||
READFULLPOST: 'Read the full post'
|
||||
SUMMARYCOMMENTS: comment(s)
|
||||
TAGS: Tags
|
||||
BlogTree:
|
||||
PLURALNAME: 'Blog Tree Pages'
|
||||
SINGULARNAME: 'Blog Tree Page'
|
||||
DESCRIPTION: 'A grouping of blogs'
|
||||
RSSWidget:
|
||||
CT: 'Custom title for the feed'
|
||||
NTS: 'Number of Items to show'
|
||||
PLURALNAME: 'R S S Widgets'
|
||||
SINGULARNAME: 'R S S Widget'
|
||||
URL: 'URL of the other page''s RSS feed. Please make sure this URL points to an RSS feed.'
|
||||
DEFAULTTITLE: 'RSS Feed'
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: 'Subscribe R S S Widgets'
|
||||
SINGULARNAME: 'Subscribe R S S Widget'
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: Subscribe
|
||||
SUBSCRIBETITLE: 'Subscribe to this blog via RSS'
|
||||
TagCloudWidget:
|
||||
LIMIT: 'Limit number of tags'
|
||||
PLURALNAME: 'Tag Cloud Widgets'
|
||||
SBAL: alphabet
|
||||
SBFREQ: frequency
|
||||
SINGULARNAME: 'Tag Cloud Widget'
|
||||
SORTBY: 'Sort by'
|
||||
TILE: Title
|
||||
DEFAULTTITLE: 'Tag Cloud'
|
||||
TrackBackPing:
|
||||
PLURALNAME: 'Track Back Pings'
|
||||
SINGULARNAME: 'Track Back Ping'
|
||||
BlogTree_ss:
|
||||
NOENTRIES: 'There are no blog entries'
|
||||
VIEWINGPOSTEDBY: 'Viewing entries posted by'
|
||||
VIEWINGPOSTEDIN: 'Viewing entries posted in'
|
||||
VIEWINGTAGGED: 'Viewing entries tagged with'
|
||||
SiteTree:
|
||||
PLURALNAME: Pages
|
||||
SINGULARNAME: Page
|
||||
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.'
|
||||
EDITOR: Editor
|
||||
FILTERDESCRIPTION_AUTHOR: 'By {author}'
|
||||
FILTERDESCRIPTION_CATEGORY: 'In category {category}'
|
||||
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
|
||||
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'
|
||||
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
|
||||
Blog: Blog
|
||||
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: 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'
|
||||
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
|
||||
Blog: Blog
|
||||
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: Sort
|
||||
Sort_Description: 'Change the order of tags shown by this widget.'
|
||||
|
@ -1,74 +0,0 @@
|
||||
en_GB:
|
||||
ArchiveWidget:
|
||||
DispBY: "Display by"
|
||||
MONTH: "month"
|
||||
PLURALNAME: "Archive Widgets"
|
||||
SINGULARNAME: "Archive Widget"
|
||||
YEAR: "year"
|
||||
BlogEntry:
|
||||
AU: "Author"
|
||||
BBH: "BBCode help"
|
||||
CN: "Content"
|
||||
DT: "Date"
|
||||
PLURALNAME: "Blog Entries"
|
||||
SINGULARNAME: "Blog Entry"
|
||||
TS: "Tags (comma sep.)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Comments"
|
||||
EDITTHIS: "Edit this post"
|
||||
POSTEDBY: "Posted by"
|
||||
POSTEDON: "on"
|
||||
TAGS: "Tags:"
|
||||
UNPUBLISHTHIS: "Unpublish this post"
|
||||
VIEWALLPOSTTAGGED: "View all posts tagged"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Blog Holders"
|
||||
POST: "Post blog entry"
|
||||
RSSFEED: "RSS feed of this blog"
|
||||
SINGULARNAME: "Blog Holder"
|
||||
SJ: "Subject"
|
||||
SPUC: "Please separate tags using commas."
|
||||
SUCCONTENT: "Congratulations, the SilverStripe blog module has been successfully installed. This blog entry can be safely deleted. You can configure aspects of your blog (such as the widgets displayed in the sidebar) in [url=admin]the CMS[/url]."
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "SilverStripe blog module successfully installed"
|
||||
TE: "For example: sport, personal, science fiction"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "There are no blog entries"
|
||||
VIEWINGTAGGED: "Viewing entries tagged with"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Comment administration"
|
||||
PLURALNAME: "Blog Management Widgets"
|
||||
SINGULARNAME: "Blog Management Widget"
|
||||
UNM1: "You have 1 unmoderated comment"
|
||||
UNMM: "You have %i unmoderated comments"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Logout"
|
||||
POSTNEW: "Post a new blog entry"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Comments"
|
||||
POSTEDBY: "Posted by"
|
||||
POSTEDON: "on"
|
||||
VIEWFULL: "View full post titled -"
|
||||
RSSWidget:
|
||||
CT: "Custom title for the feed"
|
||||
NTS: "Number of Items to show"
|
||||
PLURALNAME: "RSS Widgets"
|
||||
SINGULARNAME: "RSS Widget"
|
||||
URL: "URL of RSS Feed"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "Subscript to RSS Widgets"
|
||||
SINGULARNAME: "Subscript to an RSS Widget"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Subscribe"
|
||||
SUBSCRIBETITLE: "Subscribe to this blog via RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Limit number of tags"
|
||||
PLURALNAME: "Tag Cloud Widgets"
|
||||
SBAL: "alphabet"
|
||||
SBFREQ: "frequency"
|
||||
SINGULARNAME: "Tag Cloud Widget"
|
||||
SORTBY: "Sort by"
|
||||
TILE: "Title"
|
||||
TrackBackPing:
|
||||
PLURALNAME: "Track Back Pings"
|
||||
SINGULARNAME: "Track Back Ping"
|
182
lang/eo.yml
Normal file
@ -0,0 +1,182 @@
|
||||
eo:
|
||||
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.'
|
||||
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
|
||||
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'
|
||||
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'
|
||||
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 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'
|
||||
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'
|
||||
Sort: Ordigi
|
||||
Sort_Description: 'Ŝanĝi la ordon de etikedoj vidigotaj de tiu fenestraĵo.'
|
202
lang/es.yml
@ -1,74 +1,130 @@
|
||||
es:
|
||||
ArchiveWidget:
|
||||
DispBY: "Mostrar por"
|
||||
MONTH: "mes"
|
||||
PLURALNAME: "Archivar Widgets"
|
||||
SINGULARNAME: "Archivar Widget"
|
||||
YEAR: "año"
|
||||
BlogEntry:
|
||||
AU: "Autor"
|
||||
BBH: "BBCode ayuda"
|
||||
CN: "Contenido"
|
||||
DT: "Fecha"
|
||||
PLURALNAME: "Entradas del Blog"
|
||||
SINGULARNAME: "Entrada del Blog"
|
||||
TS: "Etiquetas (separados por comas)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Comentarios"
|
||||
EDITTHIS: "Editar esta entrada"
|
||||
POSTEDBY: "Publicado por"
|
||||
POSTEDON: "en"
|
||||
TAGS: "Etiquetas:"
|
||||
UNPUBLISHTHIS: "Retirar esta entrada"
|
||||
VIEWALLPOSTTAGGED: "Ver todas las publicaciones etiquetadas"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Contenedores de Blog"
|
||||
POST: "Entrada del blog"
|
||||
RSSFEED: "RSS feed de este blog"
|
||||
SINGULARNAME: "Contenedor de Blog"
|
||||
SJ: "Asunto"
|
||||
SPUC: "Por favor, separa las etiquetas mediante comas."
|
||||
SUCCONTENT: "Felicitaciones, el módulo de blog de SilverStripe ha sido instalado correctamente. Esta entrada puede ser eliminada. Puedes configurar aspectos de tu blog (como los widgets mostrados en la barra lateral) en [url=admin]el CMS[/url]."
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "El módulo de blog de SilverStripe ha sido instalado correctamente"
|
||||
TE: "Por ejemplo: deporte, cine, tecnología"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "No hay entradas"
|
||||
VIEWINGTAGGED: "Ver entrada etiquetadas como"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Administración de comentarios"
|
||||
PLURALNAME: "Widgets de gestión del Blog"
|
||||
SINGULARNAME: "Widget de gestión del Blog"
|
||||
UNM1: "Tienes 1 comentario sin moderar"
|
||||
UNMM: "Tienes %i comentarios sin moderar"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Salir"
|
||||
POSTNEW: "Escribir una nueva entrada del blog"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Comentarios"
|
||||
POSTEDBY: "Publicado por"
|
||||
POSTEDON: "en"
|
||||
VIEWFULL: "Ver completo el post titulado -"
|
||||
RSSWidget:
|
||||
CT: "Título personalizado para el feed"
|
||||
NTS: "Número de registros para mostrar"
|
||||
PLURALNAME: "Widgets RSS"
|
||||
SINGULARNAME: "Widget RSS"
|
||||
URL: "URL del RSS Feed"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "Suscribir a Widgets RSS"
|
||||
SINGULARNAME: "Suscribir a Widget RSS"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Suscribir"
|
||||
SUBSCRIBETITLE: "Suscribirse a este blog vía RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Limitar el número de etiquetas"
|
||||
PLURALNAME: "Nube de Etiquetas de Widgets"
|
||||
SBAL: "alfabeto"
|
||||
SBFREQ: "frecuencia"
|
||||
SINGULARNAME: "Nube de Etiquetas de Widget"
|
||||
SORTBY: "Ordenar por"
|
||||
TILE: "Título"
|
||||
TrackBackPing:
|
||||
PLURALNAME: "Notificaciones de Trackback"
|
||||
SINGULARNAME: "Notificación de Trackback"
|
||||
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'
|
||||
|
@ -1,74 +0,0 @@
|
||||
es_MX:
|
||||
ArchiveWidget:
|
||||
DispBY: "Mostrar por"
|
||||
MONTH: "mes"
|
||||
PLURALNAME: "Archivos de Widgets"
|
||||
SINGULARNAME: "Archivo de Widget"
|
||||
YEAR: "año"
|
||||
BlogEntry:
|
||||
AU: "Autor"
|
||||
BBH: "Ayuda de BBCode"
|
||||
CN: "Contenido"
|
||||
DT: "Fecha"
|
||||
PLURALNAME: "Entradas del Blog"
|
||||
SINGULARNAME: "Entrada del BLog"
|
||||
TS: "Etiquetas (separadas por coma)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Comentarios"
|
||||
EDITTHIS: "Editar este mensaje"
|
||||
POSTEDBY: "Enviado por"
|
||||
POSTEDON: "en"
|
||||
TAGS: "Etiquetas:"
|
||||
UNPUBLISHTHIS: "Ocultar este mensaje"
|
||||
VIEWALLPOSTTAGGED: "Ver todos los mensajes marcados con la etiqueta"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Titulares del Blog"
|
||||
POST: "Enviar entrada a la bitácora"
|
||||
RSSFEED: "Alimentar al RSS con esta bitácora"
|
||||
SINGULARNAME: "Titular del Blog"
|
||||
SJ: "Asunto"
|
||||
SPUC: "Por favor separa etiquetas utilizando comas."
|
||||
SUCCONTENT: "Felicidades, el módulo bitácora de Silverstripe se ha instalado satisfactoriamente. Esta entrada de la bitácora se puede eliminar con seguridad. Puedes configurar aspectos de tu nueva bitácora (tal cómo reproductores mostrados en la barra lateral) en [url=admin] el CMS[/url]."
|
||||
SUCTAGS: "bitácora, silverstripe"
|
||||
SUCTITLE: "El Módulo bitácora Silverstripe se ha instalado satisfactoriamente."
|
||||
TE: "Por ejemplo: deportes, personal. ciencia ficción"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Bitácora vacía"
|
||||
VIEWINGTAGGED: "Ver entradas etiquetadas con"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Administración de comentarios"
|
||||
PLURALNAME: "Widget para la Gestión de Blogs"
|
||||
SINGULARNAME: "Wisdget para la Gestion del Blog"
|
||||
UNM1: "Tienes 1 comentario pendiente de moderación"
|
||||
UNMM: "Tienes %i comentarios pendientes de moderación"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Salir"
|
||||
POSTNEW: "Enviar nueva entrada a la bitácora"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Comentarios"
|
||||
POSTEDBY: "Enviado por"
|
||||
POSTEDON: "en"
|
||||
VIEWFULL: "Ver completo el mensaje titulado -"
|
||||
RSSWidget:
|
||||
CT: "Título personalizado para el alimentador"
|
||||
NTS: "Número de elementos a mostrar:"
|
||||
PLURALNAME: "Widgets R S S"
|
||||
SINGULARNAME: "Widget R S S"
|
||||
URL: "URL del RSS alimentado"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "Widgets para Suscripción R S S"
|
||||
SINGULARNAME: "Widget para Suscrición R S S"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Suscribe"
|
||||
SUBSCRIBETITLE: "Suscribirme a este blog vía RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Limitar el número de etiquetas"
|
||||
PLURALNAME: "Widgets de Nube de Etiquetas"
|
||||
SBAL: "alfabeto"
|
||||
SBFREQ: "frecuencia"
|
||||
SINGULARNAME: "Widget Nube de Etiquetas"
|
||||
SORTBY: "Ordenar por"
|
||||
TILE: "Título"
|
||||
TrackBackPing:
|
||||
PLURALNAME: "Volver a la Pista de Pings"
|
||||
SINGULARNAME: "Volver a la Pista de Pings"
|
@ -1,74 +0,0 @@
|
||||
et_EE:
|
||||
ArchiveWidget:
|
||||
DispBY: "Kuva"
|
||||
MONTH: "kuu"
|
||||
PLURALNAME: "Arhiveeri vidinad"
|
||||
SINGULARNAME: "Arhiveeri vidin"
|
||||
YEAR: "aasta"
|
||||
BlogEntry:
|
||||
AU: "Autor"
|
||||
BBH: "BBCode spikker"
|
||||
CN: "Sisu"
|
||||
DT: "Kuupäev"
|
||||
PLURALNAME: "Blogi sisu"
|
||||
SINGULARNAME: "Blogi sisu"
|
||||
TS: "Sildid (komaga eraldatud)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Kommentaarid"
|
||||
EDITTHIS: "Muuda seda postitust"
|
||||
POSTEDBY: "Autori"
|
||||
POSTEDON: "poolt"
|
||||
TAGS: "Sildid:"
|
||||
UNPUBLISHTHIS: "Muuda see postitus avaldamatuks"
|
||||
VIEWALLPOSTTAGGED: "Vaata kõiki postitusi siltidega"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Blogi omanikud"
|
||||
POST: "Postita blogi sissekanne"
|
||||
RSSFEED: "Selle blogi RSS voog"
|
||||
SINGULARNAME: "Blogi omanik"
|
||||
SJ: "Teema"
|
||||
SPUC: "Palun eralda sildid komadega."
|
||||
SUCCONTENT: "Õnnitleme, SilverStripe blogimoodul on edukalt installeeritud. Selle blogi sissekande võib ohutult ära kustutada. Oma blogi ilmet (nagu küljeribal kuvatavaid vidinaid) saad seadistada [url=admin]sisuhaldussüsteemi kaudu[/url]."
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "SilverStripe blogimoodul edukalt installeeritud"
|
||||
TE: "Näiteks: sport, isiklik, teaduslik fantastika"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Blogi sissekanded puuduvad"
|
||||
VIEWINGTAGGED: "Kuvatakse sissekandeid siltidega"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Kommentaaride haldamine"
|
||||
PLURALNAME: "Blogi Muudatuse vidinad"
|
||||
SINGULARNAME: "Blogi muudatuste vidin"
|
||||
UNM1: "Sul on 1 üle vaatamata kommentaar"
|
||||
UNMM: "Sul on %i üle vaatamata kommentaari"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Logi välja"
|
||||
POSTNEW: "Postita uus blogi sissekanne"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Kommentaarid"
|
||||
POSTEDBY: "Postitas"
|
||||
POSTEDON: "-"
|
||||
VIEWFULL: "Vaata tervet postitust pealkirjaga - "
|
||||
RSSWidget:
|
||||
CT: "Kohandatud pealkiri voole"
|
||||
NTS: "Kuvatavate sissekannete arv"
|
||||
PLURALNAME: "RSS vidinad"
|
||||
SINGULARNAME: "RSS vidin"
|
||||
URL: "URL või RSS voog"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "Telli RSS Vidinad"
|
||||
SINGULARNAME: "Telli RSS Vidin"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Telli"
|
||||
SUBSCRIBETITLE: "Telli blogi RSS kaudu"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Piira siltide arvu"
|
||||
PLURALNAME: "Lipikute pilve vidinad"
|
||||
SBAL: "tähestikuliselt"
|
||||
SBFREQ: "sageduse järgi"
|
||||
SINGULARNAME: "Lipikute pilve vidin"
|
||||
SORTBY: "Sorteeri"
|
||||
TILE: "Pealkiri"
|
||||
TrackBackPing:
|
||||
PLURALNAME: "Pingid"
|
||||
SINGULARNAME: "Ping"
|
114
lang/fa_IR.yml
Normal 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: 'تغییر ترتیب تگهای نمایش دادهشده توسط این ویجت'
|
260
lang/fi.yml
Normal file → Executable file
@ -1,98 +1,164 @@
|
||||
fi:
|
||||
ArchiveWidget:
|
||||
DispBY: "Näytä »"
|
||||
MONTH: "kuukausi"
|
||||
# 50
|
||||
PLURALNAME: "Arkistovimpaimet"
|
||||
# 50
|
||||
SINGULARNAME: "Arkistovimpain"
|
||||
YEAR: "vuosi"
|
||||
BlogEntry:
|
||||
AU: "Kirjoittaja"
|
||||
BBH: "BBCode apu"
|
||||
CN: "Sisältö"
|
||||
DT: "Pvm"
|
||||
# 50
|
||||
PLURALNAME: "Blogikirjoitukset"
|
||||
# 50
|
||||
SINGULARNAME: "Blogikirjoitus"
|
||||
TS: "Avainsanat (erottimena pilkku)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Kommentit"
|
||||
EDITTHIS: "Muokkaa tätä kirjoitusta"
|
||||
POSTEDBY: "Lähettäjä"
|
||||
POSTEDON: "»"
|
||||
TAGS: "Avainsanat:"
|
||||
UNPUBLISHTHIS: "Poista julkaisusta"
|
||||
VIEWALLPOSTTAGGED: "Näytä kaikki tägätyt kirjoitukset"
|
||||
BlogHolder:
|
||||
# 50
|
||||
PLURALNAME: "Blogin koontisivut"
|
||||
POST: "Kirjoita blogi"
|
||||
RSSFEED: "RSS-syöte näistä blogeista"
|
||||
# 50
|
||||
SINGULARNAME: "Blogin koontisivu"
|
||||
SJ: "Aihe"
|
||||
SPUC: "Erota avainsanat pilkulla."
|
||||
SUCCONTENT: "Onnittelut, SilverStripe blogimoduuli on asennettu onnistuneesti. Voit poistaa tämän blogikirjoituksen turvallisesti. Voit säätää blogin toiminnaliisuuksia (kuten sivupalkin toiminnallisuuksia) ylläpidosta [url=admin]the CMS[/url]."
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "SilverStripe blogimoduuli asennettu onnistuneesti"
|
||||
TE: "Esim. urheilu, henkilökohtainen, sci-fi"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Ei blogikirjoituksia"
|
||||
VIEWINGTAGGED: "Näytä kirjoitukset tällä avainsanalla"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Kommenttien moderointi"
|
||||
# 50
|
||||
PLURALNAME: "Blogin hallinnointivimpaimet"
|
||||
# 50
|
||||
SINGULARNAME: "Blogin hallinnointivimpain"
|
||||
UNM1: "Sinulla on yksi moderoimaton kommentti"
|
||||
UNMM: "Sinulla on %i moderoimatonta kommenttia"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Kirjaudu ulos"
|
||||
POSTNEW: "Kirjoita uusi blogiteksti"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Kommentit"
|
||||
POSTEDBY: "Lähettänyt »"
|
||||
POSTEDON: "pvm"
|
||||
READFULLPOST: 'Lue koko kirjoitus'
|
||||
SUMMARYCOMMENTS: 'kommentti(a)'
|
||||
TAGS: 'Avainsanat:'
|
||||
VIEWFULL: "Näytä koko kirjoitus otsikolla -"
|
||||
BlogTree:
|
||||
# 50
|
||||
PLURALNAME: "Blogi hakemistopuut"
|
||||
# 50
|
||||
SINGULARNAME: "Blogihakemistopuu"
|
||||
RSSWidget:
|
||||
CT: "Oma otsikko syötteelle"
|
||||
NTS: "Montako kohdetta näytetään"
|
||||
# 50
|
||||
PLURALNAME: "R S S vimpain"
|
||||
# 50
|
||||
SINGULARNAME: "R S S vimpain"
|
||||
URL: "Toisen sivuston URL-osoite RSS syötteeseen. Varmistathan, että osoite on RSS-syötteeseen."
|
||||
SubscribeRSSWidget:
|
||||
# 50
|
||||
PLURALNAME: "Tilaa R S S vimpaimet"
|
||||
# 50
|
||||
SINGULARNAME: "Tilaa R S S vimpain"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Tilaa"
|
||||
SUBSCRIBETITLE: "Tilaa tämän blogin RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Rajoita avainsanojen määrää"
|
||||
# 50
|
||||
PLURALNAME: "Avainsanapilvi vimpaimet"
|
||||
SBAL: "aakkoset"
|
||||
SBFREQ: "toistuvuus"
|
||||
# 50
|
||||
SINGULARNAME: "Avainsanapilvi vimpain"
|
||||
SORTBY: "Järjestä"
|
||||
TILE: "Otsikko"
|
||||
TrackBackPing:
|
||||
# 50
|
||||
PLURALNAME: "Track Back Pings"
|
||||
# 50
|
||||
SINGULARNAME: "Track Back Ping"
|
||||
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.'
|
||||
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'
|
||||
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_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.'
|
||||
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: 'Ä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: 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
@ -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
|
186
lang/fr.yml
@ -1,71 +1,117 @@
|
||||
fr:
|
||||
ArchiveWidget:
|
||||
DispBY: "Afficher par"
|
||||
MONTH: "mois"
|
||||
PLURALNAME: "Widgets Archive"
|
||||
SINGULARNAME: "Widget Archive"
|
||||
YEAR: "années"
|
||||
BlogEntry:
|
||||
AU: "Auteur"
|
||||
BBH: "Aide BBCode"
|
||||
CN: "Contenu"
|
||||
DT: "Date"
|
||||
PLURALNAME: "Billets de blog"
|
||||
SINGULARNAME: "Billet de blog"
|
||||
TS: "Tags (Séparer par une virgule)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Commentaires"
|
||||
EDITTHIS: "Modifier ce message"
|
||||
POSTEDBY: "Posté par"
|
||||
POSTEDON: "sur"
|
||||
TAGS: "Tags:"
|
||||
UNPUBLISHTHIS: "Dépublier ce message"
|
||||
VIEWALLPOSTTAGGED: "Voir tous les messages marqués"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Conteneurs Blogs"
|
||||
POST: "Poster une entrée sur le blog"
|
||||
RSSFEED: "Flux RSS de ce blog"
|
||||
SINGULARNAME: "Conteneur Blog"
|
||||
SJ: "Sujet"
|
||||
SPUC: "Veuillez séparer les tags en utilisant une virgule"
|
||||
SUCCONTENT: "Félicitations, le module de blog SilverStripe a été installé avec succès. Cette entrée du blog peut être supprimée sans problème. Vous pouvez configurer les aspects de votre blog (comme les gadgets affichés dans la barre de coté) dans [url=admin]le CMS[/url]."
|
||||
SUCTAGS: "blog, silverStripe"
|
||||
SUCTITLE: "Le module de blog SilverStripe a été installé avec succès"
|
||||
TE: "Par exemple: sport, personnel, science fiction"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Il n'y a aucune entrée dans le blog"
|
||||
VIEWINGTAGGED: "Affichage des entrées marquées avec"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Administration des commentaires"
|
||||
PLURALNAME: "Widgets de Management Blog"
|
||||
SINGULARNAME: "Widget de Management Blog"
|
||||
UNM1: "Vous avez 1 commentaire non modéré"
|
||||
UNMM: "Vous avez %i commentaires non modérés"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Déconnexion"
|
||||
POSTNEW: "Publier une nouvelle entrée dans le blog"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Commentaires"
|
||||
POSTEDBY: "Posté par"
|
||||
POSTEDON: "sur"
|
||||
VIEWFULL: "Voir le titre du post en entier -"
|
||||
RSSWidget:
|
||||
CT: "Titre personnalisé pour le flux"
|
||||
NTS: "Nombre d'éléments à afficher"
|
||||
PLURALNAME: "Widgets de flux RSS"
|
||||
SINGULARNAME: "Widget de flux RSS"
|
||||
URL: "URL du flux RSS"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "Widgets d'abonnement RSS"
|
||||
SINGULARNAME: "Widget d'abonnement RSS"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Souscrire"
|
||||
SUBSCRIBETITLE: "Souscrire à ce blog par RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Nombre limite des tags"
|
||||
PLURALNAME: "Widgets Nuage de Tags"
|
||||
SBAL: "alphabet"
|
||||
SBFREQ: "fréquence"
|
||||
SINGULARNAME: "Widget Nuage de Tags"
|
||||
SORTBY: "Trier par"
|
||||
TILE: "Titre"
|
||||
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.'
|
||||
|
126
lang/hr.yml
@ -1,46 +1,82 @@
|
||||
hr:
|
||||
ArchiveWidget:
|
||||
MONTH: "mjesec"
|
||||
YEAR: "godina"
|
||||
BlogEntry:
|
||||
AU: "Autor"
|
||||
BBH: "Pomoć za BBCode"
|
||||
CN: "Sadržaj"
|
||||
DT: "Datum"
|
||||
TS: "Tagovi (odvojeni zarezom)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Komentari"
|
||||
POSTEDBY: "Objavio"
|
||||
POSTEDON: "Objavljeno"
|
||||
TAGS: "Tagovi:"
|
||||
VIEWALLPOSTTAGGED: "Pogledaj sve blog zapise tagirane sa"
|
||||
BlogHolder:
|
||||
POST: "Objavi blog zapis"
|
||||
RSSFEED: "RSS feed ovog bloga"
|
||||
SJ: "Tema"
|
||||
SPUC: "Molimo vas razdovojite tagove zarezima."
|
||||
SUCCONTENT: "Čestitamo, SilverStripe blog modul je uspješno instaliran. Ovaj blog zapis se slobodno može obrisati. Postavke bloga je moguće konfigurirati (kao što su widgeti prikazani sa strane) u [url=admin]CMSu[/url]."
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "SilverStripe blog modul uspješno je instaliran"
|
||||
TE: "Na primjer: sport, osobno, znanstvena fantastika"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Nema blog zapisa"
|
||||
VIEWINGTAGGED: "Pogledaj zapise tagirane sa"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Administriranje komentara"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Odlogiraj se"
|
||||
POSTNEW: "Objavi novi blog zapis"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Komentari"
|
||||
POSTEDON: "Objavljeno"
|
||||
VIEWFULL: "Pogledaj potpuni blog zapis pod nazivom - "
|
||||
RSSWidget:
|
||||
NTS: "Broj orikazanih zapisa"
|
||||
URL: "URL RSS feeda"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Ograniči broj tagova"
|
||||
SBAL: "abecedi"
|
||||
SBFREQ: "učestalosti (frekvenciji)"
|
||||
SORTBY: "Sortiraj prema"
|
||||
TILE: "Naslov"
|
||||
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
@ -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
|
71
lang/is.yml
@ -1,71 +0,0 @@
|
||||
is:
|
||||
ArchiveWidget:
|
||||
DispBY: "Birta sem"
|
||||
MONTH: "mánuður"
|
||||
YEAR: "ár"
|
||||
BlogEntry:
|
||||
AU: "Höfundur"
|
||||
BBH: "BBCode hjálp"
|
||||
CN: "Efni"
|
||||
DT: "Dags"
|
||||
PLURALNAME: "Blogg færslur"
|
||||
SINGULARNAME: "Blogg færsla"
|
||||
TS: "Tög (komma til aðskilnaðar)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Athugasemdir"
|
||||
EDITTHIS: "Breyta þessari færslu"
|
||||
POSTEDBY: "Skrifað af"
|
||||
POSTEDON: "á"
|
||||
TAGS: "Tög:"
|
||||
UNPUBLISHTHIS: "Hætta birtingu þessarar færslu"
|
||||
VIEWALLPOSTTAGGED: "Birta allar taggaðar færslur"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Blogg umhverfi"
|
||||
POST: "Birta blogg færslu"
|
||||
RSSFEED: "RSS þjónusta fyrir þetta blogg"
|
||||
SINGULARNAME: "Blogg umhverfi"
|
||||
SJ: "Málefni"
|
||||
SPUC: "Vinsamlegast notaðu kommu til að aðskilja tögin"
|
||||
SUCCONTENT: |
|
||||
Til hamingju, uppsetningin á SilverStripe blogg einingunni tókst.
|
||||
Þessari blogg færslu er hægt að eyða á örugganhátt. Þú getur stillt útlit blogsins þíns (svo sem widgets) i [url=admin] kefinu[/url].
|
||||
SUCTAGS: "silverstripe, blogg"
|
||||
SUCTITLE: "Uppsetning á SilverStripe blogg einingunni tókst"
|
||||
TE: "Til dæmis: íþróttir, persónulegt, vísindasögur"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Það eru engar blogg færslur"
|
||||
VIEWINGTAGGED: "Skoða færslur sem eru taggaðar með"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Athugasemda stjórnun"
|
||||
PLURALNAME: "Blogg stjórnunar aukahlutur"
|
||||
SINGULARNAME: "Blogg stjórnunar aukahlutur"
|
||||
UNM1: "Þú átt 1 óskoðaða athugasemd"
|
||||
UNMM: "Þú átt %i óskoðaða athugasemd"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Útskrá"
|
||||
POSTNEW: "Skrifa nýja færslu"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Athugasemdir"
|
||||
POSTEDBY: "Skráð af"
|
||||
POSTEDON: "á"
|
||||
VIEWFULL: "Skoða alla færslu -"
|
||||
RSSWidget:
|
||||
CT: "Titill fyrir þjónustuna"
|
||||
NTS: "Fjöldi hluta til að sýna"
|
||||
PLURALNAME: "RSS aukahlutur"
|
||||
SINGULARNAME: "RSS aukahlutur"
|
||||
URL: "Slóð á RSS þjónustuna"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "Áskriftar RSS aukahlutur"
|
||||
SINGULARNAME: "Áskriftar RSS aukahlutur"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Gerast áskrifandi"
|
||||
SUBSCRIBETITLE: "Gerast áskrifandi að þessu bloggi í gegnum RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Takmarka fjölda tag"
|
||||
PLURALNAME: "Tag ský aukahlutur"
|
||||
SBAL: "stafróf"
|
||||
SBFREQ: "tíðni"
|
||||
SINGULARNAME: "Tag ský aukahlutur"
|
||||
SORTBY: "Raða eftir"
|
||||
TILE: "Titill"
|
196
lang/it.yml
@ -1,77 +1,121 @@
|
||||
it:
|
||||
ArchiveWidget:
|
||||
DispBY: "Visualizzato da"
|
||||
MONTH: "mese"
|
||||
PLURALNAME: "Widget Archiviazione"
|
||||
SINGULARNAME: "Widget Archiviazione"
|
||||
YEAR: "anno"
|
||||
BlogEntry:
|
||||
AU: "Autore"
|
||||
BBH: "Aiuto BBCode"
|
||||
CN: "Contenuto"
|
||||
DT: "Data"
|
||||
PLURALNAME: "Registrazioni blog"
|
||||
SINGULARNAME: "Registrazione blog"
|
||||
TS: "Etichette (separate da virgola)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Commenti"
|
||||
EDITTHIS: "Modifica questo post"
|
||||
POSTEDBY: "Inserito da"
|
||||
POSTEDON: "su"
|
||||
TAGS: "Etichette:"
|
||||
UNPUBLISHTHIS: "Non pubblicare questo post"
|
||||
VIEWALLPOSTTAGGED: "Visualizza tutti i post con etichetta"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Proprietari blog"
|
||||
POST: "Salva il post nel blog"
|
||||
RSSFEED: "RSS feed di questo blog"
|
||||
SINGULARNAME: "Proprietario blog"
|
||||
SJ: "Soggetto"
|
||||
SPUC: "Per favore separa le etichette usando virgole."
|
||||
SUCCONTENT: "Congratulazioni, il blog SilverStripe è stato installato correttamente. Questo messaggio del blog può essere eliminato. Puoi configurare l'aspetto del tuo blog (come la visualizzazione dei widgets nella sidebar) in [url=admin] del CMS[/url]"
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "Modulo blog SilverStripe installato correttamente"
|
||||
TE: "Ad esempio: sport, personale, fantascienza"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Non ci sono voci nel blog"
|
||||
VIEWINGTAGGED: "Visualizza voci con etichetta"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Amministrazione commenti"
|
||||
PLURALNAME: "Widget di amministrazione blog"
|
||||
SINGULARNAME: "Widget di amministrazione blog"
|
||||
UNM1: "Hai 1 commento da moderare"
|
||||
UNMM: "Hai %i commenti non approvati"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Esci"
|
||||
POSTNEW: "Inserisci un nuovo post"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Commenti"
|
||||
POSTEDBY: "Inserito da"
|
||||
POSTEDON: "su"
|
||||
VIEWFULL: "Visualizza post intitolato - "
|
||||
BlogTree:
|
||||
PLURALNAME: "Alberi dei blog"
|
||||
SINGULARNAME: "Albero del blog"
|
||||
RSSWidget:
|
||||
CT: "Titolo del feed"
|
||||
NTS: "Numero di argomenti da visualizzare"
|
||||
PLURALNAME: "Widget RSS"
|
||||
SINGULARNAME: "Widget RSS"
|
||||
URL: "URL per il Feed RSS"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "Sottoscrivi Widget RSS"
|
||||
SINGULARNAME: "Sottoscrivi Widget RSS"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Sottoscrivi"
|
||||
SUBSCRIBETITLE: "Sottoscrivi questo blog via RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Limitare il numero dei tag a"
|
||||
PLURALNAME: "Widget Nuvola di Tag"
|
||||
SBAL: "alfabeto"
|
||||
SBFREQ: "frequenza"
|
||||
SINGULARNAME: "Widget Nuvola di Tag"
|
||||
SORTBY: "Ordina per"
|
||||
TILE: "Titolo"
|
||||
TrackBackPing:
|
||||
PLURALNAME: "Rileva Ping"
|
||||
SINGULARNAME: "Rileva Ping"
|
||||
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'
|
||||
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'
|
||||
ReadMoreAbout: 'Leggi di più su ''{title}''...'
|
||||
SINGULARNAME: Blog
|
||||
Tag: Etichetta
|
||||
Tagged: Etichettato
|
||||
Tags: Etichette
|
||||
WRITER: Scrittore
|
||||
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'
|
||||
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'
|
||||
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'
|
||||
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'
|
||||
Sort: Ordine
|
||||
Sort_Description: 'Modificare l''ordine delle etichette mostrate da questo widget.'
|
||||
|
27
lang/it_IT.yml
Normal 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
@ -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
|
22
lang/ms.yml
@ -1,22 +0,0 @@
|
||||
ms:
|
||||
ArchiveWidget:
|
||||
PLURALNAME: "Arkiv Widgets"
|
||||
SINGULARNAME: "Arkiv Widget"
|
||||
BlogEntry:
|
||||
PLURALNAME: "Blog Poster"
|
||||
SINGULARNAME: "Blog Post"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Blog holdere"
|
||||
SINGULARNAME: "Blog holder"
|
||||
BlogManagementWidget:
|
||||
PLURALNAME: "Blog Admin Widgets"
|
||||
SINGULARNAME: "Blog Admin Widgets"
|
||||
RSSWidget:
|
||||
PLURALNAME: "R S S Widgets"
|
||||
SINGULARNAME: "R S S Widget"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "Abonner på R S S Widgets"
|
||||
SINGULARNAME: "Abonner på R S S Widgets"
|
||||
TagCloudWidget:
|
||||
PLURALNAME: "Tag Cloud Widgets"
|
||||
SINGULARNAME: "Tag Cloud Widget"
|
26
lang/nb.yml
Normal 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
|
240
lang/nl.yml
@ -1,74 +1,168 @@
|
||||
nl:
|
||||
ArchiveWidget:
|
||||
DispBY: "Tonen door"
|
||||
MONTH: "maand"
|
||||
PLURALNAME: "Archief-widgets"
|
||||
SINGULARNAME: "Archief-widget"
|
||||
YEAR: "jaar"
|
||||
BlogEntry:
|
||||
AU: "Auteur"
|
||||
BBH: "BBCode hulp"
|
||||
CN: "Inhoud"
|
||||
DT: "Datum"
|
||||
PLURALNAME: "Blog Artikelen"
|
||||
SINGULARNAME: "Blog Artikel"
|
||||
TS: "Tags (Komma gescheiden)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Reacties"
|
||||
EDITTHIS: "Bewerk deze post"
|
||||
POSTEDBY: "Auteur"
|
||||
POSTEDON: "Aan"
|
||||
TAGS: "Tags:"
|
||||
UNPUBLISHTHIS: "onpubliceer deze post"
|
||||
VIEWALLPOSTTAGGED: "Bekijk alle posten getiteld"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Blog Houders"
|
||||
POST: "Blogartikel plaatsen"
|
||||
RSSFEED: "RSS-feed van deze blog"
|
||||
SINGULARNAME: "Blog Houder"
|
||||
SJ: "Onderwerp"
|
||||
SPUC: "Scheid de tags met behulp van komma's."
|
||||
SUCCONTENT: "Gefeliciteerd, de SilverStripe blog module is met succes geïnstalleerd. Dit blogartikel kan veilig worden verwijderd. U kunt aspecten van uw blog (zoals de widgets weergegeven in de zijbalk) in [url=admin]het CMS[/url] veranderen."
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "SilverStripe blog module met succes geïnstalleerd"
|
||||
TE: "Bijvoorbeeld: sport, persoonlijke, science fiction"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Er zijn geen blog artikelen"
|
||||
VIEWINGTAGGED: "U bekijkt artikelen getagged met"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Opmerking administratie"
|
||||
PLURALNAME: "Blog Management Widgets"
|
||||
SINGULARNAME: "Blog Management Widgets"
|
||||
UNM1: "U heeft 1 niet gecontroleerde opmerking"
|
||||
UNMM: "U heeft %i niet gecontroleerde opmerkingen"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Afmelden"
|
||||
POSTNEW: "Publiceer een nieuw blog entree"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Reacties"
|
||||
POSTEDBY: "Geplaatst door"
|
||||
POSTEDON: "Aan"
|
||||
VIEWFULL: "Bekijk het gehele post getitled"
|
||||
RSSWidget:
|
||||
CT: "Aangepaste titel voor de RSS-feed"
|
||||
NTS: "Aantal objecten tonen"
|
||||
PLURALNAME: "RSS-widget"
|
||||
SINGULARNAME: "R S S Widget"
|
||||
URL: "URL van de RSS-feed"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "Abonneer R S S Widgets"
|
||||
SINGULARNAME: "Abonneer R S S Widget"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Inschrijven"
|
||||
SUBSCRIBETITLE: "Inschrijven om dit weblog via RSS te volgen"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Beperk aantal tags"
|
||||
PLURALNAME: "Tag Cloud Widgets"
|
||||
SBAL: "alfabet"
|
||||
SBFREQ: "frequentie"
|
||||
SINGULARNAME: "Tag Cloud Widget"
|
||||
SORTBY: "Sorteer bij"
|
||||
TILE: "Titel"
|
||||
TrackBackPing:
|
||||
PLURALNAME: "Track Back Pings"
|
||||
SINGULARNAME: "Track Back Ping"
|
||||
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.'
|
||||
|
93
lang/pl.yml
@ -1,62 +1,33 @@
|
||||
pl:
|
||||
ArchiveWidget:
|
||||
DispBY: "Wyświetlaj według"
|
||||
MONTH: "miesiąc"
|
||||
YEAR: "rok"
|
||||
BlogEntry:
|
||||
AU: "Autor"
|
||||
BBH: "Pomoc BBCode"
|
||||
CN: "Zawartość"
|
||||
DT: "Data"
|
||||
PLURALNAME: "Wpisy bloga"
|
||||
SINGULARNAME: "Wpis bloga"
|
||||
TS: "Tagi (oddziel przecinkami)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Komentarze"
|
||||
EDITTHIS: "Edytuj ten post"
|
||||
POSTEDBY: "Dodane przez"
|
||||
POSTEDON: "Opublikowano"
|
||||
TAGS: "Tagi:"
|
||||
UNPUBLISHTHIS: "Cofnij publikację tego postu"
|
||||
VIEWALLPOSTTAGGED: "Zobacz wszystkie posty otagowane jako"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Blog Listy"
|
||||
POST: "Publikuj wpis"
|
||||
RSSFEED: "Subskrybuj wpisy na tym blogu przez RSS"
|
||||
SINGULARNAME: "Blog Lista"
|
||||
SJ: "Temat"
|
||||
SPUC: "Oddziel tagi używając przecinków."
|
||||
SUCCONTENT: "Gratulacje, moduł bloga SilverStripe został poprawnie zainstalowany. Możesz spokojnie usunąć ten wpis. Możesz skonfigurować różne części swojego bloga (takie jak widgety, wyświetlane z boku) w [url=admin]CMSie[/url]."
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "Blog SilverStripe został poprawnie zainstalowany."
|
||||
TE: "Na przykład: sport, osobiste, science fiction"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Nie ma żadnych wpisów na blogu"
|
||||
VIEWINGTAGGED: "Zobacz wpisy otagowane jako"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Administracja komentarzami"
|
||||
UNM1: "Masz 1 niesprawdzony komentarz"
|
||||
UNMM: "Masz %i niesprawdzonych komentarzy"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Wyloguj"
|
||||
POSTNEW: "Dodaj nowy wpis"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Komentarze"
|
||||
POSTEDBY: "Napisane przez"
|
||||
POSTEDON: "Opublikowano"
|
||||
VIEWFULL: "Zobacz pełny post zatytułowany - "
|
||||
RSSWidget:
|
||||
CT: "Tytuł dla kanału"
|
||||
NTS: "Ilość pokazywanych wpisów"
|
||||
PLURALNAME: "Widżety RSS"
|
||||
SINGULARNAME: "Widżet RSS"
|
||||
URL: "URL RSS"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "Subksrybuj widżety RSS"
|
||||
SINGULARNAME: "Subksrybuj widżet RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Limit tagów"
|
||||
SBAL: "alfabetu"
|
||||
SBFREQ: "częstości występowania"
|
||||
SORTBY: "Sortuj według"
|
||||
TILE: "Tytuł"
|
||||
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
@ -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
|
29
lang/pt.yml
@ -1,29 +0,0 @@
|
||||
pt:
|
||||
BlogEntry:
|
||||
PLURALNAME: "Posts no Blog"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Comentários"
|
||||
EDITTHIS: "Editar este post"
|
||||
POSTEDBY: "Inserido por"
|
||||
POSTEDON: "em"
|
||||
UNPUBLISHTHIS: "Não publicar este post"
|
||||
BlogHolder:
|
||||
RSSFEED: "Feed RSS para este blog"
|
||||
SUCCONTENT: "Parabéns, o módulo do blog do SilverStripe foi instalado com sucesso. Este post pode ser apagado. Poderá configurar as preferências do blog (assim como os widgets presentes no menu) através [url=admin]do CMS[/url]."
|
||||
SUCTITLE: "O módulo do blog do SilverStripe foi instalado com sucesso."
|
||||
BlogManagementWidget:
|
||||
COMADM: "Administração de comentários"
|
||||
UNM1: "Existe 1 comentário por moderar"
|
||||
UNMM: "Existem %i comentários por moderar"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Sair"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Comentários"
|
||||
POSTEDON: "em"
|
||||
RSSWidget:
|
||||
NTS: "Número de items para mostrar"
|
||||
URL: "Endereço (URL) do RSS Feed"
|
||||
TagCloudWidget:
|
||||
SBAL: "alfabeto"
|
||||
SORTBY: "Ordenar por"
|
||||
TILE: "Título"
|
169
lang/ru.yml
@ -1,53 +1,118 @@
|
||||
ru:
|
||||
ArchiveWidget:
|
||||
DispBY: "Группировать по"
|
||||
MONTH: "месяцу"
|
||||
YEAR: "году"
|
||||
BlogEntry:
|
||||
AU: "Автор"
|
||||
BBH: "Подсказка по BBCode"
|
||||
CN: "Содержимое"
|
||||
DT: "Дата"
|
||||
TS: "Метки (раздел. запят.)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Комментарии"
|
||||
EDITTHIS: "Редакт. эту запись"
|
||||
POSTEDBY: "Автор: "
|
||||
POSTEDON: ":"
|
||||
TAGS: "Метки:"
|
||||
UNPUBLISHTHIS: "Убрать запись с опубликов. сайта"
|
||||
VIEWALLPOSTTAGGED: "Смотреть все записи с метками"
|
||||
BlogHolder:
|
||||
POST: "Опубликовать запись в блоге"
|
||||
RSSFEED: "RSS подписка на этот блог"
|
||||
SJ: "Тема"
|
||||
SPUC: "Разделяйте метки запятыми."
|
||||
SUCCONTENT: "Поздравляем, модуль блога SilverStripe был успешно установлен. Эта запись в блоге может быть удалена. Вы можете настроить вид блога (например, отображение виджетов в боковой панели) в [url=admin]Системе Управления Содержимым[/url]."
|
||||
SUCTAGS: "silverstripe, блог"
|
||||
SUCTITLE: "Модуль блога SilverStripe успешно установлен"
|
||||
TE: "Например - спорт, личное, фантастика"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "В блоге нет записей"
|
||||
VIEWINGTAGGED: "Просмотр записей с метками "
|
||||
BlogManagementWidget:
|
||||
COMADM: "Управление комментариями"
|
||||
UNM1: "У вас 1 непроверенный комментарий"
|
||||
UNMM: "У вас %i непроверенных комментариев"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Выход"
|
||||
POSTNEW: "Опубликовать новую запись"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Комментарии"
|
||||
POSTEDBY: "Автор:"
|
||||
POSTEDON: ":"
|
||||
VIEWFULL: "См. полностью запись под названием: "
|
||||
RSSWidget:
|
||||
CT: "Собственное название ленты новостей"
|
||||
NTS: "Показывать кол-во записей"
|
||||
URL: "URL ленты RSS"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Ограничить кол-во меток"
|
||||
SBAL: "алфавиту"
|
||||
SBFREQ: "частоте"
|
||||
SORTBY: "Сортировать по"
|
||||
TILE: "Название"
|
||||
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: 'Добавляет к сайту блог.'
|
||||
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: 'Если не указанно описание будут использованы первые 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: 'Количество записей'
|
||||
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: 'Изменить порядок тэгов в этом блоке.'
|
||||
|
125
lang/sk.yml
Normal 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
@ -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
@ -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
|
48
lang/sr.yml
@ -1,48 +0,0 @@
|
||||
sr:
|
||||
ArchiveWidget:
|
||||
DispBY: "Прикажи по"
|
||||
MONTH: "месецу"
|
||||
YEAR: "години"
|
||||
BlogEntry:
|
||||
AU: "Аутор"
|
||||
BBH: "Помоћ око ББкода"
|
||||
CN: "Садржај"
|
||||
DT: "Датум"
|
||||
TS: "Ознаке (одвојене зарезом)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Коментари"
|
||||
EDITTHIS: "Измени овај унос"
|
||||
POSTEDBY: "Послао"
|
||||
POSTEDON: " "
|
||||
TAGS: "Тагови:"
|
||||
VIEWALLPOSTTAGGED: "Погледајте све уносе означене са"
|
||||
BlogHolder:
|
||||
POST: "Пошаљи унос у блог"
|
||||
RSSFEED: "RSS довод овог блога"
|
||||
SJ: "Наслов"
|
||||
SPUC: "Одвојите ознаке зарезима."
|
||||
SUCTAGS: "silverstripe, блог"
|
||||
SUCTITLE: "SilverStripe модул за блог је успешно инсталиран"
|
||||
TE: "На пример: спорт, лично, научна фантастика"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Нема уноса у блог"
|
||||
VIEWINGTAGGED: "Приказујем уносе означене са"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Администрација коментара"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Одјави се"
|
||||
POSTNEW: "Пошаљи нов унос у блог"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Коментари"
|
||||
POSTEDON: "у"
|
||||
VIEWFULL: "Погледајте цео унос насловљен - "
|
||||
RSSWidget:
|
||||
CT: "Прилагођени наслов за овај довод"
|
||||
NTS: "Број ставки за приказивање"
|
||||
URL: "URL RSS довода"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Ограничи број тагова"
|
||||
SBAL: "азбучном реду"
|
||||
SBFREQ: "фреквенцији"
|
||||
SORTBY: "Сортирај по"
|
||||
TILE: "Наслов"
|
120
lang/sv.yml
Normal 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.'
|
74
lang/tr.yml
@ -1,74 +0,0 @@
|
||||
tr:
|
||||
ArchiveWidget:
|
||||
DispBY: "Görüntüle"
|
||||
MONTH: "ay"
|
||||
PLURALNAME: "Arşiv Zımbırtıları"
|
||||
SINGULARNAME: "Arşiv Zımbırtısı"
|
||||
YEAR: "yıl"
|
||||
BlogEntry:
|
||||
AU: "Yazar"
|
||||
BBH: "BBCode yardımı"
|
||||
CN: "İçerik"
|
||||
DT: "Tarih"
|
||||
PLURALNAME: "Blog Girdileri"
|
||||
SINGULARNAME: "Blog Girdisi"
|
||||
TS: "Etiketler (virgülle ayrılmış)"
|
||||
BlogEntry_ss:
|
||||
COMMENTS: "Yorumlar"
|
||||
EDITTHIS: "Bu girdiyi yeniden düzenle"
|
||||
POSTEDBY: "Gönderen "
|
||||
POSTEDON: "üzerinde"
|
||||
TAGS: "Etiketler:"
|
||||
UNPUBLISHTHIS: "Bu girdiyi yayından kaldır"
|
||||
VIEWALLPOSTTAGGED: "Etiketlenen tüm girdileri görüntüle"
|
||||
BlogHolder:
|
||||
PLURALNAME: "Blog Sahipleri"
|
||||
POST: "Blog girdisi gönderin"
|
||||
RSSFEED: "Bu blog'un RSS beslemesi"
|
||||
SINGULARNAME: "Blog Sahibi"
|
||||
SJ: "Konu"
|
||||
SPUC: "Lüfen etiketleri virgülle ayırın."
|
||||
SUCCONTENT: "Tebrikler, SilverStripe blog modülü başarıyla kuruldu. Bu blog girdisini silebilirsiniz. Ayrıca, isterseniz [url=admin]CMS[/url] içerisinde blog'unuzun görünümünde degişiklikler yapabilirsiniz."
|
||||
SUCTAGS: "silverstripe, blog"
|
||||
SUCTITLE: "SilverStripe blog modülü başarıyla kuruldu"
|
||||
TE: "Örneğin: spor, kişisel, bilim kurgu"
|
||||
BlogHolder_ss:
|
||||
NOENTRIES: "Blog girdileri mevcut değil"
|
||||
VIEWINGTAGGED: "Girdiler görüntüleniyor, etiket:"
|
||||
BlogManagementWidget:
|
||||
COMADM: "Yorum yönetimi"
|
||||
PLURALNAME: "Blog Yönetim Zımbırtıları"
|
||||
SINGULARNAME: "Blog Yönetim Zımbırtısı"
|
||||
UNM1: "1 adet onay bekleyen yorumunuz var"
|
||||
UNMM: "%i adet onay bekleyen yorumunuz var"
|
||||
BlogManagementWidget_ss:
|
||||
LOGOUT: "Oturumu kapat"
|
||||
POSTNEW: "Yeni bir blog girdisi oluştur"
|
||||
BlogSummary_ss:
|
||||
COMMENTS: "Yorumlar"
|
||||
POSTEDBY: "Gönderen: "
|
||||
POSTEDON: "üzerinde"
|
||||
VIEWFULL: "Postun tamamını görüntüle -"
|
||||
RSSWidget:
|
||||
CT: "Besleme için özel başlık"
|
||||
NTS: "Görüntülenecek öğe adedi"
|
||||
PLURALNAME: "R S S Zımbırtıları"
|
||||
SINGULARNAME: "R S S Zımbırtısı"
|
||||
URL: "RSS beslemesi'nin URL'i"
|
||||
SubscribeRSSWidget:
|
||||
PLURALNAME: "R S S Zımbırtılarına abone ol"
|
||||
SINGULARNAME: "R S S Zımbırtısına abone ol"
|
||||
SubscribeRSSWidget_ss:
|
||||
SUBSCRIBETEXT: "Abone Ol"
|
||||
SUBSCRIBETITLE: "Bu bloğa RSS ile abone ol"
|
||||
TagCloudWidget:
|
||||
LIMIT: "Etiket sayısini sınırla"
|
||||
PLURALNAME: "Etiket Bulutu Zımbırtıları"
|
||||
SBAL: "alfabe"
|
||||
SBFREQ: "frekans"
|
||||
SINGULARNAME: "Etiket Bulutu Zımbırtısı"
|
||||
SORTBY: "Sıralama"
|
||||
TILE: "Başlık"
|
||||
TrackBackPing:
|
||||
PLURALNAME: "Geri İz Yoklamaları"
|
||||
SINGULARNAME: "Geri İz Yoklaması"
|
27
lang/zh.yml
Normal 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
@ -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
@ -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
@ -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
@ -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>
|
70
src/Admin/GridFieldCategorisationConfig.php
Normal 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'
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
34
src/Admin/GridFieldFormAction.php
Normal 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
|
||||
);
|
||||
}
|
||||
}
|
165
src/Admin/GridFieldMergeAction.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
23
src/Forms/BlogAdminSidebar.php
Normal 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;
|
||||
}
|
||||
}
|
240
src/Forms/GridField/GridFieldAddByDBField.php
Normal 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)];
|
||||
}
|
||||
}
|
100
src/Forms/GridField/GridFieldBlogPostState.php
Normal 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 [];
|
||||
}
|
||||
}
|
25
src/Forms/GridField/GridFieldConfigBlogPost.php
Normal 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
@ -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;
|
||||
}
|
||||
}
|
73
src/Model/BlogCategory.php
Normal 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.');
|
||||
}
|
||||
}
|
29
src/Model/BlogCommentExtension.php
Normal 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 '';
|
||||
}
|
||||
}
|
587
src/Model/BlogController.php
Normal 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
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
22
src/Model/BlogFilter/BlogFilterGridField.php
Normal 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;
|
||||
}
|
||||
}
|
142
src/Model/BlogMemberExtension.php
Normal 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
@ -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
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
10
src/Model/BlogPostController.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace SilverStripe\Blog\Model;
|
||||
|
||||
use PageController;
|
||||
|
||||
class BlogPostController extends PageController
|
||||
{
|
||||
|
||||
}
|
32
src/Model/BlogPostFeaturedExtension.php
Normal 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'))
|
||||
);
|
||||
}
|
||||
}
|
70
src/Model/BlogPostFilter.php
Normal 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"'
|
||||
);
|
||||
}
|
||||
}
|
54
src/Model/BlogPostNotifications.php
Normal 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
@ -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.');
|
||||
}
|
||||
}
|
11
src/Model/CategorisationObject.php
Normal file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace SilverStripe\Blog\Model;
|
||||
|
||||
/**
|
||||
* @method ManyManyList BlogPosts
|
||||
*/
|
||||
interface CategorisationObject
|
||||
{
|
||||
|
||||
}
|
159
src/Widgets/BlogArchiveWidget.php
Normal 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;
|
||||
}
|
||||
}
|
14
src/Widgets/BlogArchiveWidgetController.php
Normal 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
|
||||
{
|
||||
|
||||
}
|
131
src/Widgets/BlogCategoriesWidget.php
Normal 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;
|
||||
}
|
||||
}
|
14
src/Widgets/BlogCategoriesWidgetController.php
Normal 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
|
||||
{
|
||||
|
||||
}
|
93
src/Widgets/BlogFeaturedPostsWidget.php
Normal 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 [];
|
||||
}
|
||||
}
|
92
src/Widgets/BlogRecentPostsWidget.php
Normal 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 [];
|
||||
}
|
||||
}
|
14
src/Widgets/BlogRecentPostsWidgetController.php
Normal 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
|
||||
{
|
||||
|
||||
}
|
125
src/Widgets/BlogTagsCloudWidget.php
Normal 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 [];
|
||||
}
|
||||
}
|
13
src/Widgets/BlogTagsCloudWidgetController.php
Normal 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
|
||||
{
|
||||
}
|
131
src/Widgets/BlogTagsWidget.php
Normal 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;
|
||||
}
|
||||
}
|
14
src/Widgets/BlogTagsWidgetController.php
Normal 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
|
||||
{
|
||||
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
<% if DisplayMode == month %>
|
||||
<ul class="archiveMonths">
|
||||
<% loop Dates %>
|
||||
<li>
|
||||
<a href="$Link">
|
||||
$Date.Format(F) $Date.Year
|
||||
</a>
|
||||
</li>
|
||||
<% end_loop %>
|
||||
</ul>
|
||||
<% else %>
|
||||
<ul class="archiveYears">
|
||||
<% loop Dates %>
|
||||
<li>
|
||||
<a href="$Link">
|
||||
$Date.Year<% if not Last %>,<% end_if %>
|
||||
</a>
|
||||
</li>
|
||||
<% end_loop %>
|
||||
</ul>
|
||||
<% end_if %>
|
@ -1,5 +0,0 @@
|
||||
<ul>
|
||||
<% if PostLink %><li><a href="$PostLink"><% _t('BlogManagementWidget_ss.POSTNEW', 'Post a new blog entry') %></a></li><% end_if %>
|
||||
<% if CommentLink %><li><a href="$CommentLink">$CommentText</a></li><% end_if %>
|
||||
<li><a href="Security/logout"><% _t('BlogManagementWidget_ss.LOGOUT', 'Logout') %></a></li>
|
||||
</ul>
|
@ -1,41 +0,0 @@
|
||||
<% if BlogEntries.MoreThanOnePage %>
|
||||
<div class="pagination">
|
||||
<ul class="PageNumbers">
|
||||
<% if BlogEntries.NotFirstPage %>
|
||||
<li class="prev">
|
||||
<a class="paginate-left" href="$BlogEntries.PrevLink" title="View the previous page"><</a>
|
||||
</li>
|
||||
<% else %>
|
||||
<li class="prev disabled">
|
||||
<a class="paginate-left disabled"><</a>
|
||||
</li>
|
||||
<% end_if %>
|
||||
|
||||
<% loop BlogEntries.PaginationSummary(4) %>
|
||||
<% if CurrentBool %>
|
||||
<li class="active"><a class="disabled">$PageNum</a></li>
|
||||
<% else %>
|
||||
<% if Link %>
|
||||
<li>
|
||||
<a class="<% if BeforeCurrent %>paginate-left<% else %>paginate-right<% end_if %>" href="$Link">
|
||||
$PageNum
|
||||
</a>
|
||||
</li>
|
||||
<% else %>
|
||||
<li class="disabled"><a class="disabled">…</a></li>
|
||||
<% end_if %>
|
||||
<% end_if %>
|
||||
<% end_loop %>
|
||||
|
||||
<% if BlogEntries.NotLastPage %>
|
||||
<li class="next">
|
||||
<a class="next paginate-right" href="$BlogEntries.NextLink" title="View the next page">></a>
|
||||
</li>
|
||||
<% else %>
|
||||
<li class="next disabled">
|
||||
<a class="next paginate-right disabled">></a>
|
||||
</li>
|
||||
<% end_if %>
|
||||
</ul>
|
||||
</div>
|
||||
<% end_if %>
|
@ -1,5 +0,0 @@
|
||||
<% if SideBarView %>
|
||||
<div id="Sidebar" class="typography">
|
||||
$SideBarView
|
||||
</div>
|
||||
<% end_if %>
|
@ -1,28 +0,0 @@
|
||||
<div class="blogSummary">
|
||||
<h2 class="postTitle"><a href="$Link" title="<% _t('BlogSummary_ss.VIEWFULL', 'View full post titled -') %> '$Title'">$MenuTitle</a></h2>
|
||||
<p class="authorDate"><% _t('BlogSummary_ss.POSTEDBY', 'Posted by') %> $Author.XML <% _t('BlogSummary_ss.POSTEDON', 'on') %> $Date.Long | <a href="$Link#PageComments_holder" title="View Comments Posted">$Comments.Count <% _t('BlogEntry_ss.COMMENTS', 'Comments') %></a></p>
|
||||
<% if TagsCollection %>
|
||||
<p class="tags">
|
||||
<% _t('BlogSummary_ss.TAGS','Tags') %>:
|
||||
<% loop TagsCollection %>
|
||||
<a href="$Link" title="View all posts tagged '$Tag'" rel="tag">$Tag</a><% if not Last %>,<% end_if %>
|
||||
<% end_loop %>
|
||||
</p>
|
||||
<% end_if %>
|
||||
|
||||
<% if BlogHolder.ShowFullEntry %>
|
||||
$Content
|
||||
<% else %>
|
||||
<p>$Content.FirstParagraph(html)</p>
|
||||
<% end_if %>
|
||||
|
||||
<p class="blogVitals">
|
||||
<a href="$Link#PageComments_holder" class="comments" title="View Comments for this post">
|
||||
$Comments.Count <% _t('BlogSummary_ss.SUMMARYCOMMENTS','comment(s)') %>
|
||||
</a>
|
||||
|
|
||||
<a href="$Link" class="readmore" title="Read Full Post">
|
||||
<% _t('BlogSummary_ss.READFULLPOST','Read the full post') %>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
@ -1,5 +0,0 @@
|
||||
<% if Level(2) %>
|
||||
<div id="Breadcrumbs">
|
||||
$Breadcrumbs
|
||||
</div>
|
||||
<% end_if %>
|
@ -1,22 +0,0 @@
|
||||
<% include BlogSideBar %>
|
||||
<div id="BlogContent" class="typography">
|
||||
<% include BreadCrumbs %>
|
||||
|
||||
<div class="blogEntry">
|
||||
<h2 class="postTitle">$Title</h2>
|
||||
<p class="authorDate"><% _t('BlogEntry_ss.POSTEDBY', 'Posted by') %> $Author.XML <% _t('BlogEntry_ss.POSTEDON', 'on') %> $Date.Long | $Comments.Count <% _t('BlogEntry_ss.COMMENTS', 'Comments') %></p>
|
||||
<% if TagsCollection %>
|
||||
<p class="tags">
|
||||
<% _t('BlogEntry_ss.TAGS', 'Tags:') %>
|
||||
<% loop TagsCollection %>
|
||||
<a href="$Link" title="<% _t('BlogEntry_ss.VIEWALLPOSTTAGGED', 'View all posts tagged') %> '$Tag'" rel="tag">$Tag</a><% if not Last %>,<% end_if %>
|
||||
<% end_loop %>
|
||||
</p>
|
||||
<% end_if %>
|
||||
$Content
|
||||
</div>
|
||||
|
||||
<% if IsOwner %><p class="edit-post"><a href="$EditURL" id="editpost" title="<% _t('BlogEntry_ss.EDITTHIS', 'Edit this post') %>"><% _t('BlogEntry_ss.EDITTHIS', 'Edit this post') %></a> | <a href="$Link(unpublishPost)" id="unpublishpost"><% _t('BlogEntry_ss.UNPUBLISHTHIS', 'Unpublish this post') %></a></p><% end_if %>
|
||||
|
||||
$PageComments
|
||||
</div>
|
@ -1,25 +0,0 @@
|
||||
<% include BlogSideBar %>
|
||||
|
||||
<div id="BlogContent" class="blogcontent typography">
|
||||
|
||||
<% include BreadCrumbs %>
|
||||
|
||||
<% if SelectedTag %>
|
||||
<h3><% _t('BlogHolder_ss.VIEWINGTAGGED', 'Viewing entries tagged with') %> '$SelectedTag'</h3>
|
||||
<% else_if SelectedDate %>
|
||||
<h3><% _t('BlogHolder_ss.VIEWINGPOSTEDIN', 'Viewing entries posted in') %> $SelectedNiceDate</h3>
|
||||
<% else_if SelectedAuthor %>
|
||||
<h3><% _t('BlogHolder_ss.VIEWINGPOSTEDBY', 'Viewing entries posted by') %> $SelectedAuthor</h3>
|
||||
<% end_if %>
|
||||
|
||||
<% if BlogEntries %>
|
||||
<% loop BlogEntries %>
|
||||
<% include BlogSummary %>
|
||||
<% end_loop %>
|
||||
<% else %>
|
||||
<h2><% _t('BlogHolder_ss.NOENTRIES', 'There are no blog entries') %></h2>
|
||||
<% end_if %>
|
||||
|
||||
<% include BlogPagination %>
|
||||
|
||||
</div>
|
@ -1,25 +0,0 @@
|
||||
<% include BlogSideBar %>
|
||||
|
||||
<div id="BlogContent" class="blogcontent typography">
|
||||
|
||||
<% include BreadCrumbs %>
|
||||
|
||||
<% if SelectedTag %>
|
||||
<h3><% _t('BlogTree_ss.VIEWINGTAGGED', 'Viewing entries tagged with') %> '$SelectedTag'</h3>
|
||||
<% else_if SelectedDate %>
|
||||
<h3><% _t('BlogTree_ss.VIEWINGPOSTEDIN', 'Viewing entries posted in') %> $SelectedNiceDate</h3>
|
||||
<% else_if SelectedAuthor %>
|
||||
<h3><% _t('BlogTree_ss.VIEWINGPOSTEDBY', 'Viewing entries posted by') %> $SelectedAuthor</h3>
|
||||
<% end_if %>
|
||||
|
||||
<% if BlogEntries %>
|
||||
<% loop BlogEntries %>
|
||||
<% include BlogSummary %>
|
||||
<% end_loop %>
|
||||
<% else %>
|
||||
<h2><% _t('BlogTree_ss.NOENTRIES', 'There are no blog entries') %></h2>
|
||||
<% end_if %>
|
||||
|
||||
<% include BlogPagination %>
|
||||
|
||||
</div>
|
@ -1,7 +0,0 @@
|
||||
<ul>
|
||||
<% loop FeedItems %>
|
||||
<li>
|
||||
<a href="$Link">$Title</a>
|
||||
</li>
|
||||
<% end_loop %>
|
||||
</ul>
|
20
templates/SilverStripe/Blog/Forms/BlogAdminSidebar_holder.ss
Normal 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>«</span></a>
|
||||
<a class="toggle-collapse" href="#"><span>»</span></a>
|
||||
</div>
|
||||
</div>
|
@ -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>
|
4
templates/SilverStripe/Blog/Forms/TabSet_holder.ss
Normal file
@ -0,0 +1,4 @@
|
||||
<div class="blog-admin-outer">
|
||||
<%-- this resets ths template (from TabSet_holder) and renders using forTemplate --%>
|
||||
$setTemplate('')
|
||||
</div>
|
5
templates/SilverStripe/Blog/Includes/BlogSideBar.ss
Normal file
@ -0,0 +1,5 @@
|
||||
<% if $SideBarView %>
|
||||
<div class="blog-sidebar typography unit size1of4 lastUnit">
|
||||
$SideBarView
|
||||
</div>
|
||||
<% end_if %>
|
45
templates/SilverStripe/Blog/Includes/EntryMeta.ss
Normal 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>
|
13
templates/SilverStripe/Blog/Includes/MemberDetails.ss
Normal 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>
|
25
templates/SilverStripe/Blog/Includes/Pagination.ss
Normal 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}">←</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}">→</a>
|
||||
<% end_if %>
|
||||
</p>
|
||||
<% end_if %>
|
27
templates/SilverStripe/Blog/Includes/PostSummary.ss
Normal 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>
|
44
templates/SilverStripe/Blog/Model/Layout/Blog.ss
Normal 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 %>
|
20
templates/SilverStripe/Blog/Model/Layout/BlogPost.ss
Normal 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 %>
|
23
templates/SilverStripe/Blog/Model/Layout/Blog_profile.ss
Normal 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 %>
|
12
templates/SilverStripe/Blog/Widgets/BlogArchiveWidget.ss
Normal file
@ -0,0 +1,12 @@
|
||||
<% if $Archive %>
|
||||
<ul>
|
||||
<% loop $Archive %>
|
||||
<li>
|
||||
<a href="$Link" title="$Title">
|
||||
<span class="arrow">→</span>
|
||||
<span class="text">$Title</span>
|
||||
</a>
|
||||
</li>
|
||||
<% end_loop %>
|
||||
</ul>
|
||||
<% end_if %>
|
12
templates/SilverStripe/Blog/Widgets/BlogCategoriesWidget.ss
Normal file
@ -0,0 +1,12 @@
|
||||
<% if $Categories %>
|
||||
<ul>
|
||||
<% loop $Categories %>
|
||||
<li>
|
||||
<a href="$Link" title="$Title">
|
||||
<span class="arrow">→</span>
|
||||
<span class="text">$Title</span>
|
||||
</a>
|
||||
</li>
|
||||
<% end_loop %>
|
||||
</ul>
|
||||
<% end_if %>
|
@ -0,0 +1,12 @@
|
||||
<% if $Posts %>
|
||||
<ul>
|
||||
<% loop $Posts %>
|
||||
<li>
|
||||
<a href="$Link" title="$Title">
|
||||
<span class="arrow">→</span>
|
||||
<span class="text">$Title</span>
|
||||
</a>
|
||||
</li>
|
||||
<% end_loop %>
|
||||
</ul>
|
||||
<% end_if %>
|
12
templates/SilverStripe/Blog/Widgets/BlogRecentPostsWidget.ss
Normal file
@ -0,0 +1,12 @@
|
||||
<% if $Posts %>
|
||||
<ul>
|
||||
<% loop $Posts %>
|
||||
<li>
|
||||
<a href="$Link" title="$Title">
|
||||
<span class="arrow">→</span>
|
||||
<span class="text">$Title</span>
|
||||
</a>
|
||||
</li>
|
||||
<% end_loop %>
|
||||
</ul>
|
||||
<% end_if %>
|
12
templates/SilverStripe/Blog/Widgets/BlogTagsCloudWidget.ss
Normal 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 %>
|
12
templates/SilverStripe/Blog/Widgets/BlogTagsWidget.ss
Normal file
@ -0,0 +1,12 @@
|
||||
<% if $Tags %>
|
||||
<ul>
|
||||
<% loop $Tags %>
|
||||
<li>
|
||||
<a href="$Link" title="$Title">
|
||||
<span class="arrow">→</span>
|
||||
<span class="text">$Title</span>
|
||||
</a>
|
||||
</li>
|
||||
<% end_loop %>
|
||||
</ul>
|
||||
<% end_if %>
|
@ -1,5 +0,0 @@
|
||||
<p>
|
||||
<a href="$RSSLink" class="subscribeLink" title="<% _t('SubscribeRSSWidget_ss.SUBSCRIBETITLE', 'Subscribe to this blog via RSS') %>">
|
||||
<% _t('SubscribeRSSWidget_ss.SUBSCRIBETEXT', 'Subscribe') %>
|
||||
</a>
|
||||
</p>
|
@ -1,5 +0,0 @@
|
||||
<p class="tagcloud">
|
||||
<% loop TagsCollection %>
|
||||
<a href="$Link" class="$Class">$Tag.XML</a>
|
||||
<% end_loop %>
|
||||
</p>
|
4
templates/WidgetHolder.ss
Normal file
@ -0,0 +1,4 @@
|
||||
<nav class="secondary">
|
||||
<% if $Title %><h3>$Title</h3><% end_if %>
|
||||
$Content
|
||||
</nav>
|
@ -1,58 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package blog
|
||||
* @subpackage tests
|
||||
*/
|
||||
class BlogEntryTest extends SapphireTest {
|
||||
static $fixture_file = 'blog/tests/BlogTest.yml';
|
||||
|
||||
/**
|
||||
* Tests BBCode functionality
|
||||
*/
|
||||
public function testBBCodeContent() {
|
||||
$tmpFlag = BlogEntry::$allow_wysiwyg_editing;
|
||||
BlogEntry::$allow_wysiwyg_editing = false;
|
||||
|
||||
$entry = $this->objFromFixture('BlogEntry', 'testpost');
|
||||
$entry->Content = "[url=admin]the CMS[/url]";
|
||||
|
||||
$this->assertEquals('<p><a href="admin">the CMS</a></p>', $entry->Content()->value);
|
||||
BlogEntry::$allow_wysiwyg_editing = $tmpFlag;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests BlogEntry::Content method
|
||||
*/
|
||||
public function testContent() {
|
||||
$tmpFlag = BlogEntry::$allow_wysiwyg_editing;
|
||||
BlogEntry::$allow_wysiwyg_editing = true;
|
||||
|
||||
$entry = $this->objFromFixture('BlogEntry', 'testpost');
|
||||
$entry->Content = '<a href="admin">the CMS</a>';
|
||||
|
||||
$this->assertEquals('<a href="admin">the CMS</a>', $entry->Content());
|
||||
BlogEntry::$allow_wysiwyg_editing = $tmpFlag;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests TagCollection parsing of tags
|
||||
*/
|
||||
public function testTagging() {
|
||||
$entry = new BlogEntry();
|
||||
$entry->Tags = 'damian,Bob, andrew , multiple words, thing,tag,item , Andrew';
|
||||
$tags = $entry->TagNames();
|
||||
ksort($tags);
|
||||
|
||||
$this->assertEquals(array(
|
||||
'andrew' => 'Andrew',
|
||||
'bob' => 'Bob',
|
||||
'damian' => 'damian',
|
||||
'item' => 'item',
|
||||
'multiple words' => 'multiple words',
|
||||
'tag' => 'tag',
|
||||
'thing' => 'thing'
|
||||
), $tags);
|
||||
}
|
||||
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package blog
|
||||
* @subpackage tests
|
||||
*/
|
||||
class BlogHolderFunctionalTest extends FunctionalTest {
|
||||
|
||||
static $fixture_file = 'blog/tests/BlogHolderFunctionalTest.yml';
|
||||
|
||||
function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$blogHolder = $this->objFromFixture('BlogHolder', 'blogholder');
|
||||
$blogHolder->publish('Stage', 'Live');
|
||||
$blogEntry = $this->objFromFixture('BlogEntry', 'entry1');
|
||||
$blogEntry->publish('Stage', 'Live');
|
||||
}
|
||||
|
||||
function testFrontendBlogPostRequiresPermission() {
|
||||
// get valid SecurityID (from comments form, would usually be copy/pasted)
|
||||
$blogEntry = $this->objFromFixture('BlogEntry', 'entry1');
|
||||
$response = $this->get($blogEntry->RelativeLink());
|
||||
$securityID = Session::get('SecurityID');
|
||||
|
||||
// without login
|
||||
$data = array(
|
||||
'Title'=>'Disallowed',
|
||||
'Author'=>'Disallowed',
|
||||
'BlogPost'=>'Disallowed',
|
||||
'action_postblog' => 'Post blog entry',
|
||||
'SecurityID' => $securityID
|
||||
);
|
||||
$response = $this->post('blog/BlogEntryForm', $data);
|
||||
$this->assertFalse(DataObject::get_one('BlogEntry', sprintf("\"Title\" = 'Disallowed'")));
|
||||
|
||||
// with login
|
||||
$blogEditor = $this->objFromFixture('Member', 'blog_editor');
|
||||
$this->session()->inst_set('loggedInAs', $blogEditor->ID);
|
||||
Permission::flush_permission_cache();
|
||||
$data = array(
|
||||
'Title'=>'Allowed',
|
||||
'Author'=>'Allowed',
|
||||
'BlogPost'=>'Allowed',
|
||||
'action_postblog' => 'Post blog entry',
|
||||
'SecurityID' => $securityID
|
||||
);
|
||||
$response = $this->post('blog/BlogEntryForm', $data);
|
||||
|
||||
$this->assertInstanceOf('BlogEntry', DataObject::get_one('BlogEntry', sprintf("\"Title\" = 'Allowed'")));
|
||||
|
||||
}
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
Permission:
|
||||
blog_management:
|
||||
Code: BLOGMANAGEMENT
|
||||
Group:
|
||||
blog_editors:
|
||||
Code: blog-editors
|
||||
Permissions: =>Permission.blog_management
|
||||
Member:
|
||||
blog_editor:
|
||||
Email: blogeditor@test.com
|
||||
Groups: =>Group.blog_editors
|
||||
BlogHolder:
|
||||
blogholder:
|
||||
Title: Blog Holder
|
||||
URLSegment: blog
|
||||
BlogEntry:
|
||||
entry1:
|
||||
Title: Blog Entry
|
||||
ProvideComments: 1
|
||||
Parent: =>BlogHolder.blogholder
|
@ -1,75 +0,0 @@
|
||||
<?php
|
||||
|
||||
class BlogHolderTest extends SapphireTest {
|
||||
static $fixture_file = 'blog/tests/BlogTest.yml';
|
||||
|
||||
function testGetAllBlogEntries() {
|
||||
$mainblog = $this->objFromFixture('BlogHolder', 'mainblog');
|
||||
|
||||
$this->assertNotNull($mainblog->Entries());
|
||||
$this->assertEquals($mainblog->Entries()->Count(), 3);
|
||||
}
|
||||
|
||||
function testEntriesByMonth() {
|
||||
$mainblog = $this->objFromFixture('BlogHolder', 'mainblog');
|
||||
|
||||
$entries = $mainblog->Entries('', '', '2008-01');
|
||||
$this->assertEquals($entries->Count(), 2);
|
||||
$expectedEntries = array(
|
||||
'test-post-2',
|
||||
'test-post-3'
|
||||
);
|
||||
|
||||
foreach($entries as $entry) {
|
||||
$this->assertContains($entry->URLSegment, $expectedEntries);
|
||||
}
|
||||
}
|
||||
|
||||
function textEntriesByYear() {
|
||||
$mainblog = $this->objFromFixture('BlogHolder', 'mainblog');
|
||||
|
||||
$entries = $mainblog->Entries('', '', '2007');
|
||||
$this->assertEquals($entries->Count(), 1);
|
||||
$expectedEntries = array(
|
||||
'test-post'
|
||||
);
|
||||
|
||||
foreach($entries as $entry) {
|
||||
$this->assertContains($entry->URLSegment, $expectedEntries);
|
||||
}
|
||||
}
|
||||
|
||||
function testEntriesByTag() {
|
||||
$mainblog = $this->objFromFixture('BlogHolder', 'mainblog');
|
||||
|
||||
$entries = $mainblog->Entries('', 'tag1');
|
||||
$this->assertEquals($entries->Count(), 2);
|
||||
$expectedEntries = array(
|
||||
'test-post',
|
||||
'test-post-3'
|
||||
);
|
||||
|
||||
foreach($entries as $entry) {
|
||||
$this->assertContains($entry->URLSegment, $expectedEntries);
|
||||
}
|
||||
}
|
||||
|
||||
function testBlogOwners() {
|
||||
$mainblog = $this->objFromFixture('BlogHolder', 'mainblog');
|
||||
|
||||
$actualMembers = array_values($mainblog->blogOwners()->map('ID', 'Name')->toArray());
|
||||
$expectedMembers = array(
|
||||
'Admin One',
|
||||
'Admin Two',
|
||||
'ADMIN User', // test default admin
|
||||
'Blog Owner One',
|
||||
'Blog Owner Three',
|
||||
'Blog Owner Two',
|
||||
);
|
||||
sort($actualMembers);
|
||||
sort($expectedMembers);
|
||||
|
||||
$this->assertEquals($expectedMembers, $actualMembers);
|
||||
}
|
||||
|
||||
}
|
@ -1,65 +0,0 @@
|
||||
BlogHolder:
|
||||
mainblog:
|
||||
Title: Main Blog
|
||||
otherblog:
|
||||
Title: Other Blog
|
||||
|
||||
BlogEntry:
|
||||
testpost:
|
||||
Title: Test Post
|
||||
URLSegment: test-post
|
||||
Date: 2007-02-17 18:45:00
|
||||
Parent: =>BlogHolder.mainblog
|
||||
Tags: tag1,tag2
|
||||
testpost2:
|
||||
Title: Test Post 2
|
||||
URLSegment: test-post-2
|
||||
Date: 2008-01-31 20:48:00
|
||||
Parent: =>BlogHolder.mainblog
|
||||
Tags: tag2,tag3
|
||||
testpost3:
|
||||
Title: Test Post 3
|
||||
URLSegment: test-post-3
|
||||
Date: 2008-01-17 18:45:00
|
||||
Parent: =>BlogHolder.mainblog
|
||||
Tags: tag1,tag2,tag3
|
||||
|
||||
|
||||
Permission:
|
||||
admin:
|
||||
Code: ADMIN
|
||||
blogOwners:
|
||||
Code: BLOGMANAGEMENT
|
||||
|
||||
Group:
|
||||
admin:
|
||||
Title: Admin
|
||||
Permissions: =>Permission.admin
|
||||
blogOwners:
|
||||
Title: Blog Owners
|
||||
Permissions: =>Permission.blogOwners
|
||||
|
||||
Member:
|
||||
admin1:
|
||||
Name: Admin One
|
||||
Groups: =>Group.admin
|
||||
admin2:
|
||||
Name: Admin Two
|
||||
Groups: =>Group.admin
|
||||
blogOwner1:
|
||||
Name: Blog Owner One
|
||||
Groups: =>Group.blogOwners
|
||||
blogOwner2:
|
||||
Name: Blog Owner Two
|
||||
Groups: =>Group.blogOwners
|
||||
blogOwner3:
|
||||
Name: Blog Owner Three
|
||||
Groups: =>Group.admin, =>Group.blogOwners
|
||||
noBody:
|
||||
Name: No Body
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,106 +0,0 @@
|
||||
<?php
|
||||
|
||||
class BlogTreeTest extends SapphireTest {
|
||||
static $fixture_file = 'blog/tests/BlogTreeTest.yml';
|
||||
|
||||
function testGetAllBlogEntries() {
|
||||
$node = $this->objFromFixture('BlogTree', 'root');
|
||||
$this->assertEquals($node->Entries()->Count(), 3);
|
||||
|
||||
$node = $this->objFromFixture('BlogTree', 'levela');
|
||||
$this->assertEquals($node->Entries()->Count(), 2);
|
||||
|
||||
$node = $this->objFromFixture('BlogTree', 'levelaa');
|
||||
$this->assertEquals($node->Entries()->Count(), 2);
|
||||
|
||||
$node = $this->objFromFixture('BlogTree', 'levelab');
|
||||
$this->assertEquals($node->Entries()->Count(), 0); // this is not null anymore, it returns a DataList with no elements
|
||||
|
||||
$node = $this->objFromFixture('BlogTree', 'levelb');
|
||||
$this->assertEquals($node->Entries()->Count(), 1);
|
||||
|
||||
$node = $this->objFromFixture('BlogTree', 'levelba');
|
||||
$this->assertEquals($node->Entries()->Count(), 1);
|
||||
|
||||
$this->assertTrue($node->getCMSFields() instanceof FieldList);
|
||||
}
|
||||
|
||||
function testEntriesByMonth() {
|
||||
$node = $this->objFromFixture('BlogTree', 'root');
|
||||
|
||||
$entries = $node->Entries('', '', '2008-01');
|
||||
$this->assertEquals($entries->Count(), 2);
|
||||
$expectedEntries = array(
|
||||
'test-post-2',
|
||||
'test-post-3'
|
||||
);
|
||||
|
||||
foreach($entries as $entry) {
|
||||
$this->assertContains($entry->URLSegment, $expectedEntries);
|
||||
}
|
||||
}
|
||||
|
||||
function textEntriesByYear() {
|
||||
$node = $this->objFromFixture('BlogTree', 'root');
|
||||
|
||||
$entries = $node->Entries('', '', '2008');
|
||||
$this->assertEquals($entries->Count(), 2);
|
||||
$expectedEntries = array(
|
||||
'test-post-2',
|
||||
'test-post-3'
|
||||
);
|
||||
|
||||
foreach($entries as $entry) {
|
||||
$this->assertContains($entry->URLSegment, $expectedEntries);
|
||||
}
|
||||
}
|
||||
|
||||
function testEntriesByTag() {
|
||||
$node = $this->objFromFixture('BlogTree', 'root');
|
||||
|
||||
$entries = $node->Entries('', 'tag3', '');
|
||||
$this->assertEquals($entries->Count(), 2);
|
||||
$expectedEntries = array(
|
||||
'test-post-2',
|
||||
'test-post-3'
|
||||
);
|
||||
|
||||
foreach($entries as $entry) {
|
||||
$this->assertContains($entry->URLSegment, $expectedEntries);
|
||||
}
|
||||
}
|
||||
|
||||
function testLandingPageFreshness() {
|
||||
$node = $this->objFromFixture('BlogTree', 'root');
|
||||
$this->assertEquals($node->LandingPageFreshness, '7 DAYS');
|
||||
$node = $this->objFromFixture('BlogTree', 'levela');
|
||||
$this->assertEquals($node->LandingPageFreshness, '2 DAYS');
|
||||
$node = $this->objFromFixture('BlogTree', 'levelb');
|
||||
$this->assertEquals($node->LandingPageFreshness, '7 DAYS');
|
||||
}
|
||||
|
||||
function testGettingAssociatedBlogTree() {
|
||||
$this->assertEquals(BlogTree::current($this->objFromFixture('BlogTree', 'root'))->Title, 'Root BlogTree');
|
||||
$this->assertEquals(BlogTree::current($this->objFromFixture('BlogHolder', 'levelaa_blog2'))->Title, 'Level AA Blog 2');
|
||||
$this->assertEquals(BlogTree::current($this->objFromFixture('BlogEntry', 'testpost3'))->Title, 'Level BA Blog');
|
||||
}
|
||||
|
||||
function testGettingBlogHolderIDs() {
|
||||
$node = $this->objFromFixture('BlogTree', 'root');
|
||||
|
||||
$expectedIds = array();
|
||||
$expectedIds[] = $this->objFromFixture('BlogHolder', 'levelaa_blog1')->ID;
|
||||
$expectedIds[] = $this->objFromFixture('BlogHolder', 'levelaa_blog2')->ID;
|
||||
$expectedIds[] = $this->objFromFixture('BlogHolder', 'levelab_blog')->ID;
|
||||
$expectedIds[] = $this->objFromFixture('BlogHolder', 'levelba_blog')->ID;
|
||||
|
||||
foreach($node->BlogHolderIDs() as $holderId) {
|
||||
$this->assertContains($holderId, $expectedIds);
|
||||
}
|
||||
$this->assertEquals(count($node->BlogHolderIDs()), count($expectedIds));
|
||||
}
|
||||
|
||||
function testBlogTreeURLFuctions() {
|
||||
|
||||
}
|
||||
}
|
@ -1,61 +0,0 @@
|
||||
BlogTree:
|
||||
root:
|
||||
Title: Root BlogTree
|
||||
LandingPageFreshness: 7 DAYS
|
||||
otherroot:
|
||||
Title: Other root BlogTree
|
||||
levela:
|
||||
Title: Level A
|
||||
Parent: =>BlogTree.root
|
||||
LandingPageFreshness: 2 DAYS
|
||||
levelb:
|
||||
Title: Level B
|
||||
Parent: =>BlogTree.root
|
||||
LandingPageFreshness: INHERIT
|
||||
levelaa:
|
||||
Title: Level AA
|
||||
Parent: =>BlogTree.levela
|
||||
levelab:
|
||||
Title: Level AB
|
||||
Parent: =>BlogTree.levela
|
||||
levelba:
|
||||
Title: Level BA
|
||||
Parent: =>BlogTree.levelb
|
||||
BlogHolder:
|
||||
otherroot_holder:
|
||||
Title: other root holder
|
||||
levelaa_blog1:
|
||||
Title: Level AA Blog 1
|
||||
Parent: =>BlogTree.levelaa
|
||||
LandingPageFreshness: 1 DAY
|
||||
levelaa_blog2:
|
||||
Title: Level AA Blog 2
|
||||
Parent: =>BlogTree.levelaa
|
||||
levelab_blog:
|
||||
Title: Level AB Blog
|
||||
Parent: =>BlogTree.levelab
|
||||
levelba_blog:
|
||||
Title: Level BA Blog
|
||||
Parent: =>BlogTree.levelba
|
||||
BlogEntry:
|
||||
testpost:
|
||||
Title: Test Post
|
||||
URLSegment: test-post
|
||||
Date: 2007-02-17 18:45:00
|
||||
Parent: =>BlogHolder.levelaa_blog1
|
||||
Tags: tag1,tag2
|
||||
testpost2:
|
||||
Title: Test Post 2
|
||||
URLSegment: test-post-2
|
||||
Date: 2008-01-31 20:48:00
|
||||
Parent: =>BlogHolder.levelaa_blog2
|
||||
Tags: tag2,tag3
|
||||
testpost3:
|
||||
Title: Test Post 3
|
||||
URLSegment: test-post-3
|
||||
Date: 2008-01-17 18:45:00
|
||||
Parent: =>BlogHolder.levelba_blog
|
||||
Tags: tag1,tag2,tag3
|
||||
|
||||
|
||||
|
@ -1,95 +0,0 @@
|
||||
<?php
|
||||
|
||||
class TagCloudWidgetTest extends SapphireTest {
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
if(!class_exists('Widget')) return;
|
||||
|
||||
// holder
|
||||
$holder = new BlogHolder();
|
||||
$holder->Title = 'Holder';
|
||||
$holder->write();
|
||||
TagCloudWidget::$container = $holder;
|
||||
|
||||
// Save all pages
|
||||
$page = new BlogEntry();
|
||||
$page->Tags = 'Ultra, Very, Popular, Somewhat, NotVery, NotPopular';
|
||||
$page->ParentID = $holder->ID;
|
||||
$page->write();
|
||||
$page = new BlogEntry();
|
||||
$page->Tags = 'Ultra, Very, Popular, Somewhat, NotVery';
|
||||
$page->ParentID = $holder->ID;
|
||||
$page->write();
|
||||
$page = new BlogEntry();
|
||||
$page->Tags = 'Ultra, Very, Popular, Somewhat';
|
||||
$page->ParentID = $holder->ID;
|
||||
$page->write();
|
||||
$page = new BlogEntry();
|
||||
$page->Tags = 'Ultra, Very, Popular';
|
||||
$page->ParentID = $holder->ID;
|
||||
$page->write();
|
||||
$page = new BlogEntry();
|
||||
$page->Tags = 'Ultra, Very, Popular';
|
||||
$page->ParentID = $holder->ID;
|
||||
$page->write();
|
||||
$page = new BlogEntry();
|
||||
$page->Tags = 'Ultra, Very';
|
||||
$page->ParentID = $holder->ID;
|
||||
$page->write();
|
||||
$page = new BlogEntry();
|
||||
$page->Tags = 'Ultra';
|
||||
$page->ParentID = $holder->ID;
|
||||
$page->write();
|
||||
$page = new BlogEntry();
|
||||
$page->Tags = '';
|
||||
$page->ParentID = $holder->ID;
|
||||
$page->write();
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
parent::tearDown();
|
||||
|
||||
if(!class_exists('Widget')) return;
|
||||
|
||||
TagCloudWidget::$container = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that tags are correctly extracted from a blog tree
|
||||
*/
|
||||
public function testGetTags() {
|
||||
|
||||
if(!class_exists('Widget')) $this->markTestSkipped('This test requires the Widget module');
|
||||
|
||||
// Test sorting by alphabetic
|
||||
$widget = new TagCloudWidget();
|
||||
$widget->Sortby = 'alphabet';
|
||||
$tags = $widget->getTagsCollection()->toNestedArray();
|
||||
$this->assertEquals($tags[0]['Tag'], 'NotPopular');
|
||||
$this->assertEquals($tags[0]['Class'], 'not-popular');
|
||||
$this->assertEquals($tags[0]['Count'], 1);
|
||||
$this->assertEquals($tags[3]['Tag'], 'Somewhat');
|
||||
$this->assertEquals($tags[3]['Class'], 'somewhat-popular');
|
||||
$this->assertEquals($tags[3]['Count'], 3);
|
||||
$this->assertEquals($tags[5]['Tag'], 'Very');
|
||||
$this->assertEquals($tags[5]['Class'], 'very-popular');
|
||||
$this->assertEquals($tags[5]['Count'], 6);
|
||||
|
||||
// Test sorting by frequency
|
||||
$widget = new TagCloudWidget();
|
||||
$widget->Sortby = 'frequency';
|
||||
$tags = $widget->getTagsCollection()->toNestedArray();
|
||||
$this->assertEquals($tags[0]['Tag'], 'Ultra');
|
||||
$this->assertEquals($tags[0]['Class'], 'ultra-popular');
|
||||
$this->assertEquals($tags[0]['Count'], 7);
|
||||
$this->assertEquals($tags[3]['Tag'], 'Somewhat');
|
||||
$this->assertEquals($tags[3]['Class'], 'somewhat-popular');
|
||||
$this->assertEquals($tags[3]['Count'], 3);
|
||||
$this->assertEquals($tags[5]['Tag'], 'NotPopular');
|
||||
$this->assertEquals($tags[5]['Class'], 'not-popular');
|
||||
$this->assertEquals($tags[5]['Count'], 1);
|
||||
}
|
||||
|
||||
}
|
0
tests/behat/_manifest_exclude
Normal file
126
tests/behat/features/blog.feature
Normal 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
After Width: | Height: | Size: 2.2 KiB |
105
tests/behat/src/FeatureContext.php
Normal 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;
|
||||
}
|
||||
}
|
9
tests/behat/src/FixtureContext.php
Normal file
@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace SilverStripe\Blog\Tests\Behat\Context;
|
||||
|
||||
use SilverStripe\BehatExtension\Context\FixtureContext as BaseFixtureContext;
|
||||
|
||||
class FixtureContext extends BaseFixtureContext
|
||||
{
|
||||
}
|
170
tests/php/BlogCategoryTest.php
Executable 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']);
|
||||
}
|
||||
}
|
||||
}
|
46
tests/php/BlogFunctionalTest.php
Normal 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());
|
||||
}
|
||||
}
|
24
tests/php/BlogFunctionalTest.yml
Normal 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
|
57
tests/php/BlogPostFilterTest.php
Executable 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');
|
||||
}
|
||||
}
|
58
tests/php/BlogPostNotificationsTest.php
Normal 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
@ -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
@ -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");
|
||||
}
|
||||
}
|
71
tests/php/BlogTagsCloudWidgetTest.php
Normal 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
@ -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 ?? []));
|
||||
}
|
||||
}
|
39
tests/php/Model/BlogControllerFunctionalTest.php
Normal 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());
|
||||
}
|
||||
}
|
29
tests/php/Model/BlogControllerFunctionalTest.yml
Normal 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
|
131
tests/php/Widgets/BlogArchiveWidgetTest.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
45
tests/php/Widgets/BlogArchiveWidgetTest.yml
Normal 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
@ -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
|
||||
|
||||
|
3777
thirdparty/xmlrpc/xmlrpc.php
vendored
@ -1,3777 +0,0 @@
|
||||
<?php
|
||||
// by Edd Dumbill (C) 1999-2002
|
||||
// <edd@usefulinc.com>
|
||||
// $Id: xmlrpc.inc,v 1.174 2009/03/16 19:36:38 ggiunta Exp $
|
||||
|
||||
// Copyright (c) 1999,2000,2002 Edd Dumbill.
|
||||
// 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.
|
||||
//
|
||||
// * Neither the name of the "XML-RPC for PHP" nor the names of its
|
||||
// contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
//
|
||||
// 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
|
||||
// REGENTS 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.
|
||||
|
||||
if(!function_exists('xml_parser_create'))
|
||||
{
|
||||
// For PHP 4 onward, XML functionality is always compiled-in on windows:
|
||||
// no more need to dl-open it. It might have been compiled out on *nix...
|
||||
if(strtoupper(substr(PHP_OS, 0, 3) != 'WIN'))
|
||||
{
|
||||
dl('xml.so');
|
||||
}
|
||||
}
|
||||
|
||||
// G. Giunta 2005/01/29: declare global these variables,
|
||||
// so that xmlrpc.inc will work even if included from within a function
|
||||
// Milosch: 2005/08/07 - explicitly request these via $GLOBALS where used.
|
||||
$GLOBALS['xmlrpcI4']='i4';
|
||||
$GLOBALS['xmlrpcInt']='int';
|
||||
$GLOBALS['xmlrpcBoolean']='boolean';
|
||||
$GLOBALS['xmlrpcDouble']='double';
|
||||
$GLOBALS['xmlrpcString']='string';
|
||||
$GLOBALS['xmlrpcDateTime']='dateTime.iso8601';
|
||||
$GLOBALS['xmlrpcBase64']='base64';
|
||||
$GLOBALS['xmlrpcArray']='array';
|
||||
$GLOBALS['xmlrpcStruct']='struct';
|
||||
$GLOBALS['xmlrpcValue']='undefined';
|
||||
|
||||
$GLOBALS['xmlrpcTypes']=array(
|
||||
$GLOBALS['xmlrpcI4'] => 1,
|
||||
$GLOBALS['xmlrpcInt'] => 1,
|
||||
$GLOBALS['xmlrpcBoolean'] => 1,
|
||||
$GLOBALS['xmlrpcString'] => 1,
|
||||
$GLOBALS['xmlrpcDouble'] => 1,
|
||||
$GLOBALS['xmlrpcDateTime'] => 1,
|
||||
$GLOBALS['xmlrpcBase64'] => 1,
|
||||
$GLOBALS['xmlrpcArray'] => 2,
|
||||
$GLOBALS['xmlrpcStruct'] => 3
|
||||
);
|
||||
|
||||
$GLOBALS['xmlrpc_valid_parents'] = array(
|
||||
'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'),
|
||||
'BOOLEAN' => array('VALUE'),
|
||||
'I4' => array('VALUE'),
|
||||
'INT' => array('VALUE'),
|
||||
'STRING' => array('VALUE'),
|
||||
'DOUBLE' => array('VALUE'),
|
||||
'DATETIME.ISO8601' => array('VALUE'),
|
||||
'BASE64' => array('VALUE'),
|
||||
'MEMBER' => array('STRUCT'),
|
||||
'NAME' => array('MEMBER'),
|
||||
'DATA' => array('ARRAY'),
|
||||
'ARRAY' => array('VALUE'),
|
||||
'STRUCT' => array('VALUE'),
|
||||
'PARAM' => array('PARAMS'),
|
||||
'METHODNAME' => array('METHODCALL'),
|
||||
'PARAMS' => array('METHODCALL', 'METHODRESPONSE'),
|
||||
'FAULT' => array('METHODRESPONSE'),
|
||||
'NIL' => array('VALUE'), // only used when extension activated
|
||||
'EX:NIL' => array('VALUE') // only used when extension activated
|
||||
);
|
||||
|
||||
// define extra types for supporting NULL (useful for json or <NIL/>)
|
||||
$GLOBALS['xmlrpcNull']='null';
|
||||
$GLOBALS['xmlrpcTypes']['null']=1;
|
||||
|
||||
// Not in use anymore since 2.0. Shall we remove it?
|
||||
/// @deprecated
|
||||
$GLOBALS['xmlEntities']=array(
|
||||
'amp' => '&',
|
||||
'quot' => '"',
|
||||
'lt' => '<',
|
||||
'gt' => '>',
|
||||
'apos' => "'"
|
||||
);
|
||||
|
||||
// tables used for transcoding different charsets into us-ascii xml
|
||||
|
||||
$GLOBALS['xml_iso88591_Entities']=array();
|
||||
$GLOBALS['xml_iso88591_Entities']['in'] = array();
|
||||
$GLOBALS['xml_iso88591_Entities']['out'] = array();
|
||||
for ($i = 0; $i < 32; $i++)
|
||||
{
|
||||
$GLOBALS['xml_iso88591_Entities']['in'][] = chr($i);
|
||||
$GLOBALS['xml_iso88591_Entities']['out'][] = '&#'.$i.';';
|
||||
}
|
||||
for ($i = 160; $i < 256; $i++)
|
||||
{
|
||||
$GLOBALS['xml_iso88591_Entities']['in'][] = chr($i);
|
||||
$GLOBALS['xml_iso88591_Entities']['out'][] = '&#'.$i.';';
|
||||
}
|
||||
|
||||
/// @todo add to iso table the characters from cp_1252 range, i.e. 128 to 159?
|
||||
/// These will NOT be present in true ISO-8859-1, but will save the unwary
|
||||
/// windows user from sending junk (though no luck when reciving them...)
|
||||
/*
|
||||
$GLOBALS['xml_cp1252_Entities']=array();
|
||||
for ($i = 128; $i < 160; $i++)
|
||||
{
|
||||
$GLOBALS['xml_cp1252_Entities']['in'][] = chr($i);
|
||||
}
|
||||
$GLOBALS['xml_cp1252_Entities']['out'] = array(
|
||||
'€', '?', '‚', 'ƒ',
|
||||
'„', '…', '†', '‡',
|
||||
'ˆ', '‰', 'Š', '‹',
|
||||
'Œ', '?', 'Ž', '?',
|
||||
'?', '‘', '’', '“',
|
||||
'”', '•', '–', '—',
|
||||
'˜', '™', 'š', '›',
|
||||
'œ', '?', 'ž', 'Ÿ'
|
||||
);
|
||||
*/
|
||||
|
||||
$GLOBALS['xmlrpcerr'] = array(
|
||||
'unknown_method'=>1,
|
||||
'invalid_return'=>2,
|
||||
'incorrect_params'=>3,
|
||||
'introspect_unknown'=>4,
|
||||
'http_error'=>5,
|
||||
'no_data'=>6,
|
||||
'no_ssl'=>7,
|
||||
'curl_fail'=>8,
|
||||
'invalid_request'=>15,
|
||||
'no_curl'=>16,
|
||||
'server_error'=>17,
|
||||
'multicall_error'=>18,
|
||||
'multicall_notstruct'=>9,
|
||||
'multicall_nomethod'=>10,
|
||||
'multicall_notstring'=>11,
|
||||
'multicall_recursion'=>12,
|
||||
'multicall_noparams'=>13,
|
||||
'multicall_notarray'=>14,
|
||||
|
||||
'cannot_decompress'=>103,
|
||||
'decompress_fail'=>104,
|
||||
'dechunk_fail'=>105,
|
||||
'server_cannot_decompress'=>106,
|
||||
'server_decompress_fail'=>107
|
||||
);
|
||||
|
||||
$GLOBALS['xmlrpcstr'] = array(
|
||||
'unknown_method'=>'Unknown method',
|
||||
'invalid_return'=>'Invalid return payload: enable debugging to examine incoming payload',
|
||||
'incorrect_params'=>'Incorrect parameters passed to method',
|
||||
'introspect_unknown'=>"Can't introspect: method unknown",
|
||||
'http_error'=>"Didn't receive 200 OK from remote server.",
|
||||
'no_data'=>'No data received from server.',
|
||||
'no_ssl'=>'No SSL support compiled in.',
|
||||
'curl_fail'=>'CURL error',
|
||||
'invalid_request'=>'Invalid request payload',
|
||||
'no_curl'=>'No CURL support compiled in.',
|
||||
'server_error'=>'Internal server error',
|
||||
'multicall_error'=>'Received from server invalid multicall response',
|
||||
'multicall_notstruct'=>'system.multicall expected struct',
|
||||
'multicall_nomethod'=>'missing methodName',
|
||||
'multicall_notstring'=>'methodName is not a string',
|
||||
'multicall_recursion'=>'recursive system.multicall forbidden',
|
||||
'multicall_noparams'=>'missing params',
|
||||
'multicall_notarray'=>'params is not an array',
|
||||
|
||||
'cannot_decompress'=>'Received from server compressed HTTP and cannot decompress',
|
||||
'decompress_fail'=>'Received from server invalid compressed HTTP',
|
||||
'dechunk_fail'=>'Received from server invalid chunked HTTP',
|
||||
'server_cannot_decompress'=>'Received from client compressed HTTP request and cannot decompress',
|
||||
'server_decompress_fail'=>'Received from client invalid compressed HTTP request'
|
||||
);
|
||||
|
||||
// The charset encoding used by the server for received messages and
|
||||
// by the client for received responses when received charset cannot be determined
|
||||
// or is not supported
|
||||
$GLOBALS['xmlrpc_defencoding']='UTF-8';
|
||||
|
||||
// The encoding used internally by PHP.
|
||||
// String values received as xml will be converted to this, and php strings will be converted to xml
|
||||
// as if having been coded with this
|
||||
$GLOBALS['xmlrpc_internalencoding']='ISO-8859-1';
|
||||
|
||||
$GLOBALS['xmlrpcName']='XML-RPC for PHP';
|
||||
$GLOBALS['xmlrpcVersion']='3.0.0.beta';
|
||||
|
||||
// let user errors start at 800
|
||||
$GLOBALS['xmlrpcerruser']=800;
|
||||
// let XML parse errors start at 100
|
||||
$GLOBALS['xmlrpcerrxml']=100;
|
||||
|
||||
// formulate backslashes for escaping regexp
|
||||
// Not in use anymore since 2.0. Shall we remove it?
|
||||
/// @deprecated
|
||||
$GLOBALS['xmlrpc_backslash']=chr(92).chr(92);
|
||||
|
||||
// set to TRUE to enable correct decoding of <NIL/> and <EX:NIL/> values
|
||||
$GLOBALS['xmlrpc_null_extension']=false;
|
||||
|
||||
// set to TRUE to enable encoding of php NULL values to <EX:NIL/> instead of <NIL/>
|
||||
$GLOBALS['xmlrpc_null_apache_encoding']=false;
|
||||
|
||||
// used to store state during parsing
|
||||
// quick explanation of components:
|
||||
// ac - used to accumulate values
|
||||
// isf - used to indicate a parsing fault (2) or xmlrpcresp fault (1)
|
||||
// isf_reason - used for storing xmlrpcresp fault string
|
||||
// lv - used to indicate "looking for a value": implements
|
||||
// the logic to allow values with no types to be strings
|
||||
// params - used to store parameters in method calls
|
||||
// method - used to store method name
|
||||
// stack - array with genealogy of xml elements names:
|
||||
// used to validate nesting of xmlrpc elements
|
||||
$GLOBALS['_xh']=null;
|
||||
|
||||
/**
|
||||
* Convert a string to the correct XML representation in a target charset
|
||||
* To help correct communication of non-ascii chars inside strings, regardless
|
||||
* of the charset used when sending requests, parsing them, sending responses
|
||||
* and parsing responses, an option is to convert all non-ascii chars present in the message
|
||||
* into their equivalent 'charset entity'. Charset entities enumerated this way
|
||||
* are independent of the charset encoding used to transmit them, and all XML
|
||||
* parsers are bound to understand them.
|
||||
* Note that in the std case we are not sending a charset encoding mime type
|
||||
* along with http headers, so we are bound by RFC 3023 to emit strict us-ascii.
|
||||
*
|
||||
* @todo do a bit of basic benchmarking (strtr vs. str_replace)
|
||||
* @todo make usage of iconv() or recode_string() or mb_string() where available
|
||||
*/
|
||||
function xmlrpc_encode_entitites($data, $src_encoding='', $dest_encoding='')
|
||||
{
|
||||
if ($src_encoding == '')
|
||||
{
|
||||
// lame, but we know no better...
|
||||
$src_encoding = $GLOBALS['xmlrpc_internalencoding'];
|
||||
}
|
||||
|
||||
switch(strtoupper($src_encoding.'_'.$dest_encoding))
|
||||
{
|
||||
case 'ISO-8859-1_':
|
||||
case 'ISO-8859-1_US-ASCII':
|
||||
$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data);
|
||||
$escaped_data = str_replace($GLOBALS['xml_iso88591_Entities']['in'], $GLOBALS['xml_iso88591_Entities']['out'], $escaped_data);
|
||||
break;
|
||||
case 'ISO-8859-1_UTF-8':
|
||||
$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data);
|
||||
$escaped_data = utf8_encode($escaped_data);
|
||||
break;
|
||||
case 'ISO-8859-1_ISO-8859-1':
|
||||
case 'US-ASCII_US-ASCII':
|
||||
case 'US-ASCII_UTF-8':
|
||||
case 'US-ASCII_':
|
||||
case 'US-ASCII_ISO-8859-1':
|
||||
case 'UTF-8_UTF-8':
|
||||
//case 'CP1252_CP1252':
|
||||
$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data);
|
||||
break;
|
||||
case 'UTF-8_':
|
||||
case 'UTF-8_US-ASCII':
|
||||
case 'UTF-8_ISO-8859-1':
|
||||
// NB: this will choke on invalid UTF-8, going most likely beyond EOF
|
||||
$escaped_data = '';
|
||||
// be kind to users creating string xmlrpcvals out of different php types
|
||||
$data = (string) $data;
|
||||
$ns = strlen ($data);
|
||||
for ($nn = 0; $nn < $ns; $nn++)
|
||||
{
|
||||
$ch = $data[$nn];
|
||||
$ii = ord($ch);
|
||||
//1 7 0bbbbbbb (127)
|
||||
if ($ii < 128)
|
||||
{
|
||||
/// @todo shall we replace this with a (supposedly) faster str_replace?
|
||||
switch($ii){
|
||||
case 34:
|
||||
$escaped_data .= '"';
|
||||
break;
|
||||
case 38:
|
||||
$escaped_data .= '&';
|
||||
break;
|
||||
case 39:
|
||||
$escaped_data .= ''';
|
||||
break;
|
||||
case 60:
|
||||
$escaped_data .= '<';
|
||||
break;
|
||||
case 62:
|
||||
$escaped_data .= '>';
|
||||
break;
|
||||
default:
|
||||
$escaped_data .= $ch;
|
||||
} // switch
|
||||
}
|
||||
//2 11 110bbbbb 10bbbbbb (2047)
|
||||
else if ($ii>>5 == 6)
|
||||
{
|
||||
$b1 = ($ii & 31);
|
||||
$ii = ord($data[$nn+1]);
|
||||
$b2 = ($ii & 63);
|
||||
$ii = ($b1 * 64) + $b2;
|
||||
$ent = sprintf ('&#%d;', $ii);
|
||||
$escaped_data .= $ent;
|
||||
$nn += 1;
|
||||
}
|
||||
//3 16 1110bbbb 10bbbbbb 10bbbbbb
|
||||
else if ($ii>>4 == 14)
|
||||
{
|
||||
$b1 = ($ii & 15);
|
||||
$ii = ord($data[$nn+1]);
|
||||
$b2 = ($ii & 63);
|
||||
$ii = ord($data[$nn+2]);
|
||||
$b3 = ($ii & 63);
|
||||
$ii = ((($b1 * 64) + $b2) * 64) + $b3;
|
||||
$ent = sprintf ('&#%d;', $ii);
|
||||
$escaped_data .= $ent;
|
||||
$nn += 2;
|
||||
}
|
||||
//4 21 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
|
||||
else if ($ii>>3 == 30)
|
||||
{
|
||||
$b1 = ($ii & 7);
|
||||
$ii = ord($data[$nn+1]);
|
||||
$b2 = ($ii & 63);
|
||||
$ii = ord($data[$nn+2]);
|
||||
$b3 = ($ii & 63);
|
||||
$ii = ord($data[$nn+3]);
|
||||
$b4 = ($ii & 63);
|
||||
$ii = ((((($b1 * 64) + $b2) * 64) + $b3) * 64) + $b4;
|
||||
$ent = sprintf ('&#%d;', $ii);
|
||||
$escaped_data .= $ent;
|
||||
$nn += 3;
|
||||
}
|
||||
}
|
||||
break;
|
||||
/*
|
||||
case 'CP1252_':
|
||||
case 'CP1252_US-ASCII':
|
||||
$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data);
|
||||
$escaped_data = str_replace($GLOBALS['xml_iso88591_Entities']['in'], $GLOBALS['xml_iso88591_Entities']['out'], $escaped_data);
|
||||
$escaped_data = str_replace($GLOBALS['xml_cp1252_Entities']['in'], $GLOBALS['xml_cp1252_Entities']['out'], $escaped_data);
|
||||
break;
|
||||
case 'CP1252_UTF-8':
|
||||
$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data);
|
||||
/// @todo we could use real UTF8 chars here instead of xml entities... (note that utf_8 encode all allone will NOT convert them)
|
||||
$escaped_data = str_replace($GLOBALS['xml_cp1252_Entities']['in'], $GLOBALS['xml_cp1252_Entities']['out'], $escaped_data);
|
||||
$escaped_data = utf8_encode($escaped_data);
|
||||
break;
|
||||
case 'CP1252_ISO-8859-1':
|
||||
$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data);
|
||||
// we might as well replave all funky chars with a '?' here, but we are kind and leave it to the receiving application layer to decide what to do with these weird entities...
|
||||
$escaped_data = str_replace($GLOBALS['xml_cp1252_Entities']['in'], $GLOBALS['xml_cp1252_Entities']['out'], $escaped_data);
|
||||
break;
|
||||
*/
|
||||
default:
|
||||
$escaped_data = '';
|
||||
error_log("Converting from $src_encoding to $dest_encoding: not supported...");
|
||||
}
|
||||
return $escaped_data;
|
||||
}
|
||||
|
||||
/// xml parser handler function for opening element tags
|
||||
function xmlrpc_se($parser, $name, $attrs, $accept_single_vals=false)
|
||||
{
|
||||
// if invalid xmlrpc already detected, skip all processing
|
||||
if ($GLOBALS['_xh']['isf'] < 2)
|
||||
{
|
||||
// check for correct element nesting
|
||||
// top level element can only be of 2 types
|
||||
/// @todo optimization creep: save this check into a bool variable, instead of using count() every time:
|
||||
/// there is only a single top level element in xml anyway
|
||||
if (count($GLOBALS['_xh']['stack']) == 0)
|
||||
{
|
||||
if ($name != 'METHODRESPONSE' && $name != 'METHODCALL' && (
|
||||
$name != 'VALUE' && !$accept_single_vals))
|
||||
{
|
||||
$GLOBALS['_xh']['isf'] = 2;
|
||||
$GLOBALS['_xh']['isf_reason'] = 'missing top level xmlrpc element';
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
$GLOBALS['_xh']['rt'] = strtolower($name);
|
||||
$GLOBALS['_xh']['rt'] = strtolower($name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// not top level element: see if parent is OK
|
||||
$parent = end($GLOBALS['_xh']['stack']);
|
||||
if (!array_key_exists($name, $GLOBALS['xmlrpc_valid_parents']) || !in_array($parent, $GLOBALS['xmlrpc_valid_parents'][$name]))
|
||||
{
|
||||
$GLOBALS['_xh']['isf'] = 2;
|
||||
$GLOBALS['_xh']['isf_reason'] = "xmlrpc element $name cannot be child of $parent";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
switch($name)
|
||||
{
|
||||
// optimize for speed switch cases: most common cases first
|
||||
case 'VALUE':
|
||||
/// @todo we could check for 2 VALUE elements inside a MEMBER or PARAM element
|
||||
$GLOBALS['_xh']['vt']='value'; // indicator: no value found yet
|
||||
$GLOBALS['_xh']['ac']='';
|
||||
$GLOBALS['_xh']['lv']=1;
|
||||
$GLOBALS['_xh']['php_class']=null;
|
||||
break;
|
||||
case 'I4':
|
||||
case 'INT':
|
||||
case 'STRING':
|
||||
case 'BOOLEAN':
|
||||
case 'DOUBLE':
|
||||
case 'DATETIME.ISO8601':
|
||||
case 'BASE64':
|
||||
if ($GLOBALS['_xh']['vt']!='value')
|
||||
{
|
||||
//two data elements inside a value: an error occurred!
|
||||
$GLOBALS['_xh']['isf'] = 2;
|
||||
$GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";
|
||||
return;
|
||||
}
|
||||
$GLOBALS['_xh']['ac']=''; // reset the accumulator
|
||||
break;
|
||||
case 'STRUCT':
|
||||
case 'ARRAY':
|
||||
if ($GLOBALS['_xh']['vt']!='value')
|
||||
{
|
||||
//two data elements inside a value: an error occurred!
|
||||
$GLOBALS['_xh']['isf'] = 2;
|
||||
$GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";
|
||||
return;
|
||||
}
|
||||
// create an empty array to hold child values, and push it onto appropriate stack
|
||||
$cur_val = array();
|
||||
$cur_val['values'] = array();
|
||||
$cur_val['type'] = $name;
|
||||
// check for out-of-band information to rebuild php objs
|
||||
// and in case it is found, save it
|
||||
if (@isset($attrs['PHP_CLASS']))
|
||||
{
|
||||
$cur_val['php_class'] = $attrs['PHP_CLASS'];
|
||||
}
|
||||
$GLOBALS['_xh']['valuestack'][] = $cur_val;
|
||||
$GLOBALS['_xh']['vt']='data'; // be prepared for a data element next
|
||||
break;
|
||||
case 'DATA':
|
||||
if ($GLOBALS['_xh']['vt']!='data')
|
||||
{
|
||||
//two data elements inside a value: an error occurred!
|
||||
$GLOBALS['_xh']['isf'] = 2;
|
||||
$GLOBALS['_xh']['isf_reason'] = "found two data elements inside an array element";
|
||||
return;
|
||||
}
|
||||
case 'METHODCALL':
|
||||
case 'METHODRESPONSE':
|
||||
case 'PARAMS':
|
||||
// valid elements that add little to processing
|
||||
break;
|
||||
case 'METHODNAME':
|
||||
case 'NAME':
|
||||
/// @todo we could check for 2 NAME elements inside a MEMBER element
|
||||
$GLOBALS['_xh']['ac']='';
|
||||
break;
|
||||
case 'FAULT':
|
||||
$GLOBALS['_xh']['isf']=1;
|
||||
break;
|
||||
case 'MEMBER':
|
||||
$GLOBALS['_xh']['valuestack'][count($GLOBALS['_xh']['valuestack'])-1]['name']=''; // set member name to null, in case we do not find in the xml later on
|
||||
//$GLOBALS['_xh']['ac']='';
|
||||
// Drop trough intentionally
|
||||
case 'PARAM':
|
||||
// clear value type, so we can check later if no value has been passed for this param/member
|
||||
$GLOBALS['_xh']['vt']=null;
|
||||
break;
|
||||
case 'NIL':
|
||||
case 'EX:NIL':
|
||||
if ($GLOBALS['xmlrpc_null_extension'])
|
||||
{
|
||||
if ($GLOBALS['_xh']['vt']!='value')
|
||||
{
|
||||
//two data elements inside a value: an error occurred!
|
||||
$GLOBALS['_xh']['isf'] = 2;
|
||||
$GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";
|
||||
return;
|
||||
}
|
||||
$GLOBALS['_xh']['ac']=''; // reset the accumulator
|
||||
break;
|
||||
}
|
||||
// we do not support the <NIL/> extension, so
|
||||
// drop through intentionally
|
||||
default:
|
||||
/// INVALID ELEMENT: RAISE ISF so that it is later recognized!!!
|
||||
$GLOBALS['_xh']['isf'] = 2;
|
||||
$GLOBALS['_xh']['isf_reason'] = "found not-xmlrpc xml element $name";
|
||||
break;
|
||||
}
|
||||
|
||||
// Save current element name to stack, to validate nesting
|
||||
$GLOBALS['_xh']['stack'][] = $name;
|
||||
|
||||
/// @todo optimization creep: move this inside the big switch() above
|
||||
if($name!='VALUE')
|
||||
{
|
||||
$GLOBALS['_xh']['lv']=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Used in decoding xml chunks that might represent single xmlrpc values
|
||||
function xmlrpc_se_any($parser, $name, $attrs)
|
||||
{
|
||||
xmlrpc_se($parser, $name, $attrs, true);
|
||||
}
|
||||
|
||||
/// xml parser handler function for close element tags
|
||||
function xmlrpc_ee($parser, $name, $rebuild_xmlrpcvals = true)
|
||||
{
|
||||
if ($GLOBALS['_xh']['isf'] < 2)
|
||||
{
|
||||
// push this element name from stack
|
||||
// NB: if XML validates, correct opening/closing is guaranteed and
|
||||
// we do not have to check for $name == $curr_elem.
|
||||
// we also checked for proper nesting at start of elements...
|
||||
$curr_elem = array_pop($GLOBALS['_xh']['stack']);
|
||||
|
||||
switch($name)
|
||||
{
|
||||
case 'VALUE':
|
||||
// This if() detects if no scalar was inside <VALUE></VALUE>
|
||||
if ($GLOBALS['_xh']['vt']=='value')
|
||||
{
|
||||
$GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];
|
||||
$GLOBALS['_xh']['vt']=$GLOBALS['xmlrpcString'];
|
||||
}
|
||||
|
||||
if ($rebuild_xmlrpcvals)
|
||||
{
|
||||
// build the xmlrpc val out of the data received, and substitute it
|
||||
$temp = new xmlrpcval($GLOBALS['_xh']['value'], $GLOBALS['_xh']['vt']);
|
||||
// in case we got info about underlying php class, save it
|
||||
// in the object we're rebuilding
|
||||
if (isset($GLOBALS['_xh']['php_class']))
|
||||
$temp->_php_class = $GLOBALS['_xh']['php_class'];
|
||||
// check if we are inside an array or struct:
|
||||
// if value just built is inside an array, let's move it into array on the stack
|
||||
$vscount = count($GLOBALS['_xh']['valuestack']);
|
||||
if ($vscount && $GLOBALS['_xh']['valuestack'][$vscount-1]['type']=='ARRAY')
|
||||
{
|
||||
$GLOBALS['_xh']['valuestack'][$vscount-1]['values'][] = $temp;
|
||||
}
|
||||
else
|
||||
{
|
||||
$GLOBALS['_xh']['value'] = $temp;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/// @todo this needs to treat correctly php-serialized objects,
|
||||
/// since std deserializing is done by php_xmlrpc_decode,
|
||||
/// which we will not be calling...
|
||||
if (isset($GLOBALS['_xh']['php_class']))
|
||||
{
|
||||
}
|
||||
|
||||
// check if we are inside an array or struct:
|
||||
// if value just built is inside an array, let's move it into array on the stack
|
||||
$vscount = count($GLOBALS['_xh']['valuestack']);
|
||||
if ($vscount && $GLOBALS['_xh']['valuestack'][$vscount-1]['type']=='ARRAY')
|
||||
{
|
||||
$GLOBALS['_xh']['valuestack'][$vscount-1]['values'][] = $GLOBALS['_xh']['value'];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'BOOLEAN':
|
||||
case 'I4':
|
||||
case 'INT':
|
||||
case 'STRING':
|
||||
case 'DOUBLE':
|
||||
case 'DATETIME.ISO8601':
|
||||
case 'BASE64':
|
||||
$GLOBALS['_xh']['vt']=strtolower($name);
|
||||
/// @todo: optimization creep - remove the if/elseif cycle below
|
||||
/// since the case() in which we are already did that
|
||||
if ($name=='STRING')
|
||||
{
|
||||
$GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];
|
||||
}
|
||||
elseif ($name=='DATETIME.ISO8601')
|
||||
{
|
||||
if (!preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $GLOBALS['_xh']['ac']))
|
||||
{
|
||||
error_log('XML-RPC: invalid value received in DATETIME: '.$GLOBALS['_xh']['ac']);
|
||||
}
|
||||
$GLOBALS['_xh']['vt']=$GLOBALS['xmlrpcDateTime'];
|
||||
$GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];
|
||||
}
|
||||
elseif ($name=='BASE64')
|
||||
{
|
||||
/// @todo check for failure of base64 decoding / catch warnings
|
||||
$GLOBALS['_xh']['value']=base64_decode($GLOBALS['_xh']['ac']);
|
||||
}
|
||||
elseif ($name=='BOOLEAN')
|
||||
{
|
||||
// special case here: we translate boolean 1 or 0 into PHP
|
||||
// constants true or false.
|
||||
// Strings 'true' and 'false' are accepted, even though the
|
||||
// spec never mentions them (see eg. Blogger api docs)
|
||||
// NB: this simple checks helps a lot sanitizing input, ie no
|
||||
// security problems around here
|
||||
if ($GLOBALS['_xh']['ac']=='1' || strcasecmp($GLOBALS['_xh']['ac'], 'true') == 0)
|
||||
{
|
||||
$GLOBALS['_xh']['value']=true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// log if receiveing something strange, even though we set the value to false anyway
|
||||
if ($GLOBALS['_xh']['ac']!='0' && strcasecmp($GLOBALS['_xh']['ac'], 'false') != 0)
|
||||
error_log('XML-RPC: invalid value received in BOOLEAN: '.$GLOBALS['_xh']['ac']);
|
||||
$GLOBALS['_xh']['value']=false;
|
||||
}
|
||||
}
|
||||
elseif ($name=='DOUBLE')
|
||||
{
|
||||
// we have a DOUBLE
|
||||
// we must check that only 0123456789-.<space> are characters here
|
||||
// NOTE: regexp could be much stricter than this...
|
||||
if (!preg_match('/^[+-eE0123456789 \t.]+$/', $GLOBALS['_xh']['ac']))
|
||||
{
|
||||
/// @todo: find a better way of throwing an error than this!
|
||||
error_log('XML-RPC: non numeric value received in DOUBLE: '.$GLOBALS['_xh']['ac']);
|
||||
$GLOBALS['_xh']['value']='ERROR_NON_NUMERIC_FOUND';
|
||||
}
|
||||
else
|
||||
{
|
||||
// it's ok, add it on
|
||||
$GLOBALS['_xh']['value']=(double)$GLOBALS['_xh']['ac'];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// we have an I4/INT
|
||||
// we must check that only 0123456789-<space> are characters here
|
||||
if (!preg_match('/^[+-]?[0123456789 \t]+$/', $GLOBALS['_xh']['ac']))
|
||||
{
|
||||
/// @todo find a better way of throwing an error than this!
|
||||
error_log('XML-RPC: non numeric value received in INT: '.$GLOBALS['_xh']['ac']);
|
||||
$GLOBALS['_xh']['value']='ERROR_NON_NUMERIC_FOUND';
|
||||
}
|
||||
else
|
||||
{
|
||||
// it's ok, add it on
|
||||
$GLOBALS['_xh']['value']=(int)$GLOBALS['_xh']['ac'];
|
||||
}
|
||||
}
|
||||
//$GLOBALS['_xh']['ac']=''; // is this necessary?
|
||||
$GLOBALS['_xh']['lv']=3; // indicate we've found a value
|
||||
break;
|
||||
case 'NAME':
|
||||
$GLOBALS['_xh']['valuestack'][count($GLOBALS['_xh']['valuestack'])-1]['name'] = $GLOBALS['_xh']['ac'];
|
||||
break;
|
||||
case 'MEMBER':
|
||||
//$GLOBALS['_xh']['ac']=''; // is this necessary?
|
||||
// add to array in the stack the last element built,
|
||||
// unless no VALUE was found
|
||||
if ($GLOBALS['_xh']['vt'])
|
||||
{
|
||||
$vscount = count($GLOBALS['_xh']['valuestack']);
|
||||
$GLOBALS['_xh']['valuestack'][$vscount-1]['values'][$GLOBALS['_xh']['valuestack'][$vscount-1]['name']] = $GLOBALS['_xh']['value'];
|
||||
} else
|
||||
error_log('XML-RPC: missing VALUE inside STRUCT in received xml');
|
||||
break;
|
||||
case 'DATA':
|
||||
//$GLOBALS['_xh']['ac']=''; // is this necessary?
|
||||
$GLOBALS['_xh']['vt']=null; // reset this to check for 2 data elements in a row - even if they're empty
|
||||
break;
|
||||
case 'STRUCT':
|
||||
case 'ARRAY':
|
||||
// fetch out of stack array of values, and promote it to current value
|
||||
$curr_val = array_pop($GLOBALS['_xh']['valuestack']);
|
||||
$GLOBALS['_xh']['value'] = $curr_val['values'];
|
||||
$GLOBALS['_xh']['vt']=strtolower($name);
|
||||
if (isset($curr_val['php_class']))
|
||||
{
|
||||
$GLOBALS['_xh']['php_class'] = $curr_val['php_class'];
|
||||
}
|
||||
break;
|
||||
case 'PARAM':
|
||||
// add to array of params the current value,
|
||||
// unless no VALUE was found
|
||||
if ($GLOBALS['_xh']['vt'])
|
||||
{
|
||||
$GLOBALS['_xh']['params'][]=$GLOBALS['_xh']['value'];
|
||||
$GLOBALS['_xh']['pt'][]=$GLOBALS['_xh']['vt'];
|
||||
}
|
||||
else
|
||||
error_log('XML-RPC: missing VALUE inside PARAM in received xml');
|
||||
break;
|
||||
case 'METHODNAME':
|
||||
$GLOBALS['_xh']['method']=preg_replace('/^[\n\r\t ]+/', '', $GLOBALS['_xh']['ac']);
|
||||
break;
|
||||
case 'NIL':
|
||||
case 'EX:NIL':
|
||||
if ($GLOBALS['xmlrpc_null_extension'])
|
||||
{
|
||||
$GLOBALS['_xh']['vt']='null';
|
||||
$GLOBALS['_xh']['value']=null;
|
||||
$GLOBALS['_xh']['lv']=3;
|
||||
break;
|
||||
}
|
||||
// drop through intentionally if nil extension not enabled
|
||||
case 'PARAMS':
|
||||
case 'FAULT':
|
||||
case 'METHODCALL':
|
||||
case 'METHORESPONSE':
|
||||
break;
|
||||
default:
|
||||
// End of INVALID ELEMENT!
|
||||
// shall we add an assert here for unreachable code???
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Used in decoding xmlrpc requests/responses without rebuilding xmlrpc values
|
||||
function xmlrpc_ee_fast($parser, $name)
|
||||
{
|
||||
xmlrpc_ee($parser, $name, false);
|
||||
}
|
||||
|
||||
/// xml parser handler function for character data
|
||||
function xmlrpc_cd($parser, $data)
|
||||
{
|
||||
// skip processing if xml fault already detected
|
||||
if ($GLOBALS['_xh']['isf'] < 2)
|
||||
{
|
||||
// "lookforvalue==3" means that we've found an entire value
|
||||
// and should discard any further character data
|
||||
if($GLOBALS['_xh']['lv']!=3)
|
||||
{
|
||||
// G. Giunta 2006-08-23: useless change of 'lv' from 1 to 2
|
||||
//if($GLOBALS['_xh']['lv']==1)
|
||||
//{
|
||||
// if we've found text and we're just in a <value> then
|
||||
// say we've found a value
|
||||
//$GLOBALS['_xh']['lv']=2;
|
||||
//}
|
||||
// we always initialize the accumulator before starting parsing, anyway...
|
||||
//if(!@isset($GLOBALS['_xh']['ac']))
|
||||
//{
|
||||
// $GLOBALS['_xh']['ac'] = '';
|
||||
//}
|
||||
$GLOBALS['_xh']['ac'].=$data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// xml parser handler function for 'other stuff', ie. not char data or
|
||||
/// element start/end tag. In fact it only gets called on unknown entities...
|
||||
function xmlrpc_dh($parser, $data)
|
||||
{
|
||||
// skip processing if xml fault already detected
|
||||
if ($GLOBALS['_xh']['isf'] < 2)
|
||||
{
|
||||
if(substr($data, 0, 1) == '&' && substr($data, -1, 1) == ';')
|
||||
{
|
||||
// G. Giunta 2006-08-25: useless change of 'lv' from 1 to 2
|
||||
//if($GLOBALS['_xh']['lv']==1)
|
||||
//{
|
||||
// $GLOBALS['_xh']['lv']=2;
|
||||
//}
|
||||
$GLOBALS['_xh']['ac'].=$data;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
class xmlrpc_client
|
||||
{
|
||||
var $path;
|
||||
var $server;
|
||||
var $port=0;
|
||||
var $method='http';
|
||||
var $errno;
|
||||
var $errstr;
|
||||
var $debug=0;
|
||||
var $username='';
|
||||
var $password='';
|
||||
var $authtype=1;
|
||||
var $cert='';
|
||||
var $certpass='';
|
||||
var $cacert='';
|
||||
var $cacertdir='';
|
||||
var $key='';
|
||||
var $keypass='';
|
||||
var $verifypeer=true;
|
||||
var $verifyhost=1;
|
||||
var $no_multicall=false;
|
||||
var $proxy='';
|
||||
var $proxyport=0;
|
||||
var $proxy_user='';
|
||||
var $proxy_pass='';
|
||||
var $proxy_authtype=1;
|
||||
var $cookies=array();
|
||||
var $extracurlopts=array();
|
||||
|
||||
/**
|
||||
* List of http compression methods accepted by the client for responses.
|
||||
* NB: PHP supports deflate, gzip compressions out of the box if compiled w. zlib
|
||||
*
|
||||
* NNB: you can set it to any non-empty array for HTTP11 and HTTPS, since
|
||||
* in those cases it will be up to CURL to decide the compression methods
|
||||
* it supports. You might check for the presence of 'zlib' in the output of
|
||||
* curl_version() to determine wheter compression is supported or not
|
||||
*/
|
||||
var $accepted_compression = array();
|
||||
/**
|
||||
* Name of compression scheme to be used for sending requests.
|
||||
* Either null, gzip or deflate
|
||||
*/
|
||||
var $request_compression = '';
|
||||
/**
|
||||
* CURL handle: used for keep-alive connections (PHP 4.3.8 up, see:
|
||||
* http://curl.haxx.se/docs/faq.html#7.3)
|
||||
*/
|
||||
var $xmlrpc_curl_handle = null;
|
||||
/// Wheter to use persistent connections for http 1.1 and https
|
||||
var $keepalive = false;
|
||||
/// Charset encodings that can be decoded without problems by the client
|
||||
var $accepted_charset_encodings = array();
|
||||
/// Charset encoding to be used in serializing request. NULL = use ASCII
|
||||
var $request_charset_encoding = '';
|
||||
/**
|
||||
* Decides the content of xmlrpcresp objects returned by calls to send()
|
||||
* valid strings are 'xmlrpcvals', 'phpvals' or 'xml'
|
||||
*/
|
||||
var $return_type = 'xmlrpcvals';
|
||||
/**
|
||||
* Sent to servers in http headers
|
||||
*/
|
||||
var $user_agent;
|
||||
|
||||
/**
|
||||
* @param string $path either the complete server URL or the PATH part of the xmlrc server URL, e.g. /xmlrpc/server.php
|
||||
* @param string $server the server name / ip address
|
||||
* @param integer $port the port the server is listening on, defaults to 80 or 443 depending on protocol used
|
||||
* @param string $method the http protocol variant: defaults to 'http', 'https' and 'http11' can be used if CURL is installed
|
||||
*/
|
||||
function xmlrpc_client($path, $server='', $port='', $method='')
|
||||
{
|
||||
// allow user to specify all params in $path
|
||||
if($server == '' and $port == '' and $method == '')
|
||||
{
|
||||
$parts = parse_url($path);
|
||||
$server = $parts['host'];
|
||||
$path = isset($parts['path']) ? $parts['path'] : '';
|
||||
if(isset($parts['query']))
|
||||
{
|
||||
$path .= '?'.$parts['query'];
|
||||
}
|
||||
if(isset($parts['fragment']))
|
||||
{
|
||||
$path .= '#'.$parts['fragment'];
|
||||
}
|
||||
if(isset($parts['port']))
|
||||
{
|
||||
$port = $parts['port'];
|
||||
}
|
||||
if(isset($parts['scheme']))
|
||||
{
|
||||
$method = $parts['scheme'];
|
||||
}
|
||||
if(isset($parts['user']))
|
||||
{
|
||||
$this->username = $parts['user'];
|
||||
}
|
||||
if(isset($parts['pass']))
|
||||
{
|
||||
$this->password = $parts['pass'];
|
||||
}
|
||||
}
|
||||
if($path == '' || $path[0] != '/')
|
||||
{
|
||||
$this->path='/'.$path;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->path=$path;
|
||||
}
|
||||
$this->server=$server;
|
||||
if($port != '')
|
||||
{
|
||||
$this->port=$port;
|
||||
}
|
||||
if($method != '')
|
||||
{
|
||||
$this->method=$method;
|
||||
}
|
||||
|
||||
// if ZLIB is enabled, let the client by default accept compressed responses
|
||||
if(function_exists('gzinflate') || (
|
||||
function_exists('curl_init') && (($info = curl_version()) &&
|
||||
((is_string($info) && strpos($info, 'zlib') !== null) || isset($info['libz_version'])))
|
||||
))
|
||||
{
|
||||
$this->accepted_compression = array('gzip', 'deflate');
|
||||
}
|
||||
|
||||
// keepalives: enabled by default
|
||||
$this->keepalive = true;
|
||||
|
||||
// by default the xml parser can support these 3 charset encodings
|
||||
$this->accepted_charset_encodings = array('UTF-8', 'ISO-8859-1', 'US-ASCII');
|
||||
|
||||
// initialize user_agent string
|
||||
$this->user_agent = $GLOBALS['xmlrpcName'] . ' ' . $GLOBALS['xmlrpcVersion'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables/disables the echoing to screen of the xmlrpc responses received
|
||||
* @param integer $debug values 0, 1 and 2 are supported (2 = echo sent msg too, before received response)
|
||||
* @access public
|
||||
*/
|
||||
function setDebug($in)
|
||||
{
|
||||
$this->debug=$in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add some http BASIC AUTH credentials, used by the client to authenticate
|
||||
* @param string $u username
|
||||
* @param string $p password
|
||||
* @param integer $t auth type. See curl_setopt man page for supported auth types. Defaults to CURLAUTH_BASIC (basic auth)
|
||||
* @access public
|
||||
*/
|
||||
function setCredentials($u, $p, $t=1)
|
||||
{
|
||||
$this->username=$u;
|
||||
$this->password=$p;
|
||||
$this->authtype=$t;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a client-side https certificate
|
||||
* @param string $cert
|
||||
* @param string $certpass
|
||||
* @access public
|
||||
*/
|
||||
function setCertificate($cert, $certpass)
|
||||
{
|
||||
$this->cert = $cert;
|
||||
$this->certpass = $certpass;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a CA certificate to verify server with (see man page about
|
||||
* CURLOPT_CAINFO for more details
|
||||
* @param string $cacert certificate file name (or dir holding certificates)
|
||||
* @param bool $is_dir set to true to indicate cacert is a dir. defaults to false
|
||||
* @access public
|
||||
*/
|
||||
function setCaCertificate($cacert, $is_dir=false)
|
||||
{
|
||||
if ($is_dir)
|
||||
{
|
||||
$this->cacertdir = $cacert;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->cacert = $cacert;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set attributes for SSL communication: private SSL key
|
||||
* NB: does not work in older php/curl installs
|
||||
* Thanks to Daniel Convissor
|
||||
* @param string $key The name of a file containing a private SSL key
|
||||
* @param string $keypass The secret password needed to use the private SSL key
|
||||
* @access public
|
||||
*/
|
||||
function setKey($key, $keypass)
|
||||
{
|
||||
$this->key = $key;
|
||||
$this->keypass = $keypass;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set attributes for SSL communication: verify server certificate
|
||||
* @param bool $i enable/disable verification of peer certificate
|
||||
* @access public
|
||||
*/
|
||||
function setSSLVerifyPeer($i)
|
||||
{
|
||||
$this->verifypeer = $i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set attributes for SSL communication: verify match of server cert w. hostname
|
||||
* @param int $i
|
||||
* @access public
|
||||
*/
|
||||
function setSSLVerifyHost($i)
|
||||
{
|
||||
$this->verifyhost = $i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set proxy info
|
||||
* @param string $proxyhost
|
||||
* @param string $proxyport Defaults to 8080 for HTTP and 443 for HTTPS
|
||||
* @param string $proxyusername Leave blank if proxy has public access
|
||||
* @param string $proxypassword Leave blank if proxy has public access
|
||||
* @param int $proxyauthtype set to constant CURLAUTH_NTLM to use NTLM auth with proxy
|
||||
* @access public
|
||||
*/
|
||||
function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '', $proxyauthtype = 1)
|
||||
{
|
||||
$this->proxy = $proxyhost;
|
||||
$this->proxyport = $proxyport;
|
||||
$this->proxy_user = $proxyusername;
|
||||
$this->proxy_pass = $proxypassword;
|
||||
$this->proxy_authtype = $proxyauthtype;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables/disables reception of compressed xmlrpc responses.
|
||||
* Note that enabling reception of compressed responses merely adds some standard
|
||||
* http headers to xmlrpc requests. It is up to the xmlrpc server to return
|
||||
* compressed responses when receiving such requests.
|
||||
* @param string $compmethod either 'gzip', 'deflate', 'any' or ''
|
||||
* @access public
|
||||
*/
|
||||
function setAcceptedCompression($compmethod)
|
||||
{
|
||||
if ($compmethod == 'any')
|
||||
$this->accepted_compression = array('gzip', 'deflate');
|
||||
else
|
||||
$this->accepted_compression = array($compmethod);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables/disables http compression of xmlrpc request.
|
||||
* Take care when sending compressed requests: servers might not support them
|
||||
* (and automatic fallback to uncompressed requests is not yet implemented)
|
||||
* @param string $compmethod either 'gzip', 'deflate' or ''
|
||||
* @access public
|
||||
*/
|
||||
function setRequestCompression($compmethod)
|
||||
{
|
||||
$this->request_compression = $compmethod;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a cookie to list of cookies that will be sent to server.
|
||||
* NB: setting any param but name and value will turn the cookie into a 'version 1' cookie:
|
||||
* do not do it unless you know what you are doing
|
||||
* @param string $name
|
||||
* @param string $value
|
||||
* @param string $path
|
||||
* @param string $domain
|
||||
* @param int $port
|
||||
* @access public
|
||||
*
|
||||
* @todo check correctness of urlencoding cookie value (copied from php way of doing it...)
|
||||
*/
|
||||
function setCookie($name, $value='', $path='', $domain='', $port=null)
|
||||
{
|
||||
$this->cookies[$name]['value'] = urlencode($value);
|
||||
if ($path || $domain || $port)
|
||||
{
|
||||
$this->cookies[$name]['path'] = $path;
|
||||
$this->cookies[$name]['domain'] = $domain;
|
||||
$this->cookies[$name]['port'] = $port;
|
||||
$this->cookies[$name]['version'] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->cookies[$name]['version'] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Directly set cURL options, for extra flexibility
|
||||
* It allows eg. to bind client to a specific IP interface / address
|
||||
* @param $options array
|
||||
*/
|
||||
function SetCurlOptions( $options )
|
||||
{
|
||||
$this->extracurlopts = $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set user-agent string that will be used by this client instance
|
||||
* in http headers sent to the server
|
||||
*/
|
||||
function SetUserAgent( $agentstring )
|
||||
{
|
||||
$this->user_agent = $agentstring;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send an xmlrpc request
|
||||
* @param mixed $msg The message object, or an array of messages for using multicall, or the complete xml representation of a request
|
||||
* @param integer $timeout Connection timeout, in seconds, If unspecified, a platform specific timeout will apply
|
||||
* @param string $method if left unspecified, the http protocol chosen during creation of the object will be used
|
||||
* @return xmlrpcresp
|
||||
* @access public
|
||||
*/
|
||||
function& send($msg, $timeout=0, $method='')
|
||||
{
|
||||
// if user deos not specify http protocol, use native method of this client
|
||||
// (i.e. method set during call to constructor)
|
||||
if($method == '')
|
||||
{
|
||||
$method = $this->method;
|
||||
}
|
||||
|
||||
if(is_array($msg))
|
||||
{
|
||||
// $msg is an array of xmlrpcmsg's
|
||||
$r = $this->multicall($msg, $timeout, $method);
|
||||
return $r;
|
||||
}
|
||||
elseif(is_string($msg))
|
||||
{
|
||||
$n = new xmlrpcmsg('');
|
||||
$n->payload = $msg;
|
||||
$msg = $n;
|
||||
}
|
||||
|
||||
// where msg is an xmlrpcmsg
|
||||
$msg->debug=$this->debug;
|
||||
|
||||
if($method == 'https')
|
||||
{
|
||||
$r =& $this->sendPayloadHTTPS(
|
||||
$msg,
|
||||
$this->server,
|
||||
$this->port,
|
||||
$timeout,
|
||||
$this->username,
|
||||
$this->password,
|
||||
$this->authtype,
|
||||
$this->cert,
|
||||
$this->certpass,
|
||||
$this->cacert,
|
||||
$this->cacertdir,
|
||||
$this->proxy,
|
||||
$this->proxyport,
|
||||
$this->proxy_user,
|
||||
$this->proxy_pass,
|
||||
$this->proxy_authtype,
|
||||
$this->keepalive,
|
||||
$this->key,
|
||||
$this->keypass
|
||||
);
|
||||
}
|
||||
elseif($method == 'http11')
|
||||
{
|
||||
$r =& $this->sendPayloadCURL(
|
||||
$msg,
|
||||
$this->server,
|
||||
$this->port,
|
||||
$timeout,
|
||||
$this->username,
|
||||
$this->password,
|
||||
$this->authtype,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
$this->proxy,
|
||||
$this->proxyport,
|
||||
$this->proxy_user,
|
||||
$this->proxy_pass,
|
||||
$this->proxy_authtype,
|
||||
'http',
|
||||
$this->keepalive
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
$r =& $this->sendPayloadHTTP10(
|
||||
$msg,
|
||||
$this->server,
|
||||
$this->port,
|
||||
$timeout,
|
||||
$this->username,
|
||||
$this->password,
|
||||
$this->authtype,
|
||||
$this->proxy,
|
||||
$this->proxyport,
|
||||
$this->proxy_user,
|
||||
$this->proxy_pass,
|
||||
$this->proxy_authtype
|
||||
);
|
||||
}
|
||||
|
||||
return $r;
|
||||
}
|
||||
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
function &sendPayloadHTTP10($msg, $server, $port, $timeout=0,
|
||||
$username='', $password='', $authtype=1, $proxyhost='',
|
||||
$proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1)
|
||||
{
|
||||
if($port==0)
|
||||
{
|
||||
$port=80;
|
||||
}
|
||||
|
||||
// Only create the payload if it was not created previously
|
||||
if(empty($msg->payload))
|
||||
{
|
||||
$msg->createPayload($this->request_charset_encoding);
|
||||
}
|
||||
|
||||
$payload = $msg->payload;
|
||||
// Deflate request body and set appropriate request headers
|
||||
if(function_exists('gzdeflate') && ($this->request_compression == 'gzip' || $this->request_compression == 'deflate'))
|
||||
{
|
||||
if($this->request_compression == 'gzip')
|
||||
{
|
||||
$a = @gzencode($payload);
|
||||
if($a)
|
||||
{
|
||||
$payload = $a;
|
||||
$encoding_hdr = "Content-Encoding: gzip\r\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$a = @gzcompress($payload);
|
||||
if($a)
|
||||
{
|
||||
$payload = $a;
|
||||
$encoding_hdr = "Content-Encoding: deflate\r\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$encoding_hdr = '';
|
||||
}
|
||||
|
||||
// thanks to Grant Rauscher <grant7@firstworld.net> for this
|
||||
$credentials='';
|
||||
if($username!='')
|
||||
{
|
||||
$credentials='Authorization: Basic ' . base64_encode($username . ':' . $password) . "\r\n";
|
||||
if ($authtype != 1)
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth is supported with HTTP 1.0');
|
||||
}
|
||||
}
|
||||
|
||||
$accepted_encoding = '';
|
||||
if(is_array($this->accepted_compression) && count($this->accepted_compression))
|
||||
{
|
||||
$accepted_encoding = 'Accept-Encoding: ' . implode(', ', $this->accepted_compression) . "\r\n";
|
||||
}
|
||||
|
||||
$proxy_credentials = '';
|
||||
if($proxyhost)
|
||||
{
|
||||
if($proxyport == 0)
|
||||
{
|
||||
$proxyport = 8080;
|
||||
}
|
||||
$connectserver = $proxyhost;
|
||||
$connectport = $proxyport;
|
||||
$uri = 'http://'.$server.':'.$port.$this->path;
|
||||
if($proxyusername != '')
|
||||
{
|
||||
if ($proxyauthtype != 1)
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth to proxy is supported with HTTP 1.0');
|
||||
}
|
||||
$proxy_credentials = 'Proxy-Authorization: Basic ' . base64_encode($proxyusername.':'.$proxypassword) . "\r\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$connectserver = $server;
|
||||
$connectport = $port;
|
||||
$uri = $this->path;
|
||||
}
|
||||
|
||||
// Cookie generation, as per rfc2965 (version 1 cookies) or
|
||||
// netscape's rules (version 0 cookies)
|
||||
$cookieheader='';
|
||||
if (count($this->cookies))
|
||||
{
|
||||
$version = '';
|
||||
foreach ($this->cookies as $name => $cookie)
|
||||
{
|
||||
if ($cookie['version'])
|
||||
{
|
||||
$version = ' $Version="' . $cookie['version'] . '";';
|
||||
$cookieheader .= ' ' . $name . '="' . $cookie['value'] . '";';
|
||||
if ($cookie['path'])
|
||||
$cookieheader .= ' $Path="' . $cookie['path'] . '";';
|
||||
if ($cookie['domain'])
|
||||
$cookieheader .= ' $Domain="' . $cookie['domain'] . '";';
|
||||
if ($cookie['port'])
|
||||
$cookieheader .= ' $Port="' . $cookie['port'] . '";';
|
||||
}
|
||||
else
|
||||
{
|
||||
$cookieheader .= ' ' . $name . '=' . $cookie['value'] . ";";
|
||||
}
|
||||
}
|
||||
$cookieheader = 'Cookie:' . $version . substr($cookieheader, 0, -1) . "\r\n";
|
||||
}
|
||||
|
||||
$op= 'POST ' . $uri. " HTTP/1.0\r\n" .
|
||||
'User-Agent: ' . $this->user_agent . "\r\n" .
|
||||
'Host: '. $server . ':' . $port . "\r\n" .
|
||||
$credentials .
|
||||
$proxy_credentials .
|
||||
$accepted_encoding .
|
||||
$encoding_hdr .
|
||||
'Accept-Charset: ' . implode(',', $this->accepted_charset_encodings) . "\r\n" .
|
||||
$cookieheader .
|
||||
'Content-Type: ' . $msg->content_type . "\r\nContent-Length: " .
|
||||
strlen($payload) . "\r\n\r\n" .
|
||||
$payload;
|
||||
|
||||
if($this->debug > 1)
|
||||
{
|
||||
print "<PRE>\n---SENDING---\n" . htmlentities($op) . "\n---END---\n</PRE>";
|
||||
// let the client see this now in case http times out...
|
||||
flush();
|
||||
}
|
||||
|
||||
if($timeout>0)
|
||||
{
|
||||
$fp=@fsockopen($connectserver, $connectport, $this->errno, $this->errstr, $timeout);
|
||||
}
|
||||
else
|
||||
{
|
||||
$fp=@fsockopen($connectserver, $connectport, $this->errno, $this->errstr);
|
||||
}
|
||||
if($fp)
|
||||
{
|
||||
if($timeout>0 && function_exists('stream_set_timeout'))
|
||||
{
|
||||
stream_set_timeout($fp, $timeout);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->errstr='Connect error: '.$this->errstr;
|
||||
$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $this->errstr . ' (' . $this->errno . ')');
|
||||
return $r;
|
||||
}
|
||||
|
||||
if(!fputs($fp, $op, strlen($op)))
|
||||
{
|
||||
fclose($fp);
|
||||
$this->errstr='Write error';
|
||||
$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $this->errstr);
|
||||
return $r;
|
||||
}
|
||||
else
|
||||
{
|
||||
// reset errno and errstr on succesful socket connection
|
||||
$this->errstr = '';
|
||||
}
|
||||
// G. Giunta 2005/10/24: close socket before parsing.
|
||||
// should yeld slightly better execution times, and make easier recursive calls (e.g. to follow http redirects)
|
||||
$ipd='';
|
||||
do
|
||||
{
|
||||
// shall we check for $data === FALSE?
|
||||
// as per the manual, it signals an error
|
||||
$ipd.=fread($fp, 32768);
|
||||
} while(!feof($fp));
|
||||
fclose($fp);
|
||||
$r =& $msg->parseResponse($ipd, false, $this->return_type);
|
||||
return $r;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
function &sendPayloadHTTPS($msg, $server, $port, $timeout=0, $username='',
|
||||
$password='', $authtype=1, $cert='',$certpass='', $cacert='', $cacertdir='',
|
||||
$proxyhost='', $proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1,
|
||||
$keepalive=false, $key='', $keypass='')
|
||||
{
|
||||
$r =& $this->sendPayloadCURL($msg, $server, $port, $timeout, $username,
|
||||
$password, $authtype, $cert, $certpass, $cacert, $cacertdir, $proxyhost, $proxyport,
|
||||
$proxyusername, $proxypassword, $proxyauthtype, 'https', $keepalive, $key, $keypass);
|
||||
return $r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Contributed by Justin Miller <justin@voxel.net>
|
||||
* Requires curl to be built into PHP
|
||||
* NB: CURL versions before 7.11.10 cannot use proxy to talk to https servers!
|
||||
* @access private
|
||||
*/
|
||||
function &sendPayloadCURL($msg, $server, $port, $timeout=0, $username='',
|
||||
$password='', $authtype=1, $cert='', $certpass='', $cacert='', $cacertdir='',
|
||||
$proxyhost='', $proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1, $method='https',
|
||||
$keepalive=false, $key='', $keypass='')
|
||||
{
|
||||
if(!function_exists('curl_init'))
|
||||
{
|
||||
$this->errstr='CURL unavailable on this install';
|
||||
$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_curl'], $GLOBALS['xmlrpcstr']['no_curl']);
|
||||
return $r;
|
||||
}
|
||||
if($method == 'https')
|
||||
{
|
||||
if(($info = curl_version()) &&
|
||||
((is_string($info) && strpos($info, 'OpenSSL') === null) || (is_array($info) && !isset($info['ssl_version']))))
|
||||
{
|
||||
$this->errstr='SSL unavailable on this install';
|
||||
$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_ssl'], $GLOBALS['xmlrpcstr']['no_ssl']);
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
|
||||
if($port == 0)
|
||||
{
|
||||
if($method == 'http')
|
||||
{
|
||||
$port = 80;
|
||||
}
|
||||
else
|
||||
{
|
||||
$port = 443;
|
||||
}
|
||||
}
|
||||
|
||||
// Only create the payload if it was not created previously
|
||||
if(empty($msg->payload))
|
||||
{
|
||||
$msg->createPayload($this->request_charset_encoding);
|
||||
}
|
||||
|
||||
// Deflate request body and set appropriate request headers
|
||||
$payload = $msg->payload;
|
||||
if(function_exists('gzdeflate') && ($this->request_compression == 'gzip' || $this->request_compression == 'deflate'))
|
||||
{
|
||||
if($this->request_compression == 'gzip')
|
||||
{
|
||||
$a = @gzencode($payload);
|
||||
if($a)
|
||||
{
|
||||
$payload = $a;
|
||||
$encoding_hdr = 'Content-Encoding: gzip';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$a = @gzcompress($payload);
|
||||
if($a)
|
||||
{
|
||||
$payload = $a;
|
||||
$encoding_hdr = 'Content-Encoding: deflate';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$encoding_hdr = '';
|
||||
}
|
||||
|
||||
if($this->debug > 1)
|
||||
{
|
||||
print "<PRE>\n---SENDING---\n" . htmlentities($payload) . "\n---END---\n</PRE>";
|
||||
// let the client see this now in case http times out...
|
||||
flush();
|
||||
}
|
||||
|
||||
if(!$keepalive || !$this->xmlrpc_curl_handle)
|
||||
{
|
||||
$curl = curl_init($method . '://' . $server . ':' . $port . $this->path);
|
||||
if($keepalive)
|
||||
{
|
||||
$this->xmlrpc_curl_handle = $curl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$curl = $this->xmlrpc_curl_handle;
|
||||
}
|
||||
|
||||
// results into variable
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
||||
if($this->debug)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_VERBOSE, 1);
|
||||
}
|
||||
curl_setopt($curl, CURLOPT_USERAGENT, $this->user_agent);
|
||||
|
||||
// required for XMLRPC: post the data
|
||||
curl_setopt($curl, CURLOPT_POST, 1);
|
||||
// the data
|
||||
curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
|
||||
|
||||
// return the header too
|
||||
curl_setopt($curl, CURLOPT_HEADER, 1);
|
||||
|
||||
// will only work with PHP >= 5.0
|
||||
// NB: if we set an empty string, CURL will add http header indicating
|
||||
// ALL methods it is supporting. This is possibly a better option than
|
||||
// letting the user tell what curl can / cannot do...
|
||||
if(is_array($this->accepted_compression) && count($this->accepted_compression))
|
||||
{
|
||||
//curl_setopt($curl, CURLOPT_ENCODING, implode(',', $this->accepted_compression));
|
||||
// empty string means 'any supported by CURL' (shall we catch errors in case CURLOPT_SSLKEY undefined ?)
|
||||
if (count($this->accepted_compression) == 1)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_ENCODING, $this->accepted_compression[0]);
|
||||
}
|
||||
else
|
||||
curl_setopt($curl, CURLOPT_ENCODING, '');
|
||||
}
|
||||
// extra headers
|
||||
$headers = array('Content-Type: ' . $msg->content_type , 'Accept-Charset: ' . implode(',', $this->accepted_charset_encodings));
|
||||
// if no keepalive is wanted, let the server know it in advance
|
||||
if(!$keepalive)
|
||||
{
|
||||
$headers[] = 'Connection: close';
|
||||
}
|
||||
// request compression header
|
||||
if($encoding_hdr)
|
||||
{
|
||||
$headers[] = $encoding_hdr;
|
||||
}
|
||||
|
||||
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
|
||||
// timeout is borked
|
||||
if($timeout)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout == 1 ? 1 : $timeout - 1);
|
||||
}
|
||||
|
||||
if($username && $password)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_USERPWD, $username.':'.$password);
|
||||
if (defined('CURLOPT_HTTPAUTH'))
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_HTTPAUTH, $authtype);
|
||||
}
|
||||
else if ($authtype != 1)
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth is supported by the current PHP/curl install');
|
||||
}
|
||||
}
|
||||
|
||||
if($method == 'https')
|
||||
{
|
||||
// set cert file
|
||||
if($cert)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_SSLCERT, $cert);
|
||||
}
|
||||
// set cert password
|
||||
if($certpass)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $certpass);
|
||||
}
|
||||
// whether to verify remote host's cert
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verifypeer);
|
||||
// set ca certificates file/dir
|
||||
if($cacert)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_CAINFO, $cacert);
|
||||
}
|
||||
if($cacertdir)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_CAPATH, $cacertdir);
|
||||
}
|
||||
// set key file (shall we catch errors in case CURLOPT_SSLKEY undefined ?)
|
||||
if($key)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_SSLKEY, $key);
|
||||
}
|
||||
// set key password (shall we catch errors in case CURLOPT_SSLKEY undefined ?)
|
||||
if($keypass)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_SSLKEYPASSWD, $keypass);
|
||||
}
|
||||
// whether to verify cert's common name (CN); 0 for no, 1 to verify that it exists, and 2 to verify that it matches the hostname used
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $this->verifyhost);
|
||||
}
|
||||
|
||||
// proxy info
|
||||
if($proxyhost)
|
||||
{
|
||||
if($proxyport == 0)
|
||||
{
|
||||
$proxyport = 8080; // NB: even for HTTPS, local connection is on port 8080
|
||||
}
|
||||
curl_setopt($curl, CURLOPT_PROXY, $proxyhost.':'.$proxyport);
|
||||
//curl_setopt($curl, CURLOPT_PROXYPORT,$proxyport);
|
||||
if($proxyusername)
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_PROXYUSERPWD, $proxyusername.':'.$proxypassword);
|
||||
if (defined('CURLOPT_PROXYAUTH'))
|
||||
{
|
||||
curl_setopt($curl, CURLOPT_PROXYAUTH, $proxyauthtype);
|
||||
}
|
||||
else if ($proxyauthtype != 1)
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth to proxy is supported by the current PHP/curl install');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// NB: should we build cookie http headers by hand rather than let CURL do it?
|
||||
// the following code does not honour 'expires', 'path' and 'domain' cookie attributes
|
||||
// set to client obj the the user...
|
||||
if (count($this->cookies))
|
||||
{
|
||||
$cookieheader = '';
|
||||
foreach ($this->cookies as $name => $cookie)
|
||||
{
|
||||
$cookieheader .= $name . '=' . $cookie['value'] . '; ';
|
||||
}
|
||||
curl_setopt($curl, CURLOPT_COOKIE, substr($cookieheader, 0, -2));
|
||||
}
|
||||
|
||||
foreach ($this->extracurlopts as $opt => $val)
|
||||
{
|
||||
curl_setopt($curl, $opt, $val);
|
||||
}
|
||||
|
||||
$result = curl_exec($curl);
|
||||
|
||||
if ($this->debug > 1)
|
||||
{
|
||||
print "<PRE>\n---CURL INFO---\n";
|
||||
foreach(curl_getinfo($curl) as $name => $val)
|
||||
print $name . ': ' . htmlentities($val). "\n";
|
||||
print "---END---\n</PRE>";
|
||||
}
|
||||
|
||||
if(!$result) /// @todo we should use a better check here - what if we get back '' or '0'?
|
||||
{
|
||||
$this->errstr='no response';
|
||||
$resp=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['curl_fail'], $GLOBALS['xmlrpcstr']['curl_fail']. ': '. curl_error($curl));
|
||||
curl_close($curl);
|
||||
if($keepalive)
|
||||
{
|
||||
$this->xmlrpc_curl_handle = null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!$keepalive)
|
||||
{
|
||||
curl_close($curl);
|
||||
}
|
||||
$resp =& $msg->parseResponse($result, true, $this->return_type);
|
||||
}
|
||||
return $resp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send an array of request messages and return an array of responses.
|
||||
* Unless $this->no_multicall has been set to true, it will try first
|
||||
* to use one single xmlrpc call to server method system.multicall, and
|
||||
* revert to sending many successive calls in case of failure.
|
||||
* This failure is also stored in $this->no_multicall for subsequent calls.
|
||||
* Unfortunately, there is no server error code universally used to denote
|
||||
* the fact that multicall is unsupported, so there is no way to reliably
|
||||
* distinguish between that and a temporary failure.
|
||||
* If you are sure that server supports multicall and do not want to
|
||||
* fallback to using many single calls, set the fourth parameter to FALSE.
|
||||
*
|
||||
* NB: trying to shoehorn extra functionality into existing syntax has resulted
|
||||
* in pretty much convoluted code...
|
||||
*
|
||||
* @param array $msgs an array of xmlrpcmsg objects
|
||||
* @param integer $timeout connection timeout (in seconds)
|
||||
* @param string $method the http protocol variant to be used
|
||||
* @param boolean fallback When true, upon receiveing an error during multicall, multiple single calls will be attempted
|
||||
* @return array
|
||||
* @access public
|
||||
*/
|
||||
function multicall($msgs, $timeout=0, $method='', $fallback=true)
|
||||
{
|
||||
if ($method == '')
|
||||
{
|
||||
$method = $this->method;
|
||||
}
|
||||
if(!$this->no_multicall)
|
||||
{
|
||||
$results = $this->_try_multicall($msgs, $timeout, $method);
|
||||
if(is_array($results))
|
||||
{
|
||||
// System.multicall succeeded
|
||||
return $results;
|
||||
}
|
||||
else
|
||||
{
|
||||
// either system.multicall is unsupported by server,
|
||||
// or call failed for some other reason.
|
||||
if ($fallback)
|
||||
{
|
||||
// Don't try it next time...
|
||||
$this->no_multicall = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_a($results, 'xmlrpcresp'))
|
||||
{
|
||||
$result = $results;
|
||||
}
|
||||
else
|
||||
{
|
||||
$result = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['multicall_error'], $GLOBALS['xmlrpcstr']['multicall_error']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// override fallback, in case careless user tries to do two
|
||||
// opposite things at the same time
|
||||
$fallback = true;
|
||||
}
|
||||
|
||||
$results = array();
|
||||
if ($fallback)
|
||||
{
|
||||
// system.multicall is (probably) unsupported by server:
|
||||
// emulate multicall via multiple requests
|
||||
foreach($msgs as $msg)
|
||||
{
|
||||
$results[] =& $this->send($msg, $timeout, $method);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// user does NOT want to fallback on many single calls:
|
||||
// since we should always return an array of responses,
|
||||
// return an array with the same error repeated n times
|
||||
foreach($msgs as $msg)
|
||||
{
|
||||
$results[] = $result;
|
||||
}
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to boxcar $msgs via system.multicall.
|
||||
* Returns either an array of xmlrpcreponses, an xmlrpc error response
|
||||
* or false (when received response does not respect valid multicall syntax)
|
||||
* @access private
|
||||
*/
|
||||
function _try_multicall($msgs, $timeout, $method)
|
||||
{
|
||||
// Construct multicall message
|
||||
$calls = array();
|
||||
foreach($msgs as $msg)
|
||||
{
|
||||
$call['methodName'] = new xmlrpcval($msg->method(),'string');
|
||||
$numParams = $msg->getNumParams();
|
||||
$params = array();
|
||||
for($i = 0; $i < $numParams; $i++)
|
||||
{
|
||||
$params[$i] = $msg->getParam($i);
|
||||
}
|
||||
$call['params'] = new xmlrpcval($params, 'array');
|
||||
$calls[] = new xmlrpcval($call, 'struct');
|
||||
}
|
||||
$multicall = new xmlrpcmsg('system.multicall');
|
||||
$multicall->addParam(new xmlrpcval($calls, 'array'));
|
||||
|
||||
// Attempt RPC call
|
||||
$result =& $this->send($multicall, $timeout, $method);
|
||||
|
||||
if($result->faultCode() != 0)
|
||||
{
|
||||
// call to system.multicall failed
|
||||
return $result;
|
||||
}
|
||||
|
||||
// Unpack responses.
|
||||
$rets = $result->value();
|
||||
|
||||
if ($this->return_type == 'xml')
|
||||
{
|
||||
return $rets;
|
||||
}
|
||||
else if ($this->return_type == 'phpvals')
|
||||
{
|
||||
///@todo test this code branch...
|
||||
$rets = $result->value();
|
||||
if(!is_array($rets))
|
||||
{
|
||||
return false; // bad return type from system.multicall
|
||||
}
|
||||
$numRets = count($rets);
|
||||
if($numRets != count($msgs))
|
||||
{
|
||||
return false; // wrong number of return values.
|
||||
}
|
||||
|
||||
$response = array();
|
||||
for($i = 0; $i < $numRets; $i++)
|
||||
{
|
||||
$val = $rets[$i];
|
||||
if (!is_array($val)) {
|
||||
return false;
|
||||
}
|
||||
switch(count($val))
|
||||
{
|
||||
case 1:
|
||||
if(!isset($val[0]))
|
||||
{
|
||||
return false; // Bad value
|
||||
}
|
||||
// Normal return value
|
||||
$response[$i] = new xmlrpcresp($val[0], 0, '', 'phpvals');
|
||||
break;
|
||||
case 2:
|
||||
/// @todo remove usage of @: it is apparently quite slow
|
||||
$code = @$val['faultCode'];
|
||||
if(!is_int($code))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$str = @$val['faultString'];
|
||||
if(!is_string($str))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$response[$i] = new xmlrpcresp(0, $code, $str);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
else // return type == 'xmlrpcvals'
|
||||
{
|
||||
$rets = $result->value();
|
||||
if($rets->kindOf() != 'array')
|
||||
{
|
||||
return false; // bad return type from system.multicall
|
||||
}
|
||||
$numRets = $rets->arraysize();
|
||||
if($numRets != count($msgs))
|
||||
{
|
||||
return false; // wrong number of return values.
|
||||
}
|
||||
|
||||
$response = array();
|
||||
for($i = 0; $i < $numRets; $i++)
|
||||
{
|
||||
$val = $rets->arraymem($i);
|
||||
switch($val->kindOf())
|
||||
{
|
||||
case 'array':
|
||||
if($val->arraysize() != 1)
|
||||
{
|
||||
return false; // Bad value
|
||||
}
|
||||
// Normal return value
|
||||
$response[$i] = new xmlrpcresp($val->arraymem(0));
|
||||
break;
|
||||
case 'struct':
|
||||
$code = $val->structmem('faultCode');
|
||||
if($code->kindOf() != 'scalar' || $code->scalartyp() != 'int')
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$str = $val->structmem('faultString');
|
||||
if($str->kindOf() != 'scalar' || $str->scalartyp() != 'string')
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$response[$i] = new xmlrpcresp(0, $code->scalarval(), $str->scalarval());
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
} // end class xmlrpc_client
|
||||
|
||||
class xmlrpcresp
|
||||
{
|
||||
var $val = 0;
|
||||
var $valtyp;
|
||||
var $errno = 0;
|
||||
var $errstr = '';
|
||||
var $payload;
|
||||
var $hdrs = array();
|
||||
var $_cookies = array();
|
||||
var $content_type = 'text/xml';
|
||||
var $raw_data = '';
|
||||
|
||||
/**
|
||||
* @param mixed $val either an xmlrpcval obj, a php value or the xml serialization of an xmlrpcval (a string)
|
||||
* @param integer $fcode set it to anything but 0 to create an error response
|
||||
* @param string $fstr the error string, in case of an error response
|
||||
* @param string $valtyp either 'xmlrpcvals', 'phpvals' or 'xml'
|
||||
*
|
||||
* @todo add check that $val / $fcode / $fstr is of correct type???
|
||||
* NB: as of now we do not do it, since it might be either an xmlrpcval or a plain
|
||||
* php val, or a complete xml chunk, depending on usage of xmlrpc_client::send() inside which creator is called...
|
||||
*/
|
||||
function xmlrpcresp($val, $fcode = 0, $fstr = '', $valtyp='')
|
||||
{
|
||||
if($fcode != 0)
|
||||
{
|
||||
// error response
|
||||
$this->errno = $fcode;
|
||||
$this->errstr = $fstr;
|
||||
//$this->errstr = htmlspecialchars($fstr); // XXX: encoding probably shouldn't be done here; fix later.
|
||||
}
|
||||
else
|
||||
{
|
||||
// successful response
|
||||
$this->val = $val;
|
||||
if ($valtyp == '')
|
||||
{
|
||||
// user did not declare type of response value: try to guess it
|
||||
if (is_object($this->val) && is_a($this->val, 'xmlrpcval'))
|
||||
{
|
||||
$this->valtyp = 'xmlrpcvals';
|
||||
}
|
||||
else if (is_string($this->val))
|
||||
{
|
||||
$this->valtyp = 'xml';
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->valtyp = 'phpvals';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// user declares type of resp value: believe him
|
||||
$this->valtyp = $valtyp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the error code of the response.
|
||||
* @return integer the error code of this response (0 for not-error responses)
|
||||
* @access public
|
||||
*/
|
||||
function faultCode()
|
||||
{
|
||||
return $this->errno;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the error code of the response.
|
||||
* @return string the error string of this response ('' for not-error responses)
|
||||
* @access public
|
||||
*/
|
||||
function faultString()
|
||||
{
|
||||
return $this->errstr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value received by the server.
|
||||
* @return mixed the xmlrpcval object returned by the server. Might be an xml string or php value if the response has been created by specially configured xmlrpc_client objects
|
||||
* @access public
|
||||
*/
|
||||
function value()
|
||||
{
|
||||
return $this->val;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array with the cookies received from the server.
|
||||
* Array has the form: $cookiename => array ('value' => $val, $attr1 => $val1, $attr2 = $val2, ...)
|
||||
* with attributes being e.g. 'expires', 'path', domain'.
|
||||
* NB: cookies sent as 'expired' by the server (i.e. with an expiry date in the past)
|
||||
* are still present in the array. It is up to the user-defined code to decide
|
||||
* how to use the received cookies, and wheter they have to be sent back with the next
|
||||
* request to the server (using xmlrpc_client::setCookie) or not
|
||||
* @return array array of cookies received from the server
|
||||
* @access public
|
||||
*/
|
||||
function cookies()
|
||||
{
|
||||
return $this->_cookies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns xml representation of the response. XML prologue not included
|
||||
* @param string $charset_encoding the charset to be used for serialization. if null, US-ASCII is assumed
|
||||
* @return string the xml representation of the response
|
||||
* @access public
|
||||
*/
|
||||
function serialize($charset_encoding='')
|
||||
{
|
||||
if ($charset_encoding != '')
|
||||
$this->content_type = 'text/xml; charset=' . $charset_encoding;
|
||||
else
|
||||
$this->content_type = 'text/xml';
|
||||
$result = "<methodResponse>\n";
|
||||
if($this->errno)
|
||||
{
|
||||
// G. Giunta 2005/2/13: let non-ASCII response messages be tolerated by clients
|
||||
// by xml-encoding non ascii chars
|
||||
$result .= "<fault>\n" .
|
||||
"<value>\n<struct><member><name>faultCode</name>\n<value><int>" . $this->errno .
|
||||
"</int></value>\n</member>\n<member>\n<name>faultString</name>\n<value><string>" .
|
||||
xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding) . "</string></value>\n</member>\n" .
|
||||
"</struct>\n</value>\n</fault>";
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!is_object($this->val) || !is_a($this->val, 'xmlrpcval'))
|
||||
{
|
||||
if (is_string($this->val) && $this->valtyp == 'xml')
|
||||
{
|
||||
$result .= "<params>\n<param>\n" .
|
||||
$this->val .
|
||||
"</param>\n</params>";
|
||||
}
|
||||
else
|
||||
{
|
||||
/// @todo try to build something serializable?
|
||||
die('cannot serialize xmlrpcresp objects whose content is native php values');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$result .= "<params>\n<param>\n" .
|
||||
$this->val->serialize($charset_encoding) .
|
||||
"</param>\n</params>";
|
||||
}
|
||||
}
|
||||
$result .= "\n</methodResponse>";
|
||||
$this->payload = $result;
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
class xmlrpcmsg
|
||||
{
|
||||
var $payload;
|
||||
var $methodname;
|
||||
var $params=array();
|
||||
var $debug=0;
|
||||
var $content_type = 'text/xml';
|
||||
|
||||
/**
|
||||
* @param string $meth the name of the method to invoke
|
||||
* @param array $pars array of parameters to be paased to the method (xmlrpcval objects)
|
||||
*/
|
||||
function xmlrpcmsg($meth, $pars=0)
|
||||
{
|
||||
$this->methodname=$meth;
|
||||
if(is_array($pars) && count($pars)>0)
|
||||
{
|
||||
for($i=0; $i<count($pars); $i++)
|
||||
{
|
||||
$this->addParam($pars[$i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
function xml_header($charset_encoding='')
|
||||
{
|
||||
if ($charset_encoding != '')
|
||||
{
|
||||
return "<?xml version=\"1.0\" encoding=\"$charset_encoding\" ?" . ">\n<methodCall>\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<?xml version=\"1.0\"?" . ">\n<methodCall>\n";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
function xml_footer()
|
||||
{
|
||||
return '</methodCall>';
|
||||
}
|
||||
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
function kindOf()
|
||||
{
|
||||
return 'msg';
|
||||
}
|
||||
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
function createPayload($charset_encoding='')
|
||||
{
|
||||
if ($charset_encoding != '')
|
||||
$this->content_type = 'text/xml; charset=' . $charset_encoding;
|
||||
else
|
||||
$this->content_type = 'text/xml';
|
||||
$this->payload=$this->xml_header($charset_encoding);
|
||||
$this->payload.='<methodName>' . $this->methodname . "</methodName>\n";
|
||||
$this->payload.="<params>\n";
|
||||
for($i=0; $i<count($this->params); $i++)
|
||||
{
|
||||
$p=$this->params[$i];
|
||||
$this->payload.="<param>\n" . $p->serialize($charset_encoding) .
|
||||
"</param>\n";
|
||||
}
|
||||
$this->payload.="</params>\n";
|
||||
$this->payload.=$this->xml_footer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets/sets the xmlrpc method to be invoked
|
||||
* @param string $meth the method to be set (leave empty not to set it)
|
||||
* @return string the method that will be invoked
|
||||
* @access public
|
||||
*/
|
||||
function method($meth='')
|
||||
{
|
||||
if($meth!='')
|
||||
{
|
||||
$this->methodname=$meth;
|
||||
}
|
||||
return $this->methodname;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns xml representation of the message. XML prologue included
|
||||
* @return string the xml representation of the message, xml prologue included
|
||||
* @access public
|
||||
*/
|
||||
function serialize($charset_encoding='')
|
||||
{
|
||||
$this->createPayload($charset_encoding);
|
||||
return $this->payload;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a parameter to the list of parameters to be used upon method invocation
|
||||
* @param xmlrpcval $par
|
||||
* @return boolean false on failure
|
||||
* @access public
|
||||
*/
|
||||
function addParam($par)
|
||||
{
|
||||
// add check: do not add to self params which are not xmlrpcvals
|
||||
if(is_object($par) && is_a($par, 'xmlrpcval'))
|
||||
{
|
||||
$this->params[]=$par;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the nth parameter in the message. The index zero-based.
|
||||
* @param integer $i the index of the parameter to fetch (zero based)
|
||||
* @return xmlrpcval the i-th parameter
|
||||
* @access public
|
||||
*/
|
||||
function getParam($i) { return $this->params[$i]; }
|
||||
|
||||
/**
|
||||
* Returns the number of parameters in the messge.
|
||||
* @return integer the number of parameters currently set
|
||||
* @access public
|
||||
*/
|
||||
function getNumParams() { return count($this->params); }
|
||||
|
||||
/**
|
||||
* Given an open file handle, read all data available and parse it as axmlrpc response.
|
||||
* NB: the file handle is not closed by this function.
|
||||
* NNB: might have trouble in rare cases to work on network streams, as we
|
||||
* check for a read of 0 bytes instead of feof($fp).
|
||||
* But since checking for feof(null) returns false, we would risk an
|
||||
* infinite loop in that case, because we cannot trust the caller
|
||||
* to give us a valid pointer to an open file...
|
||||
* @access public
|
||||
* @return xmlrpcresp
|
||||
* @todo add 2nd & 3rd param to be passed to ParseResponse() ???
|
||||
*/
|
||||
function &parseResponseFile($fp)
|
||||
{
|
||||
$ipd='';
|
||||
while($data=fread($fp, 32768))
|
||||
{
|
||||
$ipd.=$data;
|
||||
}
|
||||
//fclose($fp);
|
||||
$r =& $this->parseResponse($ipd);
|
||||
return $r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses HTTP headers and separates them from data.
|
||||
* @access private
|
||||
*/
|
||||
function &parseResponseHeaders(&$data, $headers_processed=false)
|
||||
{
|
||||
// Support "web-proxy-tunelling" connections for https through proxies
|
||||
if(preg_match('/^HTTP\/1\.[0-1] 200 Connection established/', $data))
|
||||
{
|
||||
// Look for CR/LF or simple LF as line separator,
|
||||
// (even though it is not valid http)
|
||||
$pos = strpos($data,"\r\n\r\n");
|
||||
if($pos || is_int($pos))
|
||||
{
|
||||
$bd = $pos+4;
|
||||
}
|
||||
else
|
||||
{
|
||||
$pos = strpos($data,"\n\n");
|
||||
if($pos || is_int($pos))
|
||||
{
|
||||
$bd = $pos+2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// No separation between response headers and body: fault?
|
||||
$bd = 0;
|
||||
}
|
||||
}
|
||||
if ($bd)
|
||||
{
|
||||
// this filters out all http headers from proxy.
|
||||
// maybe we could take them into account, too?
|
||||
$data = substr($data, $bd);
|
||||
}
|
||||
else
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': HTTPS via proxy error, tunnel connection possibly failed');
|
||||
$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error']. ' (HTTPS via proxy error, tunnel connection possibly failed)');
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
|
||||
// Strip HTTP 1.1 100 Continue header if present
|
||||
while(preg_match('/^HTTP\/1\.1 1[0-9]{2} /', $data))
|
||||
{
|
||||
$pos = strpos($data, 'HTTP', 12);
|
||||
// server sent a Continue header without any (valid) content following...
|
||||
// give the client a chance to know it
|
||||
if(!$pos && !is_int($pos)) // works fine in php 3, 4 and 5
|
||||
{
|
||||
break;
|
||||
}
|
||||
$data = substr($data, $pos);
|
||||
}
|
||||
if(!preg_match('/^HTTP\/[0-9.]+ 200 /', $data))
|
||||
{
|
||||
$errstr= substr($data, 0, strpos($data, "\n")-1);
|
||||
error_log('XML-RPC: '.__METHOD__.': HTTP error, got response: ' .$errstr);
|
||||
$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error']. ' (' . $errstr . ')');
|
||||
return $r;
|
||||
}
|
||||
|
||||
$GLOBALS['_xh']['headers'] = array();
|
||||
$GLOBALS['_xh']['cookies'] = array();
|
||||
|
||||
// be tolerant to usage of \n instead of \r\n to separate headers and data
|
||||
// (even though it is not valid http)
|
||||
$pos = strpos($data,"\r\n\r\n");
|
||||
if($pos || is_int($pos))
|
||||
{
|
||||
$bd = $pos+4;
|
||||
}
|
||||
else
|
||||
{
|
||||
$pos = strpos($data,"\n\n");
|
||||
if($pos || is_int($pos))
|
||||
{
|
||||
$bd = $pos+2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// No separation between response headers and body: fault?
|
||||
// we could take some action here instead of going on...
|
||||
$bd = 0;
|
||||
}
|
||||
}
|
||||
// be tolerant to line endings, and extra empty lines
|
||||
$ar = preg_split("/\r?\n/", trim(substr($data, 0, $pos)));
|
||||
while(list(,$line) = @each($ar))
|
||||
{
|
||||
// take care of multi-line headers and cookies
|
||||
$arr = explode(':',$line,2);
|
||||
if(count($arr) > 1)
|
||||
{
|
||||
$header_name = strtolower(trim($arr[0]));
|
||||
/// @todo some other headers (the ones that allow a CSV list of values)
|
||||
/// do allow many values to be passed using multiple header lines.
|
||||
/// We should add content to $GLOBALS['_xh']['headers'][$header_name]
|
||||
/// instead of replacing it for those...
|
||||
if ($header_name == 'set-cookie' || $header_name == 'set-cookie2')
|
||||
{
|
||||
if ($header_name == 'set-cookie2')
|
||||
{
|
||||
// version 2 cookies:
|
||||
// there could be many cookies on one line, comma separated
|
||||
$cookies = explode(',', $arr[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$cookies = array($arr[1]);
|
||||
}
|
||||
foreach ($cookies as $cookie)
|
||||
{
|
||||
// glue together all received cookies, using a comma to separate them
|
||||
// (same as php does with getallheaders())
|
||||
if (isset($GLOBALS['_xh']['headers'][$header_name]))
|
||||
$GLOBALS['_xh']['headers'][$header_name] .= ', ' . trim($cookie);
|
||||
else
|
||||
$GLOBALS['_xh']['headers'][$header_name] = trim($cookie);
|
||||
// parse cookie attributes, in case user wants to correctly honour them
|
||||
// feature creep: only allow rfc-compliant cookie attributes?
|
||||
// @todo support for server sending multiple time cookie with same name, but using different PATHs
|
||||
$cookie = explode(';', $cookie);
|
||||
foreach ($cookie as $pos => $val)
|
||||
{
|
||||
$val = explode('=', $val, 2);
|
||||
$tag = trim($val[0]);
|
||||
$val = trim(@$val[1]);
|
||||
/// @todo with version 1 cookies, we should strip leading and trailing " chars
|
||||
if ($pos == 0)
|
||||
{
|
||||
$cookiename = $tag;
|
||||
$GLOBALS['_xh']['cookies'][$tag] = array();
|
||||
$GLOBALS['_xh']['cookies'][$cookiename]['value'] = urldecode($val);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($tag != 'value')
|
||||
{
|
||||
$GLOBALS['_xh']['cookies'][$cookiename][$tag] = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$GLOBALS['_xh']['headers'][$header_name] = trim($arr[1]);
|
||||
}
|
||||
}
|
||||
elseif(isset($header_name))
|
||||
{
|
||||
/// @todo version1 cookies might span multiple lines, thus breaking the parsing above
|
||||
$GLOBALS['_xh']['headers'][$header_name] .= ' ' . trim($line);
|
||||
}
|
||||
}
|
||||
|
||||
$data = substr($data, $bd);
|
||||
|
||||
if($this->debug && count($GLOBALS['_xh']['headers']))
|
||||
{
|
||||
print '<PRE>';
|
||||
foreach($GLOBALS['_xh']['headers'] as $header => $value)
|
||||
{
|
||||
print htmlentities("HEADER: $header: $value\n");
|
||||
}
|
||||
foreach($GLOBALS['_xh']['cookies'] as $header => $value)
|
||||
{
|
||||
print htmlentities("COOKIE: $header={$value['value']}\n");
|
||||
}
|
||||
print "</PRE>\n";
|
||||
}
|
||||
|
||||
// if CURL was used for the call, http headers have been processed,
|
||||
// and dechunking + reinflating have been carried out
|
||||
if(!$headers_processed)
|
||||
{
|
||||
// Decode chunked encoding sent by http 1.1 servers
|
||||
if(isset($GLOBALS['_xh']['headers']['transfer-encoding']) && $GLOBALS['_xh']['headers']['transfer-encoding'] == 'chunked')
|
||||
{
|
||||
if(!$data = decode_chunked($data))
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': errors occurred when trying to rebuild the chunked data received from server');
|
||||
$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['dechunk_fail'], $GLOBALS['xmlrpcstr']['dechunk_fail']);
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
|
||||
// Decode gzip-compressed stuff
|
||||
// code shamelessly inspired from nusoap library by Dietrich Ayala
|
||||
if(isset($GLOBALS['_xh']['headers']['content-encoding']))
|
||||
{
|
||||
$GLOBALS['_xh']['headers']['content-encoding'] = str_replace('x-', '', $GLOBALS['_xh']['headers']['content-encoding']);
|
||||
if($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' || $GLOBALS['_xh']['headers']['content-encoding'] == 'gzip')
|
||||
{
|
||||
// if decoding works, use it. else assume data wasn't gzencoded
|
||||
if(function_exists('gzinflate'))
|
||||
{
|
||||
if($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data))
|
||||
{
|
||||
$data = $degzdata;
|
||||
if($this->debug)
|
||||
print "<PRE>---INFLATED RESPONSE---[".strlen($data)." chars]---\n" . htmlentities($data) . "\n---END---</PRE>";
|
||||
}
|
||||
elseif($GLOBALS['_xh']['headers']['content-encoding'] == 'gzip' && $degzdata = @gzinflate(substr($data, 10)))
|
||||
{
|
||||
$data = $degzdata;
|
||||
if($this->debug)
|
||||
print "<PRE>---INFLATED RESPONSE---[".strlen($data)." chars]---\n" . htmlentities($data) . "\n---END---</PRE>";
|
||||
}
|
||||
else
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': errors occurred when trying to decode the deflated data received from server');
|
||||
$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['decompress_fail'], $GLOBALS['xmlrpcstr']['decompress_fail']);
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': the server sent deflated data. Your php install must have the Zlib extension compiled in to support this.');
|
||||
$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['cannot_decompress'], $GLOBALS['xmlrpcstr']['cannot_decompress']);
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
}
|
||||
} // end of 'if needed, de-chunk, re-inflate response'
|
||||
|
||||
// real stupid hack to avoid PHP complaining about returning NULL by ref
|
||||
$r = null;
|
||||
$r =& $r;
|
||||
return $r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the xmlrpc response contained in the string $data and return an xmlrpcresp object.
|
||||
* @param string $data the xmlrpc response, eventually including http headers
|
||||
* @param bool $headers_processed when true prevents parsing HTTP headers for interpretation of content-encoding and consequent decoding
|
||||
* @param string $return_type decides return type, i.e. content of response->value(). Either 'xmlrpcvals', 'xml' or 'phpvals'
|
||||
* @return xmlrpcresp
|
||||
* @access public
|
||||
*/
|
||||
function &parseResponse($data='', $headers_processed=false, $return_type='xmlrpcvals')
|
||||
{
|
||||
if($this->debug)
|
||||
{
|
||||
//by maHo, replaced htmlspecialchars with htmlentities
|
||||
print "<PRE>---GOT---\n" . htmlentities($data) . "\n---END---\n</PRE>";
|
||||
}
|
||||
|
||||
if($data == '')
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': no response received from server.');
|
||||
$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_data'], $GLOBALS['xmlrpcstr']['no_data']);
|
||||
return $r;
|
||||
}
|
||||
|
||||
$GLOBALS['_xh']=array();
|
||||
|
||||
$raw_data = $data;
|
||||
// parse the HTTP headers of the response, if present, and separate them from data
|
||||
if(substr($data, 0, 4) == 'HTTP')
|
||||
{
|
||||
$r =& $this->parseResponseHeaders($data, $headers_processed);
|
||||
if ($r)
|
||||
{
|
||||
// failed processing of HTTP response headers
|
||||
// save into response obj the full payload received, for debugging
|
||||
$r->raw_data = $data;
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$GLOBALS['_xh']['headers'] = array();
|
||||
$GLOBALS['_xh']['cookies'] = array();
|
||||
}
|
||||
|
||||
if($this->debug)
|
||||
{
|
||||
$start = strpos($data, '<!-- SERVER DEBUG INFO (BASE64 ENCODED):');
|
||||
if ($start)
|
||||
{
|
||||
$start += strlen('<!-- SERVER DEBUG INFO (BASE64 ENCODED):');
|
||||
$end = strpos($data, '-->', $start);
|
||||
$comments = substr($data, $start, $end-$start);
|
||||
print "<PRE>---SERVER DEBUG INFO (DECODED) ---\n\t".htmlentities(str_replace("\n", "\n\t", base64_decode($comments)))."\n---END---\n</PRE>";
|
||||
}
|
||||
}
|
||||
|
||||
// be tolerant of extra whitespace in response body
|
||||
$data = trim($data);
|
||||
|
||||
/// @todo return an error msg if $data=='' ?
|
||||
|
||||
// be tolerant of junk after methodResponse (e.g. javascript ads automatically inserted by free hosts)
|
||||
// idea from Luca Mariano <luca.mariano@email.it> originally in PEARified version of the lib
|
||||
$pos = strrpos($data, '</methodResponse>');
|
||||
if($pos !== false)
|
||||
{
|
||||
$data = substr($data, 0, $pos+17);
|
||||
}
|
||||
|
||||
// if user wants back raw xml, give it to him
|
||||
if ($return_type == 'xml')
|
||||
{
|
||||
$r = new xmlrpcresp($data, 0, '', 'xml');
|
||||
$r->hdrs = $GLOBALS['_xh']['headers'];
|
||||
$r->_cookies = $GLOBALS['_xh']['cookies'];
|
||||
$r->raw_data = $raw_data;
|
||||
return $r;
|
||||
}
|
||||
|
||||
// try to 'guestimate' the character encoding of the received response
|
||||
$resp_encoding = guess_encoding(@$GLOBALS['_xh']['headers']['content-type'], $data);
|
||||
|
||||
$GLOBALS['_xh']['ac']='';
|
||||
//$GLOBALS['_xh']['qt']=''; //unused...
|
||||
$GLOBALS['_xh']['stack'] = array();
|
||||
$GLOBALS['_xh']['valuestack'] = array();
|
||||
$GLOBALS['_xh']['isf']=0; // 0 = OK, 1 for xmlrpc fault responses, 2 = invalid xmlrpc
|
||||
$GLOBALS['_xh']['isf_reason']='';
|
||||
$GLOBALS['_xh']['rt']=''; // 'methodcall or 'methodresponse'
|
||||
|
||||
// if response charset encoding is not known / supported, try to use
|
||||
// the default encoding and parse the xml anyway, but log a warning...
|
||||
if (!in_array($resp_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
|
||||
// the following code might be better for mb_string enabled installs, but
|
||||
// makes the lib about 200% slower...
|
||||
//if (!is_valid_charset($resp_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': invalid charset encoding of received response: '.$resp_encoding);
|
||||
$resp_encoding = $GLOBALS['xmlrpc_defencoding'];
|
||||
}
|
||||
$parser = xml_parser_create($resp_encoding);
|
||||
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
|
||||
// G. Giunta 2005/02/13: PHP internally uses ISO-8859-1, so we have to tell
|
||||
// the xml parser to give us back data in the expected charset.
|
||||
// What if internal encoding is not in one of the 3 allowed?
|
||||
// we use the broadest one, ie. utf8
|
||||
// This allows to send data which is native in various charset,
|
||||
// by extending xmlrpc_encode_entitites() and setting xmlrpc_internalencoding
|
||||
if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
|
||||
{
|
||||
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
|
||||
}
|
||||
else
|
||||
{
|
||||
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']);
|
||||
}
|
||||
|
||||
if ($return_type == 'phpvals')
|
||||
{
|
||||
xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_fast');
|
||||
}
|
||||
else
|
||||
{
|
||||
xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee');
|
||||
}
|
||||
|
||||
xml_set_character_data_handler($parser, 'xmlrpc_cd');
|
||||
xml_set_default_handler($parser, 'xmlrpc_dh');
|
||||
|
||||
// first error check: xml not well formed
|
||||
if(!xml_parse($parser, $data, count($data)))
|
||||
{
|
||||
// thanks to Peter Kocks <peter.kocks@baygate.com>
|
||||
if((xml_get_current_line_number($parser)) == 1)
|
||||
{
|
||||
$errstr = 'XML error at line 1, check URL';
|
||||
}
|
||||
else
|
||||
{
|
||||
$errstr = sprintf('XML error: %s at line %d, column %d',
|
||||
xml_error_string(xml_get_error_code($parser)),
|
||||
xml_get_current_line_number($parser), xml_get_current_column_number($parser));
|
||||
}
|
||||
error_log($errstr);
|
||||
$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'], $GLOBALS['xmlrpcstr']['invalid_return'].' ('.$errstr.')');
|
||||
xml_parser_free($parser);
|
||||
if($this->debug)
|
||||
{
|
||||
print $errstr;
|
||||
}
|
||||
$r->hdrs = $GLOBALS['_xh']['headers'];
|
||||
$r->_cookies = $GLOBALS['_xh']['cookies'];
|
||||
$r->raw_data = $raw_data;
|
||||
return $r;
|
||||
}
|
||||
xml_parser_free($parser);
|
||||
// second error check: xml well formed but not xml-rpc compliant
|
||||
if ($GLOBALS['_xh']['isf'] > 1)
|
||||
{
|
||||
if ($this->debug)
|
||||
{
|
||||
/// @todo echo something for user?
|
||||
}
|
||||
|
||||
$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'],
|
||||
$GLOBALS['xmlrpcstr']['invalid_return'] . ' ' . $GLOBALS['_xh']['isf_reason']);
|
||||
}
|
||||
// third error check: parsing of the response has somehow gone boink.
|
||||
// NB: shall we omit this check, since we trust the parsing code?
|
||||
elseif ($return_type == 'xmlrpcvals' && !is_object($GLOBALS['_xh']['value']))
|
||||
{
|
||||
// something odd has happened
|
||||
// and it's time to generate a client side error
|
||||
// indicating something odd went on
|
||||
$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'],
|
||||
$GLOBALS['xmlrpcstr']['invalid_return']);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($this->debug)
|
||||
{
|
||||
print "<PRE>---PARSED---\n";
|
||||
// somehow htmlentities chokes on var_export, and some full html string...
|
||||
//print htmlentitites(var_export($GLOBALS['_xh']['value'], true));
|
||||
print htmlspecialchars(var_export($GLOBALS['_xh']['value'], true));
|
||||
print "\n---END---</PRE>";
|
||||
}
|
||||
|
||||
// note that using =& will raise an error if $GLOBALS['_xh']['st'] does not generate an object.
|
||||
$v =& $GLOBALS['_xh']['value'];
|
||||
|
||||
if($GLOBALS['_xh']['isf'])
|
||||
{
|
||||
/// @todo we should test here if server sent an int and a string,
|
||||
/// and/or coerce them into such...
|
||||
if ($return_type == 'xmlrpcvals')
|
||||
{
|
||||
$errno_v = $v->structmem('faultCode');
|
||||
$errstr_v = $v->structmem('faultString');
|
||||
$errno = $errno_v->scalarval();
|
||||
$errstr = $errstr_v->scalarval();
|
||||
}
|
||||
else
|
||||
{
|
||||
$errno = $v['faultCode'];
|
||||
$errstr = $v['faultString'];
|
||||
}
|
||||
|
||||
if($errno == 0)
|
||||
{
|
||||
// FAULT returned, errno needs to reflect that
|
||||
$errno = -1;
|
||||
}
|
||||
|
||||
$r = new xmlrpcresp(0, $errno, $errstr);
|
||||
}
|
||||
else
|
||||
{
|
||||
$r=new xmlrpcresp($v, 0, '', $return_type);
|
||||
}
|
||||
}
|
||||
|
||||
$r->hdrs = $GLOBALS['_xh']['headers'];
|
||||
$r->_cookies = $GLOBALS['_xh']['cookies'];
|
||||
$r->raw_data = $raw_data;
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
|
||||
class xmlrpcval
|
||||
{
|
||||
var $me=array();
|
||||
var $mytype=0;
|
||||
var $_php_class=null;
|
||||
|
||||
/**
|
||||
* @param mixed $val
|
||||
* @param string $type any valid xmlrpc type name (lowercase). If null, 'string' is assumed
|
||||
*/
|
||||
function xmlrpcval($val=-1, $type='')
|
||||
{
|
||||
/// @todo: optimization creep - do not call addXX, do it all inline.
|
||||
/// downside: booleans will not be coerced anymore
|
||||
if($val!==-1 || $type!='')
|
||||
{
|
||||
// optimization creep: inlined all work done by constructor
|
||||
switch($type)
|
||||
{
|
||||
case '':
|
||||
$this->mytype=1;
|
||||
$this->me['string']=$val;
|
||||
break;
|
||||
case 'i4':
|
||||
case 'int':
|
||||
case 'double':
|
||||
case 'string':
|
||||
case 'boolean':
|
||||
case 'dateTime.iso8601':
|
||||
case 'base64':
|
||||
case 'null':
|
||||
$this->mytype=1;
|
||||
$this->me[$type]=$val;
|
||||
break;
|
||||
case 'array':
|
||||
$this->mytype=2;
|
||||
$this->me['array']=$val;
|
||||
break;
|
||||
case 'struct':
|
||||
$this->mytype=3;
|
||||
$this->me['struct']=$val;
|
||||
break;
|
||||
default:
|
||||
error_log("XML-RPC: ".__METHOD__.": not a known type ($type)");
|
||||
}
|
||||
/*if($type=='')
|
||||
{
|
||||
$type='string';
|
||||
}
|
||||
if($GLOBALS['xmlrpcTypes'][$type]==1)
|
||||
{
|
||||
$this->addScalar($val,$type);
|
||||
}
|
||||
elseif($GLOBALS['xmlrpcTypes'][$type]==2)
|
||||
{
|
||||
$this->addArray($val);
|
||||
}
|
||||
elseif($GLOBALS['xmlrpcTypes'][$type]==3)
|
||||
{
|
||||
$this->addStruct($val);
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a single php value to an (unitialized) xmlrpcval
|
||||
* @param mixed $val
|
||||
* @param string $type
|
||||
* @return int 1 or 0 on failure
|
||||
*/
|
||||
function addScalar($val, $type='string')
|
||||
{
|
||||
$typeof=@$GLOBALS['xmlrpcTypes'][$type];
|
||||
if($typeof!=1)
|
||||
{
|
||||
error_log("XML-RPC: ".__METHOD__.": not a scalar type ($type)");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// coerce booleans into correct values
|
||||
// NB: we should either do it for datetimes, integers and doubles, too,
|
||||
// or just plain remove this check, implemented on booleans only...
|
||||
if($type==$GLOBALS['xmlrpcBoolean'])
|
||||
{
|
||||
if(strcasecmp($val,'true')==0 || $val==1 || ($val==true && strcasecmp($val,'false')))
|
||||
{
|
||||
$val=true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$val=false;
|
||||
}
|
||||
}
|
||||
|
||||
switch($this->mytype)
|
||||
{
|
||||
case 1:
|
||||
error_log('XML-RPC: '.__METHOD__.': scalar xmlrpcval can have only one value');
|
||||
return 0;
|
||||
case 3:
|
||||
error_log('XML-RPC: '.__METHOD__.': cannot add anonymous scalar to struct xmlrpcval');
|
||||
return 0;
|
||||
case 2:
|
||||
// we're adding a scalar value to an array here
|
||||
//$ar=$this->me['array'];
|
||||
//$ar[]=new xmlrpcval($val, $type);
|
||||
//$this->me['array']=$ar;
|
||||
// Faster (?) avoid all the costly array-copy-by-val done here...
|
||||
$this->me['array'][]=new xmlrpcval($val, $type);
|
||||
return 1;
|
||||
default:
|
||||
// a scalar, so set the value and remember we're scalar
|
||||
$this->me[$type]=$val;
|
||||
$this->mytype=$typeof;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an array of xmlrpcval objects to an xmlrpcval
|
||||
* @param array $vals
|
||||
* @return int 1 or 0 on failure
|
||||
* @access public
|
||||
*
|
||||
* @todo add some checking for $vals to be an array of xmlrpcvals?
|
||||
*/
|
||||
function addArray($vals)
|
||||
{
|
||||
if($this->mytype==0)
|
||||
{
|
||||
$this->mytype=$GLOBALS['xmlrpcTypes']['array'];
|
||||
$this->me['array']=$vals;
|
||||
return 1;
|
||||
}
|
||||
elseif($this->mytype==2)
|
||||
{
|
||||
// we're adding to an array here
|
||||
$this->me['array'] = array_merge($this->me['array'], $vals);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': already initialized as a [' . $this->kindOf() . ']');
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an array of named xmlrpcval objects to an xmlrpcval
|
||||
* @param array $vals
|
||||
* @return int 1 or 0 on failure
|
||||
* @access public
|
||||
*
|
||||
* @todo add some checking for $vals to be an array?
|
||||
*/
|
||||
function addStruct($vals)
|
||||
{
|
||||
if($this->mytype==0)
|
||||
{
|
||||
$this->mytype=$GLOBALS['xmlrpcTypes']['struct'];
|
||||
$this->me['struct']=$vals;
|
||||
return 1;
|
||||
}
|
||||
elseif($this->mytype==3)
|
||||
{
|
||||
// we're adding to a struct here
|
||||
$this->me['struct'] = array_merge($this->me['struct'], $vals);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': already initialized as a [' . $this->kindOf() . ']');
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// poor man's version of print_r ???
|
||||
// DEPRECATED!
|
||||
function dump($ar)
|
||||
{
|
||||
foreach($ar as $key => $val)
|
||||
{
|
||||
echo "$key => $val<br />";
|
||||
if($key == 'array')
|
||||
{
|
||||
while(list($key2, $val2) = each($val))
|
||||
{
|
||||
echo "-- $key2 => $val2<br />";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string containing "struct", "array" or "scalar" describing the base type of the value
|
||||
* @return string
|
||||
* @access public
|
||||
*/
|
||||
function kindOf()
|
||||
{
|
||||
switch($this->mytype)
|
||||
{
|
||||
case 3:
|
||||
return 'struct';
|
||||
break;
|
||||
case 2:
|
||||
return 'array';
|
||||
break;
|
||||
case 1:
|
||||
return 'scalar';
|
||||
break;
|
||||
default:
|
||||
return 'undef';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
function serializedata($typ, $val, $charset_encoding='')
|
||||
{
|
||||
$rs='';
|
||||
switch(@$GLOBALS['xmlrpcTypes'][$typ])
|
||||
{
|
||||
case 1:
|
||||
switch($typ)
|
||||
{
|
||||
case $GLOBALS['xmlrpcBase64']:
|
||||
$rs.="<${typ}>" . base64_encode($val) . "</${typ}>";
|
||||
break;
|
||||
case $GLOBALS['xmlrpcBoolean']:
|
||||
$rs.="<${typ}>" . ($val ? '1' : '0') . "</${typ}>";
|
||||
break;
|
||||
case $GLOBALS['xmlrpcString']:
|
||||
// G. Giunta 2005/2/13: do NOT use htmlentities, since
|
||||
// it will produce named html entities, which are invalid xml
|
||||
$rs.="<${typ}>" . xmlrpc_encode_entitites($val, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding). "</${typ}>";
|
||||
break;
|
||||
case $GLOBALS['xmlrpcInt']:
|
||||
case $GLOBALS['xmlrpcI4']:
|
||||
$rs.="<${typ}>".(int)$val."</${typ}>";
|
||||
break;
|
||||
case $GLOBALS['xmlrpcDouble']:
|
||||
// avoid using standard conversion of float to string because it is locale-dependent,
|
||||
// and also because the xmlrpc spec forbids exponential notation.
|
||||
// sprintf('%F') could be most likely ok but it fails eg. on 2e-14.
|
||||
// The code below tries its best at keeping max precision while avoiding exp notation,
|
||||
// but there is of course no limit in the number of decimal places to be used...
|
||||
$rs.="<${typ}>".preg_replace('/\\.?0+$/','',number_format((double)$val, 128, '.', ''))."</${typ}>";
|
||||
break;
|
||||
case $GLOBALS['xmlrpcDateTime']:
|
||||
if (is_string($val))
|
||||
{
|
||||
$rs.="<${typ}>${val}</${typ}>";
|
||||
}
|
||||
else if(is_a($val, 'DateTime'))
|
||||
{
|
||||
$rs.="<${typ}>".$val->format('Ymd\TH:i:s')."</${typ}>";
|
||||
}
|
||||
else if(is_int($val))
|
||||
{
|
||||
$rs.="<${typ}>".strftime("%Y%m%dT%H:%M:%S", $val)."</${typ}>";
|
||||
}
|
||||
else
|
||||
{
|
||||
// not really a good idea here: but what shall we output anyway? left for backward compat...
|
||||
$rs.="<${typ}>${val}</${typ}>";
|
||||
}
|
||||
break;
|
||||
case $GLOBALS['xmlrpcNull']:
|
||||
if ($GLOBALS['xmlrpc_null_apache_encoding'])
|
||||
{
|
||||
$rs.="<ex:nil/>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$rs.="<nil/>";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// no standard type value should arrive here, but provide a possibility
|
||||
// for xmlrpcvals of unknown type...
|
||||
$rs.="<${typ}>${val}</${typ}>";
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
// struct
|
||||
if ($this->_php_class)
|
||||
{
|
||||
$rs.='<struct php_class="' . $this->_php_class . "\">\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
$rs.="<struct>\n";
|
||||
}
|
||||
foreach($val as $key2 => $val2)
|
||||
{
|
||||
$rs.='<member><name>'.xmlrpc_encode_entitites($key2, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding)."</name>\n";
|
||||
//$rs.=$this->serializeval($val2);
|
||||
$rs.=$val2->serialize($charset_encoding);
|
||||
$rs.="</member>\n";
|
||||
}
|
||||
$rs.='</struct>';
|
||||
break;
|
||||
case 2:
|
||||
// array
|
||||
$rs.="<array>\n<data>\n";
|
||||
for($i=0; $i<count($val); $i++)
|
||||
{
|
||||
//$rs.=$this->serializeval($val[$i]);
|
||||
$rs.=$val[$i]->serialize($charset_encoding);
|
||||
}
|
||||
$rs.="</data>\n</array>";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return $rs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns xml representation of the value. XML prologue not included
|
||||
* @param string $charset_encoding the charset to be used for serialization. if null, US-ASCII is assumed
|
||||
* @return string
|
||||
* @access public
|
||||
*/
|
||||
function serialize($charset_encoding='')
|
||||
{
|
||||
// add check? slower, but helps to avoid recursion in serializing broken xmlrpcvals...
|
||||
//if (is_object($o) && (get_class($o) == 'xmlrpcval' || is_subclass_of($o, 'xmlrpcval')))
|
||||
//{
|
||||
reset($this->me);
|
||||
list($typ, $val) = each($this->me);
|
||||
return '<value>' . $this->serializedata($typ, $val, $charset_encoding) . "</value>\n";
|
||||
//}
|
||||
}
|
||||
|
||||
// DEPRECATED
|
||||
function serializeval($o)
|
||||
{
|
||||
// add check? slower, but helps to avoid recursion in serializing broken xmlrpcvals...
|
||||
//if (is_object($o) && (get_class($o) == 'xmlrpcval' || is_subclass_of($o, 'xmlrpcval')))
|
||||
//{
|
||||
$ar=$o->me;
|
||||
reset($ar);
|
||||
list($typ, $val) = each($ar);
|
||||
return '<value>' . $this->serializedata($typ, $val) . "</value>\n";
|
||||
//}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks wheter a struct member with a given name is present.
|
||||
* Works only on xmlrpcvals of type struct.
|
||||
* @param string $m the name of the struct member to be looked up
|
||||
* @return boolean
|
||||
* @access public
|
||||
*/
|
||||
function structmemexists($m)
|
||||
{
|
||||
return array_key_exists($m, $this->me['struct']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value of a given struct member (an xmlrpcval object in itself).
|
||||
* Will raise a php warning if struct member of given name does not exist
|
||||
* @param string $m the name of the struct member to be looked up
|
||||
* @return xmlrpcval
|
||||
* @access public
|
||||
*/
|
||||
function structmem($m)
|
||||
{
|
||||
return $this->me['struct'][$m];
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset internal pointer for xmlrpcvals of type struct.
|
||||
* @access public
|
||||
*/
|
||||
function structreset()
|
||||
{
|
||||
reset($this->me['struct']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return next member element for xmlrpcvals of type struct.
|
||||
* @return xmlrpcval
|
||||
* @access public
|
||||
*/
|
||||
function structeach()
|
||||
{
|
||||
return each($this->me['struct']);
|
||||
}
|
||||
|
||||
// DEPRECATED! this code looks like it is very fragile and has not been fixed
|
||||
// for a long long time. Shall we remove it for 2.0?
|
||||
function getval()
|
||||
{
|
||||
// UNSTABLE
|
||||
reset($this->me);
|
||||
list($a,$b)=each($this->me);
|
||||
// contributed by I Sofer, 2001-03-24
|
||||
// add support for nested arrays to scalarval
|
||||
// i've created a new method here, so as to
|
||||
// preserve back compatibility
|
||||
|
||||
if(is_array($b))
|
||||
{
|
||||
@reset($b);
|
||||
while(list($id,$cont) = @each($b))
|
||||
{
|
||||
$b[$id] = $cont->scalarval();
|
||||
}
|
||||
}
|
||||
|
||||
// add support for structures directly encoding php objects
|
||||
if(is_object($b))
|
||||
{
|
||||
$t = get_object_vars($b);
|
||||
@reset($t);
|
||||
while(list($id,$cont) = @each($t))
|
||||
{
|
||||
$t[$id] = $cont->scalarval();
|
||||
}
|
||||
@reset($t);
|
||||
while(list($id,$cont) = @each($t))
|
||||
{
|
||||
@$b->$id = $cont;
|
||||
}
|
||||
}
|
||||
// end contrib
|
||||
return $b;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value of a scalar xmlrpcval
|
||||
* @return mixed
|
||||
* @access public
|
||||
*/
|
||||
function scalarval()
|
||||
{
|
||||
reset($this->me);
|
||||
list(,$b)=each($this->me);
|
||||
return $b;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of the xmlrpcval.
|
||||
* For integers, 'int' is always returned in place of 'i4'
|
||||
* @return string
|
||||
* @access public
|
||||
*/
|
||||
function scalartyp()
|
||||
{
|
||||
reset($this->me);
|
||||
list($a,)=each($this->me);
|
||||
if($a==$GLOBALS['xmlrpcI4'])
|
||||
{
|
||||
$a=$GLOBALS['xmlrpcInt'];
|
||||
}
|
||||
return $a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the m-th member of an xmlrpcval of struct type
|
||||
* @param integer $m the index of the value to be retrieved (zero based)
|
||||
* @return xmlrpcval
|
||||
* @access public
|
||||
*/
|
||||
function arraymem($m)
|
||||
{
|
||||
return $this->me['array'][$m];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of members in an xmlrpcval of array type
|
||||
* @return integer
|
||||
* @access public
|
||||
*/
|
||||
function arraysize()
|
||||
{
|
||||
return count($this->me['array']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of members in an xmlrpcval of struct type
|
||||
* @return integer
|
||||
* @access public
|
||||
*/
|
||||
function structsize()
|
||||
{
|
||||
return count($this->me['struct']);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// date helpers
|
||||
|
||||
/**
|
||||
* Given a timestamp, return the corresponding ISO8601 encoded string.
|
||||
*
|
||||
* Really, timezones ought to be supported
|
||||
* but the XML-RPC spec says:
|
||||
*
|
||||
* "Don't assume a timezone. It should be specified by the server in its
|
||||
* documentation what assumptions it makes about timezones."
|
||||
*
|
||||
* These routines always assume localtime unless
|
||||
* $utc is set to 1, in which case UTC is assumed
|
||||
* and an adjustment for locale is made when encoding
|
||||
*
|
||||
* @param int $timet (timestamp)
|
||||
* @param int $utc (0 or 1)
|
||||
* @return string
|
||||
*/
|
||||
function iso8601_encode($timet, $utc=0)
|
||||
{
|
||||
if(!$utc)
|
||||
{
|
||||
$t=strftime("%Y%m%dT%H:%M:%S", $timet);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(function_exists('gmstrftime'))
|
||||
{
|
||||
// gmstrftime doesn't exist in some versions
|
||||
// of PHP
|
||||
$t=gmstrftime("%Y%m%dT%H:%M:%S", $timet);
|
||||
}
|
||||
else
|
||||
{
|
||||
$t=strftime("%Y%m%dT%H:%M:%S", $timet-date('Z'));
|
||||
}
|
||||
}
|
||||
return $t;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given an ISO8601 date string, return a timet in the localtime, or UTC
|
||||
* @param string $idate
|
||||
* @param int $utc either 0 or 1
|
||||
* @return int (datetime)
|
||||
*/
|
||||
function iso8601_decode($idate, $utc=0)
|
||||
{
|
||||
$t=0;
|
||||
if(preg_match('/([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})/', $idate, $regs))
|
||||
{
|
||||
if($utc)
|
||||
{
|
||||
$t=gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$t=mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
|
||||
}
|
||||
}
|
||||
return $t;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes an xmlrpc value in PHP xmlrpcval object format and translates it into native PHP types.
|
||||
*
|
||||
* Works with xmlrpc message objects as input, too.
|
||||
*
|
||||
* Given proper options parameter, can rebuild generic php object instances
|
||||
* (provided those have been encoded to xmlrpc format using a corresponding
|
||||
* option in php_xmlrpc_encode())
|
||||
* PLEASE NOTE that rebuilding php objects involves calling their constructor function.
|
||||
* This means that the remote communication end can decide which php code will
|
||||
* get executed on your server, leaving the door possibly open to 'php-injection'
|
||||
* style of attacks (provided you have some classes defined on your server that
|
||||
* might wreak havoc if instances are built outside an appropriate context).
|
||||
* Make sure you trust the remote server/client before eanbling this!
|
||||
*
|
||||
* @author Dan Libby (dan@libby.com)
|
||||
*
|
||||
* @param xmlrpcval $xmlrpc_val
|
||||
* @param array $options if 'decode_php_objs' is set in the options array, xmlrpc structs can be decoded into php objects; if 'dates_as_objects' is set xmlrpc datetimes are decoded as php DateTime objects (standard is
|
||||
* @return mixed
|
||||
*/
|
||||
function php_xmlrpc_decode($xmlrpc_val, $options=array())
|
||||
{
|
||||
switch($xmlrpc_val->kindOf())
|
||||
{
|
||||
case 'scalar':
|
||||
if (in_array('extension_api', $options))
|
||||
{
|
||||
reset($xmlrpc_val->me);
|
||||
list($typ,$val) = each($xmlrpc_val->me);
|
||||
switch ($typ)
|
||||
{
|
||||
case 'dateTime.iso8601':
|
||||
$xmlrpc_val->scalar = $val;
|
||||
$xmlrpc_val->xmlrpc_type = 'datetime';
|
||||
$xmlrpc_val->timestamp = iso8601_decode($val);
|
||||
return $xmlrpc_val;
|
||||
case 'base64':
|
||||
$xmlrpc_val->scalar = $val;
|
||||
$xmlrpc_val->type = $typ;
|
||||
return $xmlrpc_val;
|
||||
default:
|
||||
return $xmlrpc_val->scalarval();
|
||||
}
|
||||
}
|
||||
if (in_array('dates_as_objects', $options) && $xmlrpc_val->scalartyp() == 'dateTime.iso8601')
|
||||
{
|
||||
// we return a Datetime object instead of a string
|
||||
// since now the constructor of xmlrpcval accepts safely strings, ints and datetimes,
|
||||
// we cater to all 3 cases here
|
||||
$out = $xmlrpc_val->scalarval();
|
||||
if (is_string($out))
|
||||
{
|
||||
$out = strtotime($out);
|
||||
}
|
||||
if (is_int($out))
|
||||
{
|
||||
$result = new Datetime();
|
||||
$result->setTimestamp($out);
|
||||
return $result;
|
||||
}
|
||||
elseif (is_a($out, 'Datetime'))
|
||||
{
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
return $xmlrpc_val->scalarval();
|
||||
case 'array':
|
||||
$size = $xmlrpc_val->arraysize();
|
||||
$arr = array();
|
||||
for($i = 0; $i < $size; $i++)
|
||||
{
|
||||
$arr[] = php_xmlrpc_decode($xmlrpc_val->arraymem($i), $options);
|
||||
}
|
||||
return $arr;
|
||||
case 'struct':
|
||||
$xmlrpc_val->structreset();
|
||||
// If user said so, try to rebuild php objects for specific struct vals.
|
||||
/// @todo should we raise a warning for class not found?
|
||||
// shall we check for proper subclass of xmlrpcval instead of
|
||||
// presence of _php_class to detect what we can do?
|
||||
if (in_array('decode_php_objs', $options) && $xmlrpc_val->_php_class != ''
|
||||
&& class_exists($xmlrpc_val->_php_class))
|
||||
{
|
||||
$obj = @new $xmlrpc_val->_php_class;
|
||||
while(list($key,$value)=$xmlrpc_val->structeach())
|
||||
{
|
||||
$obj->$key = php_xmlrpc_decode($value, $options);
|
||||
}
|
||||
return $obj;
|
||||
}
|
||||
else
|
||||
{
|
||||
$arr = array();
|
||||
while(list($key,$value)=$xmlrpc_val->structeach())
|
||||
{
|
||||
$arr[$key] = php_xmlrpc_decode($value, $options);
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
case 'msg':
|
||||
$paramcount = $xmlrpc_val->getNumParams();
|
||||
$arr = array();
|
||||
for($i = 0; $i < $paramcount; $i++)
|
||||
{
|
||||
$arr[] = php_xmlrpc_decode($xmlrpc_val->getParam($i));
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
}
|
||||
|
||||
// This constant left here only for historical reasons...
|
||||
// it was used to decide if we have to define xmlrpc_encode on our own, but
|
||||
// we do not do it anymore
|
||||
if(function_exists('xmlrpc_decode'))
|
||||
{
|
||||
define('XMLRPC_EPI_ENABLED','1');
|
||||
}
|
||||
else
|
||||
{
|
||||
define('XMLRPC_EPI_ENABLED','0');
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes native php types and encodes them into xmlrpc PHP object format.
|
||||
* It will not re-encode xmlrpcval objects.
|
||||
*
|
||||
* Feature creep -- could support more types via optional type argument
|
||||
* (string => datetime support has been added, ??? => base64 not yet)
|
||||
*
|
||||
* If given a proper options parameter, php object instances will be encoded
|
||||
* into 'special' xmlrpc values, that can later be decoded into php objects
|
||||
* by calling php_xmlrpc_decode() with a corresponding option
|
||||
*
|
||||
* @author Dan Libby (dan@libby.com)
|
||||
*
|
||||
* @param mixed $php_val the value to be converted into an xmlrpcval object
|
||||
* @param array $options can include 'encode_php_objs', 'auto_dates', 'null_extension' or 'extension_api'
|
||||
* @return xmlrpcval
|
||||
*/
|
||||
function php_xmlrpc_encode($php_val, $options=array())
|
||||
{
|
||||
$type = gettype($php_val);
|
||||
switch($type)
|
||||
{
|
||||
case 'string':
|
||||
if (in_array('auto_dates', $options) && preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $php_val))
|
||||
$xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcDateTime']);
|
||||
else
|
||||
$xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcString']);
|
||||
break;
|
||||
case 'integer':
|
||||
$xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcInt']);
|
||||
break;
|
||||
case 'double':
|
||||
$xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcDouble']);
|
||||
break;
|
||||
// <G_Giunta_2001-02-29>
|
||||
// Add support for encoding/decoding of booleans, since they are supported in PHP
|
||||
case 'boolean':
|
||||
$xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcBoolean']);
|
||||
break;
|
||||
// </G_Giunta_2001-02-29>
|
||||
case 'array':
|
||||
// PHP arrays can be encoded to either xmlrpc structs or arrays,
|
||||
// depending on wheter they are hashes or plain 0..n integer indexed
|
||||
// A shorter one-liner would be
|
||||
// $tmp = array_diff(array_keys($php_val), range(0, count($php_val)-1));
|
||||
// but execution time skyrockets!
|
||||
$j = 0;
|
||||
$arr = array();
|
||||
$ko = false;
|
||||
foreach($php_val as $key => $val)
|
||||
{
|
||||
$arr[$key] = php_xmlrpc_encode($val, $options);
|
||||
if(!$ko && $key !== $j)
|
||||
{
|
||||
$ko = true;
|
||||
}
|
||||
$j++;
|
||||
}
|
||||
if($ko)
|
||||
{
|
||||
$xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcStruct']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcArray']);
|
||||
}
|
||||
break;
|
||||
case 'object':
|
||||
if(is_a($php_val, 'xmlrpcval'))
|
||||
{
|
||||
$xmlrpc_val = $php_val;
|
||||
}
|
||||
else if(is_a($php_val, 'DateTime'))
|
||||
{
|
||||
$xmlrpc_val = new xmlrpcval($php_val->format('Ymd\TH:i:s'), $GLOBALS['xmlrpcStruct']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$arr = array();
|
||||
reset($php_val);
|
||||
while(list($k,$v) = each($php_val))
|
||||
{
|
||||
$arr[$k] = php_xmlrpc_encode($v, $options);
|
||||
}
|
||||
$xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcStruct']);
|
||||
if (in_array('encode_php_objs', $options))
|
||||
{
|
||||
// let's save original class name into xmlrpcval:
|
||||
// might be useful later on...
|
||||
$xmlrpc_val->_php_class = get_class($php_val);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'NULL':
|
||||
if (in_array('extension_api', $options))
|
||||
{
|
||||
$xmlrpc_val = new xmlrpcval('', $GLOBALS['xmlrpcString']);
|
||||
}
|
||||
else if (in_array('null_extension', $options))
|
||||
{
|
||||
$xmlrpc_val = new xmlrpcval('', $GLOBALS['xmlrpcNull']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$xmlrpc_val = new xmlrpcval();
|
||||
}
|
||||
break;
|
||||
case 'resource':
|
||||
if (in_array('extension_api', $options))
|
||||
{
|
||||
$xmlrpc_val = new xmlrpcval((int)$php_val, $GLOBALS['xmlrpcInt']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$xmlrpc_val = new xmlrpcval();
|
||||
}
|
||||
// catch "user function", "unknown type"
|
||||
default:
|
||||
// giancarlo pinerolo <ping@alt.it>
|
||||
// it has to return
|
||||
// an empty object in case, not a boolean.
|
||||
$xmlrpc_val = new xmlrpcval();
|
||||
break;
|
||||
}
|
||||
return $xmlrpc_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the xml representation of a method response, method request or single
|
||||
* xmlrpc value into the appropriate object (a.k.a. deserialize)
|
||||
* @param string $xml_val
|
||||
* @param array $options
|
||||
* @return mixed false on error, or an instance of either xmlrpcval, xmlrpcmsg or xmlrpcresp
|
||||
*/
|
||||
function php_xmlrpc_decode_xml($xml_val, $options=array())
|
||||
{
|
||||
$GLOBALS['_xh'] = array();
|
||||
$GLOBALS['_xh']['ac'] = '';
|
||||
$GLOBALS['_xh']['stack'] = array();
|
||||
$GLOBALS['_xh']['valuestack'] = array();
|
||||
$GLOBALS['_xh']['params'] = array();
|
||||
$GLOBALS['_xh']['pt'] = array();
|
||||
$GLOBALS['_xh']['isf'] = 0;
|
||||
$GLOBALS['_xh']['isf_reason'] = '';
|
||||
$GLOBALS['_xh']['method'] = false;
|
||||
$GLOBALS['_xh']['rt'] = '';
|
||||
/// @todo 'guestimate' encoding
|
||||
$parser = xml_parser_create();
|
||||
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
|
||||
// What if internal encoding is not in one of the 3 allowed?
|
||||
// we use the broadest one, ie. utf8!
|
||||
if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
|
||||
{
|
||||
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
|
||||
}
|
||||
else
|
||||
{
|
||||
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']);
|
||||
}
|
||||
xml_set_element_handler($parser, 'xmlrpc_se_any', 'xmlrpc_ee');
|
||||
xml_set_character_data_handler($parser, 'xmlrpc_cd');
|
||||
xml_set_default_handler($parser, 'xmlrpc_dh');
|
||||
if(!xml_parse($parser, $xml_val, 1))
|
||||
{
|
||||
$errstr = sprintf('XML error: %s at line %d, column %d',
|
||||
xml_error_string(xml_get_error_code($parser)),
|
||||
xml_get_current_line_number($parser), xml_get_current_column_number($parser));
|
||||
error_log($errstr);
|
||||
xml_parser_free($parser);
|
||||
return false;
|
||||
}
|
||||
xml_parser_free($parser);
|
||||
if ($GLOBALS['_xh']['isf'] > 1) // test that $GLOBALS['_xh']['value'] is an obj, too???
|
||||
{
|
||||
error_log($GLOBALS['_xh']['isf_reason']);
|
||||
return false;
|
||||
}
|
||||
switch ($GLOBALS['_xh']['rt'])
|
||||
{
|
||||
case 'methodresponse':
|
||||
$v =& $GLOBALS['_xh']['value'];
|
||||
if ($GLOBALS['_xh']['isf'] == 1)
|
||||
{
|
||||
$vc = $v->structmem('faultCode');
|
||||
$vs = $v->structmem('faultString');
|
||||
$r = new xmlrpcresp(0, $vc->scalarval(), $vs->scalarval());
|
||||
}
|
||||
else
|
||||
{
|
||||
$r = new xmlrpcresp($v);
|
||||
}
|
||||
return $r;
|
||||
case 'methodcall':
|
||||
$m = new xmlrpcmsg($GLOBALS['_xh']['method']);
|
||||
for($i=0; $i < count($GLOBALS['_xh']['params']); $i++)
|
||||
{
|
||||
$m->addParam($GLOBALS['_xh']['params'][$i]);
|
||||
}
|
||||
return $m;
|
||||
case 'value':
|
||||
return $GLOBALS['_xh']['value'];
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* decode a string that is encoded w/ "chunked" transfer encoding
|
||||
* as defined in rfc2068 par. 19.4.6
|
||||
* code shamelessly stolen from nusoap library by Dietrich Ayala
|
||||
*
|
||||
* @param string $buffer the string to be decoded
|
||||
* @return string
|
||||
*/
|
||||
function decode_chunked($buffer)
|
||||
{
|
||||
// length := 0
|
||||
$length = 0;
|
||||
$new = '';
|
||||
|
||||
// read chunk-size, chunk-extension (if any) and crlf
|
||||
// get the position of the linebreak
|
||||
$chunkend = strpos($buffer,"\r\n") + 2;
|
||||
$temp = substr($buffer,0,$chunkend);
|
||||
$chunk_size = hexdec( trim($temp) );
|
||||
$chunkstart = $chunkend;
|
||||
while($chunk_size > 0)
|
||||
{
|
||||
$chunkend = strpos($buffer, "\r\n", $chunkstart + $chunk_size);
|
||||
|
||||
// just in case we got a broken connection
|
||||
if($chunkend == false)
|
||||
{
|
||||
$chunk = substr($buffer,$chunkstart);
|
||||
// append chunk-data to entity-body
|
||||
$new .= $chunk;
|
||||
$length += strlen($chunk);
|
||||
break;
|
||||
}
|
||||
|
||||
// read chunk-data and crlf
|
||||
$chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart);
|
||||
// append chunk-data to entity-body
|
||||
$new .= $chunk;
|
||||
// length := length + chunk-size
|
||||
$length += strlen($chunk);
|
||||
// read chunk-size and crlf
|
||||
$chunkstart = $chunkend + 2;
|
||||
|
||||
$chunkend = strpos($buffer,"\r\n",$chunkstart)+2;
|
||||
if($chunkend == false)
|
||||
{
|
||||
break; //just in case we got a broken connection
|
||||
}
|
||||
$temp = substr($buffer,$chunkstart,$chunkend-$chunkstart);
|
||||
$chunk_size = hexdec( trim($temp) );
|
||||
$chunkstart = $chunkend;
|
||||
}
|
||||
return $new;
|
||||
}
|
||||
|
||||
/**
|
||||
* xml charset encoding guessing helper function.
|
||||
* Tries to determine the charset encoding of an XML chunk received over HTTP.
|
||||
* NB: according to the spec (RFC 3023), if text/xml content-type is received over HTTP without a content-type,
|
||||
* we SHOULD assume it is strictly US-ASCII. But we try to be more tolerant of unconforming (legacy?) clients/servers,
|
||||
* which will be most probably using UTF-8 anyway...
|
||||
*
|
||||
* @param string $httpheaders the http Content-type header
|
||||
* @param string $xmlchunk xml content buffer
|
||||
* @param string $encoding_prefs comma separated list of character encodings to be used as default (when mb extension is enabled)
|
||||
*
|
||||
* @todo explore usage of mb_http_input(): does it detect http headers + post data? if so, use it instead of hand-detection!!!
|
||||
*/
|
||||
function guess_encoding($httpheader='', $xmlchunk='', $encoding_prefs=null)
|
||||
{
|
||||
// discussion: see http://www.yale.edu/pclt/encoding/
|
||||
// 1 - test if encoding is specified in HTTP HEADERS
|
||||
|
||||
//Details:
|
||||
// LWS: (\13\10)?( |\t)+
|
||||
// token: (any char but excluded stuff)+
|
||||
// quoted string: " (any char but double quotes and cointrol chars)* "
|
||||
// header: Content-type = ...; charset=value(; ...)*
|
||||
// where value is of type token, no LWS allowed between 'charset' and value
|
||||
// Note: we do not check for invalid chars in VALUE:
|
||||
// this had better be done using pure ereg as below
|
||||
// Note 2: we might be removing whitespace/tabs that ought to be left in if
|
||||
// the received charset is a quoted string. But nobody uses such charset names...
|
||||
|
||||
/// @todo this test will pass if ANY header has charset specification, not only Content-Type. Fix it?
|
||||
$matches = array();
|
||||
if(preg_match('/;\s*charset\s*=([^;]+)/i', $httpheader, $matches))
|
||||
{
|
||||
return strtoupper(trim($matches[1], " \t\""));
|
||||
}
|
||||
|
||||
// 2 - scan the first bytes of the data for a UTF-16 (or other) BOM pattern
|
||||
// (source: http://www.w3.org/TR/2000/REC-xml-20001006)
|
||||
// NOTE: actually, according to the spec, even if we find the BOM and determine
|
||||
// an encoding, we should check if there is an encoding specified
|
||||
// in the xml declaration, and verify if they match.
|
||||
/// @todo implement check as described above?
|
||||
/// @todo implement check for first bytes of string even without a BOM? (It sure looks harder than for cases WITH a BOM)
|
||||
if(preg_match('/^(\x00\x00\xFE\xFF|\xFF\xFE\x00\x00|\x00\x00\xFF\xFE|\xFE\xFF\x00\x00)/', $xmlchunk))
|
||||
{
|
||||
return 'UCS-4';
|
||||
}
|
||||
elseif(preg_match('/^(\xFE\xFF|\xFF\xFE)/', $xmlchunk))
|
||||
{
|
||||
return 'UTF-16';
|
||||
}
|
||||
elseif(preg_match('/^(\xEF\xBB\xBF)/', $xmlchunk))
|
||||
{
|
||||
return 'UTF-8';
|
||||
}
|
||||
|
||||
// 3 - test if encoding is specified in the xml declaration
|
||||
// Details:
|
||||
// SPACE: (#x20 | #x9 | #xD | #xA)+ === [ \x9\xD\xA]+
|
||||
// EQ: SPACE?=SPACE? === [ \x9\xD\xA]*=[ \x9\xD\xA]*
|
||||
if (preg_match('/^<\?xml\s+version\s*=\s*'. "((?:\"[a-zA-Z0-9_.:-]+\")|(?:'[a-zA-Z0-9_.:-]+'))".
|
||||
'\s+encoding\s*=\s*' . "((?:\"[A-Za-z][A-Za-z0-9._-]*\")|(?:'[A-Za-z][A-Za-z0-9._-]*'))/",
|
||||
$xmlchunk, $matches))
|
||||
{
|
||||
return strtoupper(substr($matches[2], 1, -1));
|
||||
}
|
||||
|
||||
// 4 - if mbstring is available, let it do the guesswork
|
||||
// NB: we favour finding an encoding that is compatible with what we can process
|
||||
if(extension_loaded('mbstring'))
|
||||
{
|
||||
if($encoding_prefs)
|
||||
{
|
||||
$enc = mb_detect_encoding($xmlchunk, $encoding_prefs);
|
||||
}
|
||||
else
|
||||
{
|
||||
$enc = mb_detect_encoding($xmlchunk);
|
||||
}
|
||||
// NB: mb_detect likes to call it ascii, xml parser likes to call it US_ASCII...
|
||||
// IANA also likes better US-ASCII, so go with it
|
||||
if($enc == 'ASCII')
|
||||
{
|
||||
$enc = 'US-'.$enc;
|
||||
}
|
||||
return $enc;
|
||||
}
|
||||
else
|
||||
{
|
||||
// no encoding specified: as per HTTP1.1 assume it is iso-8859-1?
|
||||
// Both RFC 2616 (HTTP 1.1) and 1945 (HTTP 1.0) clearly state that for text/xxx content types
|
||||
// this should be the standard. And we should be getting text/xml as request and response.
|
||||
// BUT we have to be backward compatible with the lib, which always used UTF-8 as default...
|
||||
return $GLOBALS['xmlrpc_defencoding'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a given charset encoding is present in a list of encodings or
|
||||
* if it is a valid subset of any encoding in the list
|
||||
* @param string $encoding charset to be tested
|
||||
* @param mixed $validlist comma separated list of valid charsets (or array of charsets)
|
||||
*/
|
||||
function is_valid_charset($encoding, $validlist)
|
||||
{
|
||||
$charset_supersets = array(
|
||||
'US-ASCII' => array ('ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4',
|
||||
'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8',
|
||||
'ISO-8859-9', 'ISO-8859-10', 'ISO-8859-11', 'ISO-8859-12',
|
||||
'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'UTF-8',
|
||||
'EUC-JP', 'EUC-', 'EUC-KR', 'EUC-CN')
|
||||
);
|
||||
if (is_string($validlist))
|
||||
$validlist = explode(',', $validlist);
|
||||
if (@in_array(strtoupper($encoding), $validlist))
|
||||
return true;
|
||||
else
|
||||
{
|
||||
if (array_key_exists($encoding, $charset_supersets))
|
||||
foreach ($validlist as $allowed)
|
||||
if (in_array($allowed, $charset_supersets[$encoding]))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
955
thirdparty/xmlrpc/xmlrpc_wrappers.php
vendored
@ -1,955 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* PHP-XMLRPC "wrapper" functions
|
||||
* Generate stubs to transparently access xmlrpc methods as php functions and viceversa
|
||||
*
|
||||
* @version $Id: xmlrpc_wrappers.inc,v 1.13 2008/09/20 01:23:47 ggiunta Exp $
|
||||
* @author Gaetano Giunta
|
||||
* @copyright (C) 2006-2009 G. Giunta
|
||||
* @license code licensed under the BSD License: http://phpxmlrpc.sourceforge.net/license.txt
|
||||
*
|
||||
* @todo separate introspection from code generation for func-2-method wrapping
|
||||
* @todo use some better templating system for code generation?
|
||||
* @todo implement method wrapping with preservation of php objs in calls
|
||||
* @todo when wrapping methods without obj rebuilding, use return_type = 'phpvals' (faster)
|
||||
* @todo implement self-parsing of php code for PHP <= 4
|
||||
*/
|
||||
|
||||
// requires: xmlrpc.inc
|
||||
|
||||
/**
|
||||
* Given a string defining a php type or phpxmlrpc type (loosely defined: strings
|
||||
* accepted come from javadoc blocks), return corresponding phpxmlrpc type.
|
||||
* NB: for php 'resource' types returns empty string, since resources cannot be serialized;
|
||||
* for php class names returns 'struct', since php objects can be serialized as xmlrpc structs
|
||||
* for php arrays always return array, even though arrays sometiles serialize as json structs
|
||||
* @param string $phptype
|
||||
* @return string
|
||||
*/
|
||||
function php_2_xmlrpc_type($phptype)
|
||||
{
|
||||
switch(strtolower($phptype))
|
||||
{
|
||||
case 'string':
|
||||
return $GLOBALS['xmlrpcString'];
|
||||
case 'integer':
|
||||
case $GLOBALS['xmlrpcInt']: // 'int'
|
||||
case $GLOBALS['xmlrpcI4']:
|
||||
return $GLOBALS['xmlrpcInt'];
|
||||
case 'double':
|
||||
return $GLOBALS['xmlrpcDouble'];
|
||||
case 'boolean':
|
||||
return $GLOBALS['xmlrpcBoolean'];
|
||||
case 'array':
|
||||
return $GLOBALS['xmlrpcArray'];
|
||||
case 'object':
|
||||
return $GLOBALS['xmlrpcStruct'];
|
||||
case $GLOBALS['xmlrpcBase64']:
|
||||
case $GLOBALS['xmlrpcStruct']:
|
||||
return strtolower($phptype);
|
||||
case 'resource':
|
||||
return '';
|
||||
default:
|
||||
if(class_exists($phptype))
|
||||
{
|
||||
return $GLOBALS['xmlrpcStruct'];
|
||||
}
|
||||
else
|
||||
{
|
||||
// unknown: might be any 'extended' xmlrpc type
|
||||
return $GLOBALS['xmlrpcValue'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a string defining a phpxmlrpc type return corresponding php type.
|
||||
* @param string $xmlrpctype
|
||||
* @return string
|
||||
*/
|
||||
function xmlrpc_2_php_type($xmlrpctype)
|
||||
{
|
||||
switch(strtolower($xmlrpctype))
|
||||
{
|
||||
case 'base64':
|
||||
case 'datetime.iso8601':
|
||||
case 'string':
|
||||
return $GLOBALS['xmlrpcString'];
|
||||
case 'int':
|
||||
case 'i4':
|
||||
return 'integer';
|
||||
case 'struct':
|
||||
case 'array':
|
||||
return 'array';
|
||||
case 'double':
|
||||
return 'float';
|
||||
case 'undefined':
|
||||
return 'mixed';
|
||||
case 'boolean':
|
||||
case 'null':
|
||||
default:
|
||||
// unknown: might be any xmlrpc type
|
||||
return strtolower($xmlrpctype);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a user-defined PHP function, create a PHP 'wrapper' function that can
|
||||
* be exposed as xmlrpc method from an xmlrpc_server object and called from remote
|
||||
* clients (as well as its corresponding signature info).
|
||||
*
|
||||
* Since php is a typeless language, to infer types of input and output parameters,
|
||||
* it relies on parsing the javadoc-style comment block associated with the given
|
||||
* function. Usage of xmlrpc native types (such as datetime.dateTime.iso8601 and base64)
|
||||
* in the @param tag is also allowed, if you need the php function to receive/send
|
||||
* data in that particular format (note that base64 encoding/decoding is transparently
|
||||
* carried out by the lib, while datetime vals are passed around as strings)
|
||||
*
|
||||
* Known limitations:
|
||||
* - requires PHP 5.0.3 +
|
||||
* - only works for user-defined functions, not for PHP internal functions
|
||||
* (reflection does not support retrieving number/type of params for those)
|
||||
* - functions returning php objects will generate special xmlrpc responses:
|
||||
* when the xmlrpc decoding of those responses is carried out by this same lib, using
|
||||
* the appropriate param in php_xmlrpc_decode, the php objects will be rebuilt.
|
||||
* In short: php objects can be serialized, too (except for their resource members),
|
||||
* using this function.
|
||||
* Other libs might choke on the very same xml that will be generated in this case
|
||||
* (i.e. it has a nonstandard attribute on struct element tags)
|
||||
* - usage of javadoc @param tags using param names in a different order from the
|
||||
* function prototype is not considered valid (to be fixed?)
|
||||
*
|
||||
* Note that since rel. 2.0RC3 the preferred method to have the server call 'standard'
|
||||
* php functions (ie. functions not expecting a single xmlrpcmsg obj as parameter)
|
||||
* is by making use of the functions_parameters_type class member.
|
||||
*
|
||||
* @param string $funcname the name of the PHP user function to be exposed as xmlrpc method; array($obj, 'methodname') and array('class', 'methodname') are ok too
|
||||
* @param string $newfuncname (optional) name for function to be created
|
||||
* @param array $extra_options (optional) array of options for conversion. valid values include:
|
||||
* bool return_source when true, php code w. function definition will be returned, not evaluated
|
||||
* bool encode_php_objs let php objects be sent to server using the 'improved' xmlrpc notation, so server can deserialize them as php objects
|
||||
* bool decode_php_objs --- WARNING !!! possible security hazard. only use it with trusted servers ---
|
||||
* bool suppress_warnings remove from produced xml any runtime warnings due to the php function being invoked
|
||||
* @return false on error, or an array containing the name of the new php function,
|
||||
* its signature and docs, to be used in the server dispatch map
|
||||
*
|
||||
* @todo decide how to deal with params passed by ref: bomb out or allow?
|
||||
* @todo finish using javadoc info to build method sig if all params are named but out of order
|
||||
* @todo add a check for params of 'resource' type
|
||||
* @todo add some trigger_errors / error_log when returning false?
|
||||
* @todo what to do when the PHP function returns NULL? we are currently returning an empty string value...
|
||||
* @todo add an option to suppress php warnings in invocation of user function, similar to server debug level 3?
|
||||
* @todo if $newfuncname is empty, we could use create_user_func instead of eval, as it is possibly faster
|
||||
* @todo add a verbatim_object_copy parameter to allow avoiding the same obj instance?
|
||||
*/
|
||||
function wrap_php_function($funcname, $newfuncname='', $extra_options=array())
|
||||
{
|
||||
$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
|
||||
$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
|
||||
$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
|
||||
$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
|
||||
$catch_warnings = isset($extra_options['suppress_warnings']) && $extra_options['suppress_warnings'] ? '@' : '';
|
||||
|
||||
if(version_compare(phpversion(), '5.0.3') == -1)
|
||||
{
|
||||
// up to php 5.0.3 some useful reflection methods were missing
|
||||
error_log('XML-RPC: cannot not wrap php functions unless running php version bigger than 5.0.3');
|
||||
return false;
|
||||
}
|
||||
|
||||
$exists = false;
|
||||
if (is_string($funcname) && strpos($funcname, '::') !== false)
|
||||
{
|
||||
$funcname = explode('::', $funcname);
|
||||
}
|
||||
if(is_array($funcname))
|
||||
{
|
||||
if(count($funcname) < 2 || (!is_string($funcname[0]) && !is_object($funcname[0])))
|
||||
{
|
||||
error_log('XML-RPC: syntax for function to be wrapped is wrong');
|
||||
return false;
|
||||
}
|
||||
if(is_string($funcname[0]))
|
||||
{
|
||||
$plainfuncname = implode('::', $funcname);
|
||||
}
|
||||
elseif(is_object($funcname[0]))
|
||||
{
|
||||
$plainfuncname = get_class($funcname[0]) . '->' . $funcname[1];
|
||||
}
|
||||
$exists = method_exists($funcname[0], $funcname[1]);
|
||||
if (!$exists && version_compare(phpversion(), '5.1') < 0)
|
||||
{
|
||||
// workaround for php 5.0: static class methods are not seen by method_exists
|
||||
$exists = is_callable( $funcname );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$plainfuncname = $funcname;
|
||||
$exists = function_exists($funcname);
|
||||
}
|
||||
|
||||
if(!$exists)
|
||||
{
|
||||
error_log('XML-RPC: function to be wrapped is not defined: '.$plainfuncname);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// determine name of new php function
|
||||
if($newfuncname == '')
|
||||
{
|
||||
if(is_array($funcname))
|
||||
{
|
||||
if(is_string($funcname[0]))
|
||||
$xmlrpcfuncname = "{$prefix}_".implode('_', $funcname);
|
||||
else
|
||||
$xmlrpcfuncname = "{$prefix}_".get_class($funcname[0]) . '_' . $funcname[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
$xmlrpcfuncname = "{$prefix}_$funcname";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$xmlrpcfuncname = $newfuncname;
|
||||
}
|
||||
while($buildit && function_exists($xmlrpcfuncname))
|
||||
{
|
||||
$xmlrpcfuncname .= 'x';
|
||||
}
|
||||
|
||||
// start to introspect PHP code
|
||||
if(is_array($funcname))
|
||||
{
|
||||
$func = new ReflectionMethod($funcname[0], $funcname[1]);
|
||||
if($func->isPrivate())
|
||||
{
|
||||
error_log('XML-RPC: method to be wrapped is private: '.$plainfuncname);
|
||||
return false;
|
||||
}
|
||||
if($func->isProtected())
|
||||
{
|
||||
error_log('XML-RPC: method to be wrapped is protected: '.$plainfuncname);
|
||||
return false;
|
||||
}
|
||||
if($func->isConstructor())
|
||||
{
|
||||
error_log('XML-RPC: method to be wrapped is the constructor: '.$plainfuncname);
|
||||
return false;
|
||||
}
|
||||
// php 503 always says isdestructor = true...
|
||||
if( version_compare(phpversion(), '5.0.3') != 0 && $func->isDestructor())
|
||||
{
|
||||
error_log('XML-RPC: method to be wrapped is the destructor: '.$plainfuncname);
|
||||
return false;
|
||||
}
|
||||
if($func->isAbstract())
|
||||
{
|
||||
error_log('XML-RPC: method to be wrapped is abstract: '.$plainfuncname);
|
||||
return false;
|
||||
}
|
||||
/// @todo add more checks for static vs. nonstatic?
|
||||
}
|
||||
else
|
||||
{
|
||||
$func = new ReflectionFunction($funcname);
|
||||
}
|
||||
if($func->isInternal())
|
||||
{
|
||||
// Note: from PHP 5.1.0 onward, we will possibly be able to use invokeargs
|
||||
// instead of getparameters to fully reflect internal php functions ?
|
||||
error_log('XML-RPC: function to be wrapped is internal: '.$plainfuncname);
|
||||
return false;
|
||||
}
|
||||
|
||||
// retrieve parameter names, types and description from javadoc comments
|
||||
|
||||
// function description
|
||||
$desc = '';
|
||||
// type of return val: by default 'any'
|
||||
$returns = $GLOBALS['xmlrpcValue'];
|
||||
// desc of return val
|
||||
$returnsDocs = '';
|
||||
// type + name of function parameters
|
||||
$paramDocs = array();
|
||||
|
||||
$docs = $func->getDocComment();
|
||||
if($docs != '')
|
||||
{
|
||||
$docs = explode("\n", $docs);
|
||||
$i = 0;
|
||||
foreach($docs as $doc)
|
||||
{
|
||||
$doc = trim($doc, " \r\t/*");
|
||||
if(strlen($doc) && strpos($doc, '@') !== 0 && !$i)
|
||||
{
|
||||
if($desc)
|
||||
{
|
||||
$desc .= "\n";
|
||||
}
|
||||
$desc .= $doc;
|
||||
}
|
||||
elseif(strpos($doc, '@param') === 0)
|
||||
{
|
||||
// syntax: @param type [$name] desc
|
||||
if(preg_match('/@param\s+(\S+)(\s+\$\S+)?\s+(.+)/', $doc, $matches))
|
||||
{
|
||||
if(strpos($matches[1], '|'))
|
||||
{
|
||||
//$paramDocs[$i]['type'] = explode('|', $matches[1]);
|
||||
$paramDocs[$i]['type'] = 'mixed';
|
||||
}
|
||||
else
|
||||
{
|
||||
$paramDocs[$i]['type'] = $matches[1];
|
||||
}
|
||||
$paramDocs[$i]['name'] = trim($matches[2]);
|
||||
$paramDocs[$i]['doc'] = $matches[3];
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
elseif(strpos($doc, '@return') === 0)
|
||||
{
|
||||
// syntax: @return type desc
|
||||
//$returns = preg_split('/\s+/', $doc);
|
||||
if(preg_match('/@return\s+(\S+)\s+(.+)/', $doc, $matches))
|
||||
{
|
||||
$returns = php_2_xmlrpc_type($matches[1]);
|
||||
if(isset($matches[2]))
|
||||
{
|
||||
$returnsDocs = $matches[2];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// execute introspection of actual function prototype
|
||||
$params = array();
|
||||
$i = 0;
|
||||
foreach($func->getParameters() as $paramobj)
|
||||
{
|
||||
$params[$i] = array();
|
||||
$params[$i]['name'] = '$'.$paramobj->getName();
|
||||
$params[$i]['isoptional'] = $paramobj->isOptional();
|
||||
$i++;
|
||||
}
|
||||
|
||||
|
||||
// start building of PHP code to be eval'd
|
||||
$innercode = '';
|
||||
$i = 0;
|
||||
$parsvariations = array();
|
||||
$pars = array();
|
||||
$pnum = count($params);
|
||||
foreach($params as $param)
|
||||
{
|
||||
if (isset($paramDocs[$i]['name']) && $paramDocs[$i]['name'] && strtolower($paramDocs[$i]['name']) != strtolower($param['name']))
|
||||
{
|
||||
// param name from phpdoc info does not match param definition!
|
||||
$paramDocs[$i]['type'] = 'mixed';
|
||||
}
|
||||
|
||||
if($param['isoptional'])
|
||||
{
|
||||
// this particular parameter is optional. save as valid previous list of parameters
|
||||
$innercode .= "if (\$paramcount > $i) {\n";
|
||||
$parsvariations[] = $pars;
|
||||
}
|
||||
$innercode .= "\$p$i = \$msg->getParam($i);\n";
|
||||
if ($decode_php_objects)
|
||||
{
|
||||
$innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i, array('decode_php_objs'));\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
$innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i);\n";
|
||||
}
|
||||
|
||||
$pars[] = "\$p$i";
|
||||
$i++;
|
||||
if($param['isoptional'])
|
||||
{
|
||||
$innercode .= "}\n";
|
||||
}
|
||||
if($i == $pnum)
|
||||
{
|
||||
// last allowed parameters combination
|
||||
$parsvariations[] = $pars;
|
||||
}
|
||||
}
|
||||
|
||||
$sigs = array();
|
||||
$psigs = array();
|
||||
if(count($parsvariations) == 0)
|
||||
{
|
||||
// only known good synopsis = no parameters
|
||||
$parsvariations[] = array();
|
||||
$minpars = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
$minpars = count($parsvariations[0]);
|
||||
}
|
||||
|
||||
if($minpars)
|
||||
{
|
||||
// add to code the check for min params number
|
||||
// NB: this check needs to be done BEFORE decoding param values
|
||||
$innercode = "\$paramcount = \$msg->getNumParams();\n" .
|
||||
"if (\$paramcount < $minpars) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}');\n" . $innercode;
|
||||
}
|
||||
else
|
||||
{
|
||||
$innercode = "\$paramcount = \$msg->getNumParams();\n" . $innercode;
|
||||
}
|
||||
|
||||
$innercode .= "\$np = false;\n";
|
||||
// since there are no closures in php, if we are given an object instance,
|
||||
// we store a pointer to it in a global var...
|
||||
if ( is_array($funcname) && is_object($funcname[0]) )
|
||||
{
|
||||
$GLOBALS['xmlrpcWPFObjHolder'][$xmlrpcfuncname] =& $funcname[0];
|
||||
$innercode .= "\$obj =& \$GLOBALS['xmlrpcWPFObjHolder']['$xmlrpcfuncname'];\n";
|
||||
$realfuncname = '$obj->'.$funcname[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
$realfuncname = $plainfuncname;
|
||||
}
|
||||
foreach($parsvariations as $pars)
|
||||
{
|
||||
$innercode .= "if (\$paramcount == " . count($pars) . ") \$retval = {$catch_warnings}$realfuncname(" . implode(',', $pars) . "); else\n";
|
||||
// build a 'generic' signature (only use an appropriate return type)
|
||||
$sig = array($returns);
|
||||
$psig = array($returnsDocs);
|
||||
for($i=0; $i < count($pars); $i++)
|
||||
{
|
||||
if (isset($paramDocs[$i]['type']))
|
||||
{
|
||||
$sig[] = php_2_xmlrpc_type($paramDocs[$i]['type']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sig[] = $GLOBALS['xmlrpcValue'];
|
||||
}
|
||||
$psig[] = isset($paramDocs[$i]['doc']) ? $paramDocs[$i]['doc'] : '';
|
||||
}
|
||||
$sigs[] = $sig;
|
||||
$psigs[] = $psig;
|
||||
}
|
||||
$innercode .= "\$np = true;\n";
|
||||
$innercode .= "if (\$np) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}'); else {\n";
|
||||
//$innercode .= "if (\$_xmlrpcs_error_occurred) return new xmlrpcresp(0, $GLOBALS['xmlrpcerr']user, \$_xmlrpcs_error_occurred); else\n";
|
||||
$innercode .= "if (is_a(\$retval, '{$prefix}resp')) return \$retval; else\n";
|
||||
if($returns == $GLOBALS['xmlrpcDateTime'] || $returns == $GLOBALS['xmlrpcBase64'])
|
||||
{
|
||||
$innercode .= "return new {$prefix}resp(new {$prefix}val(\$retval, '$returns'));";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($encode_php_objects)
|
||||
$innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval, array('encode_php_objs')));\n";
|
||||
else
|
||||
$innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval));\n";
|
||||
}
|
||||
// shall we exclude functions returning by ref?
|
||||
// if($func->returnsReference())
|
||||
// return false;
|
||||
$code = "function $xmlrpcfuncname(\$msg) {\n" . $innercode . "}\n}";
|
||||
//print_r($code);
|
||||
if ($buildit)
|
||||
{
|
||||
$allOK = 0;
|
||||
eval($code.'$allOK=1;');
|
||||
// alternative
|
||||
//$xmlrpcfuncname = create_function('$m', $innercode);
|
||||
|
||||
if(!$allOK)
|
||||
{
|
||||
error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap php function '.$plainfuncname);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// @todo examine if $paramDocs matches $parsvariations and build array for
|
||||
/// usage as method signature, plus put together a nice string for docs
|
||||
|
||||
$ret = array('function' => $xmlrpcfuncname, 'signature' => $sigs, 'docstring' => $desc, 'signature_docs' => $psigs, 'source' => $code);
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a user-defined PHP class or php object, map its methods onto a list of
|
||||
* PHP 'wrapper' functions that can be exposed as xmlrpc methods from an xmlrpc_server
|
||||
* object and called from remote clients (as well as their corresponding signature info).
|
||||
*
|
||||
* @param mixed $classname the name of the class whose methods are to be exposed as xmlrpc methods, or an object instance of that class
|
||||
* @param array $extra_options see the docs for wrap_php_method for more options
|
||||
* string method_type 'static', 'nonstatic', 'all' and 'auto' (default); the latter will switch between static and non-static depending on wheter $classname is a class name or object instance
|
||||
* @return array or false on failure
|
||||
*
|
||||
* @todo get_class_methods will return both static and non-static methods.
|
||||
* we have to differentiate the action, depending on wheter we recived a class name or object
|
||||
*/
|
||||
function wrap_php_class($classname, $extra_options=array())
|
||||
{
|
||||
$methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : '';
|
||||
$methodtype = isset($extra_options['method_type']) ? $extra_options['method_type'] : 'auto';
|
||||
|
||||
if(version_compare(phpversion(), '5.0.3') == -1)
|
||||
{
|
||||
// up to php 5.0.3 some useful reflection methods were missing
|
||||
error_log('XML-RPC: cannot not wrap php functions unless running php version bigger than 5.0.3');
|
||||
return false;
|
||||
}
|
||||
|
||||
$result = array();
|
||||
$mlist = get_class_methods($classname);
|
||||
foreach($mlist as $mname)
|
||||
{
|
||||
if ($methodfilter == '' || preg_match($methodfilter, $mname))
|
||||
{
|
||||
// echo $mlist."\n";
|
||||
$func = new ReflectionMethod($classname, $mname);
|
||||
if(!$func->isPrivate() && !$func->isProtected() && !$func->isConstructor() && !$func->isDestructor() && !$func->isAbstract())
|
||||
{
|
||||
if(($func->isStatic && ($methodtype == 'all' || $methodtype == 'static' || ($methodtype == 'auto' && is_string($classname)))) ||
|
||||
(!$func->isStatic && ($methodtype == 'all' || $methodtype == 'nonstatic' || ($methodtype == 'auto' && is_object($classname)))))
|
||||
{
|
||||
$methodwrap = wrap_php_function(array($classname, $mname), '', $extra_options);
|
||||
if ( $methodwrap )
|
||||
{
|
||||
$result[$methodwrap['function']] = $methodwrap['function'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given an xmlrpc client and a method name, register a php wrapper function
|
||||
* that will call it and return results using native php types for both
|
||||
* params and results. The generated php function will return an xmlrpcresp
|
||||
* oject for failed xmlrpc calls
|
||||
*
|
||||
* Known limitations:
|
||||
* - server must support system.methodsignature for the wanted xmlrpc method
|
||||
* - for methods that expose many signatures, only one can be picked (we
|
||||
* could in priciple check if signatures differ only by number of params
|
||||
* and not by type, but it would be more complication than we can spare time)
|
||||
* - nested xmlrpc params: the caller of the generated php function has to
|
||||
* encode on its own the params passed to the php function if these are structs
|
||||
* or arrays whose (sub)members include values of type datetime or base64
|
||||
*
|
||||
* Notes: the connection properties of the given client will be copied
|
||||
* and reused for the connection used during the call to the generated
|
||||
* php function.
|
||||
* Calling the generated php function 'might' be slow: a new xmlrpc client
|
||||
* is created on every invocation and an xmlrpc-connection opened+closed.
|
||||
* An extra 'debug' param is appended to param list of xmlrpc method, useful
|
||||
* for debugging purposes.
|
||||
*
|
||||
* @param xmlrpc_client $client an xmlrpc client set up correctly to communicate with target server
|
||||
* @param string $methodname the xmlrpc method to be mapped to a php function
|
||||
* @param array $extra_options array of options that specify conversion details. valid ptions include
|
||||
* integer signum the index of the method signature to use in mapping (if method exposes many sigs)
|
||||
* integer timeout timeout (in secs) to be used when executing function/calling remote method
|
||||
* string protocol 'http' (default), 'http11' or 'https'
|
||||
* string new_function_name the name of php function to create. If unsepcified, lib will pick an appropriate name
|
||||
* string return_source if true return php code w. function definition instead fo function name
|
||||
* bool encode_php_objs let php objects be sent to server using the 'improved' xmlrpc notation, so server can deserialize them as php objects
|
||||
* bool decode_php_objs --- WARNING !!! possible security hazard. only use it with trusted servers ---
|
||||
* mixed return_on_fault a php value to be returned when the xmlrpc call fails/returns a fault response (by default the xmlrpcresp object is returned in this case). If a string is used, '%faultCode%' and '%faultString%' tokens will be substituted with actual error values
|
||||
* bool debug set it to 1 or 2 to see debug results of querying server for method synopsis
|
||||
* @return string the name of the generated php function (or false) - OR AN ARRAY...
|
||||
*/
|
||||
function wrap_xmlrpc_method($client, $methodname, $extra_options=0, $timeout=0, $protocol='', $newfuncname='')
|
||||
{
|
||||
// mind numbing: let caller use sane calling convention (as per javadoc, 3 params),
|
||||
// OR the 2.0 calling convention (no options) - we really love backward compat, don't we?
|
||||
if (!is_array($extra_options))
|
||||
{
|
||||
$signum = $extra_options;
|
||||
$extra_options = array();
|
||||
}
|
||||
else
|
||||
{
|
||||
$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
|
||||
$timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
|
||||
$protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : '';
|
||||
$newfuncname = isset($extra_options['new_function_name']) ? $extra_options['new_function_name'] : '';
|
||||
}
|
||||
//$encode_php_objects = in_array('encode_php_objects', $extra_options);
|
||||
//$verbatim_client_copy = in_array('simple_client_copy', $extra_options) ? 1 :
|
||||
// in_array('build_class_code', $extra_options) ? 2 : 0;
|
||||
|
||||
$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
|
||||
$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
|
||||
$simple_client_copy = isset($extra_options['simple_client_copy']) ? (int)($extra_options['simple_client_copy']) : 0;
|
||||
$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
|
||||
$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
|
||||
if (isset($extra_options['return_on_fault']))
|
||||
{
|
||||
$decode_fault = true;
|
||||
$fault_response = $extra_options['return_on_fault'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$decode_fault = false;
|
||||
$fault_response = '';
|
||||
}
|
||||
$debug = isset($extra_options['debug']) ? ($extra_options['debug']) : 0;
|
||||
|
||||
$msgclass = $prefix.'msg';
|
||||
$valclass = $prefix.'val';
|
||||
$decodefunc = 'php_'.$prefix.'_decode';
|
||||
|
||||
$msg = new $msgclass('system.methodSignature');
|
||||
$msg->addparam(new $valclass($methodname));
|
||||
$client->setDebug($debug);
|
||||
$response =& $client->send($msg, $timeout, $protocol);
|
||||
if($response->faultCode())
|
||||
{
|
||||
error_log('XML-RPC: could not retrieve method signature from remote server for method '.$methodname);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
$msig = $response->value();
|
||||
if ($client->return_type != 'phpvals')
|
||||
{
|
||||
$msig = $decodefunc($msig);
|
||||
}
|
||||
if(!is_array($msig) || count($msig) <= $signum)
|
||||
{
|
||||
error_log('XML-RPC: could not retrieve method signature nr.'.$signum.' from remote server for method '.$methodname);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// pick a suitable name for the new function, avoiding collisions
|
||||
if($newfuncname != '')
|
||||
{
|
||||
$xmlrpcfuncname = $newfuncname;
|
||||
}
|
||||
else
|
||||
{
|
||||
// take care to insure that methodname is translated to valid
|
||||
// php function name
|
||||
$xmlrpcfuncname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
|
||||
array('_', ''), $methodname);
|
||||
}
|
||||
while($buildit && function_exists($xmlrpcfuncname))
|
||||
{
|
||||
$xmlrpcfuncname .= 'x';
|
||||
}
|
||||
|
||||
$msig = $msig[$signum];
|
||||
$mdesc = '';
|
||||
// if in 'offline' mode, get method description too.
|
||||
// in online mode, favour speed of operation
|
||||
if(!$buildit)
|
||||
{
|
||||
$msg = new $msgclass('system.methodHelp');
|
||||
$msg->addparam(new $valclass($methodname));
|
||||
$response =& $client->send($msg, $timeout, $protocol);
|
||||
if (!$response->faultCode())
|
||||
{
|
||||
$mdesc = $response->value();
|
||||
if ($client->return_type != 'phpvals')
|
||||
{
|
||||
$mdesc = $mdesc->scalarval();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$results = build_remote_method_wrapper_code($client, $methodname,
|
||||
$xmlrpcfuncname, $msig, $mdesc, $timeout, $protocol, $simple_client_copy,
|
||||
$prefix, $decode_php_objects, $encode_php_objects, $decode_fault,
|
||||
$fault_response);
|
||||
|
||||
//print_r($code);
|
||||
if ($buildit)
|
||||
{
|
||||
$allOK = 0;
|
||||
eval($results['source'].'$allOK=1;');
|
||||
// alternative
|
||||
//$xmlrpcfuncname = create_function('$m', $innercode);
|
||||
if($allOK)
|
||||
{
|
||||
return $xmlrpcfuncname;
|
||||
}
|
||||
else
|
||||
{
|
||||
error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap remote method '.$methodname);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$results['function'] = $xmlrpcfuncname;
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Similar to wrap_xmlrpc_method, but will generate a php class that wraps
|
||||
* all xmlrpc methods exposed by the remote server as own methods.
|
||||
* For more details see wrap_xmlrpc_method.
|
||||
* @param xmlrpc_client $client the client obj all set to query the desired server
|
||||
* @param array $extra_options list of options for wrapped code
|
||||
* @return mixed false on error, the name of the created class if all ok or an array with code, class name and comments (if the appropriatevoption is set in extra_options)
|
||||
*/
|
||||
function wrap_xmlrpc_server($client, $extra_options=array())
|
||||
{
|
||||
$methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : '';
|
||||
//$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0;
|
||||
$timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0;
|
||||
$protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : '';
|
||||
$newclassname = isset($extra_options['new_class_name']) ? $extra_options['new_class_name'] : '';
|
||||
$encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false;
|
||||
$decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false;
|
||||
$verbatim_client_copy = isset($extra_options['simple_client_copy']) ? !($extra_options['simple_client_copy']) : true;
|
||||
$buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true;
|
||||
$prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc';
|
||||
|
||||
$msgclass = $prefix.'msg';
|
||||
//$valclass = $prefix.'val';
|
||||
$decodefunc = 'php_'.$prefix.'_decode';
|
||||
|
||||
$msg = new $msgclass('system.listMethods');
|
||||
$response =& $client->send($msg, $timeout, $protocol);
|
||||
if($response->faultCode())
|
||||
{
|
||||
error_log('XML-RPC: could not retrieve method list from remote server');
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
$mlist = $response->value();
|
||||
if ($client->return_type != 'phpvals')
|
||||
{
|
||||
$mlist = $decodefunc($mlist);
|
||||
}
|
||||
if(!is_array($mlist) || !count($mlist))
|
||||
{
|
||||
error_log('XML-RPC: could not retrieve meaningful method list from remote server');
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// pick a suitable name for the new function, avoiding collisions
|
||||
if($newclassname != '')
|
||||
{
|
||||
$xmlrpcclassname = $newclassname;
|
||||
}
|
||||
else
|
||||
{
|
||||
$xmlrpcclassname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
|
||||
array('_', ''), $client->server).'_client';
|
||||
}
|
||||
while($buildit && class_exists($xmlrpcclassname))
|
||||
{
|
||||
$xmlrpcclassname .= 'x';
|
||||
}
|
||||
|
||||
/// @todo add function setdebug() to new class, to enable/disable debugging
|
||||
$source = "class $xmlrpcclassname\n{\nvar \$client;\n\n";
|
||||
$source .= "function $xmlrpcclassname()\n{\n";
|
||||
$source .= build_client_wrapper_code($client, $verbatim_client_copy, $prefix);
|
||||
$source .= "\$this->client =& \$client;\n}\n\n";
|
||||
$opts = array('simple_client_copy' => 2, 'return_source' => true,
|
||||
'timeout' => $timeout, 'protocol' => $protocol,
|
||||
'encode_php_objs' => $encode_php_objects, 'prefix' => $prefix,
|
||||
'decode_php_objs' => $decode_php_objects
|
||||
);
|
||||
/// @todo build javadoc for class definition, too
|
||||
foreach($mlist as $mname)
|
||||
{
|
||||
if ($methodfilter == '' || preg_match($methodfilter, $mname))
|
||||
{
|
||||
$opts['new_function_name'] = preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'),
|
||||
array('_', ''), $mname);
|
||||
$methodwrap = wrap_xmlrpc_method($client, $mname, $opts);
|
||||
if ($methodwrap)
|
||||
{
|
||||
if (!$buildit)
|
||||
{
|
||||
$source .= $methodwrap['docstring'];
|
||||
}
|
||||
$source .= $methodwrap['source']."\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
error_log('XML-RPC: will not create class method to wrap remote method '.$mname);
|
||||
}
|
||||
}
|
||||
}
|
||||
$source .= "}\n";
|
||||
if ($buildit)
|
||||
{
|
||||
$allOK = 0;
|
||||
eval($source.'$allOK=1;');
|
||||
// alternative
|
||||
//$xmlrpcfuncname = create_function('$m', $innercode);
|
||||
if($allOK)
|
||||
{
|
||||
return $xmlrpcclassname;
|
||||
}
|
||||
else
|
||||
{
|
||||
error_log('XML-RPC: could not create class '.$xmlrpcclassname.' to wrap remote server '.$client->server);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return array('class' => $xmlrpcclassname, 'code' => $source, 'docstring' => '');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Given the necessary info, build php code that creates a new function to
|
||||
* invoke a remote xmlrpc method.
|
||||
* Take care that no full checking of input parameters is done to ensure that
|
||||
* valid php code is emitted.
|
||||
* Note: real spaghetti code follows...
|
||||
* @access private
|
||||
*/
|
||||
function build_remote_method_wrapper_code($client, $methodname, $xmlrpcfuncname,
|
||||
$msig, $mdesc='', $timeout=0, $protocol='', $client_copy_mode=0, $prefix='xmlrpc',
|
||||
$decode_php_objects=false, $encode_php_objects=false, $decode_fault=false,
|
||||
$fault_response='')
|
||||
{
|
||||
$code = "function $xmlrpcfuncname (";
|
||||
if ($client_copy_mode < 2)
|
||||
{
|
||||
// client copy mode 0 or 1 == partial / full client copy in emitted code
|
||||
$innercode = build_client_wrapper_code($client, $client_copy_mode, $prefix);
|
||||
$innercode .= "\$client->setDebug(\$debug);\n";
|
||||
$this_ = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
// client copy mode 2 == no client copy in emitted code
|
||||
$innercode = '';
|
||||
$this_ = 'this->';
|
||||
}
|
||||
$innercode .= "\$msg = new {$prefix}msg('$methodname');\n";
|
||||
|
||||
if ($mdesc != '')
|
||||
{
|
||||
// take care that PHP comment is not terminated unwillingly by method description
|
||||
$mdesc = "/**\n* ".str_replace('*/', '* /', $mdesc)."\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
$mdesc = "/**\nFunction $xmlrpcfuncname\n";
|
||||
}
|
||||
|
||||
// param parsing
|
||||
$plist = array();
|
||||
$pcount = count($msig);
|
||||
for($i = 1; $i < $pcount; $i++)
|
||||
{
|
||||
$plist[] = "\$p$i";
|
||||
$ptype = $msig[$i];
|
||||
if($ptype == 'i4' || $ptype == 'int' || $ptype == 'boolean' || $ptype == 'double' ||
|
||||
$ptype == 'string' || $ptype == 'dateTime.iso8601' || $ptype == 'base64' || $ptype == 'null')
|
||||
{
|
||||
// only build directly xmlrpcvals when type is known and scalar
|
||||
$innercode .= "\$p$i = new {$prefix}val(\$p$i, '$ptype');\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($encode_php_objects)
|
||||
{
|
||||
$innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i, array('encode_php_objs'));\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
$innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i);\n";
|
||||
}
|
||||
}
|
||||
$innercode .= "\$msg->addparam(\$p$i);\n";
|
||||
$mdesc .= '* @param '.xmlrpc_2_php_type($ptype)." \$p$i\n";
|
||||
}
|
||||
if ($client_copy_mode < 2)
|
||||
{
|
||||
$plist[] = '$debug=0';
|
||||
$mdesc .= "* @param int \$debug when 1 (or 2) will enable debugging of the underlying {$prefix} call (defaults to 0)\n";
|
||||
}
|
||||
$plist = implode(', ', $plist);
|
||||
$mdesc .= '* @return '.xmlrpc_2_php_type($msig[0])." (or an {$prefix}resp obj instance if call fails)\n*/\n";
|
||||
|
||||
$innercode .= "\$res =& \${$this_}client->send(\$msg, $timeout, '$protocol');\n";
|
||||
if ($decode_fault)
|
||||
{
|
||||
if (is_string($fault_response) && ((strpos($fault_response, '%faultCode%') !== false) || (strpos($fault_response, '%faultString%') !== false)))
|
||||
{
|
||||
$respcode = "str_replace(array('%faultCode%', '%faultString%'), array(\$res->faultCode(), \$res->faultString()), '".str_replace("'", "''", $fault_response)."')";
|
||||
}
|
||||
else
|
||||
{
|
||||
$respcode = var_export($fault_response, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$respcode = '$res';
|
||||
}
|
||||
if ($decode_php_objects)
|
||||
{
|
||||
$innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value(), array('decode_php_objs'));";
|
||||
}
|
||||
else
|
||||
{
|
||||
$innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value());";
|
||||
}
|
||||
|
||||
$code = $code . $plist. ") {\n" . $innercode . "\n}\n";
|
||||
|
||||
return array('source' => $code, 'docstring' => $mdesc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Given necessary info, generate php code that will rebuild a client object
|
||||
* Take care that no full checking of input parameters is done to ensure that
|
||||
* valid php code is emitted.
|
||||
* @access private
|
||||
*/
|
||||
function build_client_wrapper_code($client, $verbatim_client_copy, $prefix='xmlrpc')
|
||||
{
|
||||
$code = "\$client = new {$prefix}_client('".str_replace("'", "\'", $client->path).
|
||||
"', '" . str_replace("'", "\'", $client->server) . "', $client->port);\n";
|
||||
|
||||
// copy all client fields to the client that will be generated runtime
|
||||
// (this provides for future expansion or subclassing of client obj)
|
||||
if ($verbatim_client_copy)
|
||||
{
|
||||
foreach($client as $fld => $val)
|
||||
{
|
||||
if($fld != 'debug' && $fld != 'return_type')
|
||||
{
|
||||
$val = var_export($val, true);
|
||||
$code .= "\$client->$fld = $val;\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
// only make sure that client always returns the correct data type
|
||||
$code .= "\$client->return_type = '{$prefix}vals';\n";
|
||||
//$code .= "\$client->setDebug(\$debug);\n";
|
||||
return $code;
|
||||
}
|
||||
?>
|
1246
thirdparty/xmlrpc/xmlrpcs.php
vendored
@ -1,1246 +0,0 @@
|
||||
<?php
|
||||
// by Edd Dumbill (C) 1999-2002
|
||||
// <edd@usefulinc.com>
|
||||
// $Id: xmlrpcs.inc,v 1.71 2008/10/29 23:41:28 ggiunta Exp $
|
||||
|
||||
// Copyright (c) 1999,2000,2002 Edd Dumbill.
|
||||
// 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.
|
||||
//
|
||||
// * Neither the name of the "XML-RPC for PHP" nor the names of its
|
||||
// contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
//
|
||||
// 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
|
||||
// REGENTS 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.
|
||||
|
||||
// XML RPC Server class
|
||||
// requires: xmlrpc.inc
|
||||
|
||||
$GLOBALS['xmlrpcs_capabilities'] = array(
|
||||
// xmlrpc spec: always supported
|
||||
'xmlrpc' => new xmlrpcval(array(
|
||||
'specUrl' => new xmlrpcval('http://www.xmlrpc.com/spec', 'string'),
|
||||
'specVersion' => new xmlrpcval(1, 'int')
|
||||
), 'struct'),
|
||||
// if we support system.xxx functions, we always support multicall, too...
|
||||
// Note that, as of 2006/09/17, the following URL does not respond anymore
|
||||
'system.multicall' => new xmlrpcval(array(
|
||||
'specUrl' => new xmlrpcval('http://www.xmlrpc.com/discuss/msgReader$1208', 'string'),
|
||||
'specVersion' => new xmlrpcval(1, 'int')
|
||||
), 'struct'),
|
||||
// introspection: version 2! we support 'mixed', too
|
||||
'introspection' => new xmlrpcval(array(
|
||||
'specUrl' => new xmlrpcval('http://phpxmlrpc.sourceforge.net/doc-2/ch10.html', 'string'),
|
||||
'specVersion' => new xmlrpcval(2, 'int')
|
||||
), 'struct')
|
||||
);
|
||||
|
||||
/* Functions that implement system.XXX methods of xmlrpc servers */
|
||||
$_xmlrpcs_getCapabilities_sig=array(array($GLOBALS['xmlrpcStruct']));
|
||||
$_xmlrpcs_getCapabilities_doc='This method lists all the capabilites that the XML-RPC server has: the (more or less standard) extensions to the xmlrpc spec that it adheres to';
|
||||
$_xmlrpcs_getCapabilities_sdoc=array(array('list of capabilities, described as structs with a version number and url for the spec'));
|
||||
function _xmlrpcs_getCapabilities($server, $m=null)
|
||||
{
|
||||
$outAr = $GLOBALS['xmlrpcs_capabilities'];
|
||||
// NIL extension
|
||||
if ($GLOBALS['xmlrpc_null_extension']) {
|
||||
$outAr['nil'] = new xmlrpcval(array(
|
||||
'specUrl' => new xmlrpcval('http://www.ontosys.com/xml-rpc/extensions.php', 'string'),
|
||||
'specVersion' => new xmlrpcval(1, 'int')
|
||||
), 'struct');
|
||||
}
|
||||
return new xmlrpcresp(new xmlrpcval($outAr, 'struct'));
|
||||
}
|
||||
|
||||
// listMethods: signature was either a string, or nothing.
|
||||
// The useless string variant has been removed
|
||||
$_xmlrpcs_listMethods_sig=array(array($GLOBALS['xmlrpcArray']));
|
||||
$_xmlrpcs_listMethods_doc='This method lists all the methods that the XML-RPC server knows how to dispatch';
|
||||
$_xmlrpcs_listMethods_sdoc=array(array('list of method names'));
|
||||
function _xmlrpcs_listMethods($server, $m=null) // if called in plain php values mode, second param is missing
|
||||
{
|
||||
|
||||
$outAr=array();
|
||||
foreach($server->dmap as $key => $val)
|
||||
{
|
||||
$outAr[]=new xmlrpcval($key, 'string');
|
||||
}
|
||||
if($server->allow_system_funcs)
|
||||
{
|
||||
foreach($GLOBALS['_xmlrpcs_dmap'] as $key => $val)
|
||||
{
|
||||
$outAr[]=new xmlrpcval($key, 'string');
|
||||
}
|
||||
}
|
||||
return new xmlrpcresp(new xmlrpcval($outAr, 'array'));
|
||||
}
|
||||
|
||||
$_xmlrpcs_methodSignature_sig=array(array($GLOBALS['xmlrpcArray'], $GLOBALS['xmlrpcString']));
|
||||
$_xmlrpcs_methodSignature_doc='Returns an array of known signatures (an array of arrays) for the method name passed. If no signatures are known, returns a none-array (test for type != array to detect missing signature)';
|
||||
$_xmlrpcs_methodSignature_sdoc=array(array('list of known signatures, each sig being an array of xmlrpc type names', 'name of method to be described'));
|
||||
function _xmlrpcs_methodSignature($server, $m)
|
||||
{
|
||||
// let accept as parameter both an xmlrpcval or string
|
||||
if (is_object($m))
|
||||
{
|
||||
$methName=$m->getParam(0);
|
||||
$methName=$methName->scalarval();
|
||||
}
|
||||
else
|
||||
{
|
||||
$methName=$m;
|
||||
}
|
||||
if(strpos($methName, "system.") === 0)
|
||||
{
|
||||
$dmap=$GLOBALS['_xmlrpcs_dmap']; $sysCall=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
$dmap=$server->dmap; $sysCall=0;
|
||||
}
|
||||
if(isset($dmap[$methName]))
|
||||
{
|
||||
if(isset($dmap[$methName]['signature']))
|
||||
{
|
||||
$sigs=array();
|
||||
foreach($dmap[$methName]['signature'] as $inSig)
|
||||
{
|
||||
$cursig=array();
|
||||
foreach($inSig as $sig)
|
||||
{
|
||||
$cursig[]=new xmlrpcval($sig, 'string');
|
||||
}
|
||||
$sigs[]=new xmlrpcval($cursig, 'array');
|
||||
}
|
||||
$r=new xmlrpcresp(new xmlrpcval($sigs, 'array'));
|
||||
}
|
||||
else
|
||||
{
|
||||
// NB: according to the official docs, we should be returning a
|
||||
// "none-array" here, which means not-an-array
|
||||
$r=new xmlrpcresp(new xmlrpcval('undef', 'string'));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$r=new xmlrpcresp(0,$GLOBALS['xmlrpcerr']['introspect_unknown'], $GLOBALS['xmlrpcstr']['introspect_unknown']);
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
$_xmlrpcs_methodHelp_sig=array(array($GLOBALS['xmlrpcString'], $GLOBALS['xmlrpcString']));
|
||||
$_xmlrpcs_methodHelp_doc='Returns help text if defined for the method passed, otherwise returns an empty string';
|
||||
$_xmlrpcs_methodHelp_sdoc=array(array('method description', 'name of the method to be described'));
|
||||
function _xmlrpcs_methodHelp($server, $m)
|
||||
{
|
||||
// let accept as parameter both an xmlrpcval or string
|
||||
if (is_object($m))
|
||||
{
|
||||
$methName=$m->getParam(0);
|
||||
$methName=$methName->scalarval();
|
||||
}
|
||||
else
|
||||
{
|
||||
$methName=$m;
|
||||
}
|
||||
if(strpos($methName, "system.") === 0)
|
||||
{
|
||||
$dmap=$GLOBALS['_xmlrpcs_dmap']; $sysCall=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
$dmap=$server->dmap; $sysCall=0;
|
||||
}
|
||||
if(isset($dmap[$methName]))
|
||||
{
|
||||
if(isset($dmap[$methName]['docstring']))
|
||||
{
|
||||
$r=new xmlrpcresp(new xmlrpcval($dmap[$methName]['docstring']), 'string');
|
||||
}
|
||||
else
|
||||
{
|
||||
$r=new xmlrpcresp(new xmlrpcval('', 'string'));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['introspect_unknown'], $GLOBALS['xmlrpcstr']['introspect_unknown']);
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
$_xmlrpcs_multicall_sig = array(array($GLOBALS['xmlrpcArray'], $GLOBALS['xmlrpcArray']));
|
||||
$_xmlrpcs_multicall_doc = 'Boxcar multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 for details';
|
||||
$_xmlrpcs_multicall_sdoc = array(array('list of response structs, where each struct has the usual members', 'list of calls, with each call being represented as a struct, with members "methodname" and "params"'));
|
||||
function _xmlrpcs_multicall_error($err)
|
||||
{
|
||||
if(is_string($err))
|
||||
{
|
||||
$str = $GLOBALS['xmlrpcstr']["multicall_${err}"];
|
||||
$code = $GLOBALS['xmlrpcerr']["multicall_${err}"];
|
||||
}
|
||||
else
|
||||
{
|
||||
$code = $err->faultCode();
|
||||
$str = $err->faultString();
|
||||
}
|
||||
$struct = array();
|
||||
$struct['faultCode'] = new xmlrpcval($code, 'int');
|
||||
$struct['faultString'] = new xmlrpcval($str, 'string');
|
||||
return new xmlrpcval($struct, 'struct');
|
||||
}
|
||||
|
||||
function _xmlrpcs_multicall_do_call($server, $call)
|
||||
{
|
||||
if($call->kindOf() != 'struct')
|
||||
{
|
||||
return _xmlrpcs_multicall_error('notstruct');
|
||||
}
|
||||
$methName = @$call->structmem('methodName');
|
||||
if(!$methName)
|
||||
{
|
||||
return _xmlrpcs_multicall_error('nomethod');
|
||||
}
|
||||
if($methName->kindOf() != 'scalar' || $methName->scalartyp() != 'string')
|
||||
{
|
||||
return _xmlrpcs_multicall_error('notstring');
|
||||
}
|
||||
if($methName->scalarval() == 'system.multicall')
|
||||
{
|
||||
return _xmlrpcs_multicall_error('recursion');
|
||||
}
|
||||
|
||||
$params = @$call->structmem('params');
|
||||
if(!$params)
|
||||
{
|
||||
return _xmlrpcs_multicall_error('noparams');
|
||||
}
|
||||
if($params->kindOf() != 'array')
|
||||
{
|
||||
return _xmlrpcs_multicall_error('notarray');
|
||||
}
|
||||
$numParams = $params->arraysize();
|
||||
|
||||
$msg = new xmlrpcmsg($methName->scalarval());
|
||||
for($i = 0; $i < $numParams; $i++)
|
||||
{
|
||||
if(!$msg->addParam($params->arraymem($i)))
|
||||
{
|
||||
$i++;
|
||||
return _xmlrpcs_multicall_error(new xmlrpcresp(0,
|
||||
$GLOBALS['xmlrpcerr']['incorrect_params'],
|
||||
$GLOBALS['xmlrpcstr']['incorrect_params'] . ": probable xml error in param " . $i));
|
||||
}
|
||||
}
|
||||
|
||||
$result = $server->execute($msg);
|
||||
|
||||
if($result->faultCode() != 0)
|
||||
{
|
||||
return _xmlrpcs_multicall_error($result); // Method returned fault.
|
||||
}
|
||||
|
||||
return new xmlrpcval(array($result->value()), 'array');
|
||||
}
|
||||
|
||||
function _xmlrpcs_multicall_do_call_phpvals($server, $call)
|
||||
{
|
||||
if(!is_array($call))
|
||||
{
|
||||
return _xmlrpcs_multicall_error('notstruct');
|
||||
}
|
||||
if(!array_key_exists('methodName', $call))
|
||||
{
|
||||
return _xmlrpcs_multicall_error('nomethod');
|
||||
}
|
||||
if (!is_string($call['methodName']))
|
||||
{
|
||||
return _xmlrpcs_multicall_error('notstring');
|
||||
}
|
||||
if($call['methodName'] == 'system.multicall')
|
||||
{
|
||||
return _xmlrpcs_multicall_error('recursion');
|
||||
}
|
||||
if(!array_key_exists('params', $call))
|
||||
{
|
||||
return _xmlrpcs_multicall_error('noparams');
|
||||
}
|
||||
if(!is_array($call['params']))
|
||||
{
|
||||
return _xmlrpcs_multicall_error('notarray');
|
||||
}
|
||||
|
||||
// this is a real dirty and simplistic hack, since we might have received a
|
||||
// base64 or datetime values, but they will be listed as strings here...
|
||||
$numParams = count($call['params']);
|
||||
$pt = array();
|
||||
foreach($call['params'] as $val)
|
||||
$pt[] = php_2_xmlrpc_type(gettype($val));
|
||||
|
||||
$result = $server->execute($call['methodName'], $call['params'], $pt);
|
||||
|
||||
if($result->faultCode() != 0)
|
||||
{
|
||||
return _xmlrpcs_multicall_error($result); // Method returned fault.
|
||||
}
|
||||
|
||||
return new xmlrpcval(array($result->value()), 'array');
|
||||
}
|
||||
|
||||
function _xmlrpcs_multicall($server, $m)
|
||||
{
|
||||
$result = array();
|
||||
// let accept a plain list of php parameters, beside a single xmlrpc msg object
|
||||
if (is_object($m))
|
||||
{
|
||||
$calls = $m->getParam(0);
|
||||
$numCalls = $calls->arraysize();
|
||||
for($i = 0; $i < $numCalls; $i++)
|
||||
{
|
||||
$call = $calls->arraymem($i);
|
||||
$result[$i] = _xmlrpcs_multicall_do_call($server, $call);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$numCalls=count($m);
|
||||
for($i = 0; $i < $numCalls; $i++)
|
||||
{
|
||||
$result[$i] = _xmlrpcs_multicall_do_call_phpvals($server, $m[$i]);
|
||||
}
|
||||
}
|
||||
|
||||
return new xmlrpcresp(new xmlrpcval($result, 'array'));
|
||||
}
|
||||
|
||||
$GLOBALS['_xmlrpcs_dmap']=array(
|
||||
'system.listMethods' => array(
|
||||
'function' => '_xmlrpcs_listMethods',
|
||||
'signature' => $_xmlrpcs_listMethods_sig,
|
||||
'docstring' => $_xmlrpcs_listMethods_doc,
|
||||
'signature_docs' => $_xmlrpcs_listMethods_sdoc),
|
||||
'system.methodHelp' => array(
|
||||
'function' => '_xmlrpcs_methodHelp',
|
||||
'signature' => $_xmlrpcs_methodHelp_sig,
|
||||
'docstring' => $_xmlrpcs_methodHelp_doc,
|
||||
'signature_docs' => $_xmlrpcs_methodHelp_sdoc),
|
||||
'system.methodSignature' => array(
|
||||
'function' => '_xmlrpcs_methodSignature',
|
||||
'signature' => $_xmlrpcs_methodSignature_sig,
|
||||
'docstring' => $_xmlrpcs_methodSignature_doc,
|
||||
'signature_docs' => $_xmlrpcs_methodSignature_sdoc),
|
||||
'system.multicall' => array(
|
||||
'function' => '_xmlrpcs_multicall',
|
||||
'signature' => $_xmlrpcs_multicall_sig,
|
||||
'docstring' => $_xmlrpcs_multicall_doc,
|
||||
'signature_docs' => $_xmlrpcs_multicall_sdoc),
|
||||
'system.getCapabilities' => array(
|
||||
'function' => '_xmlrpcs_getCapabilities',
|
||||
'signature' => $_xmlrpcs_getCapabilities_sig,
|
||||
'docstring' => $_xmlrpcs_getCapabilities_doc,
|
||||
'signature_docs' => $_xmlrpcs_getCapabilities_sdoc)
|
||||
);
|
||||
|
||||
$GLOBALS['_xmlrpcs_occurred_errors'] = '';
|
||||
$GLOBALS['_xmlrpcs_prev_ehandler'] = '';
|
||||
|
||||
/**
|
||||
* Error handler used to track errors that occur during server-side execution of PHP code.
|
||||
* This allows to report back to the client whether an internal error has occurred or not
|
||||
* using an xmlrpc response object, instead of letting the client deal with the html junk
|
||||
* that a PHP execution error on the server generally entails.
|
||||
*
|
||||
* NB: in fact a user defined error handler can only handle WARNING, NOTICE and USER_* errors.
|
||||
*
|
||||
*/
|
||||
function _xmlrpcs_errorHandler($errcode, $errstring, $filename=null, $lineno=null, $context=null)
|
||||
{
|
||||
// obey the @ protocol
|
||||
if (error_reporting() == 0)
|
||||
return;
|
||||
|
||||
//if($errcode != E_NOTICE && $errcode != E_WARNING && $errcode != E_USER_NOTICE && $errcode != E_USER_WARNING)
|
||||
if($errcode != E_STRICT)
|
||||
{
|
||||
$GLOBALS['_xmlrpcs_occurred_errors'] = $GLOBALS['_xmlrpcs_occurred_errors'] . $errstring . "\n";
|
||||
}
|
||||
// Try to avoid as much as possible disruption to the previous error handling
|
||||
// mechanism in place
|
||||
if($GLOBALS['_xmlrpcs_prev_ehandler'] == '')
|
||||
{
|
||||
// The previous error handler was the default: all we should do is log error
|
||||
// to the default error log (if level high enough)
|
||||
if(ini_get('log_errors') && (intval(ini_get('error_reporting')) & $errcode))
|
||||
{
|
||||
error_log($errstring);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Pass control on to previous error handler, trying to avoid loops...
|
||||
if($GLOBALS['_xmlrpcs_prev_ehandler'] != '_xmlrpcs_errorHandler')
|
||||
{
|
||||
// NB: this code will NOT work on php < 4.0.2: only 2 params were used for error handlers
|
||||
if(is_array($GLOBALS['_xmlrpcs_prev_ehandler']))
|
||||
{
|
||||
// the following works both with static class methods and plain object methods as error handler
|
||||
call_user_func_array($GLOBALS['_xmlrpcs_prev_ehandler'], array($errcode, $errstring, $filename, $lineno, $context));
|
||||
}
|
||||
else
|
||||
{
|
||||
$GLOBALS['_xmlrpcs_prev_ehandler']($errcode, $errstring, $filename, $lineno, $context);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$GLOBALS['_xmlrpc_debuginfo']='';
|
||||
|
||||
/**
|
||||
* Add a string to the debug info that can be later seralized by the server
|
||||
* as part of the response message.
|
||||
* Note that for best compatbility, the debug string should be encoded using
|
||||
* the $GLOBALS['xmlrpc_internalencoding'] character set.
|
||||
* @param string $m
|
||||
* @access public
|
||||
*/
|
||||
function xmlrpc_debugmsg($m)
|
||||
{
|
||||
$GLOBALS['_xmlrpc_debuginfo'] .= $m . "\n";
|
||||
}
|
||||
|
||||
class xmlrpc_server
|
||||
{
|
||||
/**
|
||||
* Array defining php functions exposed as xmlrpc methods by this server
|
||||
* @access private
|
||||
*/
|
||||
var $dmap=array();
|
||||
/**
|
||||
* Defines how functions in dmap will be invoked: either using an xmlrpc msg object
|
||||
* or plain php values.
|
||||
* valid strings are 'xmlrpcvals', 'phpvals' or 'epivals'
|
||||
*/
|
||||
var $functions_parameters_type='xmlrpcvals';
|
||||
/**
|
||||
* Option used for fine-tuning the encoding the php values returned from
|
||||
* functions registered in the dispatch map when the functions_parameters_types
|
||||
* member is set to 'phpvals'
|
||||
* @see php_xmlrpc_encode for a list of values
|
||||
*/
|
||||
var $phpvals_encoding_options = array( 'auto_dates' );
|
||||
/// controls wether the server is going to echo debugging messages back to the client as comments in response body. valid values: 0,1,2,3
|
||||
var $debug = 1;
|
||||
/**
|
||||
* Controls behaviour of server when invoked user function throws an exception:
|
||||
* 0 = catch it and return an 'internal error' xmlrpc response (default)
|
||||
* 1 = catch it and return an xmlrpc response with the error corresponding to the exception
|
||||
* 2 = allow the exception to float to the upper layers
|
||||
*/
|
||||
var $exception_handling = 0;
|
||||
/**
|
||||
* When set to true, it will enable HTTP compression of the response, in case
|
||||
* the client has declared its support for compression in the request.
|
||||
*/
|
||||
var $compress_response = false;
|
||||
/**
|
||||
* List of http compression methods accepted by the server for requests.
|
||||
* NB: PHP supports deflate, gzip compressions out of the box if compiled w. zlib
|
||||
*/
|
||||
var $accepted_compression = array();
|
||||
/// shall we serve calls to system.* methods?
|
||||
var $allow_system_funcs = true;
|
||||
/// list of charset encodings natively accepted for requests
|
||||
var $accepted_charset_encodings = array();
|
||||
/**
|
||||
* charset encoding to be used for response.
|
||||
* NB: if we can, we will convert the generated response from internal_encoding to the intended one.
|
||||
* can be: a supported xml encoding (only UTF-8 and ISO-8859-1 at present, unless mbstring is enabled),
|
||||
* null (leave unspecified in response, convert output stream to US_ASCII),
|
||||
* 'default' (use xmlrpc library default as specified in xmlrpc.inc, convert output stream if needed),
|
||||
* or 'auto' (use client-specified charset encoding or same as request if request headers do not specify it (unless request is US-ASCII: then use library default anyway).
|
||||
* NB: pretty dangerous if you accept every charset and do not have mbstring enabled)
|
||||
*/
|
||||
var $response_charset_encoding = '';
|
||||
/**
|
||||
* Storage for internal debug info
|
||||
* @access private
|
||||
*/
|
||||
var $debug_info = '';
|
||||
/**
|
||||
* Extra data passed at runtime to method handling functions. Used only by EPI layer
|
||||
*/
|
||||
var $user_data = null;
|
||||
|
||||
/**
|
||||
* @param array $dispmap the dispatch map withd efinition of exposed services
|
||||
* @param boolean $servicenow set to false to prevent the server from runnung upon construction
|
||||
*/
|
||||
function xmlrpc_server($dispMap=null, $serviceNow=true)
|
||||
{
|
||||
// if ZLIB is enabled, let the server by default accept compressed requests,
|
||||
// and compress responses sent to clients that support them
|
||||
if(function_exists('gzinflate'))
|
||||
{
|
||||
$this->accepted_compression = array('gzip', 'deflate');
|
||||
$this->compress_response = true;
|
||||
}
|
||||
|
||||
// by default the xml parser can support these 3 charset encodings
|
||||
$this->accepted_charset_encodings = array('UTF-8', 'ISO-8859-1', 'US-ASCII');
|
||||
|
||||
// dispMap is a dispatch array of methods
|
||||
// mapped to function names and signatures
|
||||
// if a method
|
||||
// doesn't appear in the map then an unknown
|
||||
// method error is generated
|
||||
/* milosch - changed to make passing dispMap optional.
|
||||
* instead, you can use the class add_to_map() function
|
||||
* to add functions manually (borrowed from SOAPX4)
|
||||
*/
|
||||
if($dispMap)
|
||||
{
|
||||
$this->dmap = $dispMap;
|
||||
if($serviceNow)
|
||||
{
|
||||
$this->service();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set debug level of server.
|
||||
* @param integer $in debug lvl: determines info added to xmlrpc responses (as xml comments)
|
||||
* 0 = no debug info,
|
||||
* 1 = msgs set from user with debugmsg(),
|
||||
* 2 = add complete xmlrpc request (headers and body),
|
||||
* 3 = add also all processing warnings happened during method processing
|
||||
* (NB: this involves setting a custom error handler, and might interfere
|
||||
* with the standard processing of the php function exposed as method. In
|
||||
* particular, triggering an USER_ERROR level error will not halt script
|
||||
* execution anymore, but just end up logged in the xmlrpc response)
|
||||
* Note that info added at elevel 2 and 3 will be base64 encoded
|
||||
* @access public
|
||||
*/
|
||||
function setDebug($in)
|
||||
{
|
||||
$this->debug=$in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a string with the serialized representation of all debug info
|
||||
* @param string $charset_encoding the target charset encoding for the serialization
|
||||
* @return string an XML comment (or two)
|
||||
*/
|
||||
function serializeDebug($charset_encoding='')
|
||||
{
|
||||
// Tough encoding problem: which internal charset should we assume for debug info?
|
||||
// It might contain a copy of raw data received from client, ie with unknown encoding,
|
||||
// intermixed with php generated data and user generated data...
|
||||
// so we split it: system debug is base 64 encoded,
|
||||
// user debug info should be encoded by the end user using the INTERNAL_ENCODING
|
||||
$out = '';
|
||||
if ($this->debug_info != '')
|
||||
{
|
||||
$out .= "<!-- SERVER DEBUG INFO (BASE64 ENCODED):\n".base64_encode($this->debug_info)."\n-->\n";
|
||||
}
|
||||
if($GLOBALS['_xmlrpc_debuginfo']!='')
|
||||
{
|
||||
|
||||
$out .= "<!-- DEBUG INFO:\n" . xmlrpc_encode_entitites(str_replace('--', '_-', $GLOBALS['_xmlrpc_debuginfo']), $GLOBALS['xmlrpc_internalencoding'], $charset_encoding) . "\n-->\n";
|
||||
// NB: a better solution MIGHT be to use CDATA, but we need to insert it
|
||||
// into return payload AFTER the beginning tag
|
||||
//$out .= "<![CDATA[ DEBUG INFO:\n\n" . str_replace(']]>', ']_]_>', $GLOBALS['_xmlrpc_debuginfo']) . "\n]]>\n";
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the xmlrpc request, printing the response
|
||||
* @param string $data the request body. If null, the http POST request will be examined
|
||||
* @return xmlrpcresp the response object (usually not used by caller...)
|
||||
* @access public
|
||||
*/
|
||||
function service($data=null, $return_payload=false)
|
||||
{
|
||||
if ($data === null)
|
||||
{
|
||||
// workaround for a known bug in php ver. 5.2.2 that broke $HTTP_RAW_POST_DATA
|
||||
$ver = phpversion();
|
||||
if ($ver[0] >= 5)
|
||||
{
|
||||
$data = file_get_contents('php://input');
|
||||
}
|
||||
else
|
||||
{
|
||||
$data = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
|
||||
}
|
||||
}
|
||||
$raw_data = $data;
|
||||
|
||||
// reset internal debug info
|
||||
$this->debug_info = '';
|
||||
|
||||
// Echo back what we received, before parsing it
|
||||
if($this->debug > 1)
|
||||
{
|
||||
$this->debugmsg("+++GOT+++\n" . $data . "\n+++END+++");
|
||||
}
|
||||
|
||||
$r = $this->parseRequestHeaders($data, $req_charset, $resp_charset, $resp_encoding);
|
||||
if (!$r)
|
||||
{
|
||||
$r=$this->parseRequest($data, $req_charset);
|
||||
}
|
||||
|
||||
// save full body of request into response, for more debugging usages
|
||||
$r->raw_data = $raw_data;
|
||||
|
||||
if($this->debug > 2 && $GLOBALS['_xmlrpcs_occurred_errors'])
|
||||
{
|
||||
$this->debugmsg("+++PROCESSING ERRORS AND WARNINGS+++\n" .
|
||||
$GLOBALS['_xmlrpcs_occurred_errors'] . "+++END+++");
|
||||
}
|
||||
|
||||
$payload=$this->xml_header($resp_charset);
|
||||
if($this->debug > 0)
|
||||
{
|
||||
$payload = $payload . $this->serializeDebug($resp_charset);
|
||||
}
|
||||
|
||||
// G. Giunta 2006-01-27: do not create response serialization if it has
|
||||
// already happened. Helps building json magic
|
||||
if (empty($r->payload))
|
||||
{
|
||||
$r->serialize($resp_charset);
|
||||
}
|
||||
$payload = $payload . $r->payload;
|
||||
|
||||
if ($return_payload)
|
||||
{
|
||||
return $payload;
|
||||
}
|
||||
|
||||
// if we get a warning/error that has output some text before here, then we cannot
|
||||
// add a new header. We cannot say we are sending xml, either...
|
||||
if(!headers_sent())
|
||||
{
|
||||
header('Content-Type: '.$r->content_type);
|
||||
// we do not know if client actually told us an accepted charset, but if he did
|
||||
// we have to tell him what we did
|
||||
header("Vary: Accept-Charset");
|
||||
|
||||
// http compression of output: only
|
||||
// if we can do it, and we want to do it, and client asked us to,
|
||||
// and php ini settings do not force it already
|
||||
$php_no_self_compress = !ini_get('zlib.output_compression') && (ini_get('output_handler') != 'ob_gzhandler');
|
||||
if($this->compress_response && function_exists('gzencode') && $resp_encoding != ''
|
||||
&& $php_no_self_compress)
|
||||
{
|
||||
if(strpos($resp_encoding, 'gzip') !== false)
|
||||
{
|
||||
$payload = gzencode($payload);
|
||||
header("Content-Encoding: gzip");
|
||||
header("Vary: Accept-Encoding");
|
||||
}
|
||||
elseif (strpos($resp_encoding, 'deflate') !== false)
|
||||
{
|
||||
$payload = gzcompress($payload);
|
||||
header("Content-Encoding: deflate");
|
||||
header("Vary: Accept-Encoding");
|
||||
}
|
||||
}
|
||||
|
||||
// do not ouput content-length header if php is compressing output for us:
|
||||
// it will mess up measurements
|
||||
if($php_no_self_compress)
|
||||
{
|
||||
header('Content-Length: ' . (int)strlen($payload));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': http headers already sent before response is fully generated. Check for php warning or error messages');
|
||||
}
|
||||
|
||||
print $payload;
|
||||
|
||||
// return request, in case subclasses want it
|
||||
return $r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a method to the dispatch map
|
||||
* @param string $methodname the name with which the method will be made available
|
||||
* @param string $function the php function that will get invoked
|
||||
* @param array $sig the array of valid method signatures
|
||||
* @param string $doc method documentation
|
||||
* @param array $sigdoc the array of valid method signatures docs (one string per param, one for return type)
|
||||
* @access public
|
||||
*/
|
||||
function add_to_map($methodname,$function,$sig=null,$doc=false,$sigdoc=false)
|
||||
{
|
||||
$this->dmap[$methodname] = array(
|
||||
'function' => $function,
|
||||
'docstring' => $doc
|
||||
);
|
||||
if ($sig)
|
||||
{
|
||||
$this->dmap[$methodname]['signature'] = $sig;
|
||||
}
|
||||
if ($sigdoc)
|
||||
{
|
||||
$this->dmap[$methodname]['signature_docs'] = $sigdoc;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify type and number of parameters received against a list of known signatures
|
||||
* @param array $in array of either xmlrpcval objects or xmlrpc type definitions
|
||||
* @param array $sig array of known signatures to match against
|
||||
* @access private
|
||||
*/
|
||||
function verifySignature($in, $sig)
|
||||
{
|
||||
// check each possible signature in turn
|
||||
if (is_object($in))
|
||||
{
|
||||
$numParams = $in->getNumParams();
|
||||
}
|
||||
else
|
||||
{
|
||||
$numParams = count($in);
|
||||
}
|
||||
foreach($sig as $cursig)
|
||||
{
|
||||
if(count($cursig)==$numParams+1)
|
||||
{
|
||||
$itsOK=1;
|
||||
for($n=0; $n<$numParams; $n++)
|
||||
{
|
||||
if (is_object($in))
|
||||
{
|
||||
$p=$in->getParam($n);
|
||||
if($p->kindOf() == 'scalar')
|
||||
{
|
||||
$pt=$p->scalartyp();
|
||||
}
|
||||
else
|
||||
{
|
||||
$pt=$p->kindOf();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$pt= $in[$n] == 'i4' ? 'int' : strtolower($in[$n]); // dispatch maps never use i4...
|
||||
}
|
||||
|
||||
// param index is $n+1, as first member of sig is return type
|
||||
if($pt != $cursig[$n+1] && $cursig[$n+1] != $GLOBALS['xmlrpcValue'])
|
||||
{
|
||||
$itsOK=0;
|
||||
$pno=$n+1;
|
||||
$wanted=$cursig[$n+1];
|
||||
$got=$pt;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if($itsOK)
|
||||
{
|
||||
return array(1,'');
|
||||
}
|
||||
}
|
||||
}
|
||||
if(isset($wanted))
|
||||
{
|
||||
return array(0, "Wanted ${wanted}, got ${got} at param ${pno}");
|
||||
}
|
||||
else
|
||||
{
|
||||
return array(0, "No method signature matches number of parameters");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse http headers received along with xmlrpc request. If needed, inflate request
|
||||
* @return null on success or an xmlrpcresp
|
||||
* @access private
|
||||
*/
|
||||
function parseRequestHeaders(&$data, &$req_encoding, &$resp_encoding, &$resp_compression)
|
||||
{
|
||||
// check if $_SERVER is populated: it might have been disabled via ini file
|
||||
// (this is true even when in CLI mode)
|
||||
if (count($_SERVER) == 0)
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': cannot parse request headers as $_SERVER is not populated');
|
||||
}
|
||||
|
||||
if($this->debug > 1)
|
||||
{
|
||||
if(function_exists('getallheaders'))
|
||||
{
|
||||
$this->debugmsg(''); // empty line
|
||||
foreach(getallheaders() as $name => $val)
|
||||
{
|
||||
$this->debugmsg("HEADER: $name: $val");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(isset($_SERVER['HTTP_CONTENT_ENCODING']))
|
||||
{
|
||||
$content_encoding = str_replace('x-', '', $_SERVER['HTTP_CONTENT_ENCODING']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$content_encoding = '';
|
||||
}
|
||||
|
||||
// check if request body has been compressed and decompress it
|
||||
if($content_encoding != '' && strlen($data))
|
||||
{
|
||||
if($content_encoding == 'deflate' || $content_encoding == 'gzip')
|
||||
{
|
||||
// if decoding works, use it. else assume data wasn't gzencoded
|
||||
if(function_exists('gzinflate') && in_array($content_encoding, $this->accepted_compression))
|
||||
{
|
||||
if($content_encoding == 'deflate' && $degzdata = @gzuncompress($data))
|
||||
{
|
||||
$data = $degzdata;
|
||||
if($this->debug > 1)
|
||||
{
|
||||
$this->debugmsg("\n+++INFLATED REQUEST+++[".strlen($data)." chars]+++\n" . $data . "\n+++END+++");
|
||||
}
|
||||
}
|
||||
elseif($content_encoding == 'gzip' && $degzdata = @gzinflate(substr($data, 10)))
|
||||
{
|
||||
$data = $degzdata;
|
||||
if($this->debug > 1)
|
||||
$this->debugmsg("+++INFLATED REQUEST+++[".strlen($data)." chars]+++\n" . $data . "\n+++END+++");
|
||||
}
|
||||
else
|
||||
{
|
||||
$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['server_decompress_fail'], $GLOBALS['xmlrpcstr']['server_decompress_fail']);
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//error_log('The server sent deflated data. Your php install must have the Zlib extension compiled in to support this.');
|
||||
$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['server_cannot_decompress'], $GLOBALS['xmlrpcstr']['server_cannot_decompress']);
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check if client specified accepted charsets, and if we know how to fulfill
|
||||
// the request
|
||||
if ($this->response_charset_encoding == 'auto')
|
||||
{
|
||||
$resp_encoding = '';
|
||||
if (isset($_SERVER['HTTP_ACCEPT_CHARSET']))
|
||||
{
|
||||
// here we should check if we can match the client-requested encoding
|
||||
// with the encodings we know we can generate.
|
||||
/// @todo we should parse q=0.x preferences instead of getting first charset specified...
|
||||
$client_accepted_charsets = explode(',', strtoupper($_SERVER['HTTP_ACCEPT_CHARSET']));
|
||||
// Give preference to internal encoding
|
||||
$known_charsets = array($GLOBALS['xmlrpc_internalencoding'], 'UTF-8', 'ISO-8859-1', 'US-ASCII');
|
||||
foreach ($known_charsets as $charset)
|
||||
{
|
||||
foreach ($client_accepted_charsets as $accepted)
|
||||
if (strpos($accepted, $charset) === 0)
|
||||
{
|
||||
$resp_encoding = $charset;
|
||||
break;
|
||||
}
|
||||
if ($resp_encoding)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$resp_encoding = $this->response_charset_encoding;
|
||||
}
|
||||
|
||||
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']))
|
||||
{
|
||||
$resp_compression = $_SERVER['HTTP_ACCEPT_ENCODING'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$resp_compression = '';
|
||||
}
|
||||
|
||||
// 'guestimate' request encoding
|
||||
/// @todo check if mbstring is enabled and automagic input conversion is on: it might mingle with this check???
|
||||
$req_encoding = guess_encoding(isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '',
|
||||
$data);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse an xml chunk containing an xmlrpc request and execute the corresponding
|
||||
* php function registered with the server
|
||||
* @param string $data the xml request
|
||||
* @param string $req_encoding (optional) the charset encoding of the xml request
|
||||
* @return xmlrpcresp
|
||||
* @access private
|
||||
*/
|
||||
function parseRequest($data, $req_encoding='')
|
||||
{
|
||||
// 2005/05/07 commented and moved into caller function code
|
||||
//if($data=='')
|
||||
//{
|
||||
// $data=$GLOBALS['HTTP_RAW_POST_DATA'];
|
||||
//}
|
||||
|
||||
// G. Giunta 2005/02/13: we do NOT expect to receive html entities
|
||||
// so we do not try to convert them into xml character entities
|
||||
//$data = xmlrpc_html_entity_xlate($data);
|
||||
|
||||
$GLOBALS['_xh']=array();
|
||||
$GLOBALS['_xh']['ac']='';
|
||||
$GLOBALS['_xh']['stack']=array();
|
||||
$GLOBALS['_xh']['valuestack'] = array();
|
||||
$GLOBALS['_xh']['params']=array();
|
||||
$GLOBALS['_xh']['pt']=array();
|
||||
$GLOBALS['_xh']['isf']=0;
|
||||
$GLOBALS['_xh']['isf_reason']='';
|
||||
$GLOBALS['_xh']['method']=false; // so we can check later if we got a methodname or not
|
||||
$GLOBALS['_xh']['rt']='';
|
||||
|
||||
// decompose incoming XML into request structure
|
||||
if ($req_encoding != '')
|
||||
{
|
||||
if (!in_array($req_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
|
||||
// the following code might be better for mb_string enabled installs, but
|
||||
// makes the lib about 200% slower...
|
||||
//if (!is_valid_charset($req_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
|
||||
{
|
||||
error_log('XML-RPC: '.__METHOD__.': invalid charset encoding of received request: '.$req_encoding);
|
||||
$req_encoding = $GLOBALS['xmlrpc_defencoding'];
|
||||
}
|
||||
/// @BUG this will fail on PHP 5 if charset is not specified in the xml prologue,
|
||||
// the encoding is not UTF8 and there are non-ascii chars in the text...
|
||||
/// @todo use an ampty string for php 5 ???
|
||||
$parser = xml_parser_create($req_encoding);
|
||||
}
|
||||
else
|
||||
{
|
||||
$parser = xml_parser_create();
|
||||
}
|
||||
|
||||
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
|
||||
// G. Giunta 2005/02/13: PHP internally uses ISO-8859-1, so we have to tell
|
||||
// the xml parser to give us back data in the expected charset
|
||||
// What if internal encoding is not in one of the 3 allowed?
|
||||
// we use the broadest one, ie. utf8
|
||||
// This allows to send data which is native in various charset,
|
||||
// by extending xmlrpc_encode_entitites() and setting xmlrpc_internalencoding
|
||||
if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
|
||||
{
|
||||
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
|
||||
}
|
||||
else
|
||||
{
|
||||
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']);
|
||||
}
|
||||
|
||||
if ($this->functions_parameters_type != 'xmlrpcvals')
|
||||
xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_fast');
|
||||
else
|
||||
xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee');
|
||||
xml_set_character_data_handler($parser, 'xmlrpc_cd');
|
||||
xml_set_default_handler($parser, 'xmlrpc_dh');
|
||||
if(!xml_parse($parser, $data, 1))
|
||||
{
|
||||
// return XML error as a faultCode
|
||||
$r=new xmlrpcresp(0,
|
||||
$GLOBALS['xmlrpcerrxml']+xml_get_error_code($parser),
|
||||
sprintf('XML error: %s at line %d, column %d',
|
||||
xml_error_string(xml_get_error_code($parser)),
|
||||
xml_get_current_line_number($parser), xml_get_current_column_number($parser)));
|
||||
xml_parser_free($parser);
|
||||
}
|
||||
elseif ($GLOBALS['_xh']['isf'])
|
||||
{
|
||||
xml_parser_free($parser);
|
||||
$r=new xmlrpcresp(0,
|
||||
$GLOBALS['xmlrpcerr']['invalid_request'],
|
||||
$GLOBALS['xmlrpcstr']['invalid_request'] . ' ' . $GLOBALS['_xh']['isf_reason']);
|
||||
}
|
||||
else
|
||||
{
|
||||
xml_parser_free($parser);
|
||||
// small layering violation in favor of speed and memory usage:
|
||||
// we should allow the 'execute' method handle this, but in the
|
||||
// most common scenario (xmlrpcvals type server with some methods
|
||||
// registered as phpvals) that would mean a useless encode+decode pass
|
||||
if ($this->functions_parameters_type != 'xmlrpcvals' || (isset($this->dmap[$GLOBALS['_xh']['method']]['parameters_type']) && ($this->dmap[$GLOBALS['_xh']['method']]['parameters_type'] == 'phpvals')))
|
||||
{
|
||||
if($this->debug > 1)
|
||||
{
|
||||
$this->debugmsg("\n+++PARSED+++\n".var_export($GLOBALS['_xh']['params'], true)."\n+++END+++");
|
||||
}
|
||||
$r = $this->execute($GLOBALS['_xh']['method'], $GLOBALS['_xh']['params'], $GLOBALS['_xh']['pt']);
|
||||
}
|
||||
else
|
||||
{
|
||||
// build an xmlrpcmsg object with data parsed from xml
|
||||
$m=new xmlrpcmsg($GLOBALS['_xh']['method']);
|
||||
// now add parameters in
|
||||
for($i=0; $i<count($GLOBALS['_xh']['params']); $i++)
|
||||
{
|
||||
$m->addParam($GLOBALS['_xh']['params'][$i]);
|
||||
}
|
||||
|
||||
if($this->debug > 1)
|
||||
{
|
||||
$this->debugmsg("\n+++PARSED+++\n".var_export($m, true)."\n+++END+++");
|
||||
}
|
||||
$r = $this->execute($m);
|
||||
}
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a method invoked by the client, checking parameters used
|
||||
* @param mixed $m either an xmlrpcmsg obj or a method name
|
||||
* @param array $params array with method parameters as php types (if m is method name only)
|
||||
* @param array $paramtypes array with xmlrpc types of method parameters (if m is method name only)
|
||||
* @return xmlrpcresp
|
||||
* @access private
|
||||
*/
|
||||
function execute($m, $params=null, $paramtypes=null)
|
||||
{
|
||||
if (is_object($m))
|
||||
{
|
||||
$methName = $m->method();
|
||||
}
|
||||
else
|
||||
{
|
||||
$methName = $m;
|
||||
}
|
||||
$sysCall = $this->allow_system_funcs && (strpos($methName, "system.") === 0);
|
||||
$dmap = $sysCall ? $GLOBALS['_xmlrpcs_dmap'] : $this->dmap;
|
||||
|
||||
if(!isset($dmap[$methName]['function']))
|
||||
{
|
||||
// No such method
|
||||
return new xmlrpcresp(0,
|
||||
$GLOBALS['xmlrpcerr']['unknown_method'],
|
||||
$GLOBALS['xmlrpcstr']['unknown_method']);
|
||||
}
|
||||
|
||||
// Check signature
|
||||
if(isset($dmap[$methName]['signature']))
|
||||
{
|
||||
$sig = $dmap[$methName]['signature'];
|
||||
if (is_object($m))
|
||||
{
|
||||
list($ok, $errstr) = $this->verifySignature($m, $sig);
|
||||
}
|
||||
else
|
||||
{
|
||||
list($ok, $errstr) = $this->verifySignature($paramtypes, $sig);
|
||||
}
|
||||
if(!$ok)
|
||||
{
|
||||
// Didn't match.
|
||||
return new xmlrpcresp(
|
||||
0,
|
||||
$GLOBALS['xmlrpcerr']['incorrect_params'],
|
||||
$GLOBALS['xmlrpcstr']['incorrect_params'] . ": ${errstr}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$func = $dmap[$methName]['function'];
|
||||
// let the 'class::function' syntax be accepted in dispatch maps
|
||||
if(is_string($func) && strpos($func, '::'))
|
||||
{
|
||||
$func = explode('::', $func);
|
||||
}
|
||||
// verify that function to be invoked is in fact callable
|
||||
if(!is_callable($func))
|
||||
{
|
||||
error_log("XML-RPC: ".__METHOD__.": function $func registered as method handler is not callable");
|
||||
return new xmlrpcresp(
|
||||
0,
|
||||
$GLOBALS['xmlrpcerr']['server_error'],
|
||||
$GLOBALS['xmlrpcstr']['server_error'] . ": no function matches method"
|
||||
);
|
||||
}
|
||||
|
||||
// If debug level is 3, we should catch all errors generated during
|
||||
// processing of user function, and log them as part of response
|
||||
if($this->debug > 2)
|
||||
{
|
||||
$GLOBALS['_xmlrpcs_prev_ehandler'] = set_error_handler('_xmlrpcs_errorHandler');
|
||||
}
|
||||
try
|
||||
{
|
||||
// Allow mixed-convention servers
|
||||
if (is_object($m))
|
||||
{
|
||||
if($sysCall)
|
||||
{
|
||||
$r = call_user_func($func, $this, $m);
|
||||
}
|
||||
else
|
||||
{
|
||||
$r = call_user_func($func, $m);
|
||||
}
|
||||
if (!is_a($r, 'xmlrpcresp'))
|
||||
{
|
||||
error_log("XML-RPC: ".__METHOD__.": function $func registered as method handler does not return an xmlrpcresp object");
|
||||
if (is_a($r, 'xmlrpcval'))
|
||||
{
|
||||
$r = new xmlrpcresp($r);
|
||||
}
|
||||
else
|
||||
{
|
||||
$r = new xmlrpcresp(
|
||||
0,
|
||||
$GLOBALS['xmlrpcerr']['server_error'],
|
||||
$GLOBALS['xmlrpcstr']['server_error'] . ": function does not return xmlrpcresp object"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// call a 'plain php' function
|
||||
if($sysCall)
|
||||
{
|
||||
array_unshift($params, $this);
|
||||
$r = call_user_func_array($func, $params);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 3rd API convention for method-handling functions: EPI-style
|
||||
if ($this->functions_parameters_type == 'epivals')
|
||||
{
|
||||
$r = call_user_func_array($func, array($methName, $params, $this->user_data));
|
||||
// mimic EPI behaviour: if we get an array that looks like an error, make it
|
||||
// an eror response
|
||||
if (is_array($r) && array_key_exists('faultCode', $r) && array_key_exists('faultString', $r))
|
||||
{
|
||||
$r = new xmlrpcresp(0, (integer)$r['faultCode'], (string)$r['faultString']);
|
||||
}
|
||||
else
|
||||
{
|
||||
// functions using EPI api should NOT return resp objects,
|
||||
// so make sure we encode the return type correctly
|
||||
$r = new xmlrpcresp(php_xmlrpc_encode($r, array('extension_api')));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$r = call_user_func_array($func, $params);
|
||||
}
|
||||
}
|
||||
// the return type can be either an xmlrpcresp object or a plain php value...
|
||||
if (!is_a($r, 'xmlrpcresp'))
|
||||
{
|
||||
// what should we assume here about automatic encoding of datetimes
|
||||
// and php classes instances???
|
||||
$r = new xmlrpcresp(php_xmlrpc_encode($r, $this->phpvals_encoding_options));
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
// (barring errors in the lib) an uncatched exception happened
|
||||
// in the called function, we wrap it in a proper error-response
|
||||
switch($this->exception_handling)
|
||||
{
|
||||
case 2:
|
||||
throw $e;
|
||||
break;
|
||||
case 1:
|
||||
$r = new xmlrpcresp(0, $e->getCode(), $e->getMessage());
|
||||
break;
|
||||
default:
|
||||
$r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['server_error'], $GLOBALS['xmlrpcstr']['server_error']);
|
||||
}
|
||||
}
|
||||
if($this->debug > 2)
|
||||
{
|
||||
// note: restore the error handler we found before calling the
|
||||
// user func, even if it has been changed inside the func itself
|
||||
if($GLOBALS['_xmlrpcs_prev_ehandler'])
|
||||
{
|
||||
set_error_handler($GLOBALS['_xmlrpcs_prev_ehandler']);
|
||||
}
|
||||
else
|
||||
{
|
||||
restore_error_handler();
|
||||
}
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
/**
|
||||
* add a string to the 'internal debug message' (separate from 'user debug message')
|
||||
* @param string $strings
|
||||
* @access private
|
||||
*/
|
||||
function debugmsg($string)
|
||||
{
|
||||
$this->debug_info .= $string."\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
function xml_header($charset_encoding='')
|
||||
{
|
||||
if ($charset_encoding != '')
|
||||
{
|
||||
return "<?xml version=\"1.0\" encoding=\"$charset_encoding\"?" . ">\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<?xml version=\"1.0\"?" . ">\n";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A debugging routine: just echoes back the input packet as a string value
|
||||
* DEPRECATED!
|
||||
*/
|
||||
function echoInput()
|
||||
{
|
||||
$r=new xmlrpcresp(new xmlrpcval( "'Aha said I: '" . $GLOBALS['HTTP_RAW_POST_DATA'], 'string'));
|
||||
print $r->serialize();
|
||||
}
|
||||
}
|
||||
?>
|
55
webpack.config.js
Normal 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
@ -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"
|