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.
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:
- 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
- Resolving extensions. Any scripts which provide implementations for
extensions exposed by bundles are loaded, using Require.
Sources in
src/resolve
- 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
- 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
, androutes
. - 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:
- All providers are registered.
- Arrays of providers are registered.
- All aggregators are registered (with dependencies to the arrays registered in the previous step.)
- All decorators are registered (with dependencies on the most recent components of matching types.)
- 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.