This commit is contained in:
crusader 2018-03-18 00:03:13 +09:00
parent b5fd2de001
commit bd8104ffe2
61 changed files with 1034 additions and 190 deletions

View File

@ -1,12 +1,12 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"project": {
"name": "js"
"name": "example-app"
},
"apps": [
{
"root": "src",
"outDir": "dist",
"root": "example-app",
"outDir": "example-dist",
"assets": [
"assets",
"favicon.ico"
@ -17,7 +17,7 @@
"test": "test.ts",
"tsconfig": "tsconfig.app.json",
"testTsconfig": "tsconfig.spec.json",
"prefix": "app",
"prefix": "of",
"styles": [
"styles.css"
],
@ -36,11 +36,11 @@
},
"lint": [
{
"project": "src/tsconfig.app.json",
"project": "example-app/tsconfig.app.json",
"exclude": "**/node_modules/**"
},
{
"project": "src/tsconfig.spec.json",
"project": "example-app/tsconfig.spec.json",
"exclude": "**/node_modules/**"
},
{
@ -54,7 +54,7 @@
}
},
"defaults": {
"styleExt": "css",
"styleExt": "scss",
"component": {}
}
}

View File

@ -0,0 +1,12 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule, PreloadAllModules } from '@angular/router';
const routes: Routes = [
{ path: 'auth', loadChildren: './pages/auth/auth-page.module#AuthPageModule' },
];
@NgModule({
imports: [RouterModule.forRoot(routes, {useHash: true, preloadingStrategy: PreloadAllModules})],
exports: [RouterModule],
})
export class AppRoutingModule { }

View File

@ -0,0 +1,23 @@
import { NgModule } from '@angular/core';
import { StoreModule, combineReducers, ActionReducer, ActionReducerMap, MetaReducer } from '@ngrx/store';
import { environment } from '../environments/environment';
import {
NgRxStoreModule,
} from '@loafer/ngrx-store';
@NgModule({
exports: [
StoreModule,
],
imports: [
StoreModule.forRoot({}),
NgRxStoreModule,
],
providers: [
],
})
export class AppStoreModule { }

View File

@ -0,0 +1 @@
<router-outlet></router-outlet>

View File

@ -1,16 +1,21 @@
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppStoreModule } from './app-store.module';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
AppComponent,
],
imports: [
BrowserModule
BrowserModule,
AppRoutingModule,
AppStoreModule,
],
providers: [],
bootstrap: [AppComponent]

View File

@ -0,0 +1,23 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { AuthPageComponent } from './auth-page.component';
import { SigninPageComponent } from './signin/signin-page.component';
const routes: Routes = [
{
path: '',
component: AuthPageComponent,
children: [
{ path: '', redirectTo: 'signin' },
{ path: 'signin', component: SigninPageComponent },
]
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class AuthPageRoutingModule { }

View File

@ -0,0 +1 @@
<router-outlet></router-outlet>

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AuthPageComponent } from './auth-page.component';
describe('AuthPageComponent', () => {
let component: AuthPageComponent;
let fixture: ComponentFixture<AuthPageComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AuthPageComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AuthPageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,15 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'of-pages-auth',
templateUrl: './auth-page.component.html',
styleUrls: ['./auth-page.component.scss']
})
export class AuthPageComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}

View File

@ -0,0 +1,24 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MemberModule } from '../../../packages/member/member.module';
import { AuthPageComponent } from './auth-page.component';
import { AuthPageRoutingModule } from './auth-page-routing.module';
import { SigninPageComponent } from './signin/signin-page.component';
export const COMPONENTS = [
AuthPageComponent,
SigninPageComponent,
];
@NgModule({
imports: [
CommonModule,
AuthPageRoutingModule,
MemberModule,
],
declarations: COMPONENTS,
})
export class AuthPageModule { }

View File

@ -0,0 +1,12 @@
<div fxLayout="column" fxFlexFill fxLayoutAlign="center center" style="background-image:url('../../../../../assets/images/login11.jpg');
margin-top: 10px;
height: 100%;
background-repeat: no-repeat;
background-position: center;
background-size: cover; ">
<div fxLayout="column" >
<div class=" mat-elevation-z4">
<of-member-signin></of-member-signin>
</div>
</div>
</div>

View File

