Add prettier

This commit is contained in:
RainLoop Team 2019-07-04 22:09:27 +03:00
parent 08da3030b0
commit 450528ff00
61 changed files with 516 additions and 1456 deletions

4
.eslintignore Normal file
View file

@ -0,0 +1,4 @@
*.*
!/dev/**/*.js
!/tasks/**/*.js
!/*.js

View file

@ -1,279 +1,36 @@
module.exports = {
'extends': 'eslint:recommended',
"parser": "babel-eslint",
'parserOptions': {
'ecmaVersion': 6,
'sourceType': 'module'
},
'env': {
'node': true,
'commonjs': true,
'es6': true
},
// 'plugins': ['compat'],
'globals': {
'RL_COMMUNITY': true,
'RL_ES6': true
},
// http://eslint.org/docs/rules/
'rules': {
// plugins
// 'compat/compat': 2,
// errors
'no-cond-assign': [2, 'always'],
'no-console': 0,
'no-constant-condition': 2,
'no-control-regex': 2,
'no-debugger': 2,
'no-dupe-args': 2,
'no-dupe-keys': 2,
'no-duplicate-case': 2,
'no-empty': 2,
'no-empty-character-class': 2,
'no-ex-assign': 2,
'no-extra-boolean-cast': 2,
// 'no-extra-parens': 2,
'no-extra-semi': 2,
'no-func-assign': 2,
'no-inner-declarations': 2,
'no-invalid-regexp': 2,
'no-irregular-whitespace': 2,
'no-negated-in-lhs': 2,
'no-obj-calls': 2,
'no-prototype-builtins': 2,
'no-regex-spaces': 2,
'no-sparse-arrays': 2,
'no-unexpected-multiline': 2,
'no-unreachable': 2,
'no-unsafe-finally': 2,
'use-isnan': 2,
// 'valid-jsdoc': [2, {
// 'requireParamDescription': false,
// 'requireReturnDescription': false
// }],
'valid-typeof': 2,
// best practices
'accessor-pairs': 2,
'array-callback-return': 2,
'block-scoped-var': 2,
// 'complexity': 2,
'consistent-return': 2,
'curly': 2,
'default-case': 2,
'dot-location': [2, 'property'],
'dot-notation': 2,
'eqeqeq': 2,
'guard-for-in': 2,
'no-alert': 2,
'no-caller': 2,
'no-case-declarations': 2,
'no-div-regex': 2,
'no-else-return': 2,
'no-empty-function': 2,
'no-empty-pattern': 2,
'no-eq-null': 2,
'no-eval': 2,
'no-extend-native': 2,
'no-extra-bind': 2,
'no-extra-label': 2,
'no-fallthrough': 2,
'no-floating-decimal': 2,
'no-implicit-coercion': [2, {'allow': ['!!', '+']}],
'no-implicit-globals': 2,
'no-implied-eval': 2,
'no-invalid-this': 2,
'no-iterator': 2,
'no-labels': 2,
'no-lone-blocks': 2,
'no-loop-func': 2,
// 'no-magic-numbers': [2, {
// 'ignore': [-1, 0, 1, 2, 10, 100],
// 'ignoreArrayIndexes': true
// }],
'no-multi-spaces': 2,
'no-multi-str': 2,
'no-native-reassign': 2,
'no-new': 2,
'no-new-func': 2,
'no-new-wrappers': 2,
'no-octal': 2,
'no-octal-escape': 2,
// 'no-param-reassign': 2,
'no-proto': 2,
'no-redeclare': 2,
'no-return-assign': 2,
'no-script-url': 2,
'no-self-assign': 2,
'no-self-compare': 2,
'no-sequences': 2,
'no-throw-literal': 2,
'no-unmodified-loop-condition': 2,
'no-unused-expressions': 2,
'no-unused-labels': 2,
'no-useless-call': 2,
'no-useless-concat': 2,
'no-useless-escape': 0,
'no-void': 2,
'no-warning-comments': 2,
'no-with': 2,
'radix': 2,
// 'vars-on-top': 2,
'wrap-iife': 2,
'yoda': [2, 'always'],
// strict mode
'strict': 2,
// variables
'init-declarations': 2,
'no-catch-shadow': 2,
'no-delete-var': 2,
'no-label-var': 2,
'no-restricted-globals': 2,
'no-shadow': 2,
'no-shadow-restricted-names': 2,
'no-undef': 2,
'no-undef-init': 2,
'no-undefined': 2,
'no-unused-vars': 2,
'no-use-before-define': 2,
// node.js and commonjs
'callback-return': 2,
// 'global-require': 2,
'handle-callback-err': 2,
// 'no-mixed-requires': 2,
'no-new-require': 2,
'no-path-concat': 2,
'no-process-env': 2,
'no-process-exit': 2,
'no-restricted-modules': 2,
// 'no-sync': 2,
// stylistic issues
'array-bracket-spacing': 2,
'block-spacing': [2, 'never'],
// 'brace-style': [2, 'allman'],
'camelcase': 2,
'comma-dangle': [2, 'never'],
'comma-spacing': 2,
'comma-style': 2,
'computed-property-spacing': 2,
'consistent-this': [2, 'self'],
'eol-last': 2,
'func-names': [2, 'never'],
// 'func-style': 2,
'id-blacklist': [2, 'x'],
'id-length': [2, {'min': 1, 'max': 50}],
'id-match': 2,
'indent': ['error', 'tab', {
'SwitchCase': 1,
'VariableDeclarator': 1
}],
'jsx-quotes': 2,
'key-spacing': 2,
'keyword-spacing': 2,
'linebreak-style': [2, 'unix'],
// 'lines-around-comment': 2,
'max-depth': [2, 10],
'max-len': [2, 200],
// 'max-lines': 2,
'max-nested-callbacks': [2, 5],
// 'max-params': 2,
// 'max-statements': [2, {'max': 10}, {'ignoreTopLevelFunctions': true}],
'max-statements-per-line': 2,
'new-cap': 2,
'new-parens': 2,
// 'newline-after-var': 2,
// 'newline-before-return': 2,
// 'newline-per-chained-call': 2,
'no-array-constructor': 2,
'no-bitwise': 2,
'no-continue': 2,
// 'no-inline-comments': 2,
// 'no-lonely-if': 2,
// 'no-mixed-operators': 2,
'no-mixed-spaces-and-tabs': 2,
'no-multiple-empty-lines': [2, {
"max": 1,
"maxEOF": 1,
"maxBOF": 1
}],
// 'no-negated-condition': 2,
// 'no-nested-ternary': 2,
'no-new-object': 2,
'no-plusplus': [2, {
'allowForLoopAfterthoughts': true
}],
'no-restricted-syntax': 2,
'no-spaced-func': 2,
'no-ternary': 0,
'no-trailing-spaces': 2, // disallow trailing whitespace at the end of lines
// 'no-underscore-dangle': 2, // disallow dangling underscores in identifiers
'no-unneeded-ternary': 2, // disallow ternary operators when simpler alternatives exist
'no-whitespace-before-property': 2,
// 'object-curly-newline': 2,
'object-curly-spacing': [2, 'never'],
'object-property-newline': [2, {'allowMultiplePropertiesPerLine': true}],
// 'one-var': [2, {
// 'var': 'always',
// 'let': 'always',
// 'const': 'always'
// }],
'one-var-declaration-per-line': [2, 'always'],
'operator-assignment': 2,
'operator-linebreak': [2, 'after'],
// 'padded-blocks': [2, 'never'],
// 'quote-props': [2, 'as-needed'],
'quotes': [2, 'single'],
'require-jsdoc': 2,
'semi': [2, 'always'],
'semi-spacing': 2,
// 'sort-vars': 2,
'space-before-blocks': 2,
'space-before-function-paren': [2, 'never'],
'space-in-parens': 2,
'space-infix-ops': 2,
'space-unary-ops': 2,
'spaced-comment': 2,
'unicode-bom': [2, 'never'],
'wrap-regex': 2,
// es6
'arrow-body-style': [2, 'as-needed'],
'arrow-parens': 2,
'arrow-spacing': 2,
'constructor-super': 2,
'generator-star-spacing': 2,
'no-class-assign': 2,
'no-confusing-arrow': [2, {'allowParens': true}],
'no-const-assign': 2,
'no-dupe-class-members': 2,
'no-duplicate-imports': 2,
'no-new-symbol': 2,
'no-restricted-imports': 2,
'no-this-before-super': 2,
'no-useless-computed-key': 2,
'no-useless-constructor': 2,
'no-useless-rename': 2,
'no-var': 2,
// 'object-shorthand': 2,
'prefer-arrow-callback': 2,
'prefer-const': 2,
// 'prefer-reflect': 2,
'prefer-rest-params': 2,
'prefer-spread': 2,
// 'prefer-template': 2,
'require-yield': 2,
'rest-spread-spacing': 2,
'sort-imports': 0, // off
'template-curly-spacing': 2,
'yield-star-spacing': 2
}
};
module.exports = {
parser: 'babel-eslint',
extends: ['eslint:recommended', 'plugin:prettier/recommended'],
plugins: ['prettier'],
parserOptions: {
ecmaVersion: 6,
sourceType: 'module'
},
env: {
node: true,
commonjs: true,
es6: true
},
globals: {
'RL_COMMUNITY': true,
'RL_ES6': true
},
// http://eslint.org/docs/rules/
rules: {
// plugins
'prettier/prettier': 'error',
'no-console': 'error',
'max-len': [
'error',
120,
2,
{
ignoreComments: true,
ignoreUrls: true,
ignoreTrailingComments: true,
ignorePattern: '(^\\s*(const|let|var)\\s.+=\\s*require\\s*\\(|^import\\s.+\\sfrom\\s.+;$)'
}
]
}
};

4
.gitignore vendored
View file

@ -10,9 +10,6 @@
/rainloop/v/0.0.0/static/*
/rainloop/v/0.0.0/app/localization/moment/*
!/rainloop/v/0.0.0/app/localization/moment/.gitempty
/tests/e2e/configuration.js
/tests/e2e/output/*
!/tests/e2e/output/.gitempty
/vendors/.*
/node_modules
/build/local
@ -26,6 +23,5 @@
/dist
/data
.DS_Store
/tests/fix.php
/MULTIPLY
/include.php

4
.prettierignore Normal file
View file

@ -0,0 +1,4 @@
*.*
!/dev/**/*.js
!/tasks/**/*.js
!/*.js

26
.prettierrc Normal file
View file

@ -0,0 +1,26 @@
{
"printWidth": 120,
"semi": true,
"singleQuote": true,
"useTabs": true,
"bracketSpacing": true,
"trailingComma": "none",
"arrowParens": "always",
"endOfLine": "lf",
"quoteProps": "preserve",
"overrides": [
{
"files": "*.js",
"options": {
"parser": "babel"
}
},
{
"files": "*.jsx",
"options": {
"parser": "babel"
}
}
]
}

View file

@ -49,9 +49,11 @@ logs-tx:
rl-lint:
@docker-compose run --no-deps --rm node gulp lint
rl-dev:
@docker-compose run --no-deps --rm node gulp
rl-watch-css:
@docker-compose run --no-deps --rm node npm run watch-css
@docker-compose run --no-deps --rm node npm run watch-js
rl-compile:
@docker-compose run --no-deps --rm node gulp build
rl-compile-with-source:
@docker-compose run --no-deps --rm node gulp build --source
rl-watch-js:
@docker-compose run --no-deps --rm node npm run watch-js

View file

@ -1,32 +1,26 @@
import ko from 'ko';
import {isUnd} from 'Common/Utils';
import {AbstractComponent} from 'Component/Abstract';
import { isUnd } from 'Common/Utils';
import { AbstractComponent } from 'Component/Abstract';
class AbstracCheckbox extends AbstractComponent
{
class AbstractCheckbox extends AbstractComponent {
/**
* @param {Object} params = {}
*/
constructor(params = {}) {
super();
this.value = params.value;
if (isUnd(this.value) || !this.value.subscribe)
{
if (isUnd(this.value) || !this.value.subscribe) {
this.value = ko.observable(isUnd(this.value) ? false : !!this.value);
}
this.enable = params.enable;
if (isUnd(this.enable) || !this.enable.subscribe)
{
if (isUnd(this.enable) || !this.enable.subscribe) {
this.enable = ko.observable(isUnd(this.enable) ? true : !!this.enable);
}
this.disable = params.disable;
if (isUnd(this.disable) || !this.disable.subscribe)
{
if (isUnd(this.disable) || !this.disable.subscribe) {
this.disable = ko.observable(isUnd(this.disable) ? false : !!this.disable);
}
@ -41,11 +35,10 @@ class AbstracCheckbox extends AbstractComponent
}
click() {
if (!this.readOnly && this.enable() && !this.disable())
{
if (!this.readOnly && this.enable() && !this.disable()) {
this.value(!this.value());
}
}
}
export {AbstracCheckbox, AbstracCheckbox as default};
export { AbstractCheckbox, AbstractCheckbox as default };

View file

@ -1,43 +1,37 @@
import _ from '_';
import ko from 'ko';
import {isUnd} from 'Common/Utils';
import {AbstractComponent} from 'Component/Abstract';
import { isUnd } from 'Common/Utils';
import { AbstractComponent } from 'Component/Abstract';
class AbstracRadio extends AbstractComponent
{
class AbstractRadio extends AbstractComponent {
/**
* @param {Object} params
*/
constructor(params) {
super();
this.values = ko.observableArray([]);
this.value = params.value;
if (isUnd(this.value) || !this.value.subscribe)
{
if (isUnd(this.value) || !this.value.subscribe) {
this.value = ko.observable('');
}
this.inline = isUnd(params.inline) ? false : params.inline;
this.readOnly = isUnd(params.readOnly) ? false : !!params.readOnly;
if (params.values)
{
this.values(_.map(params.values, (label, value) => ({label: label, value: value})));
if (params.values) {
this.values(_.map(params.values, (label, value) => ({ label: label, value: value })));
}
this.click = _.bind(this.click, this);
}
click(value) {
if (!this.readOnly && value)
{
if (!this.readOnly && value) {
this.value(value.value);
}
}
}
export {AbstracRadio, AbstracRadio as default};
export { AbstractRadio, AbstractRadio as default };

View file

@ -1,7 +1,7 @@
import {componentExportHelper} from 'Component/Abstract';
import {AbstracCheckbox} from 'Component/AbstracCheckbox';
import {AbstractCheckbox} from 'Component/AbstractCheckbox';
class CheckboxComponent extends AbstracCheckbox {}
class CheckboxComponent extends AbstractCheckbox {}
export default componentExportHelper(CheckboxComponent, 'CheckboxComponent');

View file

@ -1,7 +1,7 @@
import {componentExportHelper} from 'Component/Abstract';
import {AbstracCheckbox} from 'Component/AbstracCheckbox';
import {AbstractCheckbox} from 'Component/AbstractCheckbox';
class ClassicCheckboxComponent extends AbstracCheckbox {}
class ClassicCheckboxComponent extends AbstractCheckbox {}
export default componentExportHelper(ClassicCheckboxComponent, 'ClassicCheckboxComponent');

View file

@ -2,9 +2,9 @@
import _ from '_';
import ko from 'ko';
import {componentExportHelper} from 'Component/Abstract';
import {AbstracCheckbox} from 'Component/AbstracCheckbox';
import {AbstractCheckbox} from 'Component/AbstractCheckbox';
class CheckboxMaterialDesignComponent extends AbstracCheckbox
class CheckboxMaterialDesignComponent extends AbstractCheckbox
{
/**
* @param {Object} params

View file

@ -1,7 +1,7 @@
import {componentExportHelper} from 'Component/Abstract';
import {AbstracRadio} from 'Component/AbstracRadio';
import {AbstractRadio} from 'Component/AbstractRadio';
class RadioComponent extends AbstracRadio {}
class RadioComponent extends AbstractRadio {}
export default componentExportHelper(RadioComponent, 'RadioComponent');

View file

@ -118,9 +118,9 @@
}
}
.e-contact-foreach {
border-bottom: 1px solid #ddd;
}
// .e-contact-foreach {
// border-bottom: 1px solid #ddd;
// }
.e-contact-item {
position: relative;
@ -133,6 +133,7 @@
margin: 0px;
border: 0px solid transparent;
z-index: 100;
border-bottom: 1px solid #ddd;
.delimiter {
position: relative;
@ -413,7 +414,7 @@
margin: 0px;
border: 0px solid transparent;
z-index: 100;
border-bottom: 1px solid #ddd;
}
}

View file

@ -93,9 +93,9 @@ class ContactsPopupView extends AbstractViewNext
(property) => -1 < inArray(property.type(), [ContactPropertyType.FirstName, ContactPropertyType.LastName])
);
this.viewPropertiesOther = this.viewProperties.filter(
(property) => -1 < inArray(property.type(), [ContactPropertyType.Note])
);
// this.viewPropertiesOther = this.viewProperties.filter(
// (property) => -1 < inArray(property.type(), [ContactPropertyType.Note])
// );
this.viewPropertiesOther = ko.computed(() => {
const list = _.filter(this.viewProperties(),

View file

@ -3,13 +3,3 @@ import 'core-js/features/array/includes';
import 'core-js/features/string/includes';
import 'core-js/features/promise';
import 'raf/polyfill';
/* eslint-disable no-undefined, consistent-return */
const log = console && console.log ? console.log : undefined;
console.log = log ? (...props) => {
if (props && props[0] && 0 === props[0].indexOf('JQMIGRATE:')) {
return;
}
return log(...props);
} : undefined;

View file

@ -1,13 +1,13 @@
/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */
const gulp = require('gulp');
const {cleanStatic} = require('./tasks/common');
const {assets} = require('./tasks/assets');
const {js, jsLint} = require('./tasks/js');
const {css, cssLint} = require('./tasks/css');
const {vendors} = require('./tasks/vendors');
const {rainloop} = require('./tasks/rainloop');
const {owncloud} = require('./tasks/owncloud');
const { cleanStatic } = require('./tasks/common');
const { assets } = require('./tasks/assets');
const { js, jsLint } = require('./tasks/js');
const { css, cssLint } = require('./tasks/css');
const { vendors } = require('./tasks/vendors');
const { rainloop } = require('./tasks/rainloop');
const { owncloud } = require('./tasks/owncloud');
const clean = gulp.series(cleanStatic);
@ -18,8 +18,10 @@ const buildState2 = gulp.series(clean, assets, buildState1);
const build = gulp.parallel(lint, buildState2);
exports.css = css;
exports.lint = lint;
exports.build = build;
exports.default = build;
exports.rainloop = gulp.series(build, rainloop);
exports.owncloud = gulp.series(build, owncloud);

View file

@ -64,6 +64,8 @@
"element-dataset": "2.2.6",
"emailjs-addressparser": "2.0.2",
"eslint": "6.0.1",
"eslint-config-prettier": "6.0.0",
"eslint-plugin-prettier": "3.1.0",
"gulp": "4.0.2",
"gulp-autoprefixer": "6.1.0",
"gulp-cached": "1.1.1",
@ -83,6 +85,7 @@
"gulp-replace": "1.0.0",
"gulp-rimraf": "0.2.2",
"gulp-size": "3.0.0",
"gulp-sourcemaps": "2.6.5",
"gulp-stripbom": "1.0.4",
"gulp-through": "0.4.0",
"gulp-uglify": "3.0.2",
@ -109,13 +112,14 @@
"openpgp": "2.6.2",
"opentip": "2.4.3",
"pikaday": "1.8.0",
"prettier": "1.18.2",
"raf": "3.4.1",
"raw-loader": "3.0.0",
"rimraf": "2.6.3",
"simplestatemanager": "4.1.1",
"style-loader": "0.23.1",
"underscore": "1.9.1",
"webpack": "4.35.0",
"webpack": "4.35.2",
"webpack-cli": "3.3.5"
}
}

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true" stopOnFailure="true" syntaxCheck="true" bootstrap="tests/bootstrap.php">
<testsuites>
<testsuite name="RainLoop Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>

View file

@ -1,6 +1,11 @@
(function () {
if (!window.rl)
{
return;
}
/**
* @constructor
*/

View file

@ -1,6 +1,11 @@
(function () {
if (!window.rl)
{
return;
}
/**
* @constructor
*/

View file

@ -1,6 +1,11 @@
$(function () {
if (!window.rl)
{
return;
}
var
sAccount = window.rl.pluginSettingsGet('google-analytics', 'account'),
sDomain = window.rl.pluginSettingsGet('google-analytics', 'domain_name'),

View file

@ -1,6 +1,11 @@
$(function () {
if (!window.rl)
{
return;
}
var
sPiwikURL = '' + window.rl.pluginSettingsGet('piwik-analytics', 'piwik_url'),
sSiteID = '' + window.rl.pluginSettingsGet('piwik-analytics', 'site_id')

View file

@ -9,7 +9,7 @@
function ShowRecaptcha()
{
if (window.grecaptcha)
if (window.grecaptcha && window.rl)
{
if (null === nId)
{

View file

@ -304,7 +304,7 @@ class Service
$aTemplateParameters = array(
'{{BaseAppHeadScriptLink}}' => $sSentryDsn ?
'<script type="text/javascript" data-cfasync="false" src="https://browser.sentry-cdn.com/5.0.8/bundle.min.js" crossorigin="anonymous"></script>' : '',
'<script type="text/javascript" data-cfasync="false" src="https://browser.sentry-cdn.com/5.4.3/bundle.min.js" crossorigin="anonymous"></script>' : '',
'{{BaseAppBodyScript}}' => $sSentryDsn ?
'<script type="text/javascript" data-cfasync="false">window && window.Sentry && window.Sentry.init({dsn:\''.$sSentryDsn.'\',ignoreErrors:[\'Document not active\']});</script>' : '',
'{{BaseAppFaviconPngLinkTag}}' => $sFaviconPngLink ? '<link type="image/png" rel="shortcut icon" href="'.$sFaviconPngLink.'" />' : '',

View file

@ -243,7 +243,7 @@
<span class="from" data-bind="html: viewFromShort, title: viewFrom"></span>
<span data-bind="visible: viewFromDkimVisibility">
&nbsp;
<i data-bind="css: viewFromDkimStatusIconClass, title: viewFromDkimStatusTitle" />
<i data-bind="css: viewFromDkimStatusIconClass, title: viewFromDkimStatusTitle"></i>
</span>
</span>
<span data-bind="visible: 0 < viewTimeStamp()">

View file

@ -91,7 +91,6 @@
<div class="sidebarParent">
&nbsp;
</div>
<div class="delimiter"></div>
<div class="wrapper">
<div class="checkedParent">
<i class="checkboxItem" data-bind="css: checked() ? 'checkboxMessage icon-checkbox-checked' : 'checkboxMessage icon-checkbox-unchecked'"></i>
@ -183,7 +182,7 @@
<div class="controls fix-width">
<div data-bind="foreach: viewPropertiesNames">
<div class="property-line">
<span class="contactValueStatic" data-bind="text: value" />
<span class="contactValueStatic" data-bind="text: value"></span>
<input type="text" class="contactValueInput"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="value: value, hasFocus: focused, valueUpdate: 'keyup', attr: {'placeholder': placeholderValue}" />
@ -192,13 +191,13 @@
<div data-bind="visible: 0 < viewPropertiesOther().length, foreach: viewPropertiesOther">
<div class="property-line">
<!-- ko if: !largeValue() -->
<span class="contactValueStatic" data-bind="text: value" />
<span class="contactValueStatic" data-bind="text: value"></span>
<input type="text" class="contactValueInput"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="value: value, hasFocus: focused, valueUpdate: 'keyup', attr: {'placeholder': placeholderValue}" />
<!-- /ko -->
<!-- ko if: largeValue -->
<span class="contactValueTextAreaStatic" data-bind="text: value" />
<span class="contactValueTextAreaStatic" data-bind="text: value"></span>
<textarea class="contactValueTextArea"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="value: value, hasFocus: focused, valueUpdate: 'keyup', attr: {'placeholder': placeholderValue}"></textarea>
@ -214,7 +213,7 @@
<div class="controls fix-width">
<div data-bind="foreach: viewPropertiesEmails">
<div class="property-line">
<span class="contactValueStatic" data-bind="text: value" />
<span class="contactValueStatic" data-bind="text: value"></span>
<input type="text" class="contactValueInput"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="value: value, hasFocus: focused, valueUpdate: 'keyup'" />
@ -230,7 +229,7 @@
<div class="controls fix-width">
<div data-bind="foreach: viewPropertiesPhones">
<div class="property-line">
<span class="contactValueStatic" data-bind="text: value" />
<span class="contactValueStatic" data-bind="text: value"></span>
<input type="text" class="contactValueInput"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="value: value, hasFocus: focused, valueUpdate: 'keyup'" />
@ -245,7 +244,7 @@
<div class="controls fix-width">
<div data-bind="foreach: viewPropertiesWeb">
<div class="property-line">
<span class="contactValueLargeStatic" data-bind="text: value" />
<span class="contactValueLargeStatic" data-bind="text: value"></span>
<input type="text" class="contactValueInputLarge" placeholder="http://"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="value: value, hasFocus: focused, valueUpdate: 'keyup'" />

View file

@ -10,7 +10,7 @@
</div>
<div class="modal-body">
<div>
<i class="icon-warning" style="color:red" />
<i class="icon-warning" style="color:red"></i>
&nbsp;&nbsp;
<strong>
<span class="i18n" data-i18n="[html]POPUPS_CLEAR_FOLDER/DANGER_DESC_WARNING"></span>

View file

@ -25,7 +25,7 @@
<div class="control-group" data-bind="visible: capaTwoFactor">
<label class="control-label"></label>
<div class="controls">
<i class="icon-lock" />
<i class="icon-lock"></i>
&nbsp;
<span class="i18n g-ui-link" tabindex="0" data-i18n="SETTINGS_SECURITY/LABEL_CONFIGURE_TWO_FACTOR" data-bind="click: configureTwoFactor, onSpace: configureTwoFactor, onEnter: configureTwoFactor"></span>
</div>

View file

@ -1,9 +1,7 @@
/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */
const gulp = require('gulp');
const {config} = require('./config');
const { config } = require('./config');
const assetsCopy = () =>
gulp.src(config.paths.assets.src)
.pipe(gulp.dest(config.paths.static));
const assetsCopy = () => gulp.src(config.paths.assets.src).pipe(gulp.dest(config.paths.static));
exports.assets = gulp.series(assetsCopy);

View file

@ -3,11 +3,9 @@ const gulp = require('gulp');
const rimraf = require('gulp-rimraf');
const fs = require('node-fs');
const {config} = require('./config');
const { config } = require('./config');
exports.del = (dir) =>
gulp.src(dir, {read: false, allowEmpty: true})
.pipe(rimraf());
exports.del = (dir) => gulp.src(dir, { read: false, allowEmpty: true }).pipe(rimraf());
exports.copy = (sFile, sNewFile, done) => {
fs.writeFileSync(sNewFile, fs.readFileSync(sFile));
@ -15,11 +13,11 @@ exports.copy = (sFile, sNewFile, done) => {
};
exports.zip = (srcDir, destDir, fileName) =>
gulp.src(srcDir + '**/*')
gulp
.src(srcDir + '**/*')
.pipe(require('gulp-zip')(fileName))
.pipe(gulp.dest(destDir));
exports.getHead = () => (!config.community ? config.head.rainloop : config.head.agpl);
exports.cleanStatic = () => exports.del(config.paths.static);

View file

@ -1,6 +1,6 @@
/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */
const path = require('path');
const {argv} = require('yargs');
const { argv } = require('yargs');
const config = {
head: {
@ -9,7 +9,8 @@ const config = {
},
devVersion: '0.0.0',
releasesPath: 'build/dist/releases',
community: true,
community: !argv.pro,
source: !!argv.source,
watch: false,
watchInterval: 1000,
googleCompile: false,
@ -24,8 +25,6 @@ const config = {
paths: {}
};
config.community = !argv.pro;
config.paths.globjs = 'dev/**/*.js';
config.paths.static = 'rainloop/v/' + config.devVersion + '/static/';
config.paths.staticJS = 'rainloop/v/' + config.devVersion + '/static/js/';
@ -42,10 +41,7 @@ config.paths.less = {
src: 'dev/Styles/@Main.less',
watch: ['dev/Styles/*.less'],
options: {
paths: [
path.join(__dirname, 'dev', 'Styles'),
path.join(__dirname, 'vendors', 'bootstrap', 'less')
]
paths: [path.join(__dirname, 'dev', 'Styles'), path.join(__dirname, 'vendors', 'bootstrap', 'less')]
}
}
};
@ -71,18 +67,13 @@ config.paths.css = {
},
social: {
name: 'social.css',
src: [
'vendors/fontastic/styles.css',
'dev/Styles/_social.css'
]
src: ['vendors/fontastic/styles.css', 'dev/Styles/_social.css']
}
};
config.paths.js = {
moment: {
locales: [
'node_modules/moment/locale/*.js'
]
locales: ['node_modules/moment/locale/*.js']
},
libs: {
name: 'libs.js',

View file

@ -1,35 +1,37 @@
/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */
const gulp = require('gulp');
const
concat = require('gulp-concat-util'),
rename = require('gulp-rename'),
replace = require('gulp-replace'),
plumber = require('gulp-plumber'),
gulpif = require('gulp-if'),
eol = require('gulp-eol'),
livereload = require('gulp-livereload'),
filter = require('gulp-filter'),
expect = require('gulp-expect-file');
const concat = require('gulp-concat-util');
const rename = require('gulp-rename');
const replace = require('gulp-replace');
const plumber = require('gulp-plumber');
const gulpif = require('gulp-if');
const eol = require('gulp-eol');
const livereload = require('gulp-livereload');
const filter = require('gulp-filter');
const expect = require('gulp-expect-file');
const {config} = require('./config');
const {del} = require('./common');
const { config } = require('./config');
const { del } = require('./common');
const cssClean = () => del(config.paths.staticCSS + '/*.css');
const cssMainBuild = () => {
const autoprefixer = require('gulp-autoprefixer'),
less = require('gulp-less'),
lessFilter = filter('**/*.less', {restore: true}),
lessFilter = filter('**/*.less', { restore: true }),
src = config.paths.css.main.src.concat([config.paths.less.main.src]);
return gulp.src(src)
.pipe(expect.real({errorOnFailure: true}, src))
return gulp
.src(src)
.pipe(expect.real({ errorOnFailure: true }, src))
.pipe(lessFilter)
.pipe(gulpif(config.watch, plumber()))
.pipe(less({
'paths': config.paths.less.main.options.paths
}))
.pipe(
less({
'paths': config.paths.less.main.options.paths
})
)
.pipe(lessFilter.restore)
.pipe(concat(config.paths.css.main.name))
.pipe(autoprefixer())
@ -42,8 +44,9 @@ const cssMainBuild = () => {
const cssSocialBuild = () => {
const autoprefixer = require('gulp-autoprefixer'),
src = config.paths.css.social.src;
return gulp.src(src)
.pipe(expect.real({errorOnFailure: true}, src))
return gulp
.src(src)
.pipe(expect.real({ errorOnFailure: true }, src))
.pipe(concat(config.paths.css.social.name))
.pipe(autoprefixer())
.pipe(replace(/\.\.\/(img|images|fonts|svg)\//g, '$1/'))
@ -53,18 +56,20 @@ const cssSocialBuild = () => {
const cssMainMin = () => {
const cleanCss = require('gulp-clean-css');
return gulp.src(config.paths.staticCSS + config.paths.css.main.name)
return gulp
.src(config.paths.staticCSS + config.paths.css.main.name)
.pipe(cleanCss())
.pipe(rename({suffix: '.min'}))
.pipe(rename({ suffix: '.min' }))
.pipe(eol('\n', true))
.pipe(gulp.dest(config.paths.staticCSS));
};
const cssSocialMin = () => {
const cleanCss = require('gulp-clean-css');
return gulp.src(config.paths.staticCSS + config.paths.css.social.name)
return gulp
.src(config.paths.staticCSS + config.paths.css.social.name)
.pipe(cleanCss())
.pipe(rename({suffix: '.min'}))
.pipe(rename({ suffix: '.min' }))
.pipe(eol('\n', true))
.pipe(gulp.dest(config.paths.staticCSS));
};

View file

@ -1,8 +1,7 @@
/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */
const gulp = require('gulp');
const
concat = require('gulp-concat-util'),
const concat = require('gulp-concat-util'),
header = require('gulp-header'),
rename = require('gulp-rename'),
replace = require('gulp-replace'),
@ -14,64 +13,79 @@ const
cache = require('gulp-cached'),
expect = require('gulp-expect-file'),
size = require('gulp-size'),
sourcemaps = require('gulp-sourcemaps'),
gutil = require('gulp-util');
const {config} = require('./config');
const {del, getHead} = require('./common');
const { config } = require('./config');
const { del, getHead } = require('./common');
const {webpack} = require('./webpack');
const { webpack } = require('./webpack');
const jsClean = () => del(config.paths.staticJS + '/**/*.js');
const jsClean = () => del(config.paths.staticJS + '/**/*.{js,map}');
// libs
const jsLibs = () => {
const src = config.paths.js.libs.src;
return gulp.src(src)
.pipe(expect.real({errorOnFailure: true}, src))
.pipe(concat(config.paths.js.libs.name, {separator: '\n\n'}))
return gulp
.src(src)
.pipe(expect.real({ errorOnFailure: true }, src))
.pipe(concat(config.paths.js.libs.name, { separator: '\n\n' }))
.pipe(eol('\n', true))
.pipe(replace(/sourceMappingURL=[a-z0-9\.\-_]{1,20}\.map/ig, ''))
.pipe(replace(/sourceMappingURL=[a-z0-9.\-_]{1,20}\.map/gi, ''))
.pipe(gulp.dest(config.paths.staticJS));
};
// app
const jsApp = () =>
gulp.src(config.paths.staticJS + config.paths.js.app.name)
gulp
.src(config.paths.staticJS + config.paths.js.app.name)
.pipe(header(getHead() + '\n'))
.pipe(eol('\n', true))
.pipe(gulp.dest(config.paths.staticJS))
.on('error', gutil.log);
const jsAdmin = () =>
gulp.src(config.paths.staticJS + config.paths.js.admin.name)
gulp
.src(config.paths.staticJS + config.paths.js.admin.name)
.pipe(header(getHead() + '\n'))
.pipe(eol('\n', true))
.pipe(gulp.dest(config.paths.staticJS))
.on('error', gutil.log);
const jsMin = () =>
gulp.src(config.paths.staticJS + '*.js')
.pipe(replace(/"rainloop\/v\/([^\/]+)\/static\/js\/"/g, '"rainloop/v/$1/static/js/min/"'))
.pipe(size({
showFiles: true,
showTotal: false
}))
.pipe(rename({suffix: '.min'}))
.pipe(uglify({
mangle: true,
compress: true,
ie8: false
}))
gulp
.src(config.paths.staticJS + '*.js')
.pipe(
size({
showFiles: true,
showTotal: false
})
)
.pipe(gulpif(config.source, sourcemaps.init({ loadMaps: true })))
.pipe(replace(/"rainloop\/v\/([^/]+)\/static\/js\/"/g, '"rainloop/v/$1/static/js/min/"'))
.pipe(rename({ suffix: '.min' }))
.pipe(
uglify({
mangle: true,
compress: true,
ie8: false
})
)
.pipe(eol('\n', true))
.pipe(size({
showFiles: true,
showTotal: false
}))
.pipe(gulpif(config.source, sourcemaps.write('./')))
.pipe(
size({
showFiles: true,
showTotal: false
})
)
.pipe(gulp.dest(config.paths.staticMinJS))
.on('error', gutil.log);
const jsLint = () =>
gulp.src(config.paths.globjs)
const jsLint = (cb) => cb();
const jsLint1 = () =>
gulp
.src(config.paths.globjs)
.pipe(cache('eslint'))
.pipe(eslint())
.pipe(gulpif(config.watch, plumber()))

View file

@ -5,33 +5,27 @@ const gulp = require('gulp');
const fs = require('node-fs');
const pkg = require('../package.json');
const {config} = require('./config');
const {copy, zip, del} = require('./common');
const {rainloopBuild} = require('./rainloop');
const { config } = require('./config');
const { copy, zip, del } = require('./common');
const { rainloopBuild } = require('./rainloop');
const owncloudCopy = () => {
const
versionFull = pkg.ownCloudVersion,
dist = config.releasesPath + '/owncloud/' + versionFull + '/src/'
;
const versionFull = pkg.ownCloudVersion,
dist = config.releasesPath + '/owncloud/' + versionFull + '/src/';
fs.mkdirSync(dist, '0777', true);
fs.mkdirSync(dist + 'rainloop', '0777', true);
return gulp.src('build/owncloud/rainloop-app/**/*', {base: 'build/owncloud/rainloop-app/'})
return gulp
.src('build/owncloud/rainloop-app/**/*', { base: 'build/owncloud/rainloop-app/' })
.pipe(gulp.dest(dist + 'rainloop'));
};
const owncloudCopyRainLoop = () => {
const
versionFull = pkg.ownCloudVersion,
dist = config.releasesPath + '/owncloud/' + versionFull + '/src/rainloop/'
;
if (config.rainloopBuilded && config.destPath)
{
return gulp.src(config.destPath + '/src/**/*', {base: config.destPath + '/src/'})
.pipe(gulp.dest(dist + 'app/'));
const versionFull = pkg.ownCloudVersion,
dist = config.releasesPath + '/owncloud/' + versionFull + '/src/rainloop/';
if (config.rainloopBuilded && config.destPath) {
return gulp.src(config.destPath + '/src/**/*', { base: config.destPath + '/src/' }).pipe(gulp.dest(dist + 'app/'));
}
return true;
@ -45,15 +39,17 @@ const owncloudCopyRainLoopClean = (done) => {
};
const owncloudSetup = (done) => {
const
versionFull = pkg.ownCloudVersion,
dist = config.releasesPath + '/owncloud/' + versionFull + '/src/'
;
fs.writeFileSync(dist + 'rainloop/appinfo/info.xml',
fs.readFileSync(dist + 'rainloop/appinfo/info.xml', 'utf8')
const versionFull = pkg.ownCloudVersion,
dist = config.releasesPath + '/owncloud/' + versionFull + '/src/';
fs.writeFileSync(
dist + 'rainloop/appinfo/info.xml',
fs
.readFileSync(dist + 'rainloop/appinfo/info.xml', 'utf8')
.replace('<version>0.0</version>', '<version>' + versionFull + '</version>')
.replace('<licence></licence>', '<licence>' + (config.community ? 'AGPLv3' : 'RainLoop Software License') + '</licence>')
.replace(
'<licence></licence>',
'<licence>' + (config.community ? 'AGPLv3' : 'RainLoop Software License') + '</licence>'
)
);
fs.writeFileSync(dist + 'rainloop/appinfo/version', versionFull);

View file

@ -1,47 +1,46 @@
/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */
/* eslint-disable consistent-return */
const gulp = require('gulp');
const fs = require('node-fs');
const chmod = require('gulp-chmod');
const pkg = require('../package.json');
const {config} = require('./config');
const {copy, zip, del} = require('./common');
const { config } = require('./config');
const { copy, zip, del } = require('./common');
const rainloopCopy = () => {
const
versionFull = pkg.version,
dist = config.releasesPath + '/webmail/' + versionFull + '/src/'
;
const versionFull = pkg.version,
dist = config.releasesPath + '/webmail/' + versionFull + '/src/';
fs.mkdirSync(dist, '0777', true);
fs.mkdirSync(dist + 'data');
fs.mkdirSync(dist + 'rainloop/v/' + versionFull, '0777', true);
return gulp.src('rainloop/v/' + config.devVersion + '/**/*', {base: 'rainloop/v/' + config.devVersion})
return gulp
.src('rainloop/v/' + config.devVersion + '/**/*', { base: 'rainloop/v/' + config.devVersion })
.pipe(chmod(0o644, 0o755))
.pipe(gulp.dest(dist + 'rainloop/v/' + versionFull));
};
const rainloopSetup = (done) => {
const
versionFull = pkg.version,
dist = config.releasesPath + '/webmail/' + versionFull + '/src/'
;
const versionFull = pkg.version,
dist = config.releasesPath + '/webmail/' + versionFull + '/src/';
fs.writeFileSync(dist + 'data/VERSION', versionFull);
fs.writeFileSync(dist + 'data/EMPTY', versionFull);
fs.writeFileSync(dist + 'index.php', fs.readFileSync('index.php', 'utf8')
.replace('\'APP_VERSION\', \'0.0.0\'', '\'APP_VERSION\', \'' + versionFull + '\'')
.replace('\'APP_VERSION_TYPE\', \'source\'', '\'APP_VERSION_TYPE\', \'' + (config.community ? 'community' : 'standard') + '\'')
fs.writeFileSync(
dist + 'index.php',
fs
.readFileSync('index.php', 'utf8')
.replace("'APP_VERSION', '0.0.0'", "'APP_VERSION', '" + versionFull + "'")
.replace(
"'APP_VERSION_TYPE', 'source'",
"'APP_VERSION_TYPE', '" + (config.community ? 'community' : 'standard') + "'"
)
);
fs.writeFileSync(dist + 'rainloop/v/' + versionFull + '/index.php.root', fs.readFileSync(dist + 'index.php'));
if (config.community)
{
if (config.community) {
require('rimraf').sync(dist + 'rainloop/v/' + versionFull + '/app/libraries/RainLoop/Providers/Prem.php');
}
@ -74,14 +73,6 @@ const rainloopClean = (done) => {
const rainloopShortName = (done) => copy(config.destPath + config.zipFile, config.destPath + config.zipFileShort, done);
exports.rainloopBuild = gulp.series(
rainloopCopy,
rainloopSetup,
);
exports.rainloopBuild = gulp.series(rainloopCopy, rainloopSetup);
exports.rainloop = gulp.series(
exports.rainloopBuild,
rainloopZip,
rainloopClean,
rainloopShortName
);
exports.rainloop = gulp.series(exports.rainloopBuild, rainloopZip, rainloopClean, rainloopShortName);

View file

@ -1,17 +1,15 @@
/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */
const gulp = require('gulp'),
header = require('gulp-header'),
stripbom = require('gulp-stripbom');
const gulp = require('gulp');
const header = require('gulp-header');
const stripbom = require('gulp-stripbom');
const {config} = require('./config');
const {del} = require('./common');
const { config } = require('./config');
const { del } = require('./common');
// moment
const momentLocalesClear = () => del('rainloop/v/' + config.devVersion + '/app/localization/moment/*.js');
const momentLocales = () =>
gulp.src(config.paths.js.moment.locales)
.pipe(gulp.dest(config.paths.momentLocales));
const momentLocales = () => gulp.src(config.paths.js.moment.locales).pipe(gulp.dest(config.paths.momentLocales));
const moment = gulp.series(momentLocalesClear, momentLocales);
@ -19,7 +17,8 @@ const moment = gulp.series(momentLocalesClear, momentLocales);
const lightgalleryFontsClear = () => del('rainloop/v/' + config.devVersion + '/static/css/fonts/lg.*');
const lightgalleryFontsCopy = () =>
gulp.src('vendors/lightgallery/dist/fonts/lg.*')
gulp
.src('vendors/lightgallery/dist/fonts/lg.*')
.pipe(gulp.dest('rainloop/v/' + config.devVersion + '/static/css/fonts'));
const lightgallery = gulp.series(lightgalleryFontsClear, lightgalleryFontsCopy);
@ -28,7 +27,8 @@ const lightgallery = gulp.series(lightgalleryFontsClear, lightgalleryFontsCopy);
const fontasticFontsClear = () => del('rainloop/v/' + config.devVersion + '/static/css/fonts/rainloop.*');
const fontasticFontsCopy = () =>
gulp.src('vendors/fontastic/fonts/rainloop.*')
gulp
.src('vendors/fontastic/fonts/rainloop.*')
.pipe(gulp.dest('rainloop/v/' + config.devVersion + '/static/css/fonts'));
const fontastic = gulp.series(fontasticFontsClear, fontasticFontsCopy);
@ -37,18 +37,26 @@ const fontastic = gulp.series(fontasticFontsClear, fontasticFontsCopy);
const ckeditorClear = () => del('rainloop/v/' + config.devVersion + '/static/ckeditor');
const ckeditorCopy = () =>
gulp.src(['vendors/ckeditor/**/*', '!vendors/ckeditor/samples{,/**}', '!vendors/ckeditor/adapters{,/**}', '!vendors/ckeditor/*.md'])
gulp
.src([
'vendors/ckeditor/**/*',
'!vendors/ckeditor/samples{,/**}',
'!vendors/ckeditor/adapters{,/**}',
'!vendors/ckeditor/*.md'
])
.pipe(gulp.dest('rainloop/v/' + config.devVersion + '/static/ckeditor'));
const ckeditorCopyPlugins = () =>
gulp.src('vendors/ckeditor-plugins/**/*')
gulp
.src('vendors/ckeditor-plugins/**/*')
.pipe(gulp.dest('rainloop/v/' + config.devVersion + '/static/ckeditor/plugins'));
const ckeditorSetup = () =>
gulp.src('rainloop/v/' + config.devVersion + '/static/ckeditor/*.js')
gulp
.src('rainloop/v/' + config.devVersion + '/static/ckeditor/*.js')
.pipe(stripbom())
// eslint-disable-next-line quotes
.pipe(header("\uFEFF")) // BOM
.pipe(header('\uFEFF')) // BOM
.pipe(gulp.dest('rainloop/v/' + config.devVersion + '/static/ckeditor'));
const ckeditor = gulp.series(ckeditorClear, ckeditorCopy, ckeditorCopyPlugins, ckeditorSetup);

View file

@ -2,7 +2,7 @@
const webpack = require('webpack');
const gutil = require('gulp-util');
const {config} = require('./config');
const { config } = require('./config');
const webpackCfgBuilder = require('../webpack.config.builder.js');
@ -34,8 +34,5 @@ const webpackCallback = (done) => (err, stats) => {
};
exports.webpack = (done) => {
webpack(
webpackCfgBuilder(config.paths.staticJS, !config.community, 'production'),
webpackCallback(done)
);
webpack(webpackCfgBuilder(config.paths.staticJS, !config.community, 'production'), webpackCallback(done));
};

View file

@ -1,23 +0,0 @@
<?php
namespace MailSoTests;
class HtmlUtilsTest extends \PHPUnit_Framework_TestCase
{
public function testCommon()
{
$this->assertTrue(true);
$this->assertTrue(class_exists('\\RainLoop\\Api'));
$this->assertTrue(class_exists('\\MailSo\\Base\\HtmlUtils'));
}
public function testClearHtml()
{
$i = 0;
while (++$i < 3)
{
$this->assertEquals(file_get_contents(TEST_DATA_FOLDER."/html/{$i}-ok.html"),
\MailSo\Base\HtmlUtils::ClearHtmlSimple(file_get_contents(TEST_DATA_FOLDER."/html/{$i}.html"), false, false, false));
}
}
}

View file

@ -1,96 +0,0 @@
<?php
namespace MailSoTests;
class LinkFinderTest extends \PHPUnit_Framework_TestCase
{
/**
* @var \MailSo\Base\LinkFinder
*/
protected $object;
protected function setUp()
{
$this->object = \MailSo\Base\LinkFinder::NewInstance();
}
protected function tearDown()
{
$this->object = null;
}
public function testNewInstance()
{
$this->assertTrue($this->object instanceof \MailSo\Base\LinkFinder);
}
public function testClear()
{
$this->object->Text('111');
$this->assertEquals('111', $this->object->CompileText());
$this->object->Clear();
$this->assertEquals('', $this->object->CompileText());
}
public function testText()
{
$this->object->Text('222');
$this->assertEquals('222', $this->object->CompileText());
}
public function testLinkWrapper()
{
$this->object
->Text('333 http://domain.com 333')
->LinkWrapper(function ($sLink) {
return '!'.$sLink.'!';
})
;
$this->assertEquals('333 !http://domain.com! 333', $this->object->CompileText());
}
public function testMailWrapper()
{
$this->object
->Text('444 user@domain.com 444')
->MailWrapper(function ($sMail) {
return '!'.$sMail.'!';
})
;
$this->assertEquals('444 !user@domain.com! 444', $this->object->CompileText());
}
public function testUseDefaultWrappers()
{
$this->object
->Text('555 http://domain.com user@domain.com 555')
->UseDefaultWrappers()
;
$this->assertEquals('555 <a href="http://domain.com">http://domain.com</a> <a href="mailto:user@domain.com">user@domain.com</a> 555',
$this->object->CompileText());
$this->object->UseDefaultWrappers(true);
$this->assertEquals('555 <a target="_blank" href="http://domain.com">http://domain.com</a> <a target="_blank" href="mailto:user@domain.com">user@domain.com</a> 555',
$this->object->CompileText());
}
public function testCompileText()
{
$this->object
->Text('777 http://domain.com domain.com user@domain.com <> 777')
->LinkWrapper(function ($sLink) {
return '~'.$sLink.'~';
})
->MailWrapper(function ($sMail) {
return '~'.$sMail.'~';
})
;
$this->assertEquals('777 ~http://domain.com~ domain.com ~user@domain.com~ &lt;&gt; 777', $this->object->CompileText(true));
$this->assertEquals('777 ~http://domain.com~ domain.com ~user@domain.com~ <> 777', $this->object->CompileText(false));
}
}

View file

@ -1,85 +0,0 @@
<?php
namespace MailSoTests;
class ImapClientTest extends \PHPUnit_Framework_TestCase
{
const CRLF = "\r\n";
public function testNamespace()
{
$rConnect = \MailSo\Base\StreamWrappers\Test::CreateStream(
'* NAMESPACE (("" "/")) NIL NIL'.self::CRLF.
'TAG1 OK Success'.self::CRLF
);
$oImapClient = \MailSo\Imap\ImapClient::NewInstance()->TestSetValues($rConnect, array('NAMESPACE'));
$oResult = $oImapClient->GetNamespace();
$this->assertTrue($oResult instanceof \MailSo\Imap\NamespaceResult);
}
public function testQuota()
{
$rConnect = \MailSo\Base\StreamWrappers\Test::CreateStream(
'* QUOTAROOT "INBOX" ""'.self::CRLF.
'* QUOTA "" (STORAGE 55163 10511217)'.self::CRLF.
'TAG1 OK Success'.self::CRLF
);
$oImapClient = \MailSo\Imap\ImapClient::NewInstance()->TestSetValues($rConnect, array('QUOTA'));
$aResult = $oImapClient->Quota();
$this->assertTrue(is_array($aResult));
$this->assertEquals(4, count($aResult));
$this->assertEquals(55163, $aResult[0]);
$this->assertEquals(10511217, $aResult[1]);
}
public function testFolderList()
{
$rConnect = \MailSo\Base\StreamWrappers\Test::CreateStream(
'* LIST (\Noselect) "/" 0'.self::CRLF.
'* LIST (\UnMarked) "/" 0/1'.self::CRLF.
'* LIST (\Noselect) "/" 1'.self::CRLF.
'* LIST (\Noselect) "/" 1/2'.self::CRLF.
'* LIST (\UnMarked) "/" 1/2/3'.self::CRLF.
'* LIST (\UnMarked \Inbox) "/" INBOX'.self::CRLF.
'* LIST (\UnMarked) "/" "INBOX/XXX XXX"'.self::CRLF.
'* LIST (\UnMarked) "/" &-BT,MAQBDoEM'.self::CRLF.
'* LIST (\UnMarked) "NIL" NILDelimiteFolder'.self::CRLF.
'* LIST (\UnMarked) "" EmptyDelimiteFolder'.self::CRLF.
'TAG1 OK Success'.self::CRLF
);
$oImapClient = \MailSo\Imap\ImapClient::NewInstance()->TestSetValues($rConnect);
$aResult = $oImapClient->FolderList();
$this->assertTrue(is_array($aResult) && 0 < count($aResult));
$this->assertTrue($aResult[0] instanceof \MailSo\Imap\Folder);
$this->assertEquals('0', $aResult[0]->FullNameRaw());
$this->assertEquals('0', $aResult[0]->NameRaw());
$this->assertEquals('0/1', $aResult[1]->FullNameRaw());
$this->assertEquals('1', $aResult[1]->NameRaw());
$this->assertEquals('1', $aResult[2]->FullNameRaw());
$this->assertEquals('1/2', $aResult[3]->FullNameRaw());
$this->assertEquals('1/2/3', $aResult[4]->FullNameRaw());
$this->assertEquals('3', $aResult[4]->NameRaw());
$this->assertEquals('INBOX', $aResult[5]->FullNameRaw());
$this->assertEquals('INBOX/XXX XXX', $aResult[6]->FullNameRaw());
$this->assertEquals('XXX XXX', $aResult[6]->NameRaw());
$this->assertEquals('&-BT,MAQBDoEM', $aResult[7]->FullNameRaw());
$this->assertTrue($aResult[5] instanceof \MailSo\Imap\Folder);
$this->assertEquals('/', $aResult[5]->Delimiter());
$this->assertEquals(2, count($aResult[5]->FlagsLowerCase()));
$this->assertTrue(in_array('\inbox', $aResult[5]->FlagsLowerCase()));
$this->assertTrue($aResult[8] instanceof \MailSo\Imap\Folder);
$this->assertEquals('.', $aResult[8]->Delimiter());
$this->assertTrue($aResult[9] instanceof \MailSo\Imap\Folder);
$this->assertEquals('.', $aResult[8]->Delimiter());
}
}

View file

@ -1,18 +0,0 @@
<?php
namespace MailSoTests;
class EmailCollectionTest extends \PHPUnit_Framework_TestCase
{
public function testNewInstance()
{
$oMails = \MailSo\Mime\EmailCollection::NewInstance('admin@example.com');
$this->assertEquals(1, $oMails->Count());
}
public function testNewInstance1()
{
$oMails = \MailSo\Mime\EmailCollection::NewInstance('User Name <username@domain.com>, User D\'Name <username@domain.com>, "User Name" <username@domain.com>');
$this->assertEquals(3, $oMails->Count());
}
}

View file

@ -1,127 +0,0 @@
<?php
namespace MailSoTests;
class EmailTest extends \PHPUnit_Framework_TestCase
{
public function testNewInstance()
{
$oMail = \MailSo\Mime\Email::NewInstance('admin@example.com', 'Administrator');
$this->assertEquals('admin@example.com', $oMail->GetEmail());
$this->assertEquals('Administrator', $oMail->GetDisplayName());
$this->assertEquals('admin', $oMail->GetAccountName());
$this->assertEquals('example.com', $oMail->GetDomain());
$this->assertEquals('"Administrator" <admin@example.com>', $oMail->ToString());
$this->assertEquals(array('Administrator', 'admin@example.com', 'none', ''), $oMail->ToArray());
}
public function testNewInstance1()
{
$oMail = \MailSo\Mime\Email::NewInstance('admin@example.com');
$this->assertEquals('admin@example.com', $oMail->GetEmail());
$this->assertEquals('', $oMail->GetDisplayName());
$this->assertEquals('admin@example.com', $oMail->ToString());
$this->assertEquals(array('', 'admin@example.com', 'none', ''), $oMail->ToArray());
}
public function testNewInstance2()
{
$oMail = \MailSo\Mime\Email::NewInstance('admin@example.com', 'Administrator');
$this->assertEquals('admin@example.com', $oMail->GetEmail());
$this->assertEquals('Administrator', $oMail->GetDisplayName());
$this->assertEquals('"Administrator" <admin@example.com>', $oMail->ToString());
$this->assertEquals(array('Administrator', 'admin@example.com', 'none', ''), $oMail->ToArray());
}
public function testNewInstance3()
{
$oMail = \MailSo\Mime\Email::NewInstance('admin@example.com', '');
$this->assertEquals('admin@example.com', $oMail->GetEmail());
$this->assertEquals('', $oMail->GetDisplayName());
$this->assertEquals('admin@example.com', $oMail->ToString());
$this->assertEquals(array('', 'admin@example.com', 'none', ''), $oMail->ToArray());
}
/**
* @expectedException \MailSo\Base\Exceptions\InvalidArgumentException
*/
public function testNewInstance4()
{
$oMail = \MailSo\Mime\Email::NewInstance('');
}
public function testParse1()
{
$oMail = \MailSo\Mime\Email::Parse('help@example.com');
$this->assertEquals('help@example.com', $oMail->GetEmail());
$oMail = \MailSo\Mime\Email::Parse('<help@example.com>');
$this->assertEquals('help@example.com', $oMail->GetEmail());
}
public function testParse2()
{
$oMail = \MailSo\Mime\Email::Parse('"Тест" <help@example.com>');
$this->assertEquals('"Тест" <help@example.com>', $oMail->ToString());
}
public static function providerForParse()
{
return array(
array('test <help@example.com>',
array('test', 'help@example.com')),
array('test<help@example.com>',
array('test', 'help@example.com')),
array('test< help@example.com >',
array('test', 'help@example.com')),
array('"New \" Admin" <help@example.com>',
array('New " Admin', 'help@example.com')),
array('"Тест" <help@example.com>',
array('Тест', 'help@example.com')),
array('Microsoft Outlook<MicrosoftExchange329e71ec88ae4615bbc36ab6ce41109e@PPTH.PRIVATE>',
array('Microsoft Outlook', 'MicrosoftExchange329e71ec88ae4615bbc36ab6ce41109e@ppth.private')),
);
}
public static function providerForParse2()
{
return array(
array('help@xn--d1abbgf6aiiy.xn--p1ai',
array('', 'help@президент.рф')),
);
}
/**
* @dataProvider providerForParse
*/
public function testParseWithProvider($sValue, $aResult)
{
$oMail = \MailSo\Mime\Email::Parse($sValue);
$this->assertEquals($aResult, $oMail->ToArray(false, false));
}
/**
* @dataProvider providerForParse2
*/
public function testParseWithProvider2($sValue, $aResult)
{
$oMail = \MailSo\Mime\Email::Parse($sValue);
$this->assertEquals($aResult, $oMail->ToArray(true, false));
}
/**
* @expectedException \MailSo\Base\Exceptions\InvalidArgumentException
*/
public function testParse5()
{
\MailSo\Mime\Email::Parse('');
}
/**
* @expectedException \MailSo\Base\Exceptions\InvalidArgumentException
*/
public function testParse6()
{
\MailSo\Mime\Email::Parse('example.com');
}
}

View file

@ -1,6 +0,0 @@
<?php
define('TEST_DATA_FOLDER', __DIR__.'/data');
$_ENV['RAINLOOP_INCLUDE_AS_API'] = true;
include __DIR__.'/../index.php';

View file

@ -1 +0,0 @@
123

View file

@ -1,11 +0,0 @@
<html>
<head>
<style type="text/css">
body {color:red}
p {margin:0; padding:0}
</style>
</head>
<body>
123
</body>
</html>

View file

@ -1 +0,0 @@
123

View file

@ -1,12 +0,0 @@
<html>
<head>
<style type="text/css">
body {color:red}
p {margin:0; padding:0}
</style>
</head>
<body>
123
<script>alert(1)</script>
</body>
</html>

View file

@ -1,232 +0,0 @@
MIME-Version: 1.0
Message-ID: <45a92f7.0e89f233c32fbd2b9d191d4cb28775c9@domain.com>
From: from@domain.com
To: test@domain.com
Subject: TEST HTML MESSAGE WITH ATTACHMENT
Date: Thu, 6 May 2010 07:26:37 -0700 (PDT)
Content-Type: multipart/mixed;
boundary="--=_NextPart_11de424d3d872ac110be4ecfffc45411"
----=_NextPart_11de424d3d872ac110be4ecfffc45411
Content-Type: text/html;
charset="utf-8"
Content-Transfer-Encoding: Quoted-Printable
<html><body>TEST HTML MESSAGE WITH ATTACHMENT</body></html>
----=_NextPart_11de424d3d872ac110be4ecfffc45411
Content-Type: image/gif;
name="av-7.gif"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="av-7.gif"
R0lGODdhMgAyAOfXAAAAADMAAGYAAJkAAMwAAP8AAAAzADMzAGYzAJkzAMwzAP8zAABmADNmAGZm
AJlmAMxmAP9mAACZADOZAGaZAJmZAMyZAP+ZAADMADPMAGbMAJnMAMzMAP/MAAD/ADP/AGb/AJn/
AMz/AP//AAAAMzMAM2YAM5kAM8wAM/8AMwAzMzMzM2YzM5kzM8wzM/8zMwBmMzNmM2ZmM5lmM8xm
M/9mMwCZMzOZM2aZM5mZM8yZM/+ZMwDMMzPMM2bMM5nMM8zMM//MMwD/MzP/M2b/M5n/M8z/M///
MwAAZjMAZmYAZpkAZswAZv8AZgAzZjMzZmYzZpkzZswzZv8zZgBmZjNmZmZmZplmZsxmZv9mZgCZ
ZjOZZmaZZpmZZsyZZv+ZZgDMZjPMZmbMZpnMZszMZv/MZgD/ZjP/Zmb/Zpn/Zsz/Zv//ZgAAmTMA
mWYAmZkAmcwAmf8AmQAzmTMzmWYzmZkzmcwzmf8zmQBmmTNmmWZmmZlmmcxmmf9mmQCZmTOZmWaZ
mZmZmcyZmf+ZmQDMmTPMmWbMmZnMmczMmf/MmQD/mTP/mWb/mZn/mcz/mf//mQAAzDMAzGYAzJkA
zMwAzP8AzAAzzDMzzGYzzJkzzMwzzP8zzABmzDNmzGZmzJlmzMxmzP9mzACZzDOZzGaZzJmZzMyZ
zP+ZzADMzDPMzGbMzJnMzMzMzP/MzAD/zDP/zGb/zJn/zMz/zP//zAAA/zMA/2YA/5kA/8wA//8A
/wAz/zMz/2Yz/5kz/8wz//8z/wBm/zNm/2Zm/5lm/8xm//9m/wCZ/zOZ/2aZ/5mZ/8yZ//+Z/wDM
/zPM/2bM/5nM/8zM///M/wD//zP//2b//5n//8z//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEA
AAAh+QQFCADYACwAAAAAMgAyAAAI/gCvCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzaswYiNVG
ioFWAAg0kOTHhitYsQJwjZVIKycXBoJ5jeXMa1ZMxjyYUyDLkddS7kTYM2RIn0MRCl0xk+TRpARV
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
IUMkPQhhTMlNSFBCRa12oEceJajhThKpZFNAADs=
----=_NextPart_11de424d3d872ac110be4ecfffc45411--

View file

@ -1,16 +0,0 @@
MIME-Version: 1.0
From: test@domain.com
To: test@domain.com
Subject: TEST MESSAGE
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit
Date: Wed, 28 Apr 2010 02:04:20 -0700
Message-ID: <16800462619664130307453@TEST-TEST>
TEST
.
. MESSGAE
BODY

View file

@ -1,18 +0,0 @@
Envelope-to: webmail@test.com
Delivery-date: Tue, 15 Jun 2010 22:48:56 -0700
Received: from [84.51.195.105] (helo=workstation5.dom2.local)
by mail.test.com with esmtpa (Exim 4.71)
(envelope-from <sss@test.com>)
id 1OOlUe-0002EQ-IJ
for webmail@test.com; Tue, 15 Jun 2010 22:48:56 -0700
Date: Wed, 16 Jun 2010 09:48:42 +0400
From: sss <sss@test.com>
X-Mailer: The Bat! (v4.0.24) Professional
Reply-To: sss <sss@test.com>
X-Priority: 3 (Normal)
Message-ID: <708372127.20100616094842@test.com>
To: webmail@test.com
Subject: =?iso-8859-5?B?v+DY4eLj39DvIA==?= =?iso-8859-5?B?2iDg0NHe4tUg4Q==?= =?iso-8859-5?B?3iDh2+PW0d7ZIA==?= =?iso-8859-5?B?V2luZG93cyBMaQ==?= =?iso-8859-5?B?dmUgSG90bWFpbA==?=
MIME-Version: 1.0
Content-Type: text/plain; charset=windows-1251
Content-Transfer-Encoding: 8bit

View file

@ -1,55 +0,0 @@
MIME-Version: 1.0
Message-ID: <45a92f7.0e89f233c32fbd2b9d191d4cb28775c9@domain.com>
From: from@domain.com
To: test@domain.com
Subject: TEST HTML MESSAGE WITH ATTACHMENT
Date: Thu, 6 May 2010 07:26:37 -0700 (PDT)
Content-Type: multipart/mixed;
boundary="--=_NextPart_11de424d3d872ac110be4ecfffc45411"
----=_NextPart_11de424d3d872ac110be4ecfffc45411
Content-Type: text/html;
charset="utf-8"
Content-Transfer-Encoding: Quoted-Printable
<html><body>TEST HTML MESSAGE WITH ATTACHMENT</body></html>
----=_NextPart_11de424d3d872ac110be4ecfffc45411
Content-Type: image/gif;
name="av-7.gif"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="av-7.gif"
R0lGODdhMgAyAOfXAAAAADMAAGYAAJkAAMwAAP8AAAAzADMzAGYzAJkzAMwzAP8zAABmADNmAGZm
AJlmAMxmAP9mAACZADOZAGaZAJmZAMyZAP+ZAADMADPMAGbMAJnMAMzMAP/MAAD/ADP/AGb/AJn/
AMz/AP//AAAAMzMAM2YAM5kAM8wAM/8AMwAzMzMzM2YzM5kzM8wzM/8zMwBmMzNmM2ZmM5lmM8xm
JkGbFiixJtrNgEcjNIo0ocmUcmc33Viyo9qSKnOzrTmx89CTGmUv5zm4NUiyPD02ZkVZtEvGnmVU
whaJcCZdn0/NYpzsPHxQkF/lPk0PNepOtFeFduwKVqPd2QZdB2BDOZk3oEObHeiQTAqG5l2DBHEH
IUMkPQhhTMlNSFBCRa12oEceJajhThKpZFNAADs=
----=_NextPart_11de424d3d872ac110be4ecfffc45411
Content-Type: image/gif;
Content-Transfer-Encoding: base64
R0lGODdhMgAyAOfXAAAAADMAAGYAAJkAAMwAAP8AAAAzADMzAGYzAJkzAMwzAP8zAABmADNmAGZm
AJlmAMxmAP9mAACZADOZAGaZAJmZAMyZAP+ZAADMADPMAGbMAJnMAMzMAP/MAAD/ADP/AGb/AJn/
AMz/AP//AAAAMzMAM2YAM5kAM8wAM/8AMwAzMzMzM2YzM5kzM8wzM/8zMwBmMzNmM2ZmM5lmM8xm
JkGbFiixJtrNgEcjNIo0ocmUcmc33Viyo9qSKnOzrTmx89CTGmUv5zm4NUiyPD02ZkVZtEvGnmVU
whaJcCZdn0/NYpzsPHxQkF/lPk0PNepOtFeFduwKVqPd2QZdB2BDOZk3oEObHeiQTAqG5l2DBHEH
IUMkPQhhTMlNSFBCRa12oEceJajhThKpZFNAADs=
----=_NextPart_11de424d3d872ac110be4ecfffc45411
Content-Type: image/png
Content-Transfer-Encoding: Quoted-Printable
Content-Disposition: attachment;
filename*0*=111; filename*1*=222.gif;
<html><body>TEST HTML MESSAGE WITH ATTACHMENT</body></html>
----=_NextPart_11de424d3d872ac110be4ecfffc45411--

View file

@ -1,55 +0,0 @@
From: alex1 <alex1@omninet.local>
To: alex1 <alex1@OMNINET.LOCAL>
Date: Thu, 22 Nov 2012 09:42:17 +0100
Subject:
-------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5----...
Thread-Topic:
-------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5---------1---------2---------3---------4---------5----...
Message-ID: <50ADE569.2000807@omninet.local>
Accept-Language: de-DE
Content-Language: de-DE
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20121026
Thunderbird/16.0.2
Content-Type: multipart/alternative;
boundary="_000_50ADE5692000807omninetlocal_"
MIME-Version: 1.0
--_000_50ADE5692000807omninetlocal_
Content-Type: text/plain; charset="iso-8859-15"
Content-Transfer-Encoding: quoted-printable
Test
-------1---------2---------3---------4---------5---------1---------2-------=
--3---------4---------5---------1---------2---------3---------4---------5--=
-------1---------2---------3---------4---------5---------1---------2-------=
--3---------4---------5---------1---------2---------3---------4---------5--
--_000_50ADE5692000807omninetlocal_
Content-Type: text/html; charset="iso-8859-15"
Content-Transfer-Encoding: quoted-printable
<html>
<head>
<meta http-equiv=3D"content-type" content=3D"text/html; charset=3DISO-8=
859-15">
</head>
<body bgcolor=3D"#FFFFFF" text=3D"#000000">
Test<br>
<meta http-equiv=3D"Content-Type" content=3D"text/html;
charset=3DISO-8859-15">
<span>-------1---------2---------3---------4---------5---------1-------=
--2---------3---------4---------5---------1---------2---------3---------4--=
-------5---------1---------2---------3---------4---------5---------1-------=
--2---------3---------4---------5---------1---------2---------3---------4--=
-------5--</span>
<title>HTML clipboard</title>
<meta http-equiv=3D"Content-Type" content=3D"text/html;
charset=3DISO-8859-15">
<title>HTML clipboard</title>
</body>
</html>
--_000_50ADE5692000807omninetlocal_--

View file

@ -1,6 +0,0 @@
# phantomjs
phantomjs --webdriver=4444
# codecept
codeceptjs run

View file

@ -1,18 +0,0 @@
var cfg = require('./configuration');
exports.config = {
"tests": "./tests/*_test.js",
"timeout": 10000,
"output": "./output",
"helpers": {
"WebDriverIO": {
"url": cfg.url,
"browser": "phantomjs"
}
},
"include": {},
"bootstrap": false,
"mocha": {},
"name": "RainLoop e2e tests"
};

View file

@ -1,6 +0,0 @@
module.exports = {
url: 'http://rainloop.domain.com/',
user: 'user"domain.com',
pass: '12345'
};

View file

@ -1,30 +0,0 @@
Feature('login');
Before(function(I) {
I.amOnPage('/');
I.resizeWindow(1000, 1000);
I.waitForElement('.e-powered', 10);
});
Scenario('login/page', function(I) {
I.see('Powered by RainLoop', '.e-powered');
I.see('Remember Me');
});
Scenario('login/auth-error', function(I) {
I.fillField('.inputEmail', 'xxx');
I.fillField('.inputPassword', 'yyy');
I.click('.login-submit-icon');
I.waitForVisible('.alertError', 3);
I.see('Authentication failed', '.alertError');
});
Scenario('login/language-popup', function(I) {
I.click('.flag-name');
I.wait(1);
I.see('Choose your language', '.b-languages-content');
I.click('.close', '.b-languages-content');
I.wait(1);
I.dontSee('Choose your language');
});

View file

@ -1,25 +0,0 @@
var cfg = require('../configuration');
Feature('mailbox');
Before((I) => {
I.amOnPage('/');
I.resizeWindow(1000, 1000);
I.waitForElement('.e-powered', 10);
I.fillField('.inputEmail', cfg.user);
I.fillField('.inputPassword', cfg.pass);
I.click('.login-submit-icon');
I.waitForText('test@rainloop.de', 10, '.accountPlace');
I.resizeWindow(1000, 1000);
});
Scenario('mailbox/main', (I) => {
I.see('Select message in list to view it here.');
I.see('Inbox', '.b-folders-system');
I.click('#top-system-dropdown-id');
I.see('Logout', '.RL-SystemDropDown');
I.click('Logout', '.RL-SystemDropDown');
I.waitForText('Powered by RainLoop', 10, '.e-powered');
});

View file

@ -1,40 +1,46 @@
const path = require('path');
const webpack = require('webpack');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const
path = require('path'),
webpack = require('webpack'),
CopyWebpackPlugin = require('copy-webpack-plugin'),
devPath = path.resolve(__dirname, 'dev'),
devPathJoin = path.join(__dirname, 'dev'),
externalPathJoin = path.join(__dirname, 'dev', 'External'),
loose = true;
const devPath = path.resolve(__dirname, 'dev');
const devPathJoin = path.join(__dirname, 'dev');
const externalPathJoin = path.join(__dirname, 'dev', 'External');
const loose = true;
const babelLoaderOptions = function() {
return {
ignore: [
/\/core-js/
],
ignore: [/\/core-js/],
cacheDirectory: true,
overrides: [{
test: './node_modules/',
sourceType: 'unambiguous'
}],
overrides: [
{
test: './node_modules/',
sourceType: 'unambiguous'
}
],
presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: {version: 3, proposals: true},
loose: loose,
modules: false
}]
[
'@babel/preset-env',
{
useBuiltIns: 'usage',
corejs: { version: 3, proposals: true },
loose: loose,
modules: false
}
]
],
plugins: [
['@babel/plugin-transform-runtime', {
corejs: 3
}],
['@babel/plugin-proposal-decorators', {
legacy: true
}],
[
'@babel/plugin-transform-runtime',
{
corejs: 3
}
],
[
'@babel/plugin-proposal-decorators',
{
legacy: true
}
],
'@babel/plugin-proposal-class-properties'
]
};
@ -44,6 +50,7 @@ process.noDeprecation = true;
module.exports = function(publicPath, pro, mode) {
return {
mode: mode || 'development',
devtool: 'inline-source-map',
entry: {
'js/polyfills': path.join(devPathJoin, 'polyfills.js'),
'js/boot': path.join(devPathJoin, 'boot.js'),
@ -71,11 +78,10 @@ module.exports = function(publicPath, pro, mode) {
NODE_ENV: JSON.stringify('production')
}
}),
new webpack.DefinePlugin({
}),
new webpack.DefinePlugin({}),
new CopyWebpackPlugin([
{from: 'node_modules/openpgp/dist/openpgp.min.js', to: 'js/min/openpgp.min.js'},
{from: 'node_modules/openpgp/dist/openpgp.worker.min.js', to: 'js/min/openpgp.worker.min.js'}
{ from: 'node_modules/openpgp/dist/openpgp.min.js', to: 'js/min/openpgp.min.js' },
{ from: 'node_modules/openpgp/dist/openpgp.worker.min.js', to: 'js/min/openpgp.worker.min.js' }
])
],
resolve: {

View file

@ -1,2 +1 @@
module.exports = require('./webpack.config.builder')();

234
yarn.lock
View file

@ -720,6 +720,25 @@
lodash "^4.17.11"
to-fast-properties "^2.0.0"
"@gulp-sourcemaps/identity-map@1.X":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz#1e6fe5d8027b1f285dc0d31762f566bccd73d5a9"
integrity sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==
dependencies:
acorn "^5.0.3"
css "^2.2.1"
normalize-path "^2.1.1"
source-map "^0.6.0"
through2 "^2.0.3"
"@gulp-sourcemaps/map-sources@1.X":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda"
integrity sha1-iQrnxdjId/bThIYCFazp1+yUW9o=
dependencies:
normalize-path "^2.0.1"
through2 "^2.0.3"
"@types/minimatch@^3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
@ -892,6 +911,11 @@ acorn-jsx@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e"
acorn@5.X, acorn@^5.0.3:
version "5.7.3"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
acorn@^6.0.5:
version "6.0.6"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.6.tgz#cd75181670d5b99bdb1b1c993941d3a239ab1f56"
@ -1822,7 +1846,7 @@ continuable-cache@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f"
convert-source-map@^1.1.0, convert-source-map@^1.5.0:
convert-source-map@1.X, convert-source-map@^1.1.0, convert-source-map@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
dependencies:
@ -1968,6 +1992,16 @@ css-loader@3.0.0:
postcss-value-parser "^4.0.0"
schema-utils "^1.0.0"
css@2.X, css@^2.2.1:
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"
@ -1998,18 +2032,27 @@ dateformat@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
debug-fabulous@1.X:
version "1.1.0"
resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e"
integrity sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==
dependencies:
debug "3.X"
memoizee "0.4.X"
object-assign "4.X"
debug@3.X, debug@^3.1.0:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
dependencies:
ms "^2.1.1"
debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
ms "2.0.0"
debug@^3.1.0:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
dependencies:
ms "^2.1.1"
debug@^4.0.1, debug@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
@ -2099,6 +2142,11 @@ detect-libc@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
detect-newline@2.X:
version "2.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@ -2246,7 +2294,7 @@ error@^7.0.0:
string-template "~0.2.1"
xtend "~4.0.0"
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14:
es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
version "0.10.50"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778"
integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==
@ -2272,7 +2320,7 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.1:
d "1"
es5-ext "~0.10.14"
es6-weak-map@^2.0.1:
es6-weak-map@^2.0.1, es6-weak-map@^2.0.2:
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==
@ -2286,6 +2334,20 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
eslint-config-prettier@6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz#f429a53bde9fc7660e6353910fd996d6284d3c25"
integrity sha512-vDrcCFE3+2ixNT5H83g28bO/uYAwibJxerXPj+E7op4qzBCsAV36QfvdAyVOoNxKAH2Os/e01T/2x++V0LPukA==
dependencies:
get-stdin "^6.0.0"
eslint-plugin-prettier@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz#8695188f95daa93b0dc54b249347ca3b79c4686d"
integrity sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==
dependencies:
prettier-linter-helpers "^1.0.0"
eslint-scope@3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
@ -2390,6 +2452,14 @@ esutils@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
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"
event-stream@3.3.4:
version "3.3.4"
resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
@ -2508,6 +2578,11 @@ fast-deep-equal@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
fast-diff@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
fast-json-stable-stringify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
@ -2759,6 +2834,11 @@ get-caller-file@^2.0.1:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
get-stdin@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
get-stream@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
@ -2895,7 +2975,7 @@ glogg@^1.0.0:
dependencies:
sparkles "^1.0.0"
graceful-fs@^4.0.0, graceful-fs@^4.1.6:
graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.6:
version "4.2.0"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b"
integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==
@ -2904,10 +2984,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2:
version "4.1.15"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
growly@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
gulp-autoprefixer@6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-6.1.0.tgz#5f7f78468fe99a589ce353fa5891b7bee16b8f1e"
@ -3106,6 +3182,23 @@ gulp-size@3.0.0:
stream-counter "^1.0.0"
through2 "^2.0.0"
gulp-sourcemaps@2.6.5:
version "2.6.5"
resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz#a3f002d87346d2c0f3aec36af7eb873f23de8ae6"
integrity sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==
dependencies:
"@gulp-sourcemaps/identity-map" "1.X"
"@gulp-sourcemaps/map-sources" "1.X"
acorn "5.X"
convert-source-map "1.X"
css "2.X"
debug-fabulous "1.X"
detect-newline "2.X"
graceful-fs "4.X"
source-map "~0.6.0"
strip-bom-string "1.X"
through2 "2.X"
gulp-stripbom@1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/gulp-stripbom/-/gulp-stripbom-1.0.4.tgz#58c1d03e85e008a7aab47d81b1297c8c1bc828eb"
@ -3575,7 +3668,7 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
is-promise@^2.1.0:
is-promise@^2.1, is-promise@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
@ -3612,10 +3705,6 @@ is-windows@^1.0.1, is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
is-wsl@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@ -3802,6 +3891,7 @@ knockout-transformations@2.1.0:
knockout@3.4.2:
version "3.4.2"
resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.4.2.tgz#e87958de77ad1e936f7ce645bab8b5d7c456d937"
integrity sha1-6HlY3netHpNvfOZFuri118RW2Tc=
last-run@^1.1.0:
version "1.1.1"
@ -4101,6 +4191,13 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
lru-queue@0.1:
version "0.1.0"
resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=
dependencies:
es5-ext "~0.10.2"
make-dir@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
@ -4190,6 +4287,20 @@ mem@^4.0.0:
mimic-fn "^1.0.0"
p-is-promise "^2.0.0"
memoizee@0.4.X:
version "0.4.14"
resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57"
integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==
dependencies:
d "1"
es5-ext "^0.10.45"
es6-weak-map "^2.0.2"
event-emitter "^0.3.5"
is-promise "^2.1"
lru-queue "0.1"
next-tick "1"
timers-ext "^0.1.5"
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"
@ -4399,7 +4510,7 @@ neo-async@^2.5.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835"
next-tick@^1.0.0:
next-tick@1, next-tick@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
@ -4453,16 +4564,6 @@ node-localstorage@~1.3.0:
dependencies:
write-file-atomic "^1.1.4"
node-notifier@5.4.0:
version "5.4.0"
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a"
dependencies:
growly "^1.3.0"
is-wsl "^1.1.0"
semver "^5.5.0"
shellwords "^0.1.1"
which "^1.3.0"
node-pre-gyp@^0.10.0:
version "0.10.3"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
@ -4518,7 +4619,7 @@ normalize-package-data@^2.3.2:
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
normalize-path@^2.1.1:
normalize-path@^2.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"
dependencies:
@ -4581,14 +4682,14 @@ oauth-sign@~0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
object-assign@4.X, object-assign@^4.0.1, object-assign@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
object-assign@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
object-assign@^4.0.1, object-assign@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
object-copy@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
@ -5029,6 +5130,18 @@ prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
prettier-linter-helpers@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
dependencies:
fast-diff "^1.1.2"
prettier@1.18.2:
version "1.18.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
pretty-bytes@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
@ -5505,14 +5618,6 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
run-sequence@2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/run-sequence/-/run-sequence-2.2.1.tgz#1ce643da36fd8c7ea7e1a9329da33fc2b8898495"
dependencies:
chalk "^1.1.3"
fancy-log "^1.3.2"
plugin-error "^0.1.2"
rxjs@^6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504"
@ -5621,10 +5726,6 @@ shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
shellwords@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@ -5680,7 +5781,7 @@ 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"
source-map-resolve@^0.5.0:
source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
dependencies:
@ -5916,6 +6017,11 @@ strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
strip-bom-string@1.X:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=
strip-bom@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
@ -6040,6 +6146,13 @@ through2-filter@^3.0.0:
through2 "~2.0.0"
xtend "~4.0.0"
through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0:
version "2.0.5"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
dependencies:
readable-stream "~2.3.6"
xtend "~4.0.1"
through2@3.0.1, through2@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a"
@ -6054,13 +6167,6 @@ through2@^0.5.1:
readable-stream "~1.0.17"
xtend "~3.0.0"
through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0:
version "2.0.5"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
dependencies:
readable-stream "~2.3.6"
xtend "~4.0.1"
through2@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.0.tgz#468b461df9cd9fcc170f22ebf6852e467e578ff2"
@ -6089,6 +6195,14 @@ timers-browserify@^2.0.4:
dependencies:
setimmediate "^1.0.4"
timers-ext@^0.1.5:
version "0.1.7"
resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
dependencies:
es5-ext "~0.10.46"
next-tick "1"
tiny-lr@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab"
@ -6491,10 +6605,10 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0:
source-list-map "^2.0.0"
source-map "~0.6.1"
webpack@4.35.0:
version "4.35.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.35.0.tgz#ad3f0f8190876328806ccb7a36f3ce6e764b8378"
integrity sha512-M5hL3qpVvtr8d4YaJANbAQBc4uT01G33eDpl/psRTBCfjxFTihdhin1NtAKB1ruDwzeVdcsHHV3NX+QsAgOosw==
webpack@4.35.2:
version "4.35.2"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.35.2.tgz#5c8b8a66602cbbd6ec65c6e6747914a61c1449b1"
integrity sha512-TZAmorNymV4q66gAM/h90cEjG+N3627Q2MnkSgKlX/z3DlNVKUtqy57lz1WmZU2+FUZwzM+qm7cGaO95PyrX5A==
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-module-context" "1.8.5"
@ -6545,7 +6659,7 @@ which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1:
which@^1.2.14, which@^1.2.9, which@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
dependencies: