Pete Richards 1bb1330cba Squashed commit of the following:
commit 5aad2e68635d658cdaf78f322622506c7a6ef695
Author: charlesh88 <charlesh88@gmail.com>
Date:   Thu Aug 30 14:34:44 2018 -0700

    Code trimming / cleanup

    - pane tweaks;

commit 139e5ab18481f8687950bd84a06a2dc01bf51a50
Author: charlesh88 <charlesh88@gmail.com>
Date:   Thu Aug 30 13:50:26 2018 -0700

    Code trimming / cleanup

    - pane tweaks;

commit e3bb3871395ef7906e1141b76c609472598e2a5d
Author: charlesh88 <charlesh88@gmail.com>
Date:   Thu Aug 30 13:38:35 2018 -0700

    Code trimming / cleanup

    - pane, Layout;

commit 6edaea088931673c971a17e86138553e48e7cc22
Author: charlesh88 <charlesh88@gmail.com>
Date:   Thu Aug 30 12:57:21 2018 -0700

    Collapse button new design and styling WIP

    - Also begin code cleanups;

commit bd8fab372602bf8680974c27967ca3c2560469b2
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 29 18:04:47 2018 -0700

    Vertical pane resizing fixed

    - Vertical pane styling with significant fixes;

commit cf89e8a86fe0efbce80e7624d02d09ad17ecf705
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 29 16:52:53 2018 -0700

    Vertical pane resizing fixed

    - Vertical pane styling with significant fixes;

commit b3ad4c4c140c2155535dd2ec053448a92d215f1f
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 29 15:58:12 2018 -0700

    Vertical pane resizing fixed! Kind of...

    - pane__contents at 100% height is causing problems, fix this.
    - Normalized scss var names $splitterBtn*;
    - Added --reacts to pane to allow setting of proper flex attribs;

commit 49cead8cc67c23a2aba3e4fc83c12487ecc8f8ac
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 28 19:07:23 2018 -0700

    WIP fixing vertical pane drag problem, still broken

    - Converting from flex-basis back to width / height;
    - Make inspector-adapter target proper holder;
    - Added --resizing class to allow user-select: none while dragging;
    - Added mixins for browser prefixing;

commit c6ff381cf0da098529c42a8d0f7d8eb95d9575d6
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 28 14:56:50 2018 -0700

    New design for pane collapse buttons

    - Pane padding normalized;

commit 7cfbfe3d9642b5466f72a6076d90d464dac23a37
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 28 10:27:05 2018 -0700

    CSS sanding, panes and Inspector

    - Pane padding;
    - Inspector min-width;

commit 7d7eeff462735b86a599404aca70ad49a6af6ae7
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 28 10:01:02 2018 -0700

    Pane transitions

    - Fixed pane transitions;

commit cf160c27e951609aa32fd1ffb070cf044c6f0d63
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 28 09:09:49 2018 -0700

    Splitter styling WIP

    - Hover styling

commit 022126ca2166962299b232a6972461672fb0b85e
Author: charlesh88 <charlesh88@gmail.com>
Date:   Mon Aug 27 21:18:14 2018 -0700

    Tree styling WIP

    - Mobile styling;
    - Increased hit area for desktop and mobile on tree item;
    - Added button mixin;
    - Fixed scrolling for tree in tree pane;

commit 3f1e649526fc81efa60f9f464e2d718be4eb378f
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 24 14:47:22 2018 -0700

    Drag collapse WIP

commit f9b764bb6415d4146dff8667e0e0f0d6c2847216
Author: charlesh88 <charlesh88@gmail.com>
Date:   Thu Aug 23 16:02:02 2018 -0700

    Significant changes to splitter handle and button approach

    - WIP!;
    - WIP on drag to collapse;

commit a1d9c11e82a967bd6cb3da8cf2e4eda328472347
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 22 17:55:21 2018 -0700

    Pane refactor styles WIP

    - WIP converting from width/height to flex-basis;

commit b65cca277e28375424260f50c7e2d1fe6bf02cb2
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 22 17:54:34 2018 -0700

    Pane refactor styles WIP

    - WIP converting from width/height to flex-basis;

commit 3e712045296a1c475326e21ada9d5febee72878b
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 22 17:51:07 2018 -0700

    Pane refactor styles WIP

    - Pane transitions;
    - TODO: convert from width/height to flex-basis;

commit b070cc27f4d35d1380d2f4ada84100a7c39734e1
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 22 10:21:14 2018 -0700

    Mobile styles WIP

    - Mobile layout mostly done;
    - Pane transitions;

commit 2ee7a77a86ee8e5b323b6b73116fcc29dd29e651
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 21 15:56:12 2018 -0700

    Refinements to view control in tree

    - Changed state eval to use 'enabled', removed v-if;

commit 3a2439cd16b70d069d5343631d3bca5c871a784c
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 21 15:53:34 2018 -0700

    Mobile styles, VERY WIP

    WARNING: DON'T PULL!!
    - Mobile in progress;

commit 4e0dcb68bf755173f34882048f21fc79894cd6d2
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 21 11:45:22 2018 -0700

    Markup / scss refactor mobile styles WIP

    - Layout, panes mobile styling WIP

commit 02afd44dd1bba3824faca01ead10f17ebc2ce4f4
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 21 11:44:05 2018 -0700

    Markup / scss refactor styles WIP

    - Moved glyph constants into _constants to avoid multiple loads of
    glyph classes;

commit 703abe36c9130ed8d24e28257f108dc6ff6680ed
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Mon Aug 20 13:20:58 2018 -0700

    tree loads composition

    Expose legacy types in new API

    tree navigation

commit 80a185440b593052af12ccece9c2fe2cf21934c9
Merge: 93196379a 8378dfa61
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 18:00:04 2018 -0700

    Merge branch 'core-vue-bootstrap' of https://github.com/nasa/openmct into core-vue-bootstrap

commit 93196379aae56a141fadb425eee7138b7ae397c1
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 17:59:43 2018 -0700

    Pane padding WIP

    - Adding resize handle direction to l-pane element;

commit bea135a221b1c19bcecbc65c6ffc98ea5106f1e9
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 17:48:20 2018 -0700

    Inspector styling

    - Moved legacy CSS as needed into MctInspector component;

commit 8378dfa613ec06c80ed7f8f58ee34194aa21ff7f
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Aug 17 17:31:12 2018 -0700

    Recursive tree items

commit e4420c17c6b1f9d14431b198a8005f61a2d132bb
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 17:02:20 2018 -0700

    Sanding and shimming on legacy CSS

    - Jury-rigging to temporarily display some views: imagery, tables
    - Code style normalization in _global.scss;

commit 5aa2be97613f4d2566e07e76204f58cd1ca5499b
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 16:22:54 2018 -0700

    Bring in legacy CSS

    - Legacy styles from old _global.scss moved into section of new
    _global file;
    - Most UI elements are working
    - TODO: fix Inspector grid

commit 8d4734ef5b123949bec5c848be91f70a0deb655e
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 15:17:22 2018 -0700

    Remove commented CSS

commit e641aa69497c82c1a69e5d4cfe3ebcb81832029c
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 14:37:13 2018 -0700

    Main container and scroll-bar styling

commit c3262de1b796e9c9deb6edf08b3b781af55e1e73
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 14:14:01 2018 -0700

    Add status bar

commit 8addfb886ecdc081c126c5a9f01724985b6b192e
Merge: e6be02fb8 4203dbf8e
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 13:52:11 2018 -0700

    Merge branch 'core-vue-bootstrap' of https://github.com/nasa/openmct into core-vue-bootstrap

commit e6be02fb8da37a3642735b515b3efcce9bcdcce1
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 13:51:53 2018 -0700

    Splitter refinements / mixin fix

    - Splitter with resize grippy;
    - Fixed @background-image mixins;

commit 4203dbf8e1df75b89cfcda38a5c2e70e3b52c8a4
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Aug 17 13:46:38 2018 -0700

    Replace angular route with custom router

commit 5a07f0d2b579f4cfdf2a247b971ae256eddddcd3
Merge: e6b22cbcb 63f22c3f2
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 09:39:45 2018 -0700

    Merge branch 'core-vue-bootstrap' of https://github.com/nasa/openmct into core-vue-bootstrap

commit e6b22cbcbe949d55d36ffad2484c920b8ec55f9e
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 17 09:39:33 2018 -0700

    Markup / scss refactor WIP

    - Significant reorg of splitter CSS to reduce specificity;
    - Splitter enhancements for collapsed state;

commit 63f22c3f213701ef12e140ba3db4f428c08a099f
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Aug 17 09:32:29 2018 -0700

    remove extraneous files

commit 17cf0cf1e64e9bd8d2d7ea43d766a6d2246d22ae
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Thu Aug 16 12:43:10 2018 -0700

    Render main and inspector using angular

commit 233c17e75b9920dd663a0c0415aa1b3d4cbca1ef
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 15 18:05:44 2018 -0700

    Markup / scss refactor WIP

    - Scroll on tree;
    - Class renaming pane > l-pane;
    - Refinements to collapsed state, WIP

commit 1eaa568e048ae23339b004a45b73be20d20334c2
Merge: 82dd8e22e 3957fd619
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 15 17:28:45 2018 -0700

    Markup / scss refactor WIP

    - Merge latest from Pete

commit 82dd8e22e76b1a802b65e1297719f0a959cc7a97
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 15 17:26:45 2018 -0700

    Markup / scss refactor WIP

    - Inspector styling - very WIP!

commit 3957fd619a44e40faa57ea297e374257012f551e
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 15 16:47:48 2018 -0700

    Tidy pane js

commit 91eefbfa7bfdcabbf9eb6217c03b8072421ac8dd
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 15 16:44:02 2018 -0700

    Pane cleanup

commit 5deff887fc73274d71dd9c94adc23a3a2d696424
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 15 16:25:35 2018 -0700

    Markup / scss refactor WIP

    - Added disabled property to viewControl;
    - Margin for elements in main panes;
    - Main search input styled for --major;

commit 6708c797546eabb15783850d4f345d9329b25ee4
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 15 14:34:54 2018 -0700

    Markup / scss refactor WIP

    - Fix modifiers to correctly use '--';
    - Fix icon element in search input to disallow shrinking;

commit 7c83db11adf696ff0f0fc6478a41fa515fa57a86
Merge: e24852bb8 43f978e18
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 15 13:58:43 2018 -0700

    Merge branch 'core-vue-bootstrap' of https://github.com/nasa/openmct into core-vue-bootstrap

commit e24852bb836730a64f77c1ffbb4cf4c1e793bc0c
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 15 13:57:27 2018 -0700

    Markup / scss refactor WIP

    - Tree item styling

commit 43f978e185094231d326a6e14d5d1df01d2948dd
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 15 13:52:34 2018 -0700

    Use multipane instead of splitter

commit f67f03af47ac4d2e22e8cca7ccb39a0dff14ea96
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 15 12:43:32 2018 -0700

    new multipane

commit f6b90caaff1882572f0113befa17d09e8778092c
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 15 10:41:46 2018 -0700

    Markup / scss refactor WIP

    - Added view-control component

commit 4c5baf183adfbd64022a4f5a98f58a49497c67ba
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 15 10:38:26 2018 -0700

    Markup / scss refactor WIP

    - Added sass-base.scss to make it easier for SFC's to
    include needed SASS vars, mixins, etc. with a single import;
    - Cleaned up indention in Layout.vue;

commit b2d12f95eee479c470ec014b5a49ccd0b3006879
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 14 23:24:45 2018 -0700

    Markup / scss refactor WIP

    - Fix transition of magnify glass icon

commit 4449994ca4f9f8af419a40dc0099159e639af327
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 14 17:31:47 2018 -0700

    Markup / scss refactor WIP

    - Added code comments