@ -0,0 +1,9 @@
.signin-form {
min-width: 150px;
max-width: 500px;
width: 100%;
}
.signin-full-width {
width: 100%;
}

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { SigninPageComponent } from './signin-page.component';
describe('SigninPageComponent', () => {
let component: SigninPageComponent;
let fixture: ComponentFixture<SigninPageComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SigninPageComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SigninPageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,25 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Form, FormBuilder, FormGroup, FormGroupDirective, FormControl, NgForm, Validators } from '@angular/forms';
import { ErrorStateMatcher } from '@angular/material/core';
@Component({
selector: 'of-pages-auth-signin',
templateUrl: './signin-page.component.html',
styleUrls: ['./signin-page.component.scss'],
})
export class SigninPageComponent implements OnInit {
constructor(
private router: Router,
private activatedRoute: ActivatedRoute,
) { }
ngOnInit() {
}
initForm() {
}
}

View File

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -0,0 +1 @@
<div>works</div>

View File

@ -0,0 +1,37 @@
$gray-lighter: #eceeef !default;
$image_path: "/assets/images/" !default;
$prefix: 'sigin';
.#{$prefix} {
&-conainer {
min-height: 100%;
background-size: cover;
padding: 100px;
}
&-main {
position: relative;
margin: 0 auto;
width: 500px;
}
}
.full-width {
width: 100%;
}
.help {
}
.is-danger {
}
.redirect {
font-size: 14px;
margin-left: 10px;
color: #00AAAA;
}

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { SigninComponent } from './signin.component';
describe('SigninComponent', () => {
let component: SigninComponent;
let fixture: ComponentFixture<SigninComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SigninComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SigninComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,39 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { Store, select } from '@ngrx/store';
import { State } from '../../store/auth.state';
@Component({
selector: 'of-member-signin',
templateUrl: './signin.component.html',
styleUrls: ['./signin.component.scss']
})
export class SigninComponent implements OnInit {
constructor(
private activatedRoute: ActivatedRoute,
private router: Router,
private store: Store<State>,
) {
}
ngOnInit() {
this.initForm();
}
initForm() {
}
resetPasswordBtnClick() {
this.router.navigateByUrl('/auth/reset-password');
}
signupBtnClick() {
this.router.navigateByUrl('/auth/signup');
}
signin() {
}
}

View File

@ -0,0 +1,27 @@
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import {
NgRxStoreModule,
} from '@loafer/ngrx-store';
import { SigninComponent } from './component/signin/signin.component';
import { MemberService } from './service/member.service';
import { AuthStore } from './store/auth.store';
@NgModule({
declarations: [
SigninComponent
],
exports: [
SigninComponent,
],
imports: [
NgRxStoreModule.forFeature('member'),
],
providers: [
MemberService,
AuthStore
]
})
export class MemberModule { }

View File

@ -0,0 +1,24 @@
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
import 'rxjs/add/operator/map';
@Injectable()
export class MemberService {
public constructor(
) {
}
public signin(email: string, password: string): Observable<any> {
const body = {
signinId: email,
signinPw: password,
};
const subject: Subject<any> = new Subject();
return subject;
}
}

View File

@ -0,0 +1,25 @@
import { Action } from '@ngrx/store';
export enum ActionType {
Signin = '[member.auth] Signin',
SigninSuccess = '[member.auth] SigninSuccess',
SigninFailure = '[member.auth] SigninFailure',
}
export class Signin implements Action {
readonly type = ActionType.Signin;
constructor(public payload: {email: string, password: string, returnURL: string}) {}
}
export class SigninSuccess implements Action {
readonly type = ActionType.SigninSuccess;
constructor(public payload: any) {}
}
export class SigninFailure implements Action {
readonly type = ActionType.SigninFailure;
constructor(public payload: any) {}
}

View File

@ -0,0 +1,9 @@
export interface State {
signined: boolean;
pending: boolean;
}
export const initialState: State = {
signined: false,
pending: false,
};

View File

@ -0,0 +1,59 @@
import { Actions } from '@ngrx/effects';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/map';
import {
Store,
Action,
Effect,
ofAction,
} from '@loafer/ngrx-store';
import {
Signin,
SigninSuccess,
SigninFailure,
} from './auth.action';
import {
State,
initialState,
} from './auth.state';
import { MemberService } from '../service/member.service';
@Store(initialState)
export class AuthStore {
public constructor(
private actions$: Actions,
private memberService: MemberService,
) {
}
@Action(Signin)
signin(state: State, action: Signin) {
}
@Action(SigninSuccess)
signinSuccess(state: State, action: SigninSuccess) {
}
@Action(SigninFailure)
signinFailure(state: State, action: SigninFailure) {
}
@Effect(Signin)
signinEffect(state: State, { payload }: Signin) {
this.memberService.signin(payload.email, payload.password)
.map((result: any) => {
});
}
}

View File

@ -4,6 +4,12 @@
"outDir": "../out-tsc/app",
"baseUrl": "./",
"module": "es2015",
"paths": {
"@loafer/ngrx-store": [
"../modules/ngrx-store"
]
},
"rootDir": "../",
"types": []
},
"exclude": [

View File

@ -0,0 +1,2 @@
export * from './public_api';

View File

@ -0,0 +1,28 @@
{
"name": "@loafer/ngrx-store",
"version": "0.0.1",
"module": "@loafer/ngrx-store.es5.js",
"es2015": "@loafer/ngrx-store.js",
"main": "bundles/ngrx-store.umd.js",
"typings": "ngrx-store.d.ts",
"repository": {
"type": "git",
"url": "https://git.loafle.net/loafer/js.git"
},
"keywords": [
"RxJS",
"Angular",
"Redux"
],
"author": "Rob Wormald <robwormald@gmail.com>",
"license": "MIT",
"bugs": {
"url": "https://www.loafle.com"
},
"homepage": "https://www.loafle.com",
"peerDependencies": {
"@angular/core": "^5.0.0",
"@ngrx/store": "^5.2.0",
"rxjs": "^5.5.0"
}
}

View File

@ -0,0 +1,15 @@
export { NgRxStoreModule } from './src/ngrx-store.module';
export {
createReducer,
ofAction,
} from './src/core';
export {
Action,
Effect,
Store,
Select,
} from './src/decorator';
export {
NgRxStoreSelect,
} from './src/service';

View File

@ -0,0 +1,56 @@
import { Action } from '@ngrx/store';
import { take, materialize } from 'rxjs/operators';
import { NGRX_STORE_META, StoreMetadata } from './meta-data';
import { NgRxStoreSelect } from '../service';
export function createReducer<State = any>(
store: | {new (...args: any[]): any} | any
): (state: State, action: Action | any) => State {
const isInstance = !store.prototype;
const clazz = isInstance ? store.constructor : store;
if (!clazz.hasOwnProperty(NGRX_STORE_META)) {
throw new Error('A reducer can be created from a @Store decorated class only.');
}
const instance = isInstance ? store : new store();
const { initialState, actions, effects } = clazz[NGRX_STORE_META] as StoreMetadata;
return function(state: any = initialState, action: Action) {
const actionMeta = actions[action.type];
if (actionMeta) {
const result = instance[actionMeta.methodName](state, action);
if (result === undefined) {
if (Array.isArray(state)) {
return [...state];
} else {
return { ...state };
}
}
state = result;
}
const effectMeta = effects[action.type];
if (effectMeta) {
const retVal = instance[effectMeta.methodName](state, action);
if (retVal) {
if (retVal.subscribe) {
retVal.pipe(materialize()).subscribe((res: any) => {
if (res.value && NgRxStoreSelect.store) {
NgRxStoreSelect.store.dispatch(res.value);
}
});
} else if (NgRxStoreSelect.store) {
if (Array.isArray(retVal)) {
retVal.forEach(r => NgRxStoreSelect.store && NgRxStoreSelect.store.dispatch(r));
} else {
NgRxStoreSelect.store.dispatch(retVal);
}
}
}
}
return state;
};
}

View File

@ -0,0 +1,6 @@
export * from './factory';
export * from './meta-data';
export * from './of-action';
export * from './token';
export * from './type';

View File

@ -0,0 +1,28 @@
import { ActionType } from './type';
export const NGRX_STORE_META = '__ngrx__store__';
export interface StoreMetadata {
initialState?: any;
actions: ActionsMeta;
effects: ActionsMeta;
}
export interface ActionMeta {
action: ActionType;
methodName: string;
type: string;
}
export interface ActionsMeta {
[type: string]: ActionMeta;
}
export function ensureStoreMetadata(target: any): StoreMetadata {
// see https://github.com/angular/angular/blob/master/packages/core/src/util/decorators.ts#L60
if (!target.hasOwnProperty(NGRX_STORE_META)) {
const defaultMetadata: StoreMetadata = { actions: {}, effects: {} };
Object.defineProperty(target, NGRX_STORE_META, { value: defaultMetadata });
}
return target[NGRX_STORE_META];
}

View File

@ -0,0 +1,15 @@
import { Action } from '@ngrx/store';
import { filter } from 'rxjs/operators';
import { OperatorFunction } from 'rxjs/interfaces';
import { ActionType } from './type';
export function ofAction<T extends Action>(allowedType: ActionType<T>): OperatorFunction<Action, T>;
export function ofAction<T extends Action>(...allowedTypes: ActionType[]): OperatorFunction<Action, T>;
export function ofAction(...allowedTypes: ActionType[]): OperatorFunction<Action, Action> {
const allowedMap: {[key: string]: any} = {};
allowedTypes.forEach(clazz => (allowedMap[new clazz().type] = true));
return filter((action: Action) => {
return allowedMap[action.type];
});
}

View File

@ -0,0 +1,4 @@
import { InjectionToken } from '@angular/core';
export const _STORE = new InjectionToken<any>('@loafer/ngrx-store Internal Store');
export const _STORE_FEATURE = new InjectionToken<any>('@loafer/ngrx-store Internal Store Features');

View File

@ -0,0 +1,5 @@
import { Action } from '@ngrx/store';
export interface ActionType<T extends Action = Action> {
new (...args: any[]): T;
}

View File

@ -0,0 +1,27 @@
import {
ActionType,
ensureStoreMetadata,
} from '../core';
export function Action(...actionsClasses: ActionType[]) {
return function(target: any, name: string, descriptor: TypedPropertyDescriptor<any>) {
const meta = ensureStoreMetadata(target.constructor);
for (const clazz of actionsClasses) {
const inst = new clazz();
const type = inst.type;
if (meta.actions[type]) {
throw new Error(
`@Action for '${type}' is defined multiple times in functions '${meta.actions[type].methodName}' and '${name}'`
);
}
meta.actions[type] = {
action: clazz,
methodName: name,
type
};
}
};
}

View File

@ -0,0 +1,27 @@
import {
ActionType,
ensureStoreMetadata,
} from '../core';
export function Effect(...effectClasses: ActionType[]) {
return function(target: any, name: string, descriptor: TypedPropertyDescriptor<any>) {
const meta = ensureStoreMetadata(target.constructor);
for (const clazz of effectClasses) {
const inst = new clazz();
const type = inst.type;
if (meta.effects[type]) {
throw new Error(
`@Effect for '${type}' is defined multiple times in functions '${meta.effects[type].methodName}' and '${name}'`
);
}
meta.effects[type] = {
action: clazz,
methodName: name,
type
};
}
};
}

View File

@ -0,0 +1,4 @@
export * from './action';
export * from './effect';
export * from './select';
export * from './store';

View File

@ -0,0 +1,76 @@
import { Selector } from '@ngrx/store';
import { NgRxStoreSelect } from '../service';
/**
* Slice state from the store.
*/
export function Select<State = any, Value = any>(selector: Selector<State, Value>): (target: any, name: string) => void;
export function Select<State = any, Value = any>(selectorOrFeature?: string, ...paths: string[]): (target: any, name: string) => void;
export function Select<State = any, Value = any>(selectorOrFeature?: string | Selector<State, Value>, ...paths: string[]) {
return function(target: any, name: string): void {
const selectorFnName = '__' + name + '__selector';
let fn: Selector<State, Value>;
// Nothing here? Use propery name as selector
if (!selectorOrFeature) {
selectorOrFeature = name;
}
// Handle string vs Selector<TState, TValue>
if (typeof selectorOrFeature === 'string') {
const propsArray = paths.length ? [selectorOrFeature, ...paths] : selectorOrFeature.split('.');
fn = fastPropGetter(propsArray);
} else {
fn = selectorOrFeature;
}
const createSelect = () => {
const store = NgRxStoreSelect.store;
if (!store) {
throw new Error('NgRxStoreSelect not connected to store!');
}
return store.select(fn);
};
if (target[selectorFnName]) {
throw new Error('You cannot use @Select decorator and a ' + selectorFnName + ' property.');
}
// Redefine property
if (delete target[name]) {
Object.defineProperty(target, selectorFnName, {
writable: true,
enumerable: false,
configurable: true
});
Object.defineProperty(target, name, {
get: function() {
return target[selectorFnName] || (target[selectorFnName] = createSelect.apply(target));
// return this[selectorFnName] || (this[selectorFnName] = createSelect.apply(this));
},
enumerable: true,
configurable: true
});
}
};
}
/**
* The generated function is faster than:
* - pluck (Observable operator)
* - memoize (old ngrx-actions implementation)
* - MemoizedSelector (ngrx)
*/
export function fastPropGetter(paths: string[]): (x: any) => any {
const segments = paths;
let seg = 'store.' + segments[0],
i = 0;
const l = segments.length;
let expr = seg;
while (++i < l) {
expr = expr + ' && ' + (seg = seg + '.' + segments[i]);
}
const fn = new Function('store', 'return ' + expr + ';');
return <(x: any) => any>fn;
}

View File

@ -0,0 +1,12 @@
import {
ensureStoreMetadata,
} from '../core';
export function Store<State>(initialState?: State): (target: Function) => void;
export function Store(initialState?: any): (target: Function) => void;
export function Store(initialState: any = {}) {
return function(target: Function) {
const meta = ensureStoreMetadata(target);
meta.initialState = initialState;
};
}

View File

@ -0,0 +1,101 @@
import {
NgModule,
Inject,
Optional,
ModuleWithProviders,
OnDestroy,
InjectionToken,
Injector,
} from '@angular/core';
import {
StoreModule,
Store,
combineReducers,
ReducerManager,
} from '@ngrx/store';
import {
_STORE,
_STORE_FEATURE,
createReducer,
} from './core';
import { NgRxStoreSelect } from './service';
@NgModule({
imports: [
StoreModule,
],
providers: [
NgRxStoreSelect,
],
})
export class NgRxStoreModule {
static forRoot(reducers: any): ModuleWithProviders {
return {
ngModule: NgRxStoreModule,
providers: [
{ provide: _STORE, useValue: reducers },
],
};
}
static forFeature(featureName: string, reducers?: any): ModuleWithProviders {
return {
ngModule: NgRxStoreModule,
providers: [
{ provide: _STORE_FEATURE, useValue: { featureName, reducers } },
],
};
}
constructor(
@Optional() @Inject(_STORE) reducers: any,
@Optional() @Inject(_STORE_FEATURE) featureReducers: any,
reducerFactory: ReducerManager,
store: Store<any>,
parentInjector: Injector,
select: NgRxStoreSelect,
) {
select.connect(store);
if (reducers) {
for (const key in reducers) {
if (!reducers.hasOwnProperty(key)) {
continue;
}
const clazz = reducers[key];
const inst = parentInjector.get(clazz, new clazz());
reducerFactory.addReducer(key, createReducer(inst));
}
}
if (featureReducers) {
if (typeof featureReducers.key !== 'string') {
featureReducers.reducers = featureReducers.key;
featureReducers.key = undefined;
}
const mapped: {[key: string]: any} = {};
for (const key in featureReducers.reducers) {
if (!featureReducers.reducers.hasOwnProperty(key)) {
continue;
}
const clazz = featureReducers.reducers[key];
const inst = parentInjector.get(clazz, new clazz());
mapped[key] = createReducer(inst);
}
if (featureReducers.key) {
reducerFactory.addFeature({
reducers: mapped,
reducerFactory: <any>combineReducers,
key: featureReducers.key
});
}
}
}
}

View File

@ -0,0 +1 @@
export * from './ngrx-store-select';

View File

@ -0,0 +1,11 @@
import { Injectable } from '@angular/core';
import { Store } from '@ngrx/store';
@Injectable()
export class NgRxStoreSelect {
static store: Store<any> | undefined = undefined;
connect(store: Store<any>) {
NgRxStoreSelect.store = store;
}
}

View File

@ -0,0 +1,32 @@
{
"compilerOptions": {
"baseUrl": ".",
"declaration": true,
"experimentalDecorators": true,
"inlineSources": true,
"lib": [
"es2015",
"dom"
],
"module": "es2015",
"moduleResolution": "node",
"outDir": "../../dist/packages/ngrx-store",
"paths": { },
"rootDir": ".",
"skipLibCheck": true,
"strict": true,
"stripInternal": true,
"sourceMap": true,
"target": "es2015"
},
"files": [
"public_api.ts"
],
"angularCompilerOptions": {
"annotateForClosureCompiler": true,
"strictMetadataEmit": true,
"flatModuleOutFile": "index.js",
"flatModuleId": "@loafer/ngrx-store"
}
}

View File

@ -1,38 +1,46 @@
{
"name": "js",
"version": "0.0.0",
"name": "@loafer/js",
"version": "0.0.1",
"license": "MIT",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build --prod",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
"build": "ts-node ./build/index.ts",
"deploy:builds": "ts-node ./build/deploy-build.ts",
"test:unit": "node ./tests.js",
"test": "nyc yarn run test:unit",
"clean": "git clean -xdf && yarn && yarn run bootstrap",
"cli": "ng",
"example:start": "yarn run cli serve"
},
"engines": {
"node": ">=8.6.0",
"npm": ">=5.3.0",
"yarn": ">=1.3.0 <2.0.0"
},
"private": true,
"dependencies": {
"@angular/cdk": "^5.2.0"
},
"devDependencies": {
"@angular/animations": "^5.2.0",
"@angular/cli": "1.6.5",
"@angular/common": "^5.2.0",
"@angular/compiler": "^5.2.0",
"@angular/compiler-cli": "^5.2.0",
"@angular/core": "^5.2.0",
"@angular/forms": "^5.2.0",
"@angular/http": "^5.2.0",
"@angular/material": "^5.2.0",
"@angular/platform-browser": "^5.2.0",
"@angular/platform-browser-dynamic": "^5.2.0",
"@angular/platform-server": "^5.2.0",
"@angular/router": "^5.2.0",
"core-js": "^2.4.1",
"rxjs": "^5.5.6",
"zone.js": "^0.8.19"
},
"devDependencies": {
"@angular/cli": "1.6.5",
"@angular/compiler-cli": "^5.2.0",
"@angular/language-service": "^5.2.0",
"@ngrx/effects": "^5.2.0",
"@ngrx/store": "^5.2.0",
"@types/jasmine": "~2.8.3",
"@types/jasminewd2": "~2.0.2",
"@types/node": "~6.0.60",
"codelyzer": "^4.0.1",
"core-js": "^2.4.1",
"hammerjs": "^2.0.8",
"jasmine-core": "~2.8.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~2.0.0",
@ -42,8 +50,10 @@
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.1.2",
"rxjs": "^5.5.6",
"ts-node": "~4.1.0",
"tslint": "~5.9.1",
"typescript": "~2.5.3"
"typescript": "~2.5.3",
"zone.js": "^0.8.19"
}
}

View File

@ -1,20 +0,0 @@
<!--The content below is only a placeholder and can be replaced.-->
<div style="text-align:center">
<h1>
Welcome to {{ title }}!
</h1>
<img width="300" alt="Angular Logo" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg==">
</div>
<h2>Here are some links to help you start: </h2>
<ul>
<li>
<h2><a target="_blank" rel="noopener" href="https://angular.io/tutorial">Tour of Heroes</a></h2>
</li>
<li>
<h2><a target="_blank" rel="noopener" href="https://github.com/angular/angular-cli/wiki">CLI Documentation</a></h2>
</li>
<li>
<h2><a target="_blank" rel="noopener" href="https://blog.angular.io/">Angular blog</a></h2>
</li>
</ul>

View File

@ -1,19 +1,34 @@
{
"buildOnSave": false,
"compileOnSave": false,
"compilerOptions": {
"outDir": "./dist/out-tsc",
"sourceMap": true,
"baseUrl": "",
"declaration": false,
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es5",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2017",
"dom"
],
"module": "commonjs",
"moduleResolution": "node",
"noStrictGenericChecks": true,
"outDir": "../out-tsc/app",
"paths": {
"@loafer/ngrx-store": [
"./modules/ngrx-store"
]
},
"rootDir": "./",
"sourceMap": true,
"strict": true,
"target": "es5",
"typeRoots": [
"node_modules/@types"
]
}
},
"exclude": [
"node_modules",
"**/*/node_modules"
],
}

