UNPKG

98.9 kBSource Map (JSON)View Raw
1{"version":3,"file":"ng-core.umd.min.js","sources":["../../../../packages/ng-core/src/framing-container-outlet/container-outlet.directive.ts","../../../../packages/ng-core/src/framing-container-outlet/container-outlet.module.ts","../../../../packages/ng-core/src/framing-container-outlet/container-outlet.resolver.ts","../../../../packages/ng-core/src/framing-components/empty-parent.component.ts","../../../../packages/ng-core/src/framing-components/root.component.ts","../../../../packages/ng-core/src/framing-components/framing-components.module.ts","../../../../packages/ng-core/src/framer.helper.ts","../../../../packages/ng-core/src/framing-ng-module.ts","../../../../packages/ng-core/src/framing.ts","../../../../packages/ng-core/src/simple-framer.ts","../../../../packages/ng-core/src/action.ts","../../../../packages/ng-core/src/component.ts","../../../../packages/ng-core/src/controller.ts","../../../../packages/ng-core/src/devtools.ts","../../../../packages/ng-core/src/features/framing-dev-tools/framing-dev-tools.controller.ts","../../../../packages/ng-core/src/features/framing-dev-tools/framing-dev-tools.component.ts","../../../../packages/ng-core/src/frame.ts","../../../../packages/ng-core/src/framer.ts","../../../../packages/ng-core/src/features/framing-dev-tools/framing-dev-tools.feature.ts","../../../../packages/ng-core/src/framing-component-outlet/component-outlet.directive.ts","../../../../packages/ng-core/src/framing-component-outlet/component-outlet.module.ts","../../../../packages/ng-core/src/framing-container-outlet/container-outlet.service.ts"],"sourcesContent":["import {\n ComponentFactoryResolver,\n ComponentRef,\n Directive,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewContainerRef,\n} from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\n\nimport { AnonymousSubscription } from 'rxjs/Subscription';\n\nimport { FramingContainerOutlet } from './container-outlet';\nimport { FramingContainerOutletContent } from './container-outlet-content';\nimport { FramingContainerOutletService } from './container-outlet.service';\n\nimport * as _ from 'lodash';\n\nclass ActivatedContent {\n content: FramingContainerOutletContent;\n ref: ComponentRef<any>;\n}\n\n@Directive({\n selector: '[framingContainerOutlet]',\n})\nexport class FramingContainerOutletDirective implements OnInit, OnDestroy, FramingContainerOutlet {\n @Input() framingContainerOutlet: string;\n @Input() optionalContainer: boolean;\n @Input() useViewInjector: boolean;\n @Input() content: any[][];\n\n @Output() onComponents: EventEmitter<ComponentRef<any>[]> = new EventEmitter<ComponentRef<any>[]>();\n\n private _activated: ActivatedContent[] = [];\n\n private _subscriptions: AnonymousSubscription[] = [];\n\n constructor(\n private _view: ViewContainerRef,\n private _containerService: FramingContainerOutletService,\n private _router: Router,\n ) {}\n\n containerName(): string { return this.framingContainerOutlet; }\n\n isActivated(): boolean { return this._activated.length > 0; }\n\n ngOnInit(): void {\n if (!this.framingContainerOutlet) {\n console.warn('FramingContainerOutlet without a container name');\n } else {\n if (this.framingContainerOutlet[0] === '\\'') {\n console.warn(`FramingContainerOutlet name \"${this.framingContainerOutlet}\" starts with a qoute`);\n }\n this._subscriptions.push(this._containerService.contents$.subscribe((contents: FramingContainerOutletContent[]) => this.onContent(contents)));\n }\n\n this._subscriptions.push(this._router.events.subscribe((event) => {\n if (event instanceof NavigationEnd) {\n if (!this.optionalContainer && !this.isActivated()) {\n console.warn(`No content for required FramingContainerOutlet '${this.framingContainerOutlet}' found`);\n }\n }\n }));\n }\n\n ngOnDestroy(): void {\n this._activated.forEach((a) => this.deactivate(a));\n this._subscriptions.forEach((s) => s.unsubscribe());\n }\n\n private onContent(allContents: FramingContainerOutletContent[]): void {\n const contents: FramingContainerOutletContent[] = allContents.filter((c) => _.isEqual(c.container, this.framingContainerOutlet));\n\n // remove all content that is no longer active\n this._activated.forEach((a) => {\n if (contents.findIndex((content) => content === a.content) === -1) {\n this.deactivate(a);\n }\n });\n this._activated = this._activated.filter((a) => !!a.ref);\n\n // now setup the new activated components\n let i = 0;\n for (let content of contents) {\n if (this._activated.length > i) {\n if (this._activated[i].content !== content) {\n // look for this content\n const activatedIndex = this._activated.findIndex((a) => a.content === content);\n if (activatedIndex === -1) {\n // activate this content at i\n this._activated.splice(i, 0, { content, ref: this.activate(content) });\n } else if (activatedIndex > i) {\n // move content from activatedIndex to i\n const _activated = this._activated.splice(activatedIndex, 1);\n this._activated.splice(i, 0, ..._activated);\n const view = this._view.detach(activatedIndex);\n this._view.insert(view, i);\n } else {\n console.error('Logic error in FramingContainerOutlet!');\n }\n }\n } else {\n // activate this content\n const ref = this.activate(content);\n if (ref) {\n this._activated.push({ content, ref });\n }\n }\n i++;\n }\n\n this.onComponents.emit(this._activated.map((a) => a.ref));\n }\n\n private activate(content: FramingContainerOutletContent, i?: number): ComponentRef<any> {\n try {\n const injector = (!this.useViewInjector && content.injector) ? content.injector : this._view.parentInjector;\n const factory = injector.get(ComponentFactoryResolver).resolveComponentFactory(content.component);\n let ref = this._view.createComponent(factory, i, injector, this.content);\n try {\n ref.changeDetectorRef.detectChanges();\n } catch (e) {\n console.error(`detectChanges failed on activated component in FramingContainerOutlet '${this.framingContainerOutlet}'`, { e, component: content.component });\n }\n return ref;\n } catch (e) {\n console.error(`Failed to activate component in FramingContainerOutlet '${this.framingContainerOutlet}'`, { e, component: content.component });\n return undefined;\n }\n }\n\n private deactivate(activated: ActivatedContent): void {\n activated.ref.destroy();\n activated.ref = null;\n }\n}\n","import { ANALYZE_FOR_ENTRY_COMPONENTS, ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { FramingContainerOutletDirective } from './container-outlet.directive';\nimport { FramingContainerOutletService } from './container-outlet.service';\n\n@NgModule({\n declarations: [ FramingContainerOutletDirective ],\n exports: [ FramingContainerOutletDirective ],\n})\nexport class FramingContainerOutletModule {\n static withEntryComponents(...components: any[]): ModuleWithProviders {\n return {\n ngModule: FramingContainerOutletModule,\n providers: [\n { provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: components, multi: true },\n ],\n };\n }\n\n static forRoot(): ModuleWithProviders {\n return {\n ngModule: FramingContainerOutletModule,\n providers: [ FramingContainerOutletService ],\n };\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';\n\nimport { FramingContainerOutletContent } from './container-outlet-content';\n\n@Injectable()\nexport class FramingContainerOutletResolver implements Resolve<FramingContainerOutletContent[]> {\n\n constructor(\n private containers: FramingContainerOutletContent[],\n private injector: Injector,\n ) {}\n\n /**\n * Resolve hook.\n */\n public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): FramingContainerOutletContent[] {\n // set the injector in each container\n for (let container of this.containers) {\n container.injector = this.injector;\n }\n return this.containers;\n }\n}\n","import { Component } from '@angular/core';\n\n/**\n * @experimental\n */\n@Component({\n selector: 'empty-parent-component',\n template: '<router-outlet></router-outlet>',\n})\nexport class FramingEmptyParentComponent {}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-root',\n template: '<router-outlet></router-outlet>',\n})\nexport class FramingRootComponent {}\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\nimport { FramingEmptyParentComponent } from './empty-parent.component';\nimport { FramingRootComponent } from './root.component';\n\n@NgModule({\n imports: [\n RouterModule,\n ],\n declarations: [\n FramingEmptyParentComponent,\n FramingRootComponent,\n ],\n exports: [\n FramingEmptyParentComponent,\n FramingRootComponent,\n ],\n})\nexport class FramingComponentsModule {}\n","import * as _ from 'lodash';\n\nexport abstract class FramerHelper {\n\n private static _nextId: number = 1;\n\n /**\n * A unique framer id for this this.\n */\n public framerHelperId: number;\n\n /**\n * A unique identifier string for this framer helper instance.\n */\n public get framerHelperIdent(): string {\n return _.camelCase(`framerHelper-${(this as any).__proto__.constructor.name}-${this.framerHelperId}`);\n }\n\n // ========================================\n // constructor\n // ========================================\n\n public constructor() {\n this.framerHelperId = FramerHelper._nextId++;\n }\n}\n","import * as _ from 'lodash';\n\nimport { CommonModule } from '@angular/common';\nimport { Injector, ModuleWithProviders, NgModule, Provider, Type } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { Route, RouterModule } from '@angular/router';\n\nimport { FramingContainerOutletContent } from './framing-container-outlet/container-outlet-content';\nimport { FramingContainerOutletResolver } from './framing-container-outlet/container-outlet.resolver';\n\nimport { Framer } from './framer';\nimport { FramingRootComponentConfig } from './framing-root-component-config';\nimport { FramingRouteConfig } from './framing-route-config';\n\nimport { FramingEmptyParentComponent } from './framing-components/empty-parent.component';\nimport { FramingComponentsModule } from './framing-components/framing-components.module';\nimport { FramingRootComponent } from './framing-components/root.component';\n\n/**\n *\n */\nexport class FramingNgModule {\n\n private static _nextId: number = 1;\n\n // ========================================\n // private properties\n // ========================================\n\n private _ngModule: NgModule = {\n imports: [],\n declarations: [],\n exports: [],\n providers: [],\n bootstrap: [],\n entryComponents: [],\n };\n\n private _root: boolean = false;\n\n private _rootComponent: Type<any>;\n\n private _rootComponentConfig: FramingRootComponentConfig;\n\n private _routes: Route[] = [];\n\n private _routeConfig: FramingRouteConfig;\n\n static get defaultPathMatch(): string { return 'prefix'; }\n\n // ========================================\n // public methods\n // ========================================\n\n public ngModule(ngModule?: NgModule): FramingNgModule {\n if (ngModule) {\n _.defaults(this._ngModule, ngModule);\n _.each(_.filter(_.keys(ngModule), (key: string) => { return _.isArray((ngModule as any)[key]); }), (key) => {\n (this._ngModule as any)[key] = _.uniqWith((this._ngModule as any)[key].concat(_.reject((ngModule as any)[key], _.isNil)), _.isEqual);\n });\n }\n\n return this;\n }\n\n public bootstrap(bootstrap: any[]): FramingNgModule {\n const flattened = [].concat.apply([], bootstrap);\n this._ngModule.bootstrap = _.uniqWith(this._ngModule.bootstrap.concat(_.reject(flattened, _.isNil)), _.isEqual);\n\n return this;\n }\n\n /**\n * Add a child route. Adds to '' route by default\n */\n public child(child: Route): FramingNgModule;\n public child(child: Route, parent: Route): FramingNgModule;\n public child(child: Route, parent: Route[]): FramingNgModule;\n public child(child: Route, parent?: Route | Route[]): FramingNgModule {\n let parentRoute = this.getOrAddRouteOverload(parent);\n\n if (!parentRoute.children) { parentRoute.children = []; }\n\n if (!parentRoute.component) {\n parentRoute.component = FramingEmptyParentComponent;\n }\n\n this.getOrAddRoute(child, parentRoute.children);\n\n return this;\n }\n\n /**\n * Adds to imports\n * Adds to route\n */\n public children(children: Route[]): FramingNgModule;\n public children(children: Route[], parent: Route): FramingNgModule;\n public children(children: Route[], parent: Route[]): FramingNgModule;\n public children(children: Route[], parent?: Route | Route[]): FramingNgModule {\n _.each(children, (child) => {\n this.child(child, parent);\n });\n\n return this;\n }\n\n /**\n * Adds as component on route\n */\n public component(component: Type<any>): FramingNgModule;\n public component(component: Type<any>, route: Route): FramingNgModule;\n public component(component: Type<any>, route: Route[]): FramingNgModule;\n public component(component: Type<any>, route?: Route | Route[]): FramingNgModule {\n if (component) {\n let routeConfig = this.getOrAddRouteOverload(route);\n routeConfig.component = component;\n }\n\n return this;\n }\n\n /**\n * Adds as component on route\n * Adds component to declarations\n */\n public componentAndDeclare(component: Type<any>): FramingNgModule;\n public componentAndDeclare(component: Type<any>, route: Route): FramingNgModule;\n public componentAndDeclare(component: Type<any>, route: Route[]): FramingNgModule;\n public componentAndDeclare(component: Type<any>, route?: Route | Route[]): FramingNgModule {\n return this.componentAndDeclaration(component, route);\n }\n\n /**\n * Adds as component on route\n * Adds component to declarations\n */\n public componentAndDeclaration(component: Type<any>): FramingNgModule;\n public componentAndDeclaration(component: Type<any>, route: Route): FramingNgModule;\n public componentAndDeclaration(component: Type<any>, route: Route[]): FramingNgModule;\n public componentAndDeclaration(component: Type<any>, route?: Route | Route[]): FramingNgModule {\n this.component(component, route);\n if (component) {\n this.declare(component);\n }\n\n return this;\n }\n\n /**\n * Adds containers to route data\n * Adds container components to exports and declarations\n */\n public container(container: string, components: Type<any> | Type<any>[]): FramingNgModule;\n public container(container: string, components: Type<any> | Type<any>[], route: Route): FramingNgModule;\n public container(container: string, components: Type<any> | Type<any>[], route: Route[]): FramingNgModule;\n public container(container: string, components: Type<any> | Type<any>[], route?: Route | Route[]): FramingNgModule {\n let containers: { [key: string]: Type<any> | Type<any>[]} = {};\n containers[container] = components;\n this.containers(containers, route);\n\n return this;\n }\n\n /**\n * Adds containers to route data\n * Adds container components to exports and declarations\n */\n public containers(containers: { [key: string]: Type<any> | Type<any>[] }): FramingNgModule;\n public containers(containers: { [key: string]: Type<any> | Type<any>[] }, route: Route): FramingNgModule;\n public containers(containers: { [key: string]: Type<any> | Type<any>[] }, route: Route[]): FramingNgModule;\n public containers(containers: { [key: string]: Type<any> | Type<any>[] }, route?: Route | Route[]): FramingNgModule {\n for (let key in containers) {\n if (containers.hasOwnProperty(key)) {\n if (_.isNil(containers[key])) {\n delete containers[key];\n }\n }\n }\n\n const routeConfig = this.getOrAddRoute(route);\n if (!routeConfig.resolve) {\n routeConfig.resolve = {};\n }\n if (!routeConfig.resolve.containers) {\n routeConfig.resolve.containers = [];\n }\n\n for (let key in containers) {\n if (containers.hasOwnProperty(key)) {\n const components: Type<any> | Type<any>[] = containers[key];\n if (_.isArray(components)) {\n for (const component of components) {\n routeConfig.resolve.containers.push({ container: key, component });\n }\n } else {\n routeConfig.resolve.containers.push({ container: key, component: components });\n }\n }\n }\n\n return this;\n }\n\n /**\n * Method for appending data to route\n */\n public datum(key: string, datum: any): FramingNgModule;\n public datum(key: string, datum: any, route: Route): FramingNgModule;\n public datum(key: string, datum: any, route: Route[]): FramingNgModule;\n public datum(key: string, datum: any, route?: Route | Route[]): FramingNgModule {\n let data: { [key: string]: Type<any> } = {};\n data[key] = datum;\n this.data(data, route);\n\n return this;\n }\n\n /**\n * Methods for appending data to route\n */\n public data(data: { [key: string]: any }): FramingNgModule;\n public data(data: { [key: string]: any }, route: Route): FramingNgModule;\n public data(data: { [key: string]: any }, route: Route[]): FramingNgModule;\n public data(data: { [key: string]: any }, route?: Route | Route[]): FramingNgModule {\n let routeConfig = this.getOrAddRouteOverload(route);\n\n if (!routeConfig.data) {\n routeConfig.data = {};\n }\n _.merge(routeConfig.data, data);\n\n return this;\n }\n\n /**\n * Method for appending data resolve to route\n */\n public resolve(key: string, resolve: string | Type<any>): FramingNgModule;\n public resolve(key: string, resolve: string | Type<any>, route: Route): FramingNgModule;\n public resolve(key: string, resolve: string | Type<any>, route: Route[]): FramingNgModule;\n public resolve(key: string, resolve: string | Type<any>, route?: Route | Route[]): FramingNgModule {\n let resolves: { [key: string]: string | Type<any> } = {};\n resolves[key] = resolve;\n this.resolves(resolves, route);\n\n return this;\n }\n\n /**\n * Method for appending data resolve to route\n */\n public resolves(resolves: { [key: string]: string | Type<any> }): FramingNgModule;\n public resolves(resolves: { [key: string]: string | Type<any> }, route: Route): FramingNgModule;\n public resolves(resolves: { [key: string]: string | Type<any> }, route: Route[]): FramingNgModule;\n public resolves(resolves: { [key: string]: string | Type<any> }, route?: Route | Route[]): FramingNgModule {\n let routeConfig = this.getOrAddRouteOverload(route);\n\n if (!routeConfig.resolve) {\n routeConfig.resolve = {};\n }\n _.merge(routeConfig.resolve, resolves);\n\n return this;\n }\n\n public declare(declaration: Type<any> | Type<any>[]): FramingNgModule {\n return this.declaration(declaration);\n }\n\n public declaration(declaration: Type<any> | Type<any>[]): FramingNgModule {\n return this.declarations(_.isArray(declaration) ? declaration : [ declaration ]);\n }\n\n public declarations(declarations: Type<any>[]): FramingNgModule {\n const flattened = [].concat.apply([], declarations);\n this._ngModule.declarations = _.uniqWith(this._ngModule.declarations.concat(_.reject(flattened, _.isNil)), _.isEqual);\n\n return this;\n }\n\n public declareAndExport(declaration: Type<any> | Type<any>[]): FramingNgModule {\n return this.declarationAndExport(declaration);\n }\n\n public declarationAndExport(declaration: Type<any> | Type<any>[]): FramingNgModule {\n return this.declarationsAndExports(_.isArray(declaration) ? declaration : [ declaration ]);\n }\n\n public declarationsAndExports(declarations: Type<any>[]): FramingNgModule {\n this.declarations(declarations);\n this.exports(declarations);\n\n return this;\n }\n\n public declareAndEntryComponent(declaration: Type<any> | Type<any>[]): FramingNgModule {\n return this.declarationAndEntryComponent(declaration);\n }\n\n public declarationAndEntryComponent(declaration: Type<any> | Type<any>[]): FramingNgModule {\n return this.declarationsAndEntryComponents(_.isArray(declaration) ? declaration : [ declaration ]);\n }\n\n public declarationsAndEntryComponents(declarations: Type<any>[]): FramingNgModule {\n this.declarations(declarations);\n this.entryComponents(declarations);\n\n return this;\n }\n\n public entryComponent(entryComponent: Type<any> | Type<any>[]): FramingNgModule {\n return this.entryComponents(_.isArray(entryComponent) ? entryComponent : [ entryComponent ]);\n }\n\n public entryComponents(entryComponents: Type<any>[]): FramingNgModule {\n const flattened = [].concat.apply([], entryComponents);\n this._ngModule.entryComponents = _.uniqWith(this._ngModule.entryComponents.concat(_.reject(flattened, _.isNil)), _.isEqual);\n\n return this;\n }\n\n public export(e: Type<any> | Type<any>[]): FramingNgModule {\n return this.exports(_.isArray(e) ? e : [ e ]);\n }\n\n public exports(exports: Type<any>[]): FramingNgModule {\n const flattened = [].concat.apply([], exports);\n this._ngModule.exports = _.uniqWith(this._ngModule.exports.concat(_.reject(flattened, _.isNil)), _.isEqual);\n\n return this;\n }\n\n public import(i: Type<any> | Type<any>[] | ModuleWithProviders | ModuleWithProviders): FramingNgModule {\n return this.imports(_.isArray(i) ? i : [ i ]);\n }\n\n public imports(imports: (Type<any> | ModuleWithProviders)[]): FramingNgModule {\n const flattened = [].concat.apply([], imports);\n this._ngModule.imports = _.uniqWith(this._ngModule.imports.concat(_.reject(flattened, _.isNil)), _.isEqual);\n\n return this;\n }\n\n public importAndExport(m: Type<any> | Type<any>[]): FramingNgModule {\n return this.importsAndExports(_.isArray(m) ? m : [ m ]);\n }\n\n public importsAndExports(modules: Type<any>[]): FramingNgModule {\n this.imports(modules);\n this.exports(modules);\n\n return this;\n }\n\n public provide(provider: Provider | Provider[] | Type<any> | Type<any>[]): FramingNgModule {\n return this.provider(provider);\n }\n\n public provider(provider: Provider | Provider[] | Type<any> | Type<any>[]): FramingNgModule {\n return this.providers(_.isArray(provider) ? provider : [ provider ]);\n }\n\n public providers(providers: Provider[] | Type<any>[]): FramingNgModule {\n const flattened = [].concat.apply([], providers);\n this._ngModule.providers = _.uniqWith(this._ngModule.providers.concat(_.reject(flattened, _.isNil)), _.isEqual);\n\n return this;\n }\n\n /**\n * Adds component to bootstrap\n * Defaults route to path '', pathMatch: 'full'\n */\n public root(rootComponent?: Type<any>, config?: FramingRootComponentConfig): FramingNgModule {\n this._root = true;\n this._rootComponentConfig = config || {};\n _.defaults(this._rootComponentConfig, { hybrid: false });\n this._rootComponent = rootComponent || FramingRootComponent;\n\n return this;\n }\n\n /**\n * Creates Routes array with single route\n * Adds RouterModule.forRoot(routes) or RouterModule.forChild(routes) to imports\n * Adds all resolve services as providers\n */\n public route(route?: Route, config?: FramingRouteConfig): FramingNgModule {\n this.getOrAddRoute(route);\n\n if (this._routeConfig) {\n if (config) {\n _.merge(this._routeConfig, config);\n }\n } else {\n this._routeConfig = config || {};\n _.defaults(this._routeConfig, { forRoot: false });\n }\n\n return this;\n }\n\n public routes(routes: Route[], config?: FramingRouteConfig): FramingNgModule {\n _.each(routes, (route) => {\n this.route(route, config);\n });\n\n return this;\n }\n\n public frameRoute(route: Route, ...framers: Framer<any, any>[]): FramingNgModule;\n public frameRoute(route: Route[], ...framers: Framer<any, any>[]): FramingNgModule;\n public frameRoute(route: Route | Route[], ...framers: Framer<any, any>[]): FramingNgModule {\n this.buildFramers(framers, this.getOrAddRouteOverload(route));\n\n return this;\n }\n\n /**\n * Returns the route if it exists.\n */\n public getRoute(route: Route = {}, array?: Route[]): Route {\n /* tslint:disable:no-param-reassign */\n if (!array) { array = this._routes; }\n /* tslint:enable:no-param-reassign */\n\n _.defaults(route, { path: '', pathMatch: FramingNgModule.defaultPathMatch });\n\n return _.find(array, (m) => { return m.path === route.path && m.pathMatch === route.pathMatch; });\n }\n\n /**\n * Returns the route. Creates it if it does not exist.\n */\n public getOrAddRoute(route: Route = {}, array?: Route[]): Route {\n /* tslint:disable:no-param-reassign */\n if (!array) { array = this._routes; }\n /* tslint:enable:no-param-reassign */\n\n _.defaults(route, { path: '', pathMatch: FramingNgModule.defaultPathMatch });\n\n let r = _.find(array, (m) => { return m.path === route.path && m.pathMatch === route.pathMatch; });\n\n if (r) {\n _.merge(r, route);\n return r;\n } else {\n array.push(route);\n\n return route;\n }\n }\n\n /**\n * Run framers.\n */\n public frame(...framers: Framer<any, any>[]): FramingNgModule {\n this.buildFramers(framers);\n\n return this;\n }\n\n public use(...framers: Framer<any, any>[]): FramingNgModule {\n return this.frame(...framers);\n }\n\n /**\n * Builds @NgModule() config in the following order:\n * - Route framers\n * - Root\n * - Route\n */\n public build(): NgModule {\n this.buildRouteFramers(this._routes);\n this.buildRoot();\n this.buildContainers(this._routes);\n this.buildRoute();\n this.inspectModule();\n\n return this._ngModule;\n }\n\n // ========================================\n // private methods\n // ========================================\n\n private inspectModule(): void {\n this._routes.forEach((r) => this.inspectRoute(r));\n }\n\n private inspectRoute(route: Route): void {\n if (route.component === undefined && route.redirectTo === undefined && _.isEmpty(route.children) && route.loadChildren === undefined) {\n console.error(\n `Looks like you have a badly configured route in a framed module.\n One of the following must be provided: component, redirectTo, children or loadChildren`,\n { route, self: this });\n }\n\n if (route.children) {\n route.children.forEach((c) => this.inspectRoute(c));\n }\n }\n\n private buildRoot(): void {\n let m: NgModule = this._ngModule;\n\n if (this._root) {\n m.imports = _.uniqWith(m.imports.concat([\n BrowserModule.withServerTransition({\n appId: 'app',\n }),\n FormsModule,\n ]), _.isEqual);\n\n m.bootstrap = _.uniqWith(m.bootstrap.concat([ this._rootComponent ]), _.isEqual);\n } else {\n m.imports = _.uniqWith(m.imports.concat([\n CommonModule,\n ]), _.isEqual);\n }\n\n m.imports = _.uniqWith(m.imports.concat([ FramingComponentsModule ]), _.isEqual);\n }\n\n private buildFramers(framers: Framer<any, any>[], route?: Route): void {\n for (let framer of framers) {\n this.buildFramer(framer, route);\n }\n }\n\n private buildFramer(framer: Framer<any, any>, route: Route): void {\n if (!framer.framed) {\n framer.runFraming(this, route || this.getRoute());\n }\n }\n\n /**\n * Builds framers that were manually added to route data.\n */\n private buildRouteFramers(routes: Route[]): void {\n for (let route of routes) {\n if (route.data) {\n for (let key in route.data) {\n if (route.data.hasOwnProperty(key)) { // tslint: forin\n let prop = route.data[key];\n if (prop && prop._frame !== undefined) {\n // this is a framer attached to route data\n this.buildFramer(prop as Framer<any, any>, route);\n }\n }\n }\n }\n if (route.children) {\n this.buildRouteFramers(route.children);\n }\n }\n }\n\n private buildContainers(routes: Route[]): void {\n for (let route of routes) {\n if (route.resolve && route.resolve.containers) {\n const containers: FramingContainerOutletContent[] = route.resolve.containers;\n for (const container of containers) {\n const containerId = FramingNgModule._nextId++;\n container.id = '' + containerId;\n }\n const resolveId = FramingNgModule._nextId++;\n this.provide({\n provide: 'containerResolver' + resolveId,\n useFactory: (i: Injector) => new FramingContainerOutletResolver(containers, i),\n deps: [ Injector ],\n });\n route.resolve.containers = 'containerResolver' + resolveId;\n }\n if (route.children) {\n this.buildContainers(route.children);\n }\n }\n }\n\n private buildRoute(): void {\n if (this._routes.length > 0) {\n // re-order routes so that full routes are first\n let fullRoutes: Route[] = [];\n let prefixRoutes: Route[] = [];\n this._routes.forEach((route) => {\n if (route.pathMatch && route.pathMatch === 'full') {\n fullRoutes.push(route);\n } else if (!route.pathMatch || route.pathMatch === 'prefix') {\n prefixRoutes.push(route);\n } else {\n console.warn('Unknown pathMatch on route', route);\n }\n this._routes = [];\n this._routes = this._routes.concat(fullRoutes);\n this._routes = this._routes.concat(prefixRoutes);\n });\n\n const routing: ModuleWithProviders = this._root || (this._routeConfig && this._routeConfig.forRoot) ?\n RouterModule.forRoot(this._routes, this._routeConfig ? this._routeConfig.extraRootRouterOptions : undefined) :\n RouterModule.forChild(this._routes);\n\n this.imports([ routing ]);\n\n if (this._routeConfig && this._routeConfig.forRoot && !this._root) {\n this.exports([ RouterModule ]); // export RouterModule from AppRoutingModule\n }\n }\n }\n\n private getOrAddRouteOverload(route: Route | Route[]): Route {\n if (_.isArray(route)) {\n if (route.length) {\n let result: Route;\n\n /* tslint:disable:prefer-for-of */\n result = this.getOrAddRoute(route[0]);\n for (let i = 1; i < route.length; i++) {\n if (!result.children) { result.children = []; }\n result = this.getOrAddRoute(route[i], result.children);\n }\n /* tslint:enable:prefer-for-of */\n\n return result;\n } else {\n return this.getOrAddRoute();\n }\n } else {\n return this.getOrAddRoute(route);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { FramingNgModule } from './framing-ng-module';\n\ntype FramingNgModuleBuilder = (framing: FramingNgModule) => FramingNgModule;\n\n/* tslint:disable:variable-name */\nexport const Framing = (ngModuleBuilder: FramingNgModuleBuilder): NgModule => {\n/* tslint:enable:variable-name */\n\n let framing = ngModuleBuilder(new FramingNgModule());\n if (!framing) {\n console.error('Framing must return a FramingNgModule');\n return {};\n }\n return framing.build();\n};\n","import { Framer } from './framer';\n\n/**\n * A framer with no route, model, view, controller or frame.\n * To be used for leveraging the frame() function only.\n */\nexport abstract class SimpleFramer extends Framer<void, void> {\n public get framerName(): string { return 'Simple'; }\n public get createFrame(): boolean { return false; }\n public get routeRule(): ('require' | 'auto' | 'none') { return 'none'; }\n}\n","import { FramingTools } from './devtools';\n\nlet framingTools: FramingTools = FramingTools.Instance;\nlet stateRoot: any = {};\nlet onLoad: boolean = true;\n// let controllers: any[] = [];\nconst devTools: any = _createReduxDevtoolsExtension();\nlet isListening: boolean = false;\n\n/* tslint:disable */\nexport function Action(description: string = null, log: boolean = true): Function {\n return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor {\n if (descriptor === undefined) {\n descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);\n }\n\n let originalMethod = descriptor.value;\n\n descriptor.value = function (): void {\n let args = [];\n let controller: any = this;\n // let controllerIndex: number;\n\n // if (controllers.indexOf(controller) <= -1) {\n // controllers.push(controller);\n // controllerIndex = controllers.length - 1;\n // } else {\n // controllerIndex = controllers.indexOf(controller);\n // }\n\n for (let _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n try {\n listenForChanges();\n } catch(e) {\n console.log('Listen to Devtools failed: ');\n console.log(e);\n }\n\n // Send the initial state if this is the first time connecting to the dev tools\n if (onLoad && log && devTools) {\n onLoad = !onLoad;\n stateRoot[controller._framerName] = controller.model;\n let state = {\n framerName: controller._framerName,\n value: stateRoot,\n }\n try {\n devTools.send((description || propertyKey), state);\n } catch(e) {\n console.log('Send to Devtools failed: ');\n console.log(e);\n }\n }\n\n originalMethod.apply(controller, args);\n\n // Need to log after the method has been ran and state is updated\n if (log && devTools) {\n\n stateRoot[controller._framerName] = controller.model;\n\n let state = {\n framerName: controller._framerName,\n // controllerIndex: controllerIndex,\n value: stateRoot,\n }\n\n try {\n devTools.send((description || propertyKey), state);\n } catch(e) {\n console.log('Send to Devtools failed: ');\n console.log(e);\n }\n }\n\n controller.markForCheck();\n };\n\n return descriptor;\n };\n}\n\n/**\n * Listen for message events being broadcast from the redux devTools\n * Changes state on the correct controller to match the state changes broadcast\n */\nfunction listenForChanges(): void {\n if (isListening || !devTools) return;\n isListening = true;\n\n let connection = devTools.connect();\n connection.subscribe(\n (message: any) => {\n if (!!message.state) {\n let messageState: any = JSON.parse(message.state);\n let messageController: any = framingTools.getControllerByKey(messageState.framerName);\n if (messageController) {\n for (let prop in messageController.model) {\n messageController.model[prop] = messageState.value[messageState.framerName][prop];\n }\n messageController.markForCheck();\n }\n }\n }\n )\n}\n\n/**\n * Returns correct instance of redux dev tools installed\n *\n * @export\n * @returns\n */\nexport function _createReduxDevtoolsExtension() {\n const legacyExtensionKey = 'devToolsExtension';\n const extensionKey = '__REDUX_DEVTOOLS_EXTENSION__';\n\n if (typeof window === 'object' && typeof (window as any)[legacyExtensionKey] !== 'undefined') {\n return (window as any)[legacyExtensionKey];\n }\n else if (typeof window === 'object' && typeof (window as any)[extensionKey] !== 'undefined') {\n return (window as any)[extensionKey];\n }\n else {\n return null;\n }\n}\n","import { ChangeDetectorRef, Injector, OnDestroy, OnInit } from '@angular/core';\nimport { AnonymousSubscription } from 'rxjs/Subscription';\n\nimport { Controller } from './controller';\n\nexport class Component<M, V, C extends Controller<M, V>> implements OnDestroy, OnInit {\n public model: M;\n\n public view: V;\n\n public controller: C;\n\n private changeDetectorRef: ChangeDetectorRef;\n\n private subscriptions: AnonymousSubscription[];\n\n public constructor(\n controller: C,\n injector: Injector,\n ) {\n this.controller = controller;\n this.changeDetectorRef = injector.get(ChangeDetectorRef);\n\n this.subscriptions = [];\n this.subscriptions.push(\n controller.model$.subscribe((model) => this.updateModel(model)),\n controller.view$.subscribe((view) => this.updateView(view)),\n controller.markForCheck$.subscribe(() => this.changeDetectorRef.markForCheck()),\n );\n\n this.controller.attach();\n }\n\n public ngOnInit(): void {\n\n }\n\n public ngOnDestroy(): void {\n this.controller.detach();\n\n this.subscriptions.forEach((s) => s.unsubscribe());\n this.subscriptions = null;\n\n this.changeDetectorRef = null;\n this.controller = null;\n\n this.model = null;\n this.view = null;\n }\n\n private updateModel(model: M): void {\n this.model = model;\n this.changeDetectorRef.markForCheck();\n }\n\n private updateView(view: V): void {\n this.view = view;\n this.changeDetectorRef.markForCheck();\n }\n}\n","import * as _ from 'lodash';\n\nimport { Injectable, Injector } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs/BehaviorSubject';\nimport { Observable } from 'rxjs/Observable';\n\nimport { Frame } from './frame';\n// import { Subject } from 'rxjs/Subject';\n\n@Injectable()\nexport abstract class Controller<M, V> {\n\n // ========================================\n // private properties\n // ========================================\n\n private _modelSubject: BehaviorSubject<M>;\n\n private _model$: Observable<M>;\n\n private _model: M;\n\n private _viewSubject: BehaviorSubject<V>;\n\n private _view$: Observable<V>;\n\n private _view: V;\n\n private _markForCheckSubject: BehaviorSubject<boolean>;\n\n private _markForCheck$: Observable<boolean>;\n\n\n private _frame: Frame;\n\n private _framerName: string;\n\n private _injector: Injector;\n\n private _refCount: number = 0;\n\n // ========================================\n // public methods\n // ========================================\n\n /**\n * Model observable accessor.\n */\n public get model$(): Observable<M> { return this._model$; }\n\n /**\n * Model accessor.\n */\n public get model(): M { return this._model; }\n\n /**\n * View observable accessor.\n */\n public get view$(): Observable<V> { return this._view$; }\n\n /**\n * View accessor.\n */\n public get view(): V { return this._view; }\n\n /**\n * Mark for check observable accessor.\n */\n public get markForCheck$(): Observable<boolean> { return this._markForCheck$; }\n\n /**\n * Frame accessor.\n */\n public get frame(): Frame { return this._frame; }\n\n /**\n * Model accessor.\n */\n public get injector(): Injector { return this._injector; }\n\n /**\n * Called after controller is initialized with model, view & frame from framing.\n */\n public onControllerInit(): void {}\n\n /**\n * Called when the controller's route starts resolving.\n */\n public onResolveStart(): void {}\n\n /**\n * Called when the controller's route end resolving.\n */\n public onResolveEnd(): void {}\n\n /**\n * Called when the controller's route resolve is cancelled.\n */\n public onResolveCancel(): void {}\n\n /**\n * Called by framing after construction to link the model, view & frame for this controller.\n */\n public initController(model: M, view: V, frame: Frame, framerName: string, injector: Injector): void {\n this._modelSubject = new BehaviorSubject<M>(model);\n this._viewSubject = new BehaviorSubject<V>(view);\n this._model$ = this._modelSubject.asObservable();\n this._view$ = this._viewSubject.asObservable();\n this._model = model;\n this._view = view;\n this._markForCheckSubject = new BehaviorSubject<boolean>(true);\n this._markForCheck$ = this._markForCheckSubject.asObservable();\n this._frame = frame;\n this._injector = injector;\n this._framerName = framerName;\n\n if (this._frame) {\n this._frame.resolveStart$.subscribe(() => { this.onResolveStart(); });\n this._frame.resolveEnd$.subscribe(() => { this.onResolveEnd(); });\n this._frame.resolveCancel$.subscribe(() => { this.onResolveCancel(); });\n }\n\n this.onControllerInit();\n\n console.log('initController');\n console.log(this);\n }\n\n public updateModel(model: M, replace: boolean = false): void {\n if (replace) {\n this._model = _.clone(model);\n } else {\n this._model = _.assign({}, this._model, model);\n }\n\n this._modelSubject.next(this._model);\n }\n\n public updateView(view: V, replace: boolean = false): void {\n if (replace) {\n this._view = _.clone(view);\n } else {\n this._view = _.assign({}, this._view, view);\n }\n\n this._viewSubject.next(this._view);\n }\n\n public markForCheck(): void {\n this._markForCheckSubject.next(true);\n }\n\n public attach(): void {\n this._refCount++;\n\n if (this._refCount === 1) {\n setTimeout(() => {\n this.onAttached();\n });\n }\n }\n\n public detach(): void {\n this._refCount--;\n\n if (this._refCount === 0) {\n setTimeout(() => {\n this.onDetached();\n });\n }\n }\n\n public onAttached(): void { }\n\n public onDetached(): void { }\n}\n","/**\n * Dev tool class used for framing integration with Redux DevTools\n *\n * @class FramingTools\n */\nexport class FramingTools {\n private static _instance: FramingTools;\n public instantiatedControllers: any = {};\n\n public constructor() {}\n\n public static get Instance(): FramingTools {\n return this._instance || (this._instance = new this());\n }\n\n public addController(framerName: string, controller: any): void {\n this.instantiatedControllers[framerName] = controller;\n }\n\n public getAllControllers(): any {\n return this.instantiatedControllers;\n }\n\n public getControllerByKey(key: any): any {\n return this.instantiatedControllers[key] ? this.instantiatedControllers[key] : null;\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { FramingDevToolsModel as M } from './framing-dev-tools.model';\nimport { FramingDevToolsView as V } from './framing-dev-tools.view';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { Controller } from '../../controller';\nimport { Action } from '../../action';\n\n@Injectable()\nexport class FramingDevToolsController extends Controller<M, V> {\n\n private replayNavigation: boolean = false;\n\n constructor(\n private router: Router,\n ) {\n super();\n }\n\n public onControllerInit(): void {\n this.router.events.subscribe((event: any) => {\n this.handleRouterEvents(event);\n });\n\n this.markForCheck$.subscribe((data) => {\n if (this.model.snapshotUrl && this.model.snapshotUrl !== this.router.routerState.snapshot.url) {\n this.replayNavigation = true;\n this.router.navigate([ this.model.snapshotUrl ]);\n }\n }, (err) => console.error(err) );\n\n }\n\n @Action() private trackRouterState(): void {\n this.model.snapshotUrl = this.router.routerState.snapshot.url;\n }\n\n private handleRouterEvents(event: Event): void {\n if (event instanceof NavigationEnd) {\n if (!this.replayNavigation) {\n this.trackRouterState();\n }\n this.replayNavigation = false;\n }\n }\n}\n","import { Component as AngularComponent, Injector } from '@angular/core';\nimport { Component } from '../../component';\n\nimport { FramingDevToolsController as C } from './framing-dev-tools.controller';\nimport { FramingDevToolsModel as M } from './framing-dev-tools.model';\nimport { FramingDevToolsView as V } from './framing-dev-tools.view';\n\n@AngularComponent({})\nexport class FramingDevToolsComponent extends Component<M, V, C> {\n constructor(controller: C, injector: Injector) {\n super(controller, injector);\n }\n}\n","import { ActivatedRouteSnapshot } from '@angular/router';\nimport { Observable, ReplaySubject, Subject } from 'rxjs';\n\nexport class Frame {\n\n // ========================================\n // public properties\n // ========================================\n\n /**\n * The route url of the route that this controller is attached to, if any.\n * This value MAY change if the route url changes of the controllerrs route.\n */\n public routeUrl: string;\n\n /**\n * The current activated route snapshot for this frame.\n */\n public routeSnapshot: ActivatedRouteSnapshot;\n\n /**\n * An observable of the route url of the route that this controllerr is attached to, if any.\n */\n public get routeUrl$(): Observable<string> { return this.routeUrlSubject; }\n\n /**\n * Emitted when the frame resolve method starts if this controller is attached to a route.\n */\n public get resolveStart$(): Observable<void> { return this.resolveStartSubject; }\n\n /**\n * Emitted when the frame resolve method ends if this controller is attached to a route.\n */\n public get resolveEnd$(): Observable<void> { return this.resolveEndSubject; }\n\n /**\n * Emitted when the frame resolve method is cancelled if this controller is attached to a route.\n */\n public get resolveCancel$(): Observable<void> { return this.resolveCancelSubject; }\n\n /**\n * Subjects\n */\n public routeUrlSubject: ReplaySubject<string> = new ReplaySubject<string>();\n public resolveStartSubject: Subject<void> = new Subject<void>();\n public resolveEndSubject: Subject<void> = new Subject<void>();\n public resolveCancelSubject: Subject<void> = new Subject<void>();\n}\n","import { Injector, Type } from '@angular/core';\nimport { ActivatedRoute, ActivatedRouteSnapshot, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Route, Router, RouterStateSnapshot, UrlSegment } from '@angular/router';\n\nimport { Controller } from './controller';\nimport { Frame } from './frame';\nimport { FramingNgModule } from './framing-ng-module';\n\nimport * as _ from 'lodash';\nimport { FramingTools } from './devtools';\n\n/**\n * @description This is a description\n */\nexport abstract class Framer<Model, View> {\n private static _nextId: number = 1;\n private framingDevTools: FramingTools = FramingTools.Instance;\n\n // ========================================\n // public properties\n // ========================================\n\n /**\n * The name of this framer.\n */\n public abstract get framerName(): string;\n\n /**\n * Model accessor.\n */\n public get theModel(): Model { return this._model; }\n\n /**\n * View accessor.\n */\n public get theView(): View { return this._view; }\n\n /**\n * Controller accessor.\n */\n public get theController(): Type<Controller<Model, View>> { return this._controller; }\n\n /**\n * When true, framing will create a frame for this framer.\n */\n public get createFrame(): boolean { return true; }\n\n /**\n * When true, framing will use multi on all providers so multiple framers of the same type can be setup on the same module.\n */\n public get multiFramer(): boolean { return false; }\n\n /**\n * When true, framing will setup the controller as a provider by its type.\n */\n public get provideControllerByType(): boolean { return true; }\n\n /**\n * When true, framing will add the model to the route data.\n */\n public get addModelToRouteData(): boolean { return false; }\n\n /**\n * When true, framing will add the view to the route data.\n */\n public get addViewToRouteData(): boolean { return false; }\n\n /**\n * When true, framing will add the frame to the route data.\n */\n public get addFrameToRouteData(): boolean { return false; }\n\n /**\n * The default model.\n */\n public get defaultModel(): Model { return undefined; }\n\n /**\n * The default view.\n */\n public get defaultView(): View { return undefined; }\n\n /**\n * The default controller.\n */\n public get defaultController(): Type<Controller<Model, View>> { return undefined; }\n\n /**\n * 'require': framing will attach the default route, creating it if it doesn't yet exist, if not route is attached to this framer (default behavior)\n * 'auto': framing will attach the default route if available if not route is attached to this framer\n * 'none': framing will not attach a route to this framer\n */\n public get routeRule(): ('require' | 'auto' | 'none') { return 'require'; }\n\n /**\n * A unique framer id for this framer.\n */\n public get framerId(): number { return this._framerId; }\n\n /**\n * A unique identifier string for this framer instance.\n */\n public get framerIdent(): string { return `${this.framerName}Framer-${this._framerId}`; }\n\n /**\n * True if framing() has been called.\n */\n public get framed(): boolean { return this._framed; }\n\n /**\n * The injector (available on and after framerOnResolveRoute or framerOnControllerInit, whichever comes first)\n */\n public get injector(): Injector { return this._injector; }\n\n /**\n * The framer's route, if attached to a route, otherwise undefined\n * Valid ONLY during the runFraming() and framing() functions\n */\n public get route(): Route { return this._route; }\n\n // ========================================\n // private properties\n // ========================================\n\n /**\n * A unique framer id for this framer.\n */\n private _framerId: number;\n\n /**\n * True if framing() has been called.\n */\n private _framed: boolean = false;\n\n /**\n * The model.\n */\n private _model: Model;\n\n /**\n * The view.\n */\n private _view: View;\n\n /**\n * The controller.\n */\n private _controller: Type<Controller<Model, View>>;\n\n /**\n * The frame.\n */\n private _frame: Frame;\n\n /**\n * The framer's injector.\n */\n private _injector: Injector;\n\n /**\n * The framer's route, if attached to a route, otherwise undefined\n * Valid ONLY during the runFraming() and framing() functions\n */\n private _route: Route;\n\n /**\n * Reference to the framer's FramingNgModule.\n * Valid ONLY during the framing() function\n */\n private _framing: FramingNgModule;\n\n // ========================================\n // public static methods\n // ========================================\n\n /**\n * Helper function to build the URL of an ActivatedRouteSnapshot\n */\n public static buildUrlLink(route: ActivatedRouteSnapshot): string {\n if (!route) { return '/'; }\n let urls: UrlSegment[] = [];\n /* tslint:disable:no-param-reassign */\n for (; route.parent; route = route.parent) {\n /* tslint:enable:no-param-reassign */\n urls = urls.concat(route.url.reverse());\n }\n urls = urls.reverse();\n return '/' + urls.join('/');\n }\n\n // ========================================\n // public methods\n // ========================================\n\n /**\n * Model chaining function.\n */\n public model(model?: Model): Framer<Model, View> {\n _.merge(this._model, model);\n return this;\n }\n\n /**\n * View chaining function.\n */\n public view(view?: View): Framer<Model, View> {\n _.merge(this._view, view);\n return this;\n }\n\n /**\n * Controller chaining function.\n */\n public controller(controller?: Type<Controller<Model, View>>): Framer<Model, View> {\n if (controller) { this._controller = controller; }\n return this;\n }\n\n /**\n * The frame function.\n */\n public abstract frame(framing: FramingNgModule): void;\n\n /**\n * Framer on resolve route function called when framer's route is resolved.\n * Injector is set before during this call.\n * Not called if framer is not attached to a route.\n * To be overwritten if needed.\n */\n public framerOnResolveRoute(): void {}\n\n /**\n * Framer on controller init function is called when the controller is first injected.\n * To be overwritten if needed.\n */\n public framerOnControllerInit(controller: Controller<Model, View>): void {}\n\n /**\n * Calls derived framing()\n */\n public runFraming(framing: FramingNgModule, routeParam?: Route): void {\n if (this._framed) {\n console.warn(`runFraming() called multiple times on framer '${this.framerIdent}'`);\n return;\n }\n\n this._framed = true; // mark this framer to framed\n\n if (this.routeRule === 'auto') {\n // set the framer's attached route (if any)\n this._route = routeParam;\n } else if (this.routeRule === 'require') {\n // set the framer's attached route to the supplied route or create one if it doesn not exist\n if (routeParam) {\n this._route = routeParam;\n } else {\n /* tslint:disable:no-param-reassign */\n this._route = routeParam = framing.getOrAddRoute();\n /* tslint:enable:no-param-reassign */\n }\n }\n\n this._framing = framing; // set _framing to framing ONLY for the duration of the controller() function\n try {\n this.frame(framing);\n } catch (e) {\n console.error(`Exception when framing ${this.framerIdent} :`, e);\n this._model = undefined;\n this._view = undefined;\n this._controller = undefined;\n }\n this._framing = undefined;\n\n if (this.routeRule === 'auto') { // check this again incase the framer created a route\n this._route = routeParam;\n }\n\n const self = this;\n\n if (this._controller) {\n // FUTURE\n // this.provideTypeByName(framing, this.framerName + 'Controller', this._controller);\n\n if (this.provideControllerByType) {\n let controllerInstance: Controller<Model, View>;\n\n framing\n .provide({\n provide: this.framerIdent + '-ControllerInternal',\n useClass: this._controller,\n })\n .provide({\n provide: this.framerIdent + '-Controller',\n useFactory: (injector: Injector) => {\n if (controllerInstance) {\n this.framingDevTools.addController(this.framerName, controllerInstance);\n return controllerInstance;\n }\n self._injector = injector;\n controllerInstance = injector.get(this.framerIdent + '-ControllerInternal');\n controllerInstance.initController(this._model, this._view, this._frame, this.framerName, injector);\n this.framerOnControllerInit(controllerInstance);\n this.framingDevTools.addController(this.framerName, controllerInstance);\n return controllerInstance;\n },\n deps: [ Injector ],\n })\n .provide({\n provide: this._controller,\n useExisting: this.framerIdent + '-Controller',\n multi: this.multiFramer && this._controller === this.defaultController,\n });\n\n /* tslint:disable:no-console */\n console.info(`Providing controller for framer ${this.framerIdent} by type`);\n /* tslint:enable:no-console */\n\n if (this.defaultController && this._controller !== this.defaultController) {\n framing.provide({\n provide: this.defaultController,\n useExisting: this.framerIdent + '-Controller',\n multi: this.multiFramer,\n });\n /* tslint:disable:no-console */\n console.info(`Providing controller overload for framer ${this.framerIdent} by default controller type`);\n /* tslint:enable:no-console */\n }\n }\n }\n\n // FUTURE: frame, model & view provided by name\n // this.provideValueByName(framing, this.framerName + 'Frame', this._frame);\n // this.provideValueByName(framing, this.framerName + 'Model', this._model);\n // this.provideValueByName(framing, this.framerName + 'View', this._view);\n\n // FUTURE: model & view provided by type\n // this.provideInstanceByType(framing, this._model);\n // this.provideInstanceByType(framing, this._view);\n\n if (this.route) {\n if (this.addFrameToRouteData) {\n this.addRouteData(framing, this.framerName + 'Frame', this._frame);\n }\n if (this.addModelToRouteData) {\n this.addRouteData(framing, this.framerName + 'Model', this._model);\n }\n if (this.addViewToRouteData) {\n this.addRouteData(framing, this.framerName + 'View', this._view);\n }\n\n if (this._frame) {\n class FrameResolver {\n constructor(\n private router: Router,\n private route: ActivatedRoute,\n injector: Injector,\n ) {\n self._injector = injector;\n }\n\n resolve(routeSnapshot: ActivatedRouteSnapshot, routeStateSnapshot: RouterStateSnapshot): any {\n self._frame.resolveStartSubject.next();\n\n const routeUrl = Framer.buildUrlLink(routeSnapshot);\n const sub = this.router.events.subscribe((event) => {\n if (event instanceof NavigationStart) {\n console.error('Unexpected NavigationStart');\n } else if (event instanceof NavigationEnd) {\n /* tslint:disable:no-console */\n console.info(`Route url for framer ${self.framerIdent} changed to ${routeUrl}`);\n /* tslint:enable:no-console */\n self._frame.routeSnapshot = self.findActivateRouteSnapshot(this.route);\n self._frame.routeUrl = routeUrl;\n self._frame.routeUrlSubject.next(routeUrl);\n self.framerOnResolveRoute();\n self._frame.resolveEndSubject.next();\n } else if (event instanceof NavigationError) {\n self._frame.resolveCancelSubject.next();\n } else if (event instanceof NavigationCancel) {\n self._frame.resolveCancelSubject.next();\n }\n sub.unsubscribe();\n });\n return self._frame;\n }\n }\n\n framing\n .resolve(this.framerIdent, FrameResolver, this.route)\n .provide({\n provide: FrameResolver,\n useFactory: (r: Router, a: ActivatedRoute, i: Injector) => new FrameResolver(r, a, i),\n deps: [ Router, ActivatedRoute, Injector ] });\n }\n }\n\n this._route = undefined; // clear the route so we're not holding any references to its properties\n }\n\n // ========================================\n // constructor\n // ========================================\n\n /**\n * Contructor.\n */\n public constructor(model?: Model, view?: View, controller?: Type<Controller<Model, View>>) {\n this.construct(model, view, controller);\n }\n\n /**\n * Protected construct function for derived construction help.\n */\n protected construct(model?: Model, view?: View, controller?: Type<Controller<Model, View>>): void {\n this._framerId = Framer._nextId++;\n if (this.createFrame) {\n this._frame = new Frame();\n }\n const defaultModel = this.defaultModel;\n this._model = defaultModel ? _.merge(defaultModel, model) : model;\n const defaultView = this.defaultView;\n this._view = defaultView ? _.merge(defaultView, view) : view;\n this._controller = controller || this.defaultController;\n }\n\n /**\n * Protected construct function for derived construction help.\n */\n private findActivateRouteSnapshot(route: ActivatedRoute): ActivatedRouteSnapshot {\n if (!route) {\n console.error('Failed to find activated route snapshot');\n return undefined;\n }\n if (route.snapshot && route.snapshot.data && route.snapshot.data.hasOwnProperty(this.framerIdent)) {\n return route.snapshot;\n }\n return this.findActivateRouteSnapshot(route.firstChild);\n }\n\n /**\n * FUTURE\n */\n // private provideTypeByName(framing: FramingNgModule, name: string, type: any): void {\n // if (type) {\n // framing.provide({ provide: name, useClass: type });\n // /* tslint:disable:no-console */\n // console.info(`Providing ${name} for framer ${this.framerIdent} by name`);\n // /* tslint:enable:no-console */\n // }\n // }\n\n /**\n * FUTURE\n */\n // private provideInstanceByType(framing: FramingNgModule, instance: any): void {\n // if (instance &&\n // (instance as any).__proto__ &&\n // (instance as any).__proto__.constructor &&\n // (instance as any).__proto__.constructor.name !== 'Object') {\n // framing.provide({ provide: (instance as any).__proto__.constructor, useValue: instance });\n // /* tslint:disable:no-console */\n // console.info(`Providing ${(instance as any).__proto__.constructor.name} for framer ${this.framerIdent} by type`);\n // /* tslint:enable:no-console */\n // }\n // }\n\n /**\n * FUTURE\n */\n // private provideValueByName(framing: FramingNgModule, name: string, value: any): void {\n // if (value) {\n // framing.provide({ provide: name, useValue: value });\n // /* tslint:disable:no-console */\n // console.info(`Providing ${name} for framer ${this.framerIdent} by name`);\n // /* tslint:enable:no-console */\n // }\n // }\n\n private addRouteData(framing: FramingNgModule, name: string, value: any): void {\n if (value) {\n const routeConfig = framing.getOrAddRoute(this.route);\n if (routeConfig.data && routeConfig.data[name]) {\n console.warn(`Failed to add ${name} route data for framer ${this.framerIdent}. Data item already exists.`);\n } else {\n framing.datum(name, value, this.route);\n /* tslint:disable:no-console */\n console.info(`Adding ${name} route data for framer ${this.framerIdent}`);\n /* tslint:enable:no-console */\n }\n }\n }\n}\n","import { Type } from '@angular/core';\n\nimport { FramingDevToolsController as C } from './framing-dev-tools.controller';\nimport { FramingDevToolsModel as M } from './framing-dev-tools.model';\nimport { FramingDevToolsView as V } from './framing-dev-tools.view';\nimport { Framer } from '../../framer';\nimport { FramingNgModule } from '../../framing-ng-module';\n\nexport class FramingDevToolsFeature extends Framer<M, V> {\n public get defaultModel(): M {\n return {};\n }\n\n public get defaultView(): V {\n return {};\n }\n\n public frame(framing: FramingNgModule): void {}\n\n public framerOnResolveRoute(): void {\n let framingDevToolsController: C;\n framingDevToolsController = this.injector.get(C);\n }\n\n // ========================================\n // internal framing methods (don't touch!)\n // ========================================\n\n public get framerName(): string { return 'FramingDevTools'; }\n\n public get defaultController(): Type<C> { return C; }\n}\n","import {\n ComponentFactoryResolver,\n ComponentRef,\n Directive,\n EventEmitter,\n Injector,\n Input,\n NgModuleFactory,\n NgModuleRef,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n Type,\n ViewContainerRef,\n} from '@angular/core';\n\nimport { FramingComponentOutlet } from './component-outlet';\n\n@Directive({\n selector: '[framingComponentOutlet]',\n})\nexport class FramingComponentOutletDirective implements OnChanges, OnDestroy, FramingComponentOutlet {\n @Input() framingComponentOutlet: Type<any>;\n @Input() injector: Injector;\n @Input() content: any[][];\n @Input() ngModuleFactory: NgModuleFactory<any>;\n\n @Output() onComponent: EventEmitter<ComponentRef<any>> = new EventEmitter<ComponentRef<any>>();\n\n private _componentRef: ComponentRef<any>;\n private _moduleRef: NgModuleRef<any>;\n\n constructor(\n private _view: ViewContainerRef,\n ) {}\n\n isActivated(): boolean { return !!this._componentRef; }\n\n ngOnChanges(changes: SimpleChanges): void {\n let activate = false;\n if ((changes as any).ngModuleFactory) {\n if (this._moduleRef) { this._moduleRef.destroy(); }\n if (this.ngModuleFactory) {\n const injector = this.injector || this._view.parentInjector;\n this._moduleRef = this.ngModuleFactory.create(injector);\n } else {\n this._moduleRef = undefined;\n }\n activate = true;\n }\n\n if ((changes as any).framingComponentOutlet.currentValue !== (changes as any).framingComponentOutlet.previousValue) {\n activate = true;\n }\n\n if (activate) {\n this.activate(this.framingComponentOutlet);\n }\n }\n\n ngOnDestroy(): void {\n this.deactivate();\n if (this._moduleRef) { this._moduleRef.destroy(); }\n }\n\n private activate(component: Type<any>): void {\n this.deactivate();\n\n if (!component) {\n return;\n }\n\n try {\n const injector = this.injector || this._view.parentInjector;\n const factory = injector.get(ComponentFactoryResolver).resolveComponentFactory(component);\n this._componentRef = this._view.createComponent(factory, this._view.length, injector, this.content);\n this.onComponent.emit(this._componentRef);\n try {\n this._componentRef.changeDetectorRef.detectChanges();\n } catch (e) {\n console.error(`detectChanges failed on activated component in FramingComponentOutlet`, { e, component });\n return;\n }\n } catch (e) {\n console.error(`Failed to activate component in FramingComponentOutlet`, { e, component });\n return;\n }\n }\n\n private deactivate(): void {\n if (this._componentRef) {\n this._view.remove(this._view.indexOf(this._componentRef.hostView));\n this._componentRef.destroy();\n }\n this._view.clear();\n this._componentRef = undefined;\n }\n}\n","import { ANALYZE_FOR_ENTRY_COMPONENTS, ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { FramingComponentOutletDirective } from './component-outlet.directive';\n\n@NgModule({\n declarations: [ FramingComponentOutletDirective ],\n exports: [ FramingComponentOutletDirective ],\n})\nexport class FramingComponentOutletModule {\n static withEntryComponents(...components: any[]): ModuleWithProviders {\n return {\n ngModule: FramingComponentOutletModule,\n providers: [\n { provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: components, multi: true },\n ],\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\nimport { Observable, ReplaySubject } from 'rxjs/Rx';\nimport { AnonymousSubscription } from 'rxjs/Subscription';\n\nimport { FramingContainerOutletContent } from './container-outlet-content';\n\nimport * as _ from 'lodash';\n\n@Injectable()\nexport class FramingContainerOutletService {\n\n public get contents$(): Observable<FramingContainerOutletContent[]> { return this.contentsSubject.asObservable(); }\n\n private contentsSubject: ReplaySubject<FramingContainerOutletContent[]> = new ReplaySubject<FramingContainerOutletContent[]>();\n private contents: FramingContainerOutletContent[] = [];\n private routeContents: FramingContainerOutletContent[] = [];\n\n private subscriptions: AnonymousSubscription[] = [];\n\n constructor(\n private router: Router,\n ) {\n this.subscriptions.push(this.router.events.subscribe((event) => {\n if (event instanceof NavigationEnd) {\n this.onNavigationEnd();\n }\n }));\n }\n\n public hasContent(container: string): boolean {\n return !!this.contents.filter((c) => _.isEqual(c.container, container)).length;\n }\n\n public activate(content: FramingContainerOutletContent): () => void {\n this.contents.push(content);\n this.contentsSubject.next(_.clone(this.contents));\n return () => { this.deactivate(content); };\n }\n\n private deactivate(content: FramingContainerOutletContent): void {\n this.contents = this.contents.filter((e) => e !== content);\n this.contentsSubject.next(_.clone(this.contents));\n }\n\n private onNavigationEnd(): void {\n let newRouteContents: FramingContainerOutletContent[] = [];\n this.resolveRouteContents(this.router.routerState.snapshot.root, newRouteContents);\n\n newRouteContents = _.uniqWith(newRouteContents, _.isEqual);\n\n const newContents = _.differenceWith(newRouteContents, this.routeContents, _.isEqual);\n const removedContents = _.differenceWith(this.routeContents, newRouteContents, _.isEqual);\n\n newContents.forEach((c) => this.activate(c));\n removedContents.forEach((c) => this.deactivate(c));\n\n this.routeContents = newRouteContents;\n }\n\n private resolveRouteContents(snapshot: ActivatedRouteSnapshot, routeContents: FramingContainerOutletContent[]): void {\n if (snapshot.data && (snapshot.data as any).containers) {\n const containers: FramingContainerOutletContent[] = (snapshot.data as any).containers;\n for (const container of containers) {\n routeContents.push(container);\n }\n }\n for (let child of snapshot.children) {\n this.resolveRouteContents(child, routeContents);\n }\n }\n}\n"],"names":["activated","ref","destroy","__decorate","_angular_core","Input","exports","FramingContainerOutletDirective","prototype","__metadata","__metadata$3","Boolean","Output","Directive","ViewContainerRef","FramingContainerOutletService","_angular_router","Router","__decorate$7","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","FramingContainerOutletModule","FramingContainerOutletModule_1","withEntryComponents","components","_a","ngModule","providers","provide","ANALYZE_FOR_ENTRY_COMPONENTS","useValue","multi","forRoot","metadata","k","v","this","injector","FramingContainerOutletResolver","resolve","_b","containers","__decorate$8","FramingEmptyParentComponent","selector","template","__decorate$11","FramingRootComponent","__decorate$10","FramingComponentsModule","NgModule","RouterModule","FramerHelper","enumerable","_nextId","FramingNgModule","_ngModule","imports","bootstrap","entryComponents","configurable","_this","lodash","defaults","each","filter","keys","isArray","uniqWith","concat","reject","isNil","isEqual","flattened","apply","child","parent","parentRoute","getOrAddRouteOverload","_.each","children","component","route","routeConfig","componentAndDeclare","componentAndDeclaration","declare","container","hasOwnProperty","getOrAddRoute","components_1","push","datum","_.merge","data","merge","resolves","declaration","declarations","declareAndExport","declarationAndExport","declarationsAndExports","declareAndEntryComponent","declarationAndEntryComponent","declarationsAndEntryComponents","entryComponent","export","e","import","importAndExport","m","importsAndExports","modules","provider","config","_routeConfig","routes","framers","array","_routes","path","pathMatch","defaultPathMatch","frame","buildRouteFramers","buildRoot","inspectModule","forEach","inspectRoute","undefined","redirectTo","isEmpty","loadChildren","console","error","self","FormsModule","_angular_platformBrowser","BrowserModule","withServerTransition","appId","_angular_forms","CommonModule","_rootComponent","_angular_common","buildFramers","routes_1","prop","_frame","buildFramer","buildContainers","_loop_2","containers_2","containers_3","containerId","id","resolveId","this_2","useFactory","deps","Injector","routes_2","buildRoute","fullRoutes_1","prefixRoutes_1","warn","routing","_root","extraRootRouterOptions","forChild","result","Framing","ngModuleBuilder","Action","description","log","args","_i","listenForChanges","onLoad","devTools","stateRoot","controller","_framerName","model","state","framerName","value","send","propertyKey","originalMethod","isListening","connection","connect","subscribe","message","messageState","JSON","parse","_createReduxDevtoolsExtension","legacyExtensionKey","extensionKey","Component$1","changeDetectorRef","get","ChangeDetectorRef","subscriptions","model$","updateModel","view$","view","updateView","markForCheck$","markForCheck","attach","ngOnInit","ngOnDestroy","detach","s","unsubscribe","Controller","onResolveCancel","initController","_modelSubject","rxjs_BehaviorSubject","BehaviorSubject","_viewSubject","_model$","asObservable","_view$","_model","_view","_markForCheckSubject","_markForCheck$","_injector","resolveStart$","onResolveStart","resolveEnd$","onResolveEnd","resolveCancel$","onControllerInit","replace","clone","assign","next","_refCount","setTimeout","onAttached","FramingTools","instantiatedControllers","_instance","getAllControllers","getControllerByKey","framingTools","Instance","__metadata$1","FramingDevToolsController","_super","router","call","replayNavigation","events","event","handleRouterEvents","snapshotUrl","routerState","snapshot","url","navigate","err","trackRouterState","AngularComponent","FramingDevToolsComponent","Component","__extends","resolveCancelSubject","framingDevTools","Framer","framerOnResolveRoute","framerOnControllerInit","runFraming","framing","routeParam","_framed","routeRule","_framing","framerIdent","_controller","provideControllerByType","controllerInstance_1","useClass","addController","multiFramer","defaultController","addFrameToRouteData","addRouteData","addModelToRouteData","addViewToRouteData","FrameResolver_1","routeSnapshot","resolveStartSubject","routeUrl","buildUrlLink","NavigationStart","NavigationEnd","info","findActivateRouteSnapshot","routeUrlSubject","resolveEndSubject","NavigationError","NavigationCancel","sub","a","ActivatedRoute","_route","construct","defaultModel","name","FramingDevToolsFeature","__metadata$2","FramingComponentOutletDirective","onComponent","EventEmitter","isActivated","_componentRef","ngOnChanges","changes","activate","ngModuleFactory","_moduleRef","parentInjector","create","framingComponentOutlet","currentValue","previousValue","deactivate","factory","ComponentFactoryResolver","resolveComponentFactory","createComponent","content","emit","detectChanges","remove","indexOf","hostView","clear","Array","__decorate$4","FramingComponentOutletModule","FramingComponentOutletModule_1","__metadata$4","contentsSubject","rxjs_Rx","ReplaySubject","contents","routeContents","onNavigationEnd","hasContent","newRouteContents","resolveRouteContents","root","newContents","differenceWith","removedContents","containers_1","_c","_containerService","_router","onComponents","_activated","_subscriptions","containerName","framingContainerOutlet","contents$","onContent","optionalContainer","allContents","this_1","activatedIndex","findIndex","splice","insert","contents_1","_loop_1","map","useViewInjector"],"mappings":"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"}
\No newline at end of file