commit 84fde4bd34c6526e4ed8aef74d8c5f1c60c11874
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 14 17:29:50 2018 -0700

    Markup / scss refactor WIP

    - Search input dynamic behavior

commit 9424f9f49e80abd3353b0ddfbe4609c466bba0fd
Author: charlesh88 <charlesh88@gmail.com>
Date:   Tue Aug 14 11:28:25 2018 -0700

    Markup / scss refactor WIP

    - Search input styling and dynamics WIP;

commit dfc02cdf258b9d178004767c54adf81891a95f24
Author: charlesh88 <charlesh88@gmail.com>
Date:   Mon Aug 13 15:34:29 2018 -0700

    Markup / scss refactor WIP

    - Add input-related styling;
    - Cleanup scss in various files;
    - Move search into own component;
    - Refine padding approach in pane-tree;

commit 94a3e9e798689b023cac72b31b32b754606803de
Author: charlesh88 <charlesh88@gmail.com>
Date:   Mon Aug 13 14:36:41 2018 -0700

    Markup / scss refactor WIP

    - Add collapse buttons to splitter;

commit d35aed2d62cfa4a8f31fb78d57a03b6a216fa7ef
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 10 18:45:37 2018 -0700

    Markup / scss refactor WIP

    - Add some initial theme files; pull back from theme "override"
    approach;
    - Splitters refined;
    - Style cleanups;

commit 32cdecebcee92594a3049f22be7084690c983318
Author: charlesh88 <charlesh88@gmail.com>
Date:   Fri Aug 10 14:53:16 2018 -0700

    Markup / scss refactor WIP

    - Markup and components corrected;
    - Stubbed in snow theme file;

commit f811318d183c16dd53d74807f3320d6ae2403090
Author: charlesh88 <charlesh88@gmail.com>
Date:   Thu Aug 9 16:02:22 2018 -0700

    Markup / scss refactor WIP

    - Add normalize.min to styles-new;
    - Factor components to be more standalone, very WIP;

commit 4d9b7fe3e4bbbf4a089242fbfcb20e80a5de102b
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 8 18:06:11 2018 -0700

    Markup / scss refactor WIP

    - Add timestamp to webpack build

commit dd93653306c0bf8acf463e8e1e4eb654196a2e6e
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 8 18:03:00 2018 -0700

    Markup / scss refactor WIP

    - Use MctTree component with passed properties;
    - MctTree markup and CSS ported from codepen;

commit 84430d34b1e7fc3ff80d51a2b6057eebd2fe5f79
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 8 17:39:26 2018 -0700

    Markup / scss refactor WIP

    - Add new splitter component with passed properties;

commit 50be48342136ed568ecc82a6bd7a98c2e5b19853
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 8 16:04:41 2018 -0700

    Markup / scss refactor WIP

    - Mixins file added;
    - Markup and -shell CSS from codepen brought over;

commit fe2667285e8f2c1a87511b48dbf3711c28db7d5d
Merge: c7bd7d97d 5219f5394
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 8 15:15:21 2018 -0700

    Merge branch 'core-vue-bootstrap' of https://github.com/nasa/openmct into core-vue-bootstrap

commit 5219f5394ef21f7408d03198a55dcbaa5377ad46
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 8 15:13:28 2018 -0700

    Add alias for styles directory

commit c7bd7d97dc4ac1d75b9d27c7a3c2453794bc8722
Merge: 0a7c16031 ab18bb348
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 8 13:55:44 2018 -0700

    Merge branch 'core-vue-bootstrap' of https://github.com/nasa/openmct into core-vue-bootstrap

commit ab18bb3484f5f0b2e6a130d38c202a4a64c819fd
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 8 13:48:27 2018 -0700

    Revert "temporarily use file loader for live-reload via plugin"

    This reverts commit 2f54f404c22a9fe1721a90f7d5bd374db8b2eeff.

commit 9c0d5f7dbf130c59c5c6b9b6e2e1f0aac2c13dbd
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 8 13:48:17 2018 -0700

    Enable HMR in dev server

