Created
July 16, 2014 11:46
-
-
Save xperiments/5dff26e1ab673b74194d to your computer and use it in GitHub Desktop.
AngularJS Typescript Static Injector References
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* $di.ts | |
* http://www.xperiments.io/posts/typescript-angularjs-best-practices/ | |
* xperiments on 15/07/14. | |
*/ | |
module $di | |
{ | |
/* service */ | |
export class $ng | |
{ | |
/* Services */ | |
static $anchorScroll:string = null; | |
static $animate:string = null; | |
static $cacheFactory:string = null; | |
static $compile:string = null; | |
static $controller:string = null; | |
static $document:string = null; | |
static $filter:string = null; | |
static $http:string = null; | |
static $interpolate:string = null; | |
static $locale:string = null; | |
static $location:string = null; | |
static $parse:string = null; | |
static $q:string = null; | |
static $rootElement:string = null; | |
static $rootScope:string = null; | |
static $sce:string = null; | |
static $sceDelegate:string = null; | |
static $templateCache:string = null; | |
static $window:string = null; | |
static $exceptionHandler:string = null; | |
static $httpBackend:string = null; | |
static $interval:string = null; | |
static $log:string = null; | |
static $timeout:string = null; | |
static $resource:string = null; | |
static $sanitize:string = null; | |
static $swipe:string = null; | |
/* providers */ | |
static $animateProvider:string = null; | |
static $compileProvider:string = null; | |
static $controllerProvider:string = null; | |
static $filterProvider:string = null; | |
static $httpProvider:string = null; | |
static $interpolateProvider:string = null; | |
static $locationProvider:string = null; | |
static $logProvider:string = null; | |
static $parseProvider:string = null; | |
static $rootScopeProvider:string = null; | |
static $sceDelegateProvider:string = null; | |
static $sceProvider:string = null; | |
static $exceptionHandlerProvider:string = null; | |
static $routeProvider:string = null; | |
/* auto */ | |
static $injector:string = null; | |
static $provide:string = null; | |
/* ngCookies service */ | |
static $cookieStore:string = null; | |
static $cookies:string = null; | |
/* ngRoute service */ | |
static $route:string = null; | |
static $routeParams:string = null; | |
/* controller */ | |
static $scope:string = null; | |
static $element:string = null; | |
static $attrs:string = null; | |
static $transclude:string = null; | |
} | |
export module $ng | |
{ | |
initStaticClass( $ng ); | |
} | |
var __dev_mode:boolean = false; | |
export function setDevelopment(devMode:boolean){ __dev_mode = devMode } | |
/* HELPERS */ | |
export function initStaticClass( Class:any ):void | |
{ | |
// sets the same value from the keyname itself | |
// bypassing not nulled properties | |
Object.keys(Class).forEach((key:string)=> { (Class[key] === null) && ( Class[key] = key ); }) | |
} | |
export function checkDI( Class:Function ):void | |
{ | |
if( !__dev_mode ) return; // Do nothing in production!! | |
// do a dity check here :-( | |
var className:string = getClassName(Class); | |
if ( annotate(Class).toString().toLowerCase()!=Class.$inject.toString().toLowerCase() ) | |
{ | |
var err = ("\n\nPlease check the injection in class $className$\n\n").replace('$className$',className); | |
throw new Error(err); | |
return; | |
} | |
console.log('$di class checked: '+className) | |
}; | |
/** INTERNAL **/ | |
function getClassName(Class:any):string | |
{ | |
return Class.toString().match(/function (.*)\(/)[1]; | |
} | |
//http://taoofcode.net/studying-the-angular-injector-annotate/ | |
var FN_ARGS:RegExp = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; | |
var FN_ARG_SPLIT:RegExp = /,/; | |
var FN_ARG:RegExp = /^\s*(_?)(\S+?)\1\s*$/; | |
var STRIP_COMMENTS:RegExp = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; | |
function annotate(fn:Function):string[] | |
{ | |
var $inject:string[]; | |
var fnText:string; | |
var argDecl:any[]; | |
if (typeof fn == 'function') { | |
$inject = []; | |
if (fn.length) { | |
fnText = fn.toString().replace(STRIP_COMMENTS, ''); | |
argDecl = fnText.match(FN_ARGS); | |
argDecl[1].split(FN_ARG_SPLIT).forEach(function(arg){ | |
arg.replace(FN_ARG, function(all, underscore, name){ | |
$inject.push(name); | |
}); | |
}); | |
} | |
} | |
return $inject; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Can you share an example of how to use this pattern?