@stratusjs/angularjs
Version:
This is the AngularJS package for StratusJS.
253 lines (251 loc) • 12.4 kB
JavaScript
System.register(["lodash", "@stratusjs/runtime/stratus", "@stratusjs/core/conversion", "@stratusjs/core/misc", "@stratusjs/core/environment", "../injector", "./model", "./collection", "@stratusjs/core/events/eventManager"], function (exports_1, context_1) {
"use strict";
var lodash_1, stratus_1, conversion_1, misc_1, environment_1, injector_1, model_1, collection_1, eventManager_1, injector, $interpolate, serviceVerify, Registry;
var __moduleName = context_1 && context_1.id;
return {
setters: [
function (lodash_1_1) {
lodash_1 = lodash_1_1;
},
function (stratus_1_1) {
stratus_1 = stratus_1_1;
},
function (conversion_1_1) {
conversion_1 = conversion_1_1;
},
function (misc_1_1) {
misc_1 = misc_1_1;
},
function (environment_1_1) {
environment_1 = environment_1_1;
},
function (injector_1_1) {
injector_1 = injector_1_1;
},
function (model_1_1) {
model_1 = model_1_1;
},
function (collection_1_1) {
collection_1 = collection_1_1;
},
function (eventManager_1_1) {
eventManager_1 = eventManager_1_1;
}
],
execute: function () {
injector = injector_1.getInjector();
serviceVerify = async () => {
return new Promise(async (resolve, _reject) => {
if ($interpolate) {
resolve(true);
return;
}
if (!injector) {
injector = injector_1.getInjector();
}
if (injector) {
$interpolate = injector.get('$interpolate');
}
if ($interpolate) {
resolve(true);
return;
}
setTimeout(() => {
if (environment_1.cookie('env')) {
console.log('wait for $interpolate service:', $interpolate);
}
serviceVerify().then(resolve);
}, 250);
});
};
Registry = class Registry {
constructor() {
}
fetch($element, $scope) {
return new Promise(async (resolve, _reject) => {
if (typeof $element === 'string') {
$element = {
target: $element
};
}
const inputs = {};
const baseInputs = [
'id',
'api',
'temp',
'decouple',
'fetch'
];
lodash_1.forEach(lodash_1.union(model_1.ModelOptionKeys, collection_1.CollectionOptionKeys, baseInputs), (option) => lodash_1.set(inputs, option, 'data-' + lodash_1.kebabCase(option)));
const options = lodash_1.forEach(inputs, (value, key, list) => {
list[key] = $element.attr ? $element.attr(value) : $element[key];
if (!misc_1.isJSON(list[key])) {
return;
}
list[key] = JSON.parse(list[key]);
});
options.api = conversion_1.sanitize(options.api);
options.temp = conversion_1.sanitize(options.temp);
let completed = 0;
const verify = () => {
if (!lodash_1.isNumber(completed) || completed !== lodash_1.size(options)) {
return;
}
resolve(this.build(options, $scope));
};
if (!$interpolate) {
await serviceVerify();
}
lodash_1.forEach(options, async (element, key) => {
if (!element || typeof element !== 'string' || !$scope || !$scope.$parent) {
completed++;
verify();
return;
}
const interpreter = $interpolate(element, false, null, true);
const initial = interpreter($scope.$parent);
if (typeof initial !== 'undefined') {
options[key] = initial;
completed++;
verify();
return;
}
if (environment_1.cookie('env')) {
console.log(`poll (${key}): start`);
}
let value;
try {
value = await misc_1.poll(() => interpreter($scope.$parent), 1500, 250);
}
catch (err) {
if (environment_1.cookie('env') ||
err.name !== 'Timeout') {
console.error(err);
}
}
if (environment_1.cookie('env')) {
console.log(`poll (${key}):`, value);
}
options[key] = value;
completed++;
verify();
});
});
}
build(options, $scope) {
let data;
if (options.payload || options.convoy) {
options.fetch = false;
}
if (options.target) {
options.target = misc_1.ucfirst(options.target);
if (options.manifest || options.id) {
if (!stratus_1.Stratus.Catalog[options.target]) {
stratus_1.Stratus.Catalog[options.target] = {};
}
const id = options.id || 'manifest';
if (options.decouple || !stratus_1.Stratus.Catalog[options.target][id]) {
const modelOptions = {
stagger: true
};
lodash_1.forEach(model_1.ModelOptionKeys, (element) => {
const optionValue = lodash_1.get(options, element);
if (lodash_1.isUndefined(optionValue)) {
return;
}
lodash_1.set(modelOptions, element, optionValue);
});
data = new model_1.Model(modelOptions, {
id: options.id
});
if (!options.decouple) {
stratus_1.Stratus.Catalog[options.target][id] = data;
}
}
else if (stratus_1.Stratus.Catalog[options.target][id]) {
data = stratus_1.Stratus.Catalog[options.target][id];
}
}
else {
const registry = !options.direct ? 'Catalog' : 'Compendium';
if (!stratus_1.Stratus[registry][options.target]) {
stratus_1.Stratus[registry][options.target] = {};
}
if (options.decouple ||
!stratus_1.Stratus[registry][options.target].collection) {
const collectionOptions = {};
lodash_1.forEach(collection_1.CollectionOptionKeys, (element) => {
const optionValue = lodash_1.get(options, element);
if (lodash_1.isUndefined(optionValue)) {
return;
}
lodash_1.set(collectionOptions, element, optionValue);
});
data = new collection_1.Collection(collectionOptions);
if (!options.decouple) {
stratus_1.Stratus[registry][options.target].collection = data;
}
}
else if (stratus_1.Stratus[registry][options.target].collection) {
data = stratus_1.Stratus[registry][options.target].collection;
}
}
if (options.api) {
data.meta.set('api', misc_1.isJSON(options.api) ? JSON.parse(options.api) : options.api);
}
if (options.temp && lodash_1.isObject(options.temp) && !data.completed) {
lodash_1.forEach(misc_1.flatten(options.temp), (v, k) => {
console.log('setting temp:', `api.${k}`, v);
data.meta.temp(`api.${k}`, v);
});
}
if (data instanceof model_1.Model && data.stagger && typeof data.initialize === 'function') {
data.initialize();
}
}
if (typeof data === 'object' && data !== null) {
if (typeof $scope !== 'undefined') {
$scope.data = data;
if (data instanceof model_1.Model) {
$scope.model = data;
}
else if (data instanceof collection_1.Collection) {
$scope.collection = data;
}
if (data instanceof eventManager_1.EventManager && typeof $scope.$applyAsync === 'function') {
data.on('change', () => {
$scope.$applyAsync();
});
data.on('error', () => {
$scope.$applyAsync();
});
if (data.completed) {
$scope.$applyAsync();
}
}
}
if (!data.pending
&& !data.completed
&& (lodash_1.isUndefined(options.fetch) || options.fetch)) {
data.fetch().then();
}
}
return data;
}
};
exports_1("Registry", Registry);
stratus_1.Stratus.Services.Registry = [
'$provide',
($provide) => {
$provide.factory('Registry', [
() => {
return new Registry();
}
]);
}
];
stratus_1.Stratus.Data.Registry = Registry;
}
};
});
//# sourceMappingURL=registry.js.map