commit 0a7c1603159badc51aafd83bbfa8f942a949465a
Author: charlesh88 <charlesh88@gmail.com>
Date:   Wed Aug 8 11:26:03 2018 -0700

    Markup / scss refactor WIP

    - Symbol fonts and glyphs files;
    - Constants, global, etc. in progress;

commit 0fa09e31a681429b6585783f2a6852766f04ece2
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 8 10:30:11 2018 -0700

    WIP new styles

commit 2f54f404c22a9fe1721a90f7d5bd374db8b2eeff
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 8 10:29:23 2018 -0700

    temporarily use file loader for live-reload via plugin

commit 279e0bf29dd27f2c7d065cc8519766783826a4fe
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Tue Aug 7 14:59:04 2018 -0700

    Beginning of new layout code.

    Really basic 5 component setup.
2018-08-31 12:03:15 -07:00
..
2018-08-31 12:03:15 -07:00
2018-08-07 14:47:50 -07:00

Framework-level components for Open MCT. This is Angular and Require, with an extra layer to mediate between them and act as an extension mechanism to allow plug-ins to be introduced declaratively.

Usage

This section needs to be written. For now, refer to implementation notes and examples in example/builtins, example/extensions, and example/composite.

Circular dependencies

The framework layer (like Angular itself) does not support circular dependencies among extensions. Generally, circular dependencies can be avoided by refactoring; for instance, a dependency-less intermediary can be added by two parties which depend upon one another, and both can depend upon this intermediary while one abandons its dependency to the other (the intermediary must then provide the functionality that was needed in the abandoned dependency.)

In some cases this refactoring is non-obvious or ineffective (for instance, when a service component depends upon the whole.) In these cases, Angular's $injector may be used to break the declaration-time dependency, by allowing retrieval of the dependency at use-time instead. (This is essentially the same solution as above, where $injector acts as an application-global generalized intermediary.)

Implementation Notes

The framework layer is responsible for performing a four-stage initialization process. These stages are:

  1. Loading definitions. JSON declarations are loaded for all bundles which will constitute the application, and wrapped in a useful API for subsequent stages. Sources in src/load
  2. Resolving extensions. Any scripts which provide implementations for extensions exposed by bundles are loaded, using Require. Sources in src/resolve
  3. Registering extensions. Resolved extensions are registered with Angular, such that they can be used by the application at run-time. This stage includes both registration of Angular built-ins (directives, controllers, routes, constants, and services) as well as registration of non-Angular extensions. Sources in src/register
  4. Bootstrapping. JSON declarations are loaded for all bundles which will constitute the application, and wrapped in a useful API for subsequent stages. Sources in src/bootstrap

Additionally, the framework layer takes responsibility for initializing other application state. Currently this simply means adding Promise to the global namespace if it is not defined.

Load stage

Using Angular's $http, the list of installed bundles is loaded from bundles.json; then, each bundle's declaration (its path + bundle.json) is loaded. These are wrapped by Bundle objects, and the extensions they expose are wrapped by Extension objects; this is only to provide a useful API for subsequent stages.

A bundle is a set of related extensions; an extension is an individual unit of the application that is meant to be used by other pieces of the application.

Resolution stage

Some, but not all, individual extensions have corresponding scripts. These are referred to by the implementation field in their extension definition. The implementation name should not include the bundle path, or the name of the source folder; these will be pre-pended by the framework during this stage. The implementation name should include a .js extension.