207
yarn.lock
View File

@ -33,6 +33,12 @@
dependencies:
tslib "^1.7.1"
"@angular/cdk@^5.2.0":
version "5.2.4"
resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-5.2.4.tgz#c0a429a8710d8fedb157f546e21cb49d4335f7f7"
dependencies:
tslib "^1.7.1"
"@angular/cli@1.6.5":
version "1.6.5"
resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-1.6.5.tgz#9217c5d5c366292aca61fb0328c406bb5b0f2d76"
@ -136,9 +142,11 @@
dependencies:
tslib "^1.7.1"
"@angular/language-service@^5.2.0":
version "5.2.9"
resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-5.2.9.tgz#4838bb6319c99e8f5beb08bdfb392ee9a1173766"
"@angular/material@^5.2.0":
version "5.2.4"
resolved "https://registry.yarnpkg.com/@angular/material/-/material-5.2.4.tgz#9e823798324283d23ea839156fac5bcb73443d55"
dependencies:
tslib "^1.7.1"
"@angular/platform-browser-dynamic@^5.2.0":
version "5.2.9"
@ -152,12 +160,28 @@
dependencies:
tslib "^1.7.1"
"@angular/platform-server@^5.2.0":
version "5.2.9"
resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-5.2.9.tgz#9905cc152242472da2557bf9fec73685449b92c4"
dependencies:
domino "^1.0.29"
tslib "^1.7.1"
xhr2 "^0.1.4"
"@angular/router@^5.2.0":
version "5.2.9"
resolved "https://registry.yarnpkg.com/@angular/router/-/router-5.2.9.tgz#0369df6e60c6da3a5842c6eb35e3958d4ffe727e"
dependencies:
tslib "^1.7.1"
"@ngrx/effects@^5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-5.2.0.tgz#aa762b69cb6fd4644d724a1cecd265caa42baf09"
"@ngrx/store@^5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-5.2.0.tgz#627ed74c9cd95462930485d912a557117b23903e"
"@ngtools/json-schema@1.1.0", "@ngtools/json-schema@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@ngtools/json-schema/-/json-schema-1.1.0.tgz#c3a0c544d62392acc2813a42c8a0dc6f58f86922"
@ -288,7 +312,7 @@ ajv@^4.9.1:
co "^4.6.0"
json-stable-stringify "^1.0.1"
ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@~5.5.1:
ajv@^5.0.0, ajv@^5.1.5, ajv@~5.5.1:
version "5.5.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
dependencies:
@ -579,11 +603,7 @@ aws-sign2@~0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
aws4@^1.2.1, aws4@^1.6.0:
aws4@^1.2.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
@ -796,18 +816,6 @@ boom@2.x.x:
dependencies:
hoek "2.x.x"
boom@4.x.x:
version "4.3.1"
resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
dependencies:
hoek "4.x.x"
boom@5.x.x:
version "5.2.0"
resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
dependencies:
hoek "4.x.x"
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@ -1366,7 +1374,7 @@ combine-source-map@~0.8.0:
lodash.memoize "~3.0.3"
source-map "~0.5.3"
combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
combined-stream@^1.0.5, combined-stream@~1.0.5:
version "1.0.6"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
dependencies:
@ -1589,12 +1597,6 @@ cryptiles@2.x.x:
dependencies:
boom "2.x.x"
cryptiles@3.x.x:
version "3.1.2"
resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
dependencies:
boom "5.x.x"
crypto-browserify@^3.0.0, crypto-browserify@^3.11.0:
version "3.12.0"
resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
@ -1755,15 +1757,15 @@ date-now@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
debug@*, debug@^3.1.0, debug@~3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
debug@*, debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@~2.6.4, debug@~2.6.6:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
ms "2.0.0"
debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@~2.6.4, debug@~2.6.6:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
debug@^3.1.0, debug@~3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
dependencies:
ms "2.0.0"
@ -2001,6 +2003,10 @@ domhandler@2.1:
dependencies:
domelementtype "1"
domino@^1.0.29:
version "1.0.30"
resolved "https://registry.yarnpkg.com/domino/-/domino-1.0.30.tgz#54a4154ecae968616680f8feba3cedff355c71f4"
domutils@1.1:
version "1.1.6"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
@ -2416,7 +2422,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
extend@3, extend@^3.0.0, extend@~3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
@ -2627,14 +2633,6 @@ form-data@~2.1.1:
combined-stream "^1.0.5"
mime-types "^2.1.12"
form-data@~2.3.1:
version "2.3.2"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
dependencies:
asynckit "^0.4.0"
combined-stream "1.0.6"
mime-types "^2.1.12"
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@ -2880,6 +2878,10 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
version "4.1.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
hammerjs@^2.0.8:
version "2.0.8"
resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1"
handle-thing@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
@ -2898,10 +2900,6 @@ har-schema@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
har-schema@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
har-validator@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
@ -2918,13 +2916,6 @@ har-validator@~4.2.1:
ajv "^4.9.1"
har-schema "^1.0.5"
har-validator@~5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
dependencies:
ajv "^5.1.0"
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"
@ -3019,15 +3010,6 @@ hawk@3.1.3, hawk@~3.1.3:
hoek "2.x.x"
sntp "1.x.x"
hawk@~6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
dependencies:
boom "4.x.x"
cryptiles "3.x.x"
hoek "4.x.x"
sntp "2.x.x"
he@1.1.x:
version "1.1.1"
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
@ -3051,10 +3033,6 @@ hoek@2.x.x:
version "2.16.3"
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
hoek@4.x.x:
version "4.2.1"
resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
homedir-polyfill@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
@ -3168,14 +3146,6 @@ http-signature@~1.1.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
dependencies:
assert-plus "^1.0.0"
jsprim "^1.2.2"
sshpk "^1.7.0"
httpntlm@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/httpntlm/-/httpntlm-1.6.1.tgz#ad01527143a2e8773cfae6a96f58656bb52a34b2"
@ -4687,7 +4657,7 @@ 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"
oauth-sign@~0.8.1, oauth-sign@~0.8.2:
oauth-sign@~0.8.1:
version "0.8.2"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
@ -5020,10 +4990,6 @@ performance-now@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
pify@^2.0.0, pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@ -5487,7 +5453,7 @@ qjobs@^1.1.4:
version "1.2.0"
resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071"
qs@6.5.1, qs@~6.5.1:
qs@6.5.1:
version "6.5.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
@ -5780,32 +5746,32 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
request@2, request@^2.0.0, request@^2.74.0, request@^2.78.0:
version "2.85.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa"
request@2, request@2.81.0, request@^2.0.0, request@^2.74.0, request@^2.78.0:
version "2.81.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.6.0"
aws-sign2 "~0.6.0"
aws4 "^1.2.1"
caseless "~0.12.0"
combined-stream "~1.0.5"
extend "~3.0.1"
extend "~3.0.0"
forever-agent "~0.6.1"
form-data "~2.3.1"
har-validator "~5.0.3"
hawk "~6.0.2"
http-signature "~1.2.0"
form-data "~2.1.1"
har-validator "~4.2.1"
hawk "~3.1.3"
http-signature "~1.1.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.17"
oauth-sign "~0.8.2"
performance-now "^2.1.0"
qs "~6.5.1"
safe-buffer "^5.1.1"
stringstream "~0.0.5"
tough-cookie "~2.3.3"
mime-types "~2.1.7"
oauth-sign "~0.8.1"
performance-now "^0.2.0"
qs "~6.4.0"
safe-buffer "^5.0.1"
stringstream "~0.0.4"
tough-cookie "~2.3.0"
tunnel-agent "^0.6.0"
uuid "^3.1.0"
uuid "^3.0.0"
request@2.75.x:
version "2.75.0"
@ -5833,33 +5799,6 @@ request@2.75.x:
tough-cookie "~2.3.0"
tunnel-agent "~0.4.1"
request@2.81.0:
version "2.81.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
dependencies:
aws-sign2 "~0.6.0"
aws4 "^1.2.1"
caseless "~0.12.0"
combined-stream "~1.0.5"
extend "~3.0.0"
forever-agent "~0.6.1"
form-data "~2.1.1"
har-validator "~4.2.1"
hawk "~3.1.3"
http-signature "~1.1.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.7"
oauth-sign "~0.8.1"
performance-now "^0.2.0"
qs "~6.4.0"
safe-buffer "^5.0.1"
stringstream "~0.0.4"
tough-cookie "~2.3.0"
tunnel-agent "^0.6.0"
uuid "^3.0.0"
request@~2.79.0:
version "2.79.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
@ -6269,12 +6208,6 @@ sntp@1.x.x:
dependencies:
hoek "2.x.x"
sntp@2.x.x:
version "2.1.0"
resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
dependencies:
hoek "4.x.x"
socket.io-adapter@~1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
@ -6597,7 +6530,7 @@ string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
stringstream@~0.0.4, stringstream@~0.0.5:
stringstream@~0.0.4:
version "0.0.5"
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
@ -6830,7 +6763,7 @@ toposort@^1.0.0:
version "1.0.6"
resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec"
tough-cookie@~2.3.0, tough-cookie@~2.3.3:
tough-cookie@~2.3.0:
version "2.3.4"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
dependencies:
@ -7159,7 +7092,7 @@ utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
uuid@^3.0.0, uuid@^3.0.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
@ -7433,6 +7366,10 @@ ws@~3.3.1:
safe-buffer "~5.1.0"
ultron "~1.1.0"
xhr2@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f"
xml-char-classes@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d"