|
| 1 | +/// <reference path="../node_modules/typescript/lib/lib.es6.d.ts"/> |
| 2 | + |
| 3 | +export * from "./ui-router"; |
| 4 | +import {services} from "./common/coreservices"; |
| 5 | +import {isDefined, isFunction, isArray, isObject, isInjectable} from "./common/predicates"; |
| 6 | +import {extend, assertPredicate, forEach} from "./common/common"; |
| 7 | + |
| 8 | +/** $q-like promise api */ |
| 9 | +services.$q = (executor: (resolve, reject) => void) => new Promise(executor); |
| 10 | +services.$q.when = (val) => new Promise((resolve, reject) => resolve(val)); |
| 11 | +services.$q.reject = (val) => new Promise((resolve, reject) => { reject(val); }); |
| 12 | +services.$q.defer = function() { |
| 13 | + let deferred: any = {}; |
| 14 | + deferred.promise = new Promise((resolve, reject) => { |
| 15 | + deferred.resolve = resolve; |
| 16 | + deferred.reject = reject; |
| 17 | + }); |
| 18 | + |
| 19 | + return deferred; |
| 20 | +}; |
| 21 | + |
| 22 | +services.$q.all = function (promises: { [key: string]: Promise<any> } | Promise<any>[]) { |
| 23 | + if (isArray(promises)) { |
| 24 | + return new Promise((resolve, reject) => { |
| 25 | + let results = []; |
| 26 | + promises.reduce((memo, promise) => { |
| 27 | + if (!isDefined(memo)) return promise; |
| 28 | + return memo.then(val => results.push(val)).then(() => promise); |
| 29 | + }).then(() => resolve(results), reject); |
| 30 | + }); |
| 31 | + } |
| 32 | + |
| 33 | + if (isObject(promises)) { |
| 34 | + let results = {}; |
| 35 | + return new Promise((resolve, reject) => { |
| 36 | + let chain = services.$q.when(); |
| 37 | + forEach(promises, (promise: Promise<any>, key: string) => { |
| 38 | + promise.then(val => results[key] = val); |
| 39 | + chain = chain.then(() => promise); |
| 40 | + }); |
| 41 | + chain.then(resolve, reject); |
| 42 | + }); |
| 43 | + } |
| 44 | +}; |
| 45 | + |
| 46 | + |
| 47 | + |
| 48 | + |
| 49 | + |
| 50 | +// angular1-like injector api |
| 51 | + |
| 52 | +// globally available injectables |
| 53 | +let globals = { }; |
| 54 | +services.$injector = { }; |
| 55 | + |
| 56 | +services.$injector.get = name => globals[name]; |
| 57 | +services.$injector.has = (name) => services.$injector.get(name) != null; |
| 58 | +services.$injector.invoke = function(fn, context?, locals?) { |
| 59 | + let all = extend({}, globals, locals || {}); |
| 60 | + let params = services.$injector.annotate(fn); |
| 61 | + let ensureExist = assertPredicate(key => all.hasOwnProperty(key), key => `DI can't find injectable: '${key}'`); |
| 62 | + let args = params.filter(ensureExist).map(x => all[x]); |
| 63 | + if (isFunction(fn)) return fn.apply(context, args); |
| 64 | + return fn.slice(-1)[0].apply(context, args); |
| 65 | +}; |
| 66 | + |
| 67 | +let STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; |
| 68 | +let ARGUMENT_NAMES = /([^\s,]+)/g; |
| 69 | +// http://stackoverflow.com/questions/1007981 |
| 70 | +services.$injector.annotate = function(fn) { |
| 71 | + if (!isInjectable(fn)) throw new Error(`Not an injectable function: ${fn}`); |
| 72 | + if (fn && fn.$inject) return fn.$inject; |
| 73 | + if (isArray(fn)) return fn.slice(0, -1); |
| 74 | + let fnStr = fn.toString().replace(STRIP_COMMENTS, ''); |
| 75 | + let result = fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(ARGUMENT_NAMES); |
| 76 | + return result || []; |
| 77 | +}; |
| 78 | + |
| 79 | +let loc = <any> services.location; |
| 80 | + |
| 81 | +loc.hash = () => ""; |
| 82 | +loc.path = () => location.hash.replace(/^#/, ""); |
| 83 | +loc.search = () => location.search; |
| 84 | +loc.url = (url) => { if (url) location.hash = url; return loc.path(); }; |
| 85 | +loc.replace = () => { console.log(new Error("not impl")); }; |
| 86 | +loc.onChange = (cb) => { |
| 87 | + window.addEventListener("hashchange", cb, false); |
| 88 | +}; |
| 89 | + |
0 commit comments