Bundles may utilize third-party libraries, and may wish to expose these such that other bundles may use them. Require JS may need special configuration to recognize and utilize third-party libraries, and when exposing a third-party library it may be desirable to do so under a short name (to avoid long relative paths.) Such configuration is performed during the resolution stage, immediately before implementations are loaded. Any configuration properties from a bundle's definition (bundle.json) will be used to perform this configuration; these configuration should take the same form as needed to populate a require.config call. At present, only shim and paths options are supported; any paths will be prepended with the bundle's library path (the bundle's lib folder, by default; this directory name can be overridden by specifying a libraries property in bundles.json.)

An extension is resolved by loading its implementing script, if one has been declared. If none is declared, the extension's raw definition is used instead. To ensure that extensions look similar regardless of whether or not an implementation is present, all key-value pairs from the definition are copied to the loaded implementation (if one has been loaded.)

Registration stage

Following implementation resolution, extensions are registered by Angular. How this registration occurs depends on whether or not there is built in support for the category of extension being registered.

  • For built-in extension types (recognized by Angular), these are registered with the application module. These categories are directives, controllers, services, constants, and routes.
  • For composite services, extensions of category components are passed to the service compositor, which builds up a dependency graph among the components such that their fully-wired whole is exposed as a single service.
  • For general extensions, the resolved extensions are assembled into a list, with Angular-level dependencies are declared, and the full set is exposed as a single Angular "service."

Priority order

Within each category, registration occurs in priority order. An extension's priority may be specified as a priority property in its extension definition; this may be a number, or a symbolic string. Extensions are registered in reverse numeric order (highest-priority first), and symbolic strings are mapped to the numeric values as follows:

  • fallback: Negative infinity. Used for extensions that are not intended for use (that is, they are meant to be overridden) but are present as an option of last resort.
  • default: -100. Used for extensions that are expected to be overridden, but need a useful default.
  • none: 0. Also used if no priority is specified, or if an unknown or malformed priority is specified.
  • optional: 100. Used for extensions that are meant to be used, but may be overridden.
  • preferred: 1000. Used for extensions that are specifically intended to be used, but still may be overridden in principle.
  • mandatory: Positive infinity. Used when an extension should definitely not be overridden.

These symbolic names are chosen to reflect usage where many extensions may satisfy a given usage, but only one may be used; in this case, as a convention it should be the lowest-ordered (highest-priority) extensions available. In other cases, a full set (or multi-element subset) of extensions may be desired, with a specific ordering; in these cases, it is preferable to specify priority numerically when declaring extensions, and to understand that extensions will be sorted according to these conventions when using them.

Composite services

Composite services are assumed to follow a provider-aggregator-decorator pattern where:

  • Providers have dependencies as usual, and expose the API associated with the service they compose. Providers are full service implementations in-and-of-themselves.
  • Aggregators have dependencies as usual plus one additional dependency, which will be satisfied by the array of all providers registered of that type of service. Implementations are assumed to include an extra argument (after what they declare in depends) to receive this array. Aggregators make multiple providers appear as one.
  • Decorators have dependencies as usual plus one additional dependency, which will be satisfied by either an aggregator (if one is present), the latest provider (if no aggregator is present), or another decorator (if multiple decorators are present.) As with aggregators, an additional argument should be accepted by the implementation to receive this. Decorators modify or augment the behavior of a service, but do not provide its core functionality.
  • All of the above must be declared with a provides property, which indicates which type of service they compose. Providers will only be paired with aggregators of matching types, and so on. The value of this property is also the name of the service that is ultimately registered with Angular to represent the composite service as a whole.

The service compositor handles this in five steps:

  1. All providers are registered.
  2. Arrays of providers are registered.
  3. All aggregators are registered (with dependencies to the arrays registered in the previous step.)
  4. All decorators are registered (with dependencies on the most recent components of matching types.)
  5. Full composite services are registered (essentially aliasing back to the latest component registered of a given type.)

Throughout these steps, components are registered with Angular using generated names like typeService[decorator#11]. It is technically possible to reference these dependencies elsewhere but that is not the intent. Rather, the resulting composed service should be referred to as typeService (or, more generally, the value matched from the provides field of the paired service components.)

General extensions

Similar to composite services, each individual general extension gets registered using a generated name, like types[extension#0]. These are not intended to be referenced directly; instead, they are declared dependencies of the full list of general extensions of a given category. This list of extensions is registered with a square-brackets suffix, like types[]; this is intended to be declared as a dependency by non-framework code.