mirror of
https://github.com/wassname/DefinitelyTyped.git
synced 2026-08-28 12:43:06 +08:00
Merge branch 'master' of https://github.com/borisyankov/DefinitelyTyped
This commit is contained in:
+9
-6
@@ -23,18 +23,21 @@ Properties
|
||||
*~
|
||||
|
||||
# test folder
|
||||
!_infrastructure/*.js
|
||||
!_infrastructure/tests/*
|
||||
!_infrastructure/tests/*.js
|
||||
!_infrastructure/tests/*/*.js
|
||||
!_infrastructure/tests/*/*/*.js
|
||||
!_infrastructure/tests/*/*/*/*.js
|
||||
_infrastructure/tests/build
|
||||
|
||||
.idea
|
||||
*.iml
|
||||
*.js.map
|
||||
|
||||
#decimal.js
|
||||
!decimal.js
|
||||
|
||||
#rx.js
|
||||
!rx.js
|
||||
|
||||
#zip.js
|
||||
!zip.js
|
||||
|
||||
node_modules
|
||||
|
||||
.sublimets
|
||||
|
||||
+3
-1
@@ -1,6 +1,8 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- 0.10
|
||||
- "0.10"
|
||||
|
||||
sudo: false
|
||||
|
||||
notifications:
|
||||
email: false
|
||||
|
||||
+953
-290
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
/// <reference path="FileSaver.d.ts" />
|
||||
|
||||
/**
|
||||
* @summary Test for "saveAs" function.
|
||||
*/
|
||||
function testSaveAs() {
|
||||
var data: Blob = new Blob(["Hello, world!"], {type: "text/plain;charset=utf-8"});
|
||||
var filename: string = 'hello world.txt';
|
||||
|
||||
saveAs(data, filename);
|
||||
}
|
||||
Vendored
+27
@@ -0,0 +1,27 @@
|
||||
// Type definitions for FileSaver.js
|
||||
// Project: https://github.com/eligrey/FileSaver.js/
|
||||
// Definitions by: Cyril Schumacher <https://github.com/cyrilschumacher>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/**
|
||||
* @summary Interface for "saveAs" function.
|
||||
* @author Cyril Schumacher
|
||||
* @version 1.0
|
||||
*/
|
||||
interface FileSaver {
|
||||
(
|
||||
/**
|
||||
* @summary Data.
|
||||
* @type {Blob}
|
||||
*/
|
||||
data: Blob,
|
||||
|
||||
/**
|
||||
* @summary File name.
|
||||
* @type {DOMString}
|
||||
*/
|
||||
filename: string
|
||||
): void
|
||||
}
|
||||
|
||||
declare var saveAs: FileSaver;
|
||||
@@ -0,0 +1,368 @@
|
||||
/// <reference path="Finch.d.ts" />
|
||||
|
||||
function test_Finch() {
|
||||
|
||||
|
||||
Finch.route("Hello/Route", function() {
|
||||
return console.log("Well hello there! How you doin'?!");
|
||||
});
|
||||
|
||||
Finch.route("Hello/Route/:someId", function(bindings) {
|
||||
return console.log("Hey! Here's Some Id: " + bindings.someId);
|
||||
});
|
||||
|
||||
Finch.route("Hello/Route/:someId", function(bindings, childCallback) {
|
||||
console.log("Hey! Here's Some Id: " + bindings.someId);
|
||||
return childCallback();
|
||||
});
|
||||
|
||||
Finch.route("some/route", {
|
||||
setup: function(bindings) {
|
||||
return console.log("Some Route has been setup! :)");
|
||||
},
|
||||
load: function(bindings) {
|
||||
return console.log("Some Route has been loaed! :D");
|
||||
},
|
||||
unload: function(bindings) {
|
||||
return console.log("Some Route has been loaed! :(");
|
||||
},
|
||||
teardown: function(bindings) {
|
||||
return console.log("Some Route has been torndown! :'(");
|
||||
}
|
||||
});
|
||||
|
||||
Finch.route("some/route", {
|
||||
setup: function(bindings, childCallback) {
|
||||
console.log("Some Route has been setup! :)");
|
||||
return childCallback();
|
||||
},
|
||||
load: function(bindings, childCallback) {
|
||||
console.log("Some Route has been loaed! :D");
|
||||
return childCallback();
|
||||
},
|
||||
unload: function(bindings, childCallback) {
|
||||
console.log("Some Route has been loaed! :(");
|
||||
return childCallback();
|
||||
},
|
||||
teardown: function(bindings, childCallback) {
|
||||
console.log("Some Route has been torndown! :'(");
|
||||
return childCallback();
|
||||
}
|
||||
});
|
||||
|
||||
Finch.call("Some/Route");
|
||||
|
||||
Finch.route("Some/Route", function() {
|
||||
return Finch.observe("hello", "foo", function(hello: any, foo: string) {
|
||||
return console.log("" + hello + " and " + foo);
|
||||
});
|
||||
});
|
||||
|
||||
Finch.route("Some/Route", function() {
|
||||
return Finch.observe(["hello", "foo"], function(hello: any, foo: any) {
|
||||
return console.log("" + hello + " and " + foo);
|
||||
});
|
||||
});
|
||||
|
||||
Finch.route("Some/Route", function(bindings) {
|
||||
return Finch.observe(function(params) {
|
||||
});
|
||||
});
|
||||
|
||||
Finch.navigate("Some/Route");
|
||||
|
||||
Finch.navigate("Some/Route", {
|
||||
hello: 'world',
|
||||
foo: 'bar'
|
||||
});
|
||||
|
||||
Finch.navigate("Some/Route", {
|
||||
foo: 'bar'
|
||||
}, true);
|
||||
|
||||
Finch.navigate("Some/Route", true);
|
||||
|
||||
Finch.navigate({
|
||||
hello: 'world2',
|
||||
wow: 'wee'
|
||||
});
|
||||
|
||||
Finch.navigate({
|
||||
foo: 'bar',
|
||||
wow: 'wee!!!'
|
||||
});
|
||||
|
||||
Finch.navigate({
|
||||
hello: 'world2'
|
||||
}, true);
|
||||
|
||||
Finch.listen();
|
||||
Finch.ignore();
|
||||
Finch.abort();
|
||||
|
||||
|
||||
//test from Finch
|
||||
Finch.call("/foo/bar");
|
||||
Finch.call("/foo/bar/123");
|
||||
Finch.call("/foo/bar/123");
|
||||
Finch.call("/foo/bar/123?x=Hello&y=World");
|
||||
Finch.call("/foo/baz/456");
|
||||
Finch.call("/quux/789?band=Sunn O)))&genre=Post-Progressive Fridgecore");
|
||||
Finch.call("/foo/bar/baz");
|
||||
Finch.call("/foo/bar/quux");
|
||||
Finch.call("/foo");
|
||||
Finch.call("/foo/bar");
|
||||
Finch.call("/foo");
|
||||
Finch.call("/foo");
|
||||
Finch.call("/");
|
||||
Finch.call("/");
|
||||
Finch.call("/foo");
|
||||
Finch.call("/foo/bar");
|
||||
Finch.call("/foo/bar?baz=quux");
|
||||
Finch.call("/foo/bar?baz=xyzzy");
|
||||
|
||||
var cb: any;
|
||||
Finch.route("foo", {
|
||||
setup: cb.setup_foo = this.stub(),
|
||||
load: cb.load_foo = this.stub(),
|
||||
unload: cb.unload_foo = this.stub(),
|
||||
teardown: cb.teardown_foo = this.stub()
|
||||
});
|
||||
Finch.route("[foo]/bar", {
|
||||
setup: cb.setup_foo_bar = this.stub(),
|
||||
load: cb.load_foo_bar = this.stub(),
|
||||
unload: cb.unload_foo_bar = this.stub(),
|
||||
teardown: cb.teardown_foo_bar = this.stub()
|
||||
});
|
||||
Finch.route("[foo/bar]/:id", {
|
||||
setup: cb.setup_foo_bar_id = this.stub(),
|
||||
load: cb.load_foo_bar_id = this.stub(),
|
||||
unload: cb.unload_foo_bar_id = this.stub(),
|
||||
teardown: cb.teardown_foo_bar_id = this.stub()
|
||||
});
|
||||
Finch.route("[foo]/baz", {
|
||||
setup: cb.setup_foo_baz = this.stub(),
|
||||
load: cb.load_foo_baz = this.stub(),
|
||||
unload: cb.unload_foo_baz = this.stub(),
|
||||
teardown: cb.teardown_foo_baz = this.stub()
|
||||
});
|
||||
Finch.route("[foo/baz]/:id", {
|
||||
setup: cb.setup_foo_baz_id = this.stub(),
|
||||
load: cb.load_foo_baz_id = this.stub(),
|
||||
unload: cb.unload_foo_baz_id = this.stub(),
|
||||
teardown: cb.teardown_foo_baz_id = this.stub()
|
||||
});
|
||||
Finch.call("/foo");
|
||||
Finch.call("/foo/bar");
|
||||
Finch.call("/foo");
|
||||
Finch.call("/foo/bar/123?x=abc");
|
||||
Finch.call("/foo/bar/456?x=aaa&y=zzz");
|
||||
Finch.call("/foo/bar/456?x=bbb&y=zzz");
|
||||
Finch.call("/foo/bar/456?y=zzz&x=bbb");
|
||||
Finch.call("/foo/baz/789");
|
||||
Finch.call("/foo/baz/abc?term=Hello");
|
||||
Finch.call("/foo/baz/abc?term=World");
|
||||
Finch.route("bar", this.stub());
|
||||
Finch.call("/foo");
|
||||
Finch.call("/bar");
|
||||
Finch.route("/", function() {
|
||||
});
|
||||
Finch.route("[/]home", function() {
|
||||
});
|
||||
Finch.route("[/home]/news", {
|
||||
setup: function() {
|
||||
},
|
||||
load: function() {
|
||||
},
|
||||
unload: function() {
|
||||
return true;
|
||||
},
|
||||
teardown: function() {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
Finch.route("/foo", {
|
||||
setup: function() {
|
||||
return true;
|
||||
},
|
||||
load: function() {
|
||||
return true;
|
||||
},
|
||||
unload: function() {
|
||||
},
|
||||
teardown: function() {
|
||||
}
|
||||
});
|
||||
Finch.route("[/]bar", {
|
||||
setup: function() {
|
||||
},
|
||||
load: function() {
|
||||
},
|
||||
unload: function() {
|
||||
},
|
||||
teardown: function() {
|
||||
}
|
||||
});
|
||||
Finch.call("/bar");
|
||||
Finch.call("/home/news");
|
||||
Finch.call("/foo");
|
||||
Finch.call("/home/news");
|
||||
Finch.call("/bar");
|
||||
Finch.route("baz", this.stub());
|
||||
Finch.call("/foo");
|
||||
Finch.call("/foo/bar");
|
||||
Finch.call("/baz");
|
||||
Finch.route("/home", {
|
||||
setup: function(bindings, next) {
|
||||
return next();
|
||||
},
|
||||
load: function(bindings, next) {
|
||||
return next();
|
||||
},
|
||||
unload: function(bindings, next) {
|
||||
return next();
|
||||
},
|
||||
teardown: function(bindings, next) {
|
||||
return next();
|
||||
}
|
||||
});
|
||||
Finch.route("[/home]/news", {
|
||||
setup: function(bindings, next) {
|
||||
return next();
|
||||
},
|
||||
load: function(bindings, next) {
|
||||
return next();
|
||||
},
|
||||
unload: function(bindings, next) {
|
||||
return next();
|
||||
},
|
||||
teardown: function(bindings, next) {
|
||||
return next();
|
||||
}
|
||||
});
|
||||
Finch.call("/home");
|
||||
Finch.call("/home/news");
|
||||
Finch.call("/foo");
|
||||
|
||||
Finch.route("/", function(bindings) {
|
||||
return Finch.observe(["x"], function(x) {
|
||||
});
|
||||
});
|
||||
Finch.call("/?x=123");
|
||||
Finch.call("/?x=123.456");
|
||||
Finch.call("/?x=true");
|
||||
Finch.call("/?x=false");
|
||||
Finch.call("/?x=stuff");
|
||||
Finch.options({
|
||||
CoerceParameterTypes: true
|
||||
});
|
||||
Finch.call("/?x=123");
|
||||
Finch.call("/?x=123.456");
|
||||
Finch.call("/?x=true");
|
||||
Finch.call("/?x=false");
|
||||
Finch.call("/?x=stuff");
|
||||
Finch.route("/:x", function(_arg) {
|
||||
});
|
||||
Finch.call("/123");
|
||||
Finch.call("/123.456");
|
||||
Finch.call("/true");
|
||||
Finch.call("/false");
|
||||
Finch.call("/stuff");
|
||||
Finch.options({
|
||||
CoerceParameterTypes: true
|
||||
});
|
||||
Finch.call("/123");
|
||||
Finch.call("/123.456");
|
||||
Finch.call("/true");
|
||||
Finch.call("/false");
|
||||
Finch.call("/stuff");
|
||||
|
||||
Finch.navigate("/home");
|
||||
Finch.navigate("/home/news");
|
||||
Finch.navigate("/home");
|
||||
Finch.navigate("/home", {
|
||||
foo: "bar"
|
||||
});
|
||||
Finch.navigate("/home", {
|
||||
hello: "world"
|
||||
});
|
||||
Finch.navigate({
|
||||
foos: "bars"
|
||||
});
|
||||
Finch.navigate({
|
||||
foos: "baz"
|
||||
});
|
||||
Finch.navigate({
|
||||
hello: "world"
|
||||
}, true);
|
||||
Finch.navigate({
|
||||
foos: null
|
||||
}, true);
|
||||
Finch.navigate("/home/news", true);
|
||||
Finch.navigate("/hello world", {});
|
||||
Finch.navigate("/hello world", {
|
||||
foo: "bar bar"
|
||||
});
|
||||
Finch.navigate({
|
||||
foo: "baz baz"
|
||||
});
|
||||
Finch.navigate({
|
||||
hello: 'world world'
|
||||
}, true);
|
||||
Finch.navigate("/home?foo=bar", {
|
||||
hello: "world"
|
||||
});
|
||||
Finch.navigate("/home?foo=bar", {
|
||||
hello: "world",
|
||||
foo: "baz"
|
||||
});
|
||||
Finch.navigate("/home?foo=bar", {
|
||||
hello: "world",
|
||||
free: "bird"
|
||||
});
|
||||
Finch.navigate("#/home", true);
|
||||
Finch.navigate("#/home");
|
||||
Finch.navigate("#/home/news", {
|
||||
free: "birds",
|
||||
hello: "worlds"
|
||||
});
|
||||
Finch.navigate("#/home/news", {
|
||||
foo: "bar"
|
||||
}, true);
|
||||
Finch.navigate("/home/news");
|
||||
Finch.navigate("../");
|
||||
Finch.navigate("./");
|
||||
Finch.navigate("./news");
|
||||
Finch.navigate("/home/news/article");
|
||||
Finch.navigate("../../account");
|
||||
|
||||
Finch.listen();
|
||||
Finch.ignore();
|
||||
Finch.route("/home", function(bindings, continuation) {
|
||||
});
|
||||
Finch.route("/foo", function(bindings, continuation) {
|
||||
});
|
||||
Finch.call("home");
|
||||
Finch.call("foo");
|
||||
Finch.abort();
|
||||
Finch.call("foo");
|
||||
Finch.route("/", {
|
||||
'setup': cb.slash_setup = this.stub(),
|
||||
'load': cb.slash_load = this.stub(),
|
||||
'unload': cb.slash_unload = this.stub(),
|
||||
'teardown': cb.slash_teardown = this.stub()
|
||||
});
|
||||
Finch.route("[/]users/profile", {
|
||||
'setup': cb.profile_setup = this.stub(),
|
||||
'load': cb.profile_load = this.stub(),
|
||||
'unload': cb.profile_unload = this.stub(),
|
||||
'teardown': cb.profile_teardown = this.stub()
|
||||
});
|
||||
Finch.route("[/]:page", {
|
||||
'setup': cb.page_setup = this.stub(),
|
||||
'load': cb.page_load = this.stub(),
|
||||
'unload': cb.page_unload = this.stub(),
|
||||
'teardown': cb.page_teardown = this.stub()
|
||||
});
|
||||
Finch.call("/users");
|
||||
}
|
||||
Vendored
+47
@@ -0,0 +1,47 @@
|
||||
// Type definitions for Finch 0.5.13
|
||||
// Project: https://github.com/stoodder/finchjs
|
||||
// Definitions by: David Sichau <https://github.com/DavidSichau>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
|
||||
interface FinchCallback {
|
||||
(bindings?: any, childCallback? : () => void): any;
|
||||
}
|
||||
|
||||
interface ExpandedCallback {
|
||||
setup?: FinchCallback;
|
||||
load?: FinchCallback;
|
||||
unload?: FinchCallback;
|
||||
teardown?: FinchCallback;
|
||||
}
|
||||
|
||||
interface ObserveCallback {
|
||||
(...args: any[]): string;
|
||||
}
|
||||
interface FinchOptions {
|
||||
CoerceParameterTypes?: boolean;
|
||||
}
|
||||
|
||||
|
||||
interface FinchStatic {
|
||||
route(route: string, callback: FinchCallback): void;
|
||||
route(route: string, callbacks: ExpandedCallback): void;
|
||||
call( uri: string ): void;
|
||||
|
||||
observe(argN: string[], callback: (params: ObserveCallback ) => void): void;
|
||||
observe(callback: (params: ObserveCallback) => void): void;
|
||||
observe(...args: any[]): void;
|
||||
navigate(uri:string, queryParams?:any, doUpdate?:boolean ): void;
|
||||
navigate(uri:string, doUpdate:boolean ): void;
|
||||
navigate(queryParams:any, doUpdate?:boolean ): void;
|
||||
listen(): boolean;
|
||||
ignore(): boolean;
|
||||
abort(): void;
|
||||
options(options: FinchOptions): void;
|
||||
}
|
||||
|
||||
|
||||
declare var Finch: FinchStatic;
|
||||
declare module "finch" {
|
||||
export = Finch;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/// <reference path="headroom.d.ts" />
|
||||
|
||||
new Headroom(document.getElementById('siteHead'));
|
||||
|
||||
new Headroom(document.getElementsByClassName('siteHead')[0]);
|
||||
|
||||
new Headroom(document.getElementsByClassName('siteHead')[0], {
|
||||
tolerance: 34
|
||||
});
|
||||
|
||||
new Headroom(document.getElementsByClassName('siteHead')[0], {
|
||||
offset: 500
|
||||
});
|
||||
Vendored
+28
@@ -0,0 +1,28 @@
|
||||
// Type definitions for headroom.js v0.7.0
|
||||
// Project: http://wicky.nillia.ms/headroom.js/
|
||||
// Definitions by: Jakub Olek <https://github.com/hakubo/>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
interface HeadroomOptions {
|
||||
offset?: number;
|
||||
tolerance?: any;
|
||||
classes?: {
|
||||
initial?: string;
|
||||
pinned?: string;
|
||||
unpinned?: string;
|
||||
top?: string;
|
||||
notTop?: string;
|
||||
};
|
||||
scroller?: Element;
|
||||
onPin?: () => void;
|
||||
onUnPin?: () => void;
|
||||
onTop?: () => void;
|
||||
onNotTop?: () => void;
|
||||
|
||||
}
|
||||
|
||||
declare class Headroom {
|
||||
constructor(element: Node, options?: HeadroomOptions);
|
||||
constructor(element: Element, options?: HeadroomOptions);
|
||||
init: () => void;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
/// <reference path="JSONStream.d.ts" />
|
||||
|
||||
import json = require('JSONStream');
|
||||
|
||||
var read: NodeJS.ReadableStream;
|
||||
var write: NodeJS.WritableStream;
|
||||
|
||||
read = read.pipe(json.parse('*'));
|
||||
read = read.pipe(json.parse(['foo/*', 'bar/*']));
|
||||
|
||||
read = json.stringify();
|
||||
read = json.stringify('{', ',', '}');
|
||||
|
||||
read = json.stringifyObject();
|
||||
read = json.stringifyObject('{', ',', '}');
|
||||
Vendored
+22
@@ -0,0 +1,22 @@
|
||||
// Type definitions for JSONStream v0.8.0
|
||||
// Project: http://github.com/dominictarr/JSONStream
|
||||
// Definitions by: Bart van der Schoor <https://github.com/Bartvds>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="../node/node.d.ts" />
|
||||
|
||||
declare module 'JSONStream' {
|
||||
|
||||
export interface Options {
|
||||
recurse: boolean;
|
||||
}
|
||||
|
||||
export function parse(pattern: any): NodeJS.ReadWriteStream;
|
||||
export function parse(patterns: any[]): NodeJS.ReadWriteStream;
|
||||
|
||||
export function stringify(): NodeJS.ReadWriteStream;
|
||||
export function stringify(open: string, sep: string, close: string): NodeJS.ReadWriteStream;
|
||||
|
||||
export function stringifyObject(): NodeJS.ReadWriteStream;
|
||||
export function stringifyObject(open: string, sep: string, close: string): NodeJS.ReadWriteStream;
|
||||
}
|
||||
@@ -30,7 +30,7 @@ Please see the [contribution guide](http://definitelytyped.org/guides/contributi
|
||||
|
||||
## Requested definitions
|
||||
|
||||
Here is an updated list of [definitions people have requested](https://github.com/borisyankov/DefinitelyTyped/issues?labels=Definition%3ARequest).
|
||||
Here is are the [currently requested definitions](https://github.com/borisyankov/DefinitelyTyped/labels/Definition%3ARequest).
|
||||
|
||||
## Licence
|
||||
|
||||
@@ -38,4 +38,4 @@ This project is licensed under the MIT license.
|
||||
|
||||
Copyrights on the definition files are respective of each contributor listed at the beginning of each definition file.
|
||||
|
||||
[](https://github.com/igrigorik/ga-beacon)
|
||||
[](https://github.com/igrigorik/ga-beacon)
|
||||
|
||||
Vendored
-1
@@ -1 +0,0 @@
|
||||
/// <reference path="typings/tsd.d.ts" />
|
||||
@@ -1 +0,0 @@
|
||||
tsc runner.ts --target ES5 --out runner.js --module commonjs --sourcemap
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,367 +0,0 @@
|
||||
/// <reference path="typings/tsd.d.ts" />
|
||||
|
||||
/// <reference path="src/exec.ts" />
|
||||
|
||||
/// <reference path="src/file.ts" />
|
||||
/// <reference path="src/tsc.ts" />
|
||||
/// <reference path="src/timer.ts" />
|
||||
/// <reference path="src/util.ts" />
|
||||
|
||||
/// <reference path="src/index.ts" />
|
||||
/// <reference path="src/changes.ts" />
|
||||
|
||||
/// <reference path="src/printer.ts" />
|
||||
/// <reference path="src/reporter/reporter.ts" />
|
||||
|
||||
/// <reference path="src/suite/suite.ts" />
|
||||
/// <reference path="src/suite/syntax.ts" />
|
||||
/// <reference path="src/suite/testEval.ts" />
|
||||
/// <reference path="src/suite/tscParams.ts" />
|
||||
|
||||
module DT {
|
||||
require('source-map-support').install();
|
||||
|
||||
// hacky typing
|
||||
var Lazy: LazyJS.LazyStatic = require('lazy.js');
|
||||
var Promise: typeof Promise = require('bluebird');
|
||||
|
||||
var os = require('os');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var assert = require('assert');
|
||||
|
||||
var tsExp = /\.ts$/;
|
||||
|
||||
export var DEFAULT_TSC_VERSION = '0.9.7';
|
||||
|
||||
interface PackageJSON {
|
||||
scripts: {[key:string]: string};
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
// Single test
|
||||
/////////////////////////////////
|
||||
export class Test {
|
||||
constructor(public suite: ITestSuite, public tsfile: File, public options?: TscExecOptions) {
|
||||
}
|
||||
|
||||
public run(): Promise<TestResult> {
|
||||
return Tsc.run(this.tsfile.filePathWithName, this.options).then((execResult: ExecResult) => {
|
||||
var testResult = new TestResult();
|
||||
testResult.hostedBy = this.suite;
|
||||
testResult.targetFile = this.tsfile;
|
||||
testResult.options = this.options;
|
||||
|
||||
testResult.stdout = execResult.stdout;
|
||||
testResult.stderr = execResult.stderr;
|
||||
testResult.exitCode = execResult.exitCode;
|
||||
|
||||
return testResult;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
// Parallel execute Tests
|
||||
/////////////////////////////////
|
||||
export class TestQueue {
|
||||
|
||||
private queue: Function[] = [];
|
||||
private active: Test[] = [];
|
||||
private concurrent: number;
|
||||
|
||||
constructor(concurrent: number) {
|
||||
this.concurrent = Math.max(1, concurrent);
|
||||
}
|
||||
|
||||
// add to queue and return a promise
|
||||
run(test: Test): Promise<TestResult> {
|
||||
var defer = Promise.defer();
|
||||
// add a closure to queue
|
||||
this.queue.push(() => {
|
||||
// run it
|
||||
var p = test.run();
|
||||
p.then(defer.resolve.bind(defer), defer.reject.bind(defer));
|
||||
p.finally(() => {
|
||||
var i = this.active.indexOf(test);
|
||||
if (i > -1) {
|
||||
this.active.splice(i, 1);
|
||||
}
|
||||
this.step();
|
||||
});
|
||||
// return it
|
||||
return test;
|
||||
});
|
||||
this.step();
|
||||
// defer it
|
||||
return defer.promise;
|
||||
}
|
||||
|
||||
private step(): void {
|
||||
while (this.queue.length > 0 && this.active.length < this.concurrent) {
|
||||
this.active.push(this.queue.pop().call(null));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
// Test results
|
||||
/////////////////////////////////
|
||||
export class TestResult {
|
||||
hostedBy: ITestSuite;
|
||||
targetFile: File;
|
||||
options: TscExecOptions;
|
||||
|
||||
stdout: string;
|
||||
stderr: string;
|
||||
exitCode: number;
|
||||
|
||||
public get success(): boolean {
|
||||
return this.exitCode === 0;
|
||||
}
|
||||
}
|
||||
|
||||
export interface ITestRunnerOptions {
|
||||
tscVersion:string;
|
||||
concurrent?:number;
|
||||
testChanges?:boolean;
|
||||
skipTests?:boolean;
|
||||
printFiles?:boolean;
|
||||
printRefMap?:boolean;
|
||||
findNotRequiredTscparams?:boolean;
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
// The main class to kick things off
|
||||
/////////////////////////////////
|
||||
export class TestRunner {
|
||||
private timer: Timer;
|
||||
private suites: ITestSuite[] = [];
|
||||
|
||||
public changes: GitChanges;
|
||||
public index: FileIndex;
|
||||
public print: Print;
|
||||
|
||||
constructor(public dtPath: string, public options: ITestRunnerOptions = {tscVersion: DT.DEFAULT_TSC_VERSION}) {
|
||||
this.options.findNotRequiredTscparams = !!this.options.findNotRequiredTscparams;
|
||||
|
||||
this.index = new FileIndex(this, this.options);
|
||||
this.changes = new GitChanges(this);
|
||||
|
||||
this.print = new Print(this.options.tscVersion);
|
||||
}
|
||||
|
||||
public addSuite(suite: ITestSuite): void {
|
||||
this.suites.push(suite);
|
||||
}
|
||||
|
||||
public checkAcceptFile(fileName: string): boolean {
|
||||
var ok = tsExp.test(fileName);
|
||||
ok = ok && fileName.indexOf('_infrastructure') < 0;
|
||||
ok = ok && fileName.indexOf('node_modules/') < 0;
|
||||
ok = ok && /^[a-z]/i.test(fileName);
|
||||
return ok;
|
||||
}
|
||||
|
||||
public run(): Promise<boolean> {
|
||||
this.timer = new Timer();
|
||||
this.timer.start();
|
||||
|
||||
this.print.printChangeHeader();
|
||||
|
||||
// only includes .d.ts or -tests.ts or -test.ts or .ts
|
||||
return this.index.readIndex().then(() => {
|
||||
return this.changes.readChanges();
|
||||
}).then((changes: string[]) => {
|
||||
this.print.printAllChanges(changes);
|
||||
return this.index.collectDiff(changes);
|
||||
}).then(() => {
|
||||
this.print.printRemovals(this.index.removed);
|
||||
this.print.printRelChanges(this.index.changed);
|
||||
return this.index.parseFiles();
|
||||
}).then(() => {
|
||||
if (this.options.printRefMap) {
|
||||
this.print.printRefMap(this.index, this.index.refMap);
|
||||
}
|
||||
if (Lazy(this.index.missing).some((arr: any[]) => arr.length > 0)) {
|
||||
this.print.printMissing(this.index, this.index.missing);
|
||||
this.print.printBoldDiv();
|
||||
// bail
|
||||
return Promise.cast(false);
|
||||
}
|
||||
if (this.options.printFiles) {
|
||||
this.print.printFiles(this.index.files);
|
||||
}
|
||||
return this.index.collectTargets().then((files) => {
|
||||
if (this.options.testChanges) {
|
||||
this.print.printQueue(files);
|
||||
return this.runTests(files);
|
||||
}
|
||||
else {
|
||||
this.print.printTestAll();
|
||||
return this.runTests(this.index.files)
|
||||
}
|
||||
}).then(() => {
|
||||
return !this.suites.some((suite) => {
|
||||
return suite.ngTests.length !== 0
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private runTests(files: File[]): Promise<boolean> {
|
||||
return Promise.attempt(() => {
|
||||
assert(Array.isArray(files), 'files must be array');
|
||||
|
||||
var syntaxChecking = new SyntaxChecking(this.options);
|
||||
var testEval = new TestEval(this.options);
|
||||
|
||||
if (!this.options.findNotRequiredTscparams) {
|
||||
this.addSuite(syntaxChecking);
|
||||
this.addSuite(testEval);
|
||||
}
|
||||
|
||||
return Promise.all([
|
||||
syntaxChecking.filterTargetFiles(files),
|
||||
testEval.filterTargetFiles(files)
|
||||
]);
|
||||
}).spread((syntaxFiles, testFiles) => {
|
||||
this.print.init(syntaxFiles.length, testFiles.length, files.length);
|
||||
this.print.printHeader(this.options);
|
||||
|
||||
if (this.options.findNotRequiredTscparams) {
|
||||
this.addSuite(new FindNotRequiredTscparams(this.options, this.print));
|
||||
}
|
||||
|
||||
return Promise.reduce(this.suites, (count, suite: ITestSuite) => {
|
||||
suite.testReporter = suite.testReporter || new DefaultTestReporter(this.print);
|
||||
|
||||
this.print.printSuiteHeader(suite.testSuiteName);
|
||||
|
||||
if (this.options.skipTests) {
|
||||
this.print.printWarnCode('skipped test');
|
||||
return Promise.cast(count++);
|
||||
}
|
||||
|
||||
return suite.start(files, (testResult) => {
|
||||
this.print.printTestComplete(testResult);
|
||||
}).then((suite) => {
|
||||
this.print.printSuiteComplete(suite);
|
||||
return count++;
|
||||
});
|
||||
}, 0);
|
||||
}).then((count) => {
|
||||
this.timer.end();
|
||||
this.finaliseTests(files);
|
||||
});
|
||||
}
|
||||
|
||||
private finaliseTests(files: File[]): void {
|
||||
var testEval: TestEval = Lazy(this.suites).filter((suite) => {
|
||||
return suite instanceof TestEval;
|
||||
}).first();
|
||||
|
||||
if (testEval) {
|
||||
var existsTestTypings: string[] = Lazy(testEval.testResults).map((testResult) => {
|
||||
return testResult.targetFile.dir;
|
||||
}).reduce((a: string[], b: string) => {
|
||||
return a.indexOf(b) < 0 ? a.concat([b]) : a;
|
||||
}, []);
|
||||
|
||||
var typings: string[] = Lazy(files).map((file) => {
|
||||
return file.dir;
|
||||
}).reduce((a: string[], b: string) => {
|
||||
return a.indexOf(b) < 0 ? a.concat([b]) : a;
|
||||
}, []);
|
||||
|
||||
var withoutTestTypings: string[] = typings.filter((typing) => {
|
||||
return existsTestTypings.indexOf(typing) < 0;
|
||||
});
|
||||
|
||||
this.print.printDiv();
|
||||
this.print.printTypingsWithoutTest(withoutTestTypings);
|
||||
}
|
||||
|
||||
this.print.printDiv();
|
||||
this.print.printTotalMessage();
|
||||
|
||||
this.print.printDiv();
|
||||
this.print.printElapsedTime(this.timer.asString, this.timer.time);
|
||||
|
||||
this.suites.filter((suite: ITestSuite) => {
|
||||
return suite.printErrorCount;
|
||||
}).forEach((suite: ITestSuite) => {
|
||||
this.print.printSuiteErrorCount(suite.errorHeadline, suite.ngTests.length, suite.testResults.length);
|
||||
});
|
||||
if (testEval) {
|
||||
this.print.printSuiteErrorCount('Without tests', withoutTestTypings.length, typings.length, true);
|
||||
}
|
||||
|
||||
this.print.printDiv();
|
||||
|
||||
if (this.suites.some((suite) => {
|
||||
return suite.ngTests.length !== 0
|
||||
})) {
|
||||
this.print.printErrorsHeader();
|
||||
|
||||
this.suites.filter((suite) => {
|
||||
return suite.ngTests.length !== 0;
|
||||
}).forEach((suite) => {
|
||||
suite.ngTests.forEach((testResult) => {
|
||||
this.print.printErrorsForFile(testResult);
|
||||
});
|
||||
this.print.printBoldDiv();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var optimist: Optimist = require('optimist')(process.argv);
|
||||
optimist.default('try-without-tscparams', false);
|
||||
optimist.default('single-thread', false);
|
||||
optimist.default('tsc-version', DEFAULT_TSC_VERSION);
|
||||
|
||||
optimist.default('test-changes', false);
|
||||
optimist.default('skip-tests', false);
|
||||
optimist.default('print-files', false);
|
||||
optimist.default('print-refmap', false);
|
||||
|
||||
optimist.boolean('help');
|
||||
optimist.describe('help', 'print help');
|
||||
optimist.alias('h', 'help');
|
||||
|
||||
var argv: any = optimist.argv;
|
||||
|
||||
var dtPath = path.resolve(path.dirname((module).filename), '..', '..');
|
||||
var cpuCores = os.cpus().length;
|
||||
|
||||
if (argv.help) {
|
||||
optimist.showHelp();
|
||||
var pkg: PackageJSON = require('../../package.json');
|
||||
console.log('Scripts:');
|
||||
console.log('');
|
||||
Lazy(pkg.scripts).keys().each((key) => {
|
||||
console.log(' $ npm run ' + key);
|
||||
});
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
var testFull = process.env['TRAVIS_BRANCH'] ? /\w\/full$/.test(process.env['TRAVIS_BRANCH']) : false;
|
||||
|
||||
new TestRunner(dtPath, {
|
||||
concurrent: argv['single-thread'] ? 1 : Math.max(Math.min(24, cpuCores), 2),
|
||||
tscVersion: argv['tsc-version'],
|
||||
testChanges: testFull ? false : argv['test-changes'], // allow magic branch
|
||||
skipTests: argv['skip-tests'],
|
||||
printFiles: argv['print-files'],
|
||||
printRefMap: argv['print-refmap'],
|
||||
findNotRequiredTscparams: argv['try-without-tscparam']
|
||||
}).run().then((success) => {
|
||||
if (!success) {
|
||||
process.exit(1);
|
||||
}
|
||||
}).catch((err) => {
|
||||
throw err;
|
||||
process.exit(2);
|
||||
});
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/// <reference path="../_ref.d.ts" />
|
||||
/// <reference path="../runner.ts" />
|
||||
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var Git = require('git-wrapper');
|
||||
var Promise: typeof Promise = require('bluebird');
|
||||
|
||||
export class GitChanges {
|
||||
|
||||
git;
|
||||
options = {};
|
||||
|
||||
constructor(private runner: TestRunner) {
|
||||
var dir = path.join(this.runner.dtPath, '.git');
|
||||
if (!fs.existsSync(dir)) {
|
||||
throw new Error('cannot locate git-dir: ' + dir);
|
||||
}
|
||||
this.options['git-dir'] = dir;
|
||||
|
||||
this.git = new Git(this.options);
|
||||
this.git.exec = Promise.promisify(this.git.exec);
|
||||
}
|
||||
|
||||
public readChanges(): Promise<string[]> {
|
||||
var opts = {};
|
||||
var args = ['--name-only HEAD~1'];
|
||||
return this.git.exec('diff', opts, args).then((msg: string) => {
|
||||
return msg.replace(/^\s+/, '').replace(/\s+$/, '').split(/\r?\n/g);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
var Promise: typeof Promise = require('bluebird');
|
||||
var nodeExec = require('child_process').exec;
|
||||
|
||||
export class ExecResult {
|
||||
error;
|
||||
stdout = '';
|
||||
stderr = '';
|
||||
exitCode: number;
|
||||
}
|
||||
|
||||
export function exec(filename: string, cmdLineArgs: string[]): Promise<ExecResult> {
|
||||
return new Promise((resolve) => {
|
||||
var result = new ExecResult();
|
||||
result.exitCode = null;
|
||||
|
||||
var cmdLine = filename + ' ' + cmdLineArgs.join(' ');
|
||||
|
||||
nodeExec(cmdLine, {maxBuffer: 1 * 1024 * 1024}, (error, stdout, stderr) => {
|
||||
result.error = error;
|
||||
result.stdout = stdout;
|
||||
result.stderr = stderr;
|
||||
result.exitCode = error ? error.code : 0;
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
/// <reference path="../_ref.d.ts" />
|
||||
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
var path = require('path');
|
||||
|
||||
export interface FileDict {
|
||||
[fullPath:string]: File;
|
||||
}
|
||||
|
||||
export interface FileArrDict {
|
||||
[fullPath:string]: File[];
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
// Given a document root + ts file pattern this class returns:
|
||||
// all the TS files OR just tests OR just definition files
|
||||
/////////////////////////////////
|
||||
export class File {
|
||||
baseDir: string;
|
||||
filePathWithName: string;
|
||||
dir: string;
|
||||
file: string;
|
||||
ext: string;
|
||||
fullPath: string;
|
||||
references: File[] = [];
|
||||
|
||||
constructor(baseDir: string, filePathWithName: string) {
|
||||
// why choose?
|
||||
this.baseDir = baseDir;
|
||||
this.filePathWithName = filePathWithName;
|
||||
this.ext = path.extname(this.filePathWithName);
|
||||
this.file = path.basename(this.filePathWithName, this.ext);
|
||||
this.dir = path.dirname(this.filePathWithName);
|
||||
this.fullPath = path.join(this.baseDir, this.dir, this.file + this.ext);
|
||||
|
||||
// lock it (shallow) (needs `use strict` in each file to work)
|
||||
// Object.freeze(this);
|
||||
}
|
||||
|
||||
toString(): string {
|
||||
return '[File ' + this.filePathWithName + ']';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
/// <reference path="../_ref.d.ts" />
|
||||
/// <reference path="../runner.ts" />
|
||||
/// <reference path="util.ts" />
|
||||
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var glob = require('glob');
|
||||
var Lazy: LazyJS.LazyStatic = require('lazy.js');
|
||||
var Promise: typeof Promise = require('bluebird');
|
||||
|
||||
var readFile = Promise.promisify(fs.readFile);
|
||||
|
||||
/////////////////////////////////
|
||||
// Track all files in the repo: map full path to File objects
|
||||
/////////////////////////////////
|
||||
export class FileIndex {
|
||||
|
||||
files: File[];
|
||||
fileMap: FileDict;
|
||||
refMap: FileArrDict;
|
||||
options: ITestRunnerOptions;
|
||||
changed: FileDict;
|
||||
removed: FileDict;
|
||||
missing: FileArrDict;
|
||||
|
||||
constructor(private runner: TestRunner, options: ITestRunnerOptions) {
|
||||
this.options = options;
|
||||
}
|
||||
|
||||
public hasFile(target: string): boolean {
|
||||
return target in this.fileMap;
|
||||
}
|
||||
|
||||
public getFile(target: string): File {
|
||||
if (target in this.fileMap) {
|
||||
return this.fileMap[target];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public setFile(file: File): void {
|
||||
if (file.fullPath in this.fileMap) {
|
||||
throw new Error('cannot overwrite file');
|
||||
}
|
||||
this.fileMap[file.fullPath] = file;
|
||||
}
|
||||
|
||||
public readIndex(): Promise<void> {
|
||||
this.fileMap = Object.create(null);
|
||||
|
||||
return Promise.promisify(glob).call(glob, '**/*.ts', {
|
||||
cwd: this.runner.dtPath
|
||||
}).then((filesNames: string[]) => {
|
||||
this.files = Lazy(filesNames).filter((fileName) => {
|
||||
return this.runner.checkAcceptFile(fileName);
|
||||
}).map((fileName: string) => {
|
||||
var file = new File(this.runner.dtPath, fileName);
|
||||
this.fileMap[file.fullPath] = file;
|
||||
return file;
|
||||
}).toArray();
|
||||
});
|
||||
}
|
||||
|
||||
public collectDiff(changes: string[]): Promise<void> {
|
||||
return new Promise((resolve) => {
|
||||
// filter changes and bake map for easy lookup
|
||||
this.changed = Object.create(null);
|
||||
this.removed = Object.create(null);
|
||||
|
||||
Lazy(changes).filter((full) => {
|
||||
return this.runner.checkAcceptFile(full);
|
||||
}).uniq().each((local) => {
|
||||
var full = path.resolve(this.runner.dtPath, local);
|
||||
var file = this.getFile(full);
|
||||
if (!file) {
|
||||
// TODO figure out what to do here
|
||||
// what does it mean? deleted?ss
|
||||
file = new File(this.runner.dtPath, local);
|
||||
this.setFile(file);
|
||||
this.removed[full] = file;
|
||||
// console.log('not in index? %', file.fullPath);
|
||||
}
|
||||
else {
|
||||
this.changed[full] = file;
|
||||
}
|
||||
});
|
||||
// console.log('changed:\n' + Object.keys(this.changed).join('\n'));
|
||||
// console.log('removed:\n' + Object.keys(this.removed).join('\n'));
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
|
||||
public parseFiles(): Promise<void> {
|
||||
return this.loadReferences(this.files).then(() => {
|
||||
return this.getMissingReferences();
|
||||
});
|
||||
}
|
||||
|
||||
private getMissingReferences(): Promise<void> {
|
||||
return Promise.attempt(() => {
|
||||
this.missing = Object.create(null);
|
||||
Lazy(this.removed).keys().each((removed) => {
|
||||
if (removed in this.refMap) {
|
||||
this.missing[removed] = this.refMap[removed];
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private loadReferences(files: File[]): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
var queue = files.slice(0);
|
||||
var active = [];
|
||||
var max = 50;
|
||||
var next = () => {
|
||||
if (queue.length === 0 && active.length === 0) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
// queue paralel
|
||||
while (queue.length > 0 && active.length < max) {
|
||||
var file = queue.pop();
|
||||
active.push(file);
|
||||
this.parseFile(file).then((file) => {
|
||||
active.splice(active.indexOf(file), 1);
|
||||
next();
|
||||
}).catch((err) => {
|
||||
queue = [];
|
||||
active = [];
|
||||
reject(err);
|
||||
});
|
||||
}
|
||||
};
|
||||
next();
|
||||
}).then(() => {
|
||||
// bake reverse reference map (referenced to referrers)
|
||||
this.refMap = Object.create(null);
|
||||
|
||||
Lazy(files).each((file) => {
|
||||
Lazy(file.references).each((ref) => {
|
||||
if (ref.fullPath in this.refMap) {
|
||||
this.refMap[ref.fullPath].push(file);
|
||||
}
|
||||
else {
|
||||
this.refMap[ref.fullPath] = [file];
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// TODO replace with a stream?
|
||||
private parseFile(file: File): Promise<File> {
|
||||
return readFile(file.filePathWithName, {
|
||||
encoding: 'utf8',
|
||||
flag: 'r'
|
||||
}).then((content) => {
|
||||
file.references = Lazy(extractReferenceTags(content)).map((ref) => {
|
||||
return path.resolve(path.dirname(file.fullPath), ref);
|
||||
}).reduce((memo: File[], ref) => {
|
||||
if (ref in this.fileMap) {
|
||||
memo.push(this.fileMap[ref]);
|
||||
}
|
||||
else {
|
||||
console.log('not mapped? -> ' + ref);
|
||||
}
|
||||
return memo;
|
||||
}, []);
|
||||
// return the object
|
||||
return file;
|
||||
});
|
||||
}
|
||||
|
||||
public collectTargets(): Promise<File[]> {
|
||||
return new Promise((resolve) => {
|
||||
// map out files linked to changes
|
||||
// - queue holds files touched by a change
|
||||
// - pre-fill with actually changed files
|
||||
// - loop queue, if current not seen:
|
||||
// - add to result
|
||||
// - from refMap queue all files referring to current
|
||||
|
||||
var result: FileDict = Object.create(null);
|
||||
var queue = Lazy<File>(this.changed).values().toArray();
|
||||
|
||||
while (queue.length > 0) {
|
||||
var next = queue.shift();
|
||||
var fp = next.fullPath;
|
||||
if (result[fp]) {
|
||||
continue;
|
||||
}
|
||||
result[fp] = next;
|
||||
if (fp in this.refMap) {
|
||||
var arr = this.refMap[fp];
|
||||
for (var i = 0, ii = arr.length; i < ii; i++) {
|
||||
// just add it and skip expensive checks
|
||||
queue.push(arr[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
resolve(Lazy<File>(result).values().toArray());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,281 +0,0 @@
|
||||
/// <reference path="../_ref.d.ts" />
|
||||
/// <reference path="../runner.ts" />
|
||||
|
||||
module DT {
|
||||
|
||||
var os = require('os');
|
||||
|
||||
/////////////////////////////////
|
||||
// All the common things that we print are functions of this class
|
||||
/////////////////////////////////
|
||||
export class Print {
|
||||
|
||||
WIDTH = 77;
|
||||
|
||||
typings: number;
|
||||
tests: number;
|
||||
tsFiles: number
|
||||
|
||||
constructor(public version: string){
|
||||
|
||||
}
|
||||
|
||||
public init(typings: number, tests: number, tsFiles: number) {
|
||||
this.typings = typings;
|
||||
this.tests = tests;
|
||||
this.tsFiles = tsFiles;
|
||||
}
|
||||
|
||||
public out(s: any): Print {
|
||||
process.stdout.write(s);
|
||||
return this;
|
||||
}
|
||||
|
||||
public repeat(s: string, times: number): string {
|
||||
return new Array(times + 1).join(s);
|
||||
}
|
||||
|
||||
public printChangeHeader() {
|
||||
this.out('=============================================================================\n');
|
||||
this.out(' \33[36m\33[1mDefinitelyTyped Diff Detector 0.1.0\33[0m \n');
|
||||
this.out('=============================================================================\n');
|
||||
}
|
||||
|
||||
public printHeader(options: ITestRunnerOptions) {
|
||||
var totalMem = Math.round(os.totalmem() / 1024 / 1024) + ' mb';
|
||||
var freemem = Math.round(os.freemem() / 1024 / 1024) + ' mb';
|
||||
|
||||
this.out('=============================================================================\n');
|
||||
this.out(' \33[36m\33[1mDefinitelyTyped Test Runner 0.5.0\33[0m\n');
|
||||
this.out('=============================================================================\n');
|
||||
this.out(' \33[36m\33[1mTypescript version:\33[0m ' + this.version + '\n');
|
||||
this.out(' \33[36m\33[1mTypings :\33[0m ' + this.typings + '\n');
|
||||
this.out(' \33[36m\33[1mTests :\33[0m ' + this.tests + '\n');
|
||||
this.out(' \33[36m\33[1mTypeScript files :\33[0m ' + this.tsFiles + '\n');
|
||||
this.out(' \33[36m\33[1mTotal Memory :\33[0m ' + totalMem + '\n');
|
||||
this.out(' \33[36m\33[1mFree Memory :\33[0m ' + freemem + '\n');
|
||||
this.out(' \33[36m\33[1mCores :\33[0m ' + os.cpus().length + '\n');
|
||||
this.out(' \33[36m\33[1mConcurrent :\33[0m ' + options.concurrent + '\n');
|
||||
}
|
||||
|
||||
public printSuiteHeader(title: string) {
|
||||
var left = Math.floor((this.WIDTH - title.length ) / 2) - 1;
|
||||
var right = Math.ceil((this.WIDTH - title.length ) / 2) - 1;
|
||||
this.out(this.repeat('=', left)).out(' \33[34m\33[1m');
|
||||
this.out(title);
|
||||
this.out('\33[0m ').out(this.repeat('=', right)).printBreak();
|
||||
}
|
||||
|
||||
public printDiv() {
|
||||
this.out('-----------------------------------------------------------------------------\n');
|
||||
}
|
||||
|
||||
public printBoldDiv() {
|
||||
this.out('=============================================================================\n');
|
||||
}
|
||||
|
||||
public printErrorsHeader() {
|
||||
this.out('=============================================================================\n');
|
||||
this.out(' \33[34m\33[1mErrors in files\33[0m \n');
|
||||
this.out('=============================================================================\n');
|
||||
}
|
||||
|
||||
public printErrorsForFile(testResult: TestResult) {
|
||||
this.out('----------------- For file:' + testResult.targetFile.filePathWithName);
|
||||
this.printBreak().out(testResult.stderr).printBreak();
|
||||
}
|
||||
|
||||
public printBreak(): Print {
|
||||
this.out('\n');
|
||||
return this;
|
||||
}
|
||||
|
||||
public clearCurrentLine(): Print {
|
||||
this.out('\r\33[K');
|
||||
return this;
|
||||
}
|
||||
|
||||
public printSuccessCount(current: number, total: number) {
|
||||
var arb = (total === 0) ? 0 : (current / total);
|
||||
this.out(' \33[36m\33[1mSuccessful :\33[0m \33[32m\33[1m' + (arb * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n');
|
||||
}
|
||||
|
||||
public printFailedCount(current: number, total: number) {
|
||||
var arb = (total === 0) ? 0 : (current / total);
|
||||
this.out(' \33[36m\33[1mFailure :\33[0m \33[31m\33[1m' + (arb * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n');
|
||||
}
|
||||
|
||||
public printTypingsWithoutTestsMessage() {
|
||||
this.out(' \33[36m\33[1mTyping without tests\33[0m\n');
|
||||
}
|
||||
|
||||
public printTotalMessage() {
|
||||
this.out(' \33[36m\33[1mTotal\33[0m\n');
|
||||
}
|
||||
|
||||
public printElapsedTime(time: string, s: number) {
|
||||
this.out(' \33[36m\33[1mElapsed time :\33[0m ~' + time + ' (' + s + 's)\n');
|
||||
}
|
||||
|
||||
public printSuiteErrorCount(errorHeadline: string, current: number, total: number, warn: boolean = false) {
|
||||
var arb = (total === 0) ? 0 : (current / total);
|
||||
this.out(' \33[36m\33[1m').out(errorHeadline).out(this.repeat(' ', 16 - errorHeadline.length));
|
||||
if (warn) {
|
||||
this.out(': \33[31m\33[1m' + (arb * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n');
|
||||
}
|
||||
else {
|
||||
this.out(': \33[33m\33[1m' + (arb * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n');
|
||||
}
|
||||
}
|
||||
|
||||
public printSubHeader(file: string) {
|
||||
this.out(' \33[36m\33[1m' + file + '\33[0m\n');
|
||||
}
|
||||
|
||||
public printWarnCode(str: string) {
|
||||
this.out(' \33[31m\33[1m<' + str.toLowerCase().replace(/ +/g, '-') + '>\33[0m\n');
|
||||
}
|
||||
|
||||
public printLine(file: string) {
|
||||
this.out(file + '\n');
|
||||
}
|
||||
|
||||
public printElement(file: string) {
|
||||
this.out(' - ' + file + '\n');
|
||||
}
|
||||
|
||||
public printElement2(file: string) {
|
||||
this.out(' - ' + file + '\n');
|
||||
}
|
||||
|
||||
public printTypingsWithoutTestName(file: string) {
|
||||
this.out(' - \33[33m\33[1m' + file + '\33[0m\n');
|
||||
}
|
||||
|
||||
public printTypingsWithoutTest(withoutTestTypings: string[]) {
|
||||
if (withoutTestTypings.length > 0) {
|
||||
this.printTypingsWithoutTestsMessage();
|
||||
|
||||
this.printDiv();
|
||||
withoutTestTypings.forEach((t) => {
|
||||
this.printTypingsWithoutTestName(t);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public printTestComplete(testResult: TestResult): void {
|
||||
var reporter = testResult.hostedBy.testReporter;
|
||||
if (testResult.success) {
|
||||
reporter.printPositiveCharacter(testResult);
|
||||
}
|
||||
else {
|
||||
reporter.printNegativeCharacter(testResult);
|
||||
}
|
||||
}
|
||||
|
||||
public printSuiteComplete(suite: ITestSuite): void {
|
||||
this.printBreak();
|
||||
|
||||
this.printDiv();
|
||||
this.printElapsedTime(suite.timer.asString, suite.timer.time);
|
||||
this.printSuccessCount(suite.okTests.length, suite.testResults.length);
|
||||
this.printFailedCount(suite.ngTests.length, suite.testResults.length);
|
||||
}
|
||||
|
||||
public printTests(adding: FileDict): void {
|
||||
this.printDiv();
|
||||
this.printSubHeader('Testing');
|
||||
this.printDiv();
|
||||
|
||||
Object.keys(adding).sort().map((src) => {
|
||||
this.printLine(adding[src].filePathWithName);
|
||||
return adding[src];
|
||||
});
|
||||
}
|
||||
|
||||
public printQueue(files: File[]): void {
|
||||
this.printDiv();
|
||||
this.printSubHeader('Queued for testing');
|
||||
this.printDiv();
|
||||
|
||||
files.forEach((file) => {
|
||||
this.printLine(file.filePathWithName);
|
||||
});
|
||||
}
|
||||
|
||||
public printTestAll(): void {
|
||||
this.printDiv();
|
||||
this.printSubHeader('Ignoring changes, testing all files');
|
||||
}
|
||||
|
||||
public printFiles(files: File[]): void {
|
||||
this.printDiv();
|
||||
this.printSubHeader('Files');
|
||||
this.printDiv();
|
||||
|
||||
files.forEach((file) => {
|
||||
this.printLine(file.filePathWithName);
|
||||
file.references.forEach((file) => {
|
||||
this.printElement(file.filePathWithName);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public printMissing(index: FileIndex, refMap: FileArrDict): void {
|
||||
this.printDiv();
|
||||
this.printSubHeader('Missing references');
|
||||
this.printDiv();
|
||||
|
||||
Object.keys(refMap).sort().forEach((src) => {
|
||||
var ref = index.getFile(src);
|
||||
this.printLine('\33[31m\33[1m' + ref.filePathWithName + '\33[0m');
|
||||
refMap[src].forEach((file) => {
|
||||
this.printElement(file.filePathWithName);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public printAllChanges(paths: string[]): void {
|
||||
this.printSubHeader('All changes');
|
||||
this.printDiv();
|
||||
|
||||
paths.sort().forEach((line) => {
|
||||
this.printLine(line);
|
||||
});
|
||||
}
|
||||
|
||||
public printRelChanges(changeMap: FileDict): void {
|
||||
this.printDiv();
|
||||
this.printSubHeader('Interesting files');
|
||||
this.printDiv();
|
||||
|
||||
Object.keys(changeMap).sort().forEach((src) => {
|
||||
this.printLine(changeMap[src].filePathWithName);
|
||||
});
|
||||
}
|
||||
|
||||
public printRemovals(changeMap: FileDict): void {
|
||||
this.printDiv();
|
||||
this.printSubHeader('Removed files');
|
||||
this.printDiv();
|
||||
|
||||
Object.keys(changeMap).sort().forEach((src) => {
|
||||
this.printLine(changeMap[src].filePathWithName);
|
||||
});
|
||||
}
|
||||
|
||||
public printRefMap(index: FileIndex, refMap: FileArrDict): void {
|
||||
this.printDiv();
|
||||
this.printSubHeader('Referring');
|
||||
this.printDiv();
|
||||
|
||||
Object.keys(refMap).sort().forEach((src) => {
|
||||
var ref = index.getFile(src);
|
||||
this.printLine(ref.filePathWithName);
|
||||
refMap[src].forEach((file) => {
|
||||
this.printLine(' - ' + file.filePathWithName);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
/// <reference path="../../_ref.d.ts" />
|
||||
/// <reference path="../printer.ts" />
|
||||
|
||||
module DT {
|
||||
/////////////////////////////////
|
||||
// Test reporter interface
|
||||
// for example, . and x
|
||||
/////////////////////////////////
|
||||
export interface ITestReporter {
|
||||
printPositiveCharacter(testResult: TestResult):void;
|
||||
printNegativeCharacter(testResult: TestResult):void;
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
// Default test reporter
|
||||
/////////////////////////////////
|
||||
export class DefaultTestReporter implements ITestReporter {
|
||||
|
||||
index = 0;
|
||||
|
||||
constructor(public print: Print) {
|
||||
}
|
||||
|
||||
public printPositiveCharacter(testResult: TestResult) {
|
||||
this.print.out('\33[36m\33[1m' + '.' + '\33[0m');
|
||||
this.index++;
|
||||
this.printBreakIfNeeded(this.index);
|
||||
}
|
||||
|
||||
public printNegativeCharacter( testResult: TestResult) {
|
||||
this.print.out('x');
|
||||
this.index++;
|
||||
this.printBreakIfNeeded(this.index);
|
||||
}
|
||||
|
||||
private printBreakIfNeeded(index: number) {
|
||||
if (index % this.print.WIDTH === 0) {
|
||||
this.print.printBreak();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
/// <reference path="../../runner.ts" />
|
||||
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
var Promise: typeof Promise = require('bluebird');
|
||||
|
||||
/////////////////////////////////
|
||||
// The interface for test suite
|
||||
/////////////////////////////////
|
||||
export interface ITestSuite {
|
||||
testSuiteName:string;
|
||||
errorHeadline:string;
|
||||
filterTargetFiles(files: File[]): Promise<File[]>;
|
||||
|
||||
start(targetFiles: File[], testCallback: (result: TestResult, index: number) => void): Promise<ITestSuite>;
|
||||
|
||||
testResults:TestResult[];
|
||||
okTests:TestResult[];
|
||||
ngTests:TestResult[];
|
||||
timer:Timer;
|
||||
|
||||
testReporter:ITestReporter;
|
||||
printErrorCount:boolean;
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
// Base class for test suite
|
||||
/////////////////////////////////
|
||||
export class TestSuiteBase implements ITestSuite {
|
||||
timer: Timer = new Timer();
|
||||
testResults: TestResult[] = [];
|
||||
testReporter: ITestReporter;
|
||||
printErrorCount = true;
|
||||
queue: TestQueue;
|
||||
|
||||
constructor(public options: ITestRunnerOptions, public testSuiteName: string, public errorHeadline: string) {
|
||||
this.queue = new TestQueue(options.concurrent);
|
||||
}
|
||||
|
||||
public filterTargetFiles(files: File[]): Promise<File[]> {
|
||||
throw new Error('please implement this method');
|
||||
}
|
||||
|
||||
public start(targetFiles: File[], testCallback: (result: TestResult) => void): Promise<ITestSuite> {
|
||||
this.timer.start();
|
||||
|
||||
return this.filterTargetFiles(targetFiles).then((targetFiles) => {
|
||||
// tests get queued for multi-threading
|
||||
return Promise.all(targetFiles.map((targetFile) => {
|
||||
return this.runTest(targetFile).then((result) => {
|
||||
testCallback(result);
|
||||
});
|
||||
}));
|
||||
}).then(() => {
|
||||
this.timer.end();
|
||||
return this;
|
||||
});
|
||||
}
|
||||
|
||||
public runTest(targetFile: File): Promise<TestResult> {
|
||||
return this.queue.run(new Test(this, targetFile, {
|
||||
tscVersion: this.options.tscVersion
|
||||
})).then((result) => {
|
||||
this.testResults.push(result);
|
||||
return result;
|
||||
});
|
||||
}
|
||||
|
||||
public get okTests(): TestResult[] {
|
||||
return this.testResults.filter((r) => {
|
||||
return r.success;
|
||||
});
|
||||
}
|
||||
|
||||
public get ngTests(): TestResult[] {
|
||||
return this.testResults.filter((r) => {
|
||||
return !r.success
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
/// <reference path="../../runner.ts" />
|
||||
/// <reference path="../util.ts" />
|
||||
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
var Promise: typeof Promise = require('bluebird');
|
||||
|
||||
var endDts = /\w\.d\.ts$/i;
|
||||
|
||||
/////////////////////////////////
|
||||
// .d.ts syntax inspection
|
||||
/////////////////////////////////
|
||||
export class SyntaxChecking extends TestSuiteBase {
|
||||
|
||||
constructor(options: ITestRunnerOptions) {
|
||||
super(options, 'Syntax checking', 'Syntax error');
|
||||
}
|
||||
|
||||
public filterTargetFiles(files: File[]): Promise<File[]> {
|
||||
return Promise.cast(files.filter((file) => {
|
||||
return endDts.test(file.filePathWithName);
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
/// <reference path="../../runner.ts" />
|
||||
/// <reference path="../util.ts" />
|
||||
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
var Promise: typeof Promise = require('bluebird');
|
||||
|
||||
var endTestDts = /\w-tests?\.ts$/i;
|
||||
|
||||
/////////////////////////////////
|
||||
// Compile with *-tests.ts
|
||||
/////////////////////////////////
|
||||
export class TestEval extends TestSuiteBase {
|
||||
|
||||
constructor(options) {
|
||||
super(options, 'Typing tests', 'Failed tests');
|
||||
}
|
||||
|
||||
public filterTargetFiles(files: File[]): Promise<File[]> {
|
||||
return Promise.cast(files.filter((file) => {
|
||||
return endTestDts.test(file.filePathWithName);
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
/// <reference path='../../runner.ts' />
|
||||
/// <reference path='../file.ts' />
|
||||
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var Promise: typeof Promise = require('bluebird');
|
||||
|
||||
/////////////////////////////////
|
||||
// Try compile without .tscparams
|
||||
// It may indicate that it is compatible with --noImplicitAny maybe...
|
||||
/////////////////////////////////
|
||||
export class FindNotRequiredTscparams extends TestSuiteBase {
|
||||
testReporter: ITestReporter;
|
||||
printErrorCount = false;
|
||||
|
||||
constructor(options: ITestRunnerOptions, private print: Print) {
|
||||
super(options, 'Find not required .tscparams files', 'New arrival!');
|
||||
|
||||
this.testReporter = {
|
||||
printPositiveCharacter: (testResult: TestResult) => {
|
||||
this.print
|
||||
.clearCurrentLine()
|
||||
.printTypingsWithoutTestName(testResult.targetFile.filePathWithName);
|
||||
},
|
||||
printNegativeCharacter: (testResult: TestResult) => {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public filterTargetFiles(files: File[]): Promise<File[]> {
|
||||
return Promise.filter(files, (file) => {
|
||||
return new Promise((resolve) => {
|
||||
fs.exists(file.filePathWithName + '.tscparams', resolve);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public runTest(targetFile: File): Promise<TestResult> {
|
||||
this.print.clearCurrentLine().out(targetFile.filePathWithName);
|
||||
|
||||
return this.queue.run(new Test(this, targetFile, {
|
||||
tscVersion: this.options.tscVersion,
|
||||
useTscParams: false,
|
||||
checkNoImplicitAny: true
|
||||
})).then((result) => {
|
||||
this.testResults.push(result);
|
||||
this.print.clearCurrentLine();
|
||||
return result
|
||||
});
|
||||
}
|
||||
|
||||
public get ngTests(): TestResult[] {
|
||||
// Do not show ng test results
|
||||
return [];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
/// <reference path="../_ref.d.ts" />
|
||||
/// <reference path="../runner.ts" />
|
||||
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
/////////////////////////////////
|
||||
// Timer.start starts a timer
|
||||
// Timer.end stops the timer and sets asString to the pretty print value
|
||||
/////////////////////////////////
|
||||
export class Timer {
|
||||
startTime: number;
|
||||
time = 0;
|
||||
asString: string = '<not-started>'
|
||||
|
||||
public start() {
|
||||
this.time = 0;
|
||||
this.startTime = this.now();
|
||||
this.asString = '<started>';
|
||||
}
|
||||
|
||||
public now(): number {
|
||||
return Date.now();
|
||||
}
|
||||
|
||||
public end() {
|
||||
this.time = (this.now() - this.startTime) / 1000;
|
||||
this.asString = Timer.prettyDate(this.startTime, this.now());
|
||||
}
|
||||
|
||||
public static prettyDate(date1: number, date2: number): string {
|
||||
var diff = ((date2 - date1) / 1000);
|
||||
var day_diff = Math.floor(diff / 86400);
|
||||
|
||||
if (isNaN(day_diff) || day_diff < 0 || day_diff >= 31) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (<string><any> (day_diff == 0 && (
|
||||
diff < 60 && (diff + ' seconds') ||
|
||||
diff < 120 && '1 minute' ||
|
||||
diff < 3600 && Math.floor(diff / 60) + ' minutes' ||
|
||||
diff < 7200 && '1 hour' ||
|
||||
diff < 86400 && Math.floor(diff / 3600) + ' hours') ||
|
||||
day_diff == 1 && 'Yesterday' ||
|
||||
day_diff < 7 && day_diff + ' days' ||
|
||||
day_diff < 31 && Math.ceil(day_diff / 7) + ' weeks'));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
/// <reference path='../_ref.d.ts' />
|
||||
/// <reference path='../runner.ts' />
|
||||
/// <reference path='exec.ts' />
|
||||
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
|
||||
var Promise: typeof Promise = require('bluebird');
|
||||
|
||||
export interface TscExecOptions {
|
||||
tscVersion?:string;
|
||||
useTscParams?:boolean;
|
||||
checkNoImplicitAny?:boolean;
|
||||
}
|
||||
|
||||
export class Tsc {
|
||||
public static run(tsfile: string, options: TscExecOptions): Promise<ExecResult> {
|
||||
var tscPath;
|
||||
return new Promise.attempt(() => {
|
||||
options = options || {};
|
||||
options.tscVersion = options.tscVersion || DEFAULT_TSC_VERSION;
|
||||
if (typeof options.checkNoImplicitAny === 'undefined') {
|
||||
options.checkNoImplicitAny = true;
|
||||
}
|
||||
if (typeof options.useTscParams === 'undefined') {
|
||||
options.useTscParams = true;
|
||||
}
|
||||
return fileExists(tsfile);
|
||||
}).then((exists) => {
|
||||
if (!exists) {
|
||||
throw new Error(tsfile + ' not exists');
|
||||
}
|
||||
tscPath = './_infrastructure/tests/typescript/' + options.tscVersion + '/tsc.js';
|
||||
return fileExists(tscPath);
|
||||
}).then((exists) => {
|
||||
if (!exists) {
|
||||
throw new Error(tscPath + ' is not exists');
|
||||
}
|
||||
return fileExists(tsfile + '.tscparams');
|
||||
}).then((exists) => {
|
||||
var command = 'node ' + tscPath + ' --module commonjs ';
|
||||
if (options.useTscParams && exists) {
|
||||
command += '@' + tsfile + '.tscparams';
|
||||
}
|
||||
else if (options.checkNoImplicitAny) {
|
||||
command += '--noImplicitAny';
|
||||
}
|
||||
return exec(command, [tsfile]);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
/// <reference path="../_ref.d.ts" />
|
||||
|
||||
module DT {
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var Lazy: LazyJS.LazyStatic = require('lazy.js');
|
||||
var Promise: typeof Promise = require('bluebird');
|
||||
|
||||
var referenceTagExp = /<reference[ \t]*path=["']?([\w\.\/_-]*)["']?[ \t]*\/>/g;
|
||||
|
||||
export function endsWith(str: string, suffix: string) {
|
||||
return str.indexOf(suffix, str.length - suffix.length) !== -1;
|
||||
}
|
||||
|
||||
export function extractReferenceTags(source: string): string[] {
|
||||
var ret: string[] = [];
|
||||
var match: RegExpExecArray;
|
||||
|
||||
if (!referenceTagExp.global) {
|
||||
throw new Error('referenceTagExp RegExp must have global flag');
|
||||
}
|
||||
referenceTagExp.lastIndex = 0;
|
||||
|
||||
while ((match = referenceTagExp.exec(source))) {
|
||||
if (match.length > 0 && match[1].length > 0) {
|
||||
ret.push(match[1]);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
export function fileExists(target: string): Promise<boolean> {
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.exists(target, (bool: boolean) => {
|
||||
resolve(bool);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
-9178
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
require('./tsc.js')
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-14202
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
require('./tsc.js')
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-14931
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
require('./tsc.js')
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-14958
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
require('./tsc.js')
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-252
@@ -1,252 +0,0 @@
|
||||
// Type definitions for Lazy.js 0.3.2
|
||||
// Project: https://github.com/dtao/lazy.js/
|
||||
// Definitions by: Bart van der Schoor <https://github.com/Bartvds>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
declare module LazyJS {
|
||||
|
||||
interface LazyStatic {
|
||||
|
||||
<T>(value: T[]):ArrayLikeSequence<T>;
|
||||
(value: any[]):ArrayLikeSequence<any>;
|
||||
<T>(value: Object):ObjectLikeSequence<T>;
|
||||
(value: Object):ObjectLikeSequence<any>;
|
||||
(value: string):StringLikeSequence;
|
||||
|
||||
strict():LazyStatic;
|
||||
|
||||
generate<T>(generatorFn: GeneratorCallback<T>, length?: number):GeneratedSequence<T>;
|
||||
|
||||
range(to: number):GeneratedSequence<number>;
|
||||
range(from: number, to: number, step?: number):GeneratedSequence<number>;
|
||||
|
||||
repeat<T>(value: T, count?: number):GeneratedSequence<T>;
|
||||
|
||||
on<T>(eventType: string):Sequence<T>;
|
||||
|
||||
readFile(path: string):StringLikeSequence;
|
||||
makeHttpRequest(path: string):StringLikeSequence;
|
||||
}
|
||||
|
||||
interface ArrayLike<T> {
|
||||
length:number;
|
||||
[index:number]:T;
|
||||
}
|
||||
|
||||
interface Callback {
|
||||
():void;
|
||||
}
|
||||
|
||||
interface ErrorCallback {
|
||||
(error: any):void;
|
||||
}
|
||||
|
||||
interface ValueCallback<T> {
|
||||
(value: T):void;
|
||||
}
|
||||
|
||||
interface GetKeyCallback<T> {
|
||||
(value: T):string;
|
||||
}
|
||||
|
||||
interface TestCallback<T> {
|
||||
(value: T):boolean;
|
||||
}
|
||||
|
||||
interface MapCallback<T, U> {
|
||||
(value: T):U;
|
||||
}
|
||||
|
||||
interface MapStringCallback {
|
||||
(value: string):string;
|
||||
}
|
||||
|
||||
interface NumberCallback<T> {
|
||||
(value: T):number;
|
||||
}
|
||||
|
||||
interface MemoCallback<T, U> {
|
||||
(memo: U, value: T):U;
|
||||
}
|
||||
|
||||
interface GeneratorCallback<T> {
|
||||
(index: number):T;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
interface Iterator<T> {
|
||||
new (sequence: Sequence<T>):Iterator<T>;
|
||||
current():T;
|
||||
moveNext():boolean;
|
||||
}
|
||||
|
||||
interface GeneratedSequence<T> extends Sequence<T> {
|
||||
new(generatorFn: GeneratorCallback<T>, length: number):GeneratedSequence<T>;
|
||||
length():number;
|
||||
}
|
||||
|
||||
interface AsyncSequence<T> extends SequenceBase<T> {
|
||||
each(callback: ValueCallback<T>):AsyncHandle<T>;
|
||||
}
|
||||
|
||||
interface AsyncHandle<T> {
|
||||
cancel():void;
|
||||
onComplete(callback: Callback):void;
|
||||
onError(callback: ErrorCallback):void;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
module Sequence {
|
||||
function define(methodName: string[], overrides: Object): Function;
|
||||
}
|
||||
|
||||
interface Sequence<T> extends SequenceBase<T> {
|
||||
each(eachFn: ValueCallback<T>):Sequence<T>;
|
||||
}
|
||||
|
||||
interface SequenceBase<T> extends SequenceBaser<T> {
|
||||
first():any;
|
||||
first(count: number):Sequence<T>;
|
||||
indexOf(value: any, startIndex?: number):Sequence<T>;
|
||||
|
||||
last():any;
|
||||
last(count: number):Sequence<T>;
|
||||
lastIndexOf(value: any):Sequence<T>;
|
||||
|
||||
reverse():Sequence<T>;
|
||||
}
|
||||
|
||||
interface SequenceBaser<T> {
|
||||
// TODO improve define() (needs ugly overload)
|
||||
async(interval: number):AsyncSequence<T>;
|
||||
chunk(size: number):Sequence<T>;
|
||||
compact():Sequence<T>;
|
||||
concat(var_args: T[]):Sequence<T>;
|
||||
consecutive(length: number):Sequence<T>;
|
||||
contains(value: T):boolean;
|
||||
countBy(keyFn: GetKeyCallback<T>): ObjectLikeSequence<T>;
|
||||
countBy(propertyName: string): ObjectLikeSequence<T>;
|
||||
dropWhile(predicateFn: TestCallback<T>): Sequence<T>;
|
||||
every(predicateFn: TestCallback<T>): boolean;
|
||||
filter(predicateFn: TestCallback<T>): Sequence<T>;
|
||||
find(predicateFn: TestCallback<T>): Sequence<T>;
|
||||
findWhere(properties: Object): Sequence<T>;
|
||||
|
||||
flatten(): Sequence<T>;
|
||||
groupBy(keyFn: GetKeyCallback<T>): ObjectLikeSequence<T>;
|
||||
initial(count?: number): Sequence<T>;
|
||||
intersection(var_args: T[]): Sequence<T>;
|
||||
invoke(methodName: string): Sequence<T>;
|
||||
isEmpty(): boolean;
|
||||
join(delimiter?: string): string;
|
||||
map<U>(mapFn: MapCallback<T, U>): Sequence<U>;
|
||||
|
||||
max(valueFn?: NumberCallback<T>): T;
|
||||
min(valueFn?: NumberCallback<T>): T;
|
||||
pluck(propertyName: string): Sequence<T>;
|
||||
reduce<U>(aggregatorFn: MemoCallback<T, U>, memo?: U): U;
|
||||
reduceRight<U>(aggregatorFn: MemoCallback<T, U>, memo: U): U;
|
||||
reject(predicateFn: TestCallback<T>): Sequence<T>;
|
||||
rest(count?: number): Sequence<T>;
|
||||
shuffle(): Sequence<T>;
|
||||
some(predicateFn?: TestCallback<T>): boolean;
|
||||
sortBy(sortFn: NumberCallback<T>): Sequence<T>;
|
||||
sortedIndex(value: T): Sequence<T>;
|
||||
sum(valueFn?: NumberCallback<T>): Sequence<T>;
|
||||
takeWhile(predicateFn: TestCallback<T>): Sequence<T>;
|
||||
union(var_args: T[]): Sequence<T>;
|
||||
uniq(): Sequence<T>;
|
||||
where(properties: Object): Sequence<T>;
|
||||
without(var_args: T[]): Sequence<T>;
|
||||
zip(var_args: T[]): Sequence<T>;
|
||||
|
||||
toArray(): T[];
|
||||
toObject(): Object;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
module ArrayLikeSequence {
|
||||
function define(methodName: string[], overrides: Object): Function;
|
||||
}
|
||||
|
||||
interface ArrayLikeSequence<T> extends Sequence<T> {
|
||||
// define()X;
|
||||
concat(): ArrayLikeSequence<T>;
|
||||
first(count?: number): ArrayLikeSequence<T>;
|
||||
get(index: number): T;
|
||||
length(): number;
|
||||
map<U>(mapFn: MapCallback<T, U>): ArrayLikeSequence<U>;
|
||||
pop(): ArrayLikeSequence<T>;
|
||||
rest(count?: number): ArrayLikeSequence<T>;
|
||||
reverse(): ArrayLikeSequence<T>;
|
||||
shift(): ArrayLikeSequence<T>;
|
||||
slice(begin: number, end?: number): ArrayLikeSequence<T>;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
module ObjectLikeSequence {
|
||||
function define(methodName: string[], overrides: Object): Function;
|
||||
}
|
||||
|
||||
interface ObjectLikeSequence<T> extends Sequence<T> {
|
||||
assign(other: Object): ObjectLikeSequence<T>;
|
||||
// throws error
|
||||
//async(): X;
|
||||
defaults(defaults: Object): ObjectLikeSequence<T>;
|
||||
functions(): Sequence<T>;
|
||||
get(property: string): ObjectLikeSequence<T>;
|
||||
invert(): ObjectLikeSequence<T>;
|
||||
keys(): Sequence<string>;
|
||||
omit(properties: string[]): ObjectLikeSequence<T>;
|
||||
pairs(): Sequence<T>;
|
||||
pick(properties: string[]): ObjectLikeSequence<T>;
|
||||
toArray(): T[];
|
||||
toObject(): Object;
|
||||
values(): Sequence<T>;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
module StringLikeSequence {
|
||||
function define(methodName: string[], overrides: Object): Function;
|
||||
}
|
||||
|
||||
interface StringLikeSequence extends SequenceBaser<string> {
|
||||
charAt(index: number): string;
|
||||
charCodeAt(index: number): number;
|
||||
contains(value: string): boolean;
|
||||
endsWith(suffix: string): boolean;
|
||||
|
||||
first(): string;
|
||||
first(count: number): StringLikeSequence;
|
||||
|
||||
indexOf(substring: string, startIndex?: number): number;
|
||||
|
||||
last(): string;
|
||||
last(count: number): StringLikeSequence;
|
||||
|
||||
lastIndexOf(substring: string, startIndex?: number): number;
|
||||
mapString(mapFn: MapStringCallback): StringLikeSequence;
|
||||
match(pattern: RegExp): StringLikeSequence;
|
||||
reverse(): StringLikeSequence;
|
||||
|
||||
split(delimiter: string): StringLikeSequence;
|
||||
split(delimiter: RegExp): StringLikeSequence;
|
||||
|
||||
startsWith(prefix: string): boolean;
|
||||
substring(start: number, stop?: number): StringLikeSequence;
|
||||
toLowerCase(): StringLikeSequence;
|
||||
toUpperCase(): StringLikeSequence;
|
||||
}
|
||||
}
|
||||
|
||||
declare var Lazy: LazyJS.LazyStatic;
|
||||
|
||||
declare module 'lazy.js' {
|
||||
export = Lazy;
|
||||
}
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
// https://github.com/substack/node-optimist
|
||||
// sourced from https://github.com/soywiz/typescript-node-definitions/blob/master/optimist.d.ts
|
||||
// rehacked by @Bartvds
|
||||
|
||||
declare module Optimist {
|
||||
export interface Argv {
|
||||
_: string[];
|
||||
}
|
||||
export interface Optimist {
|
||||
default(name: string, value: any): Optimist;
|
||||
default(args: any): Optimist;
|
||||
|
||||
boolean(name: string): Optimist;
|
||||
boolean(names: string[]): Optimist;
|
||||
|
||||
string(name: string): Optimist;
|
||||
string(names: string[]): Optimist;
|
||||
|
||||
wrap(columns): Optimist;
|
||||
|
||||
help(): Optimist;
|
||||
showHelp(fn?: Function): Optimist;
|
||||
|
||||
usage(message: string): Optimist;
|
||||
|
||||
demand(key: string): Optimist;
|
||||
demand(key: number): Optimist;
|
||||
demand(key: string[]): Optimist;
|
||||
|
||||
alias(key: string, alias: string): Optimist;
|
||||
|
||||
describe(key: string, desc: string): Optimist;
|
||||
|
||||
options(key: string, opt: any): Optimist;
|
||||
|
||||
check(fn: Function);
|
||||
|
||||
parse(args: string[]): Optimist;
|
||||
|
||||
argv: Argv;
|
||||
}
|
||||
}
|
||||
interface Optimist extends Optimist.Optimist {
|
||||
(args: string[]): Optimist.Optimist;
|
||||
}
|
||||
declare module 'optimist' {
|
||||
export = Optimist;
|
||||
}
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
/// <reference path="node/node.d.ts" />
|
||||
/// <reference path="bluebird/bluebird.d.ts" />
|
||||
/// <reference path="lazy.js/lazy.js.d.ts" />
|
||||
/// <reference path="optimist/optimist.d.ts" />
|
||||
@@ -0,0 +1,36 @@
|
||||
/// <reference path="../jquery/jquery.d.ts"/>
|
||||
/// <reference path="acc-wizard.d.ts" />
|
||||
|
||||
/**
|
||||
* @summary Test for "accwizard" without options.
|
||||
*/
|
||||
function testBasic() {
|
||||
$('#test').accwizard();
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Test for "accwizard" with options.
|
||||
*/
|
||||
function testWithOptions() {
|
||||
var options: AccWizardOptions = {
|
||||
addButtons: true,
|
||||
sidebar: '.acc-wizard-sidebar',
|
||||
activeClass: 'acc-wizard-active',
|
||||
completedClass: 'acc-wizard-completed',
|
||||
todoClass: 'acc-wizard-todo',
|
||||
stepClass: 'acc-wizard-step',
|
||||
nextText: 'Next Step',
|
||||
backText: 'Go Back',
|
||||
nextType: 'submit',
|
||||
backType: 'reset',
|
||||
nextClasses: 'btn btn-primary',
|
||||
backClasses: 'btn',
|
||||
autoScrolling: true,
|
||||
onNext: function() {},
|
||||
onBack: function() {},
|
||||
onInit: function() {},
|
||||
onDestroy: function() {}
|
||||
};
|
||||
|
||||
$('#test').accwizard(options);
|
||||
}
|
||||
Vendored
+101
@@ -0,0 +1,101 @@
|
||||
// Type definitions for acc-wizard
|
||||
// Project: https://github.com/sathomas/acc-wizard
|
||||
// Definitions by: Cyril Schumacher <https://github.com/cyrilschumacher>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
interface AccWizardOptions {
|
||||
/**
|
||||
* @summary Add next/prev buttons to panels.
|
||||
* @type {boolean}
|
||||
*/
|
||||
addButtons: boolean;
|
||||
|
||||
/**
|
||||
* @summary Selector for task sidebar.
|
||||
* @type {string}
|
||||
*/
|
||||
sidebar: string;
|
||||
|
||||
/**
|
||||
* @summary Class to indicate the active task in sidebar.
|
||||
* @type {string}
|
||||
*/
|
||||
activeClass: string;
|
||||
|
||||
/**
|
||||
* @summary Class to indicate task is complete.
|
||||
* @type {string}
|
||||
*/
|
||||
completedClass: string;
|
||||
|
||||
/**
|
||||
* @summary Class to indicate task is still pending.
|
||||
* @type {string}
|
||||
*/
|
||||
todoClass: string;
|
||||
|
||||
/**
|
||||
* @summary Class for step buttons within panels.
|
||||
* @type {string}
|
||||
*/
|
||||
stepClass: string;
|
||||
|
||||
/**
|
||||
* @summary Text for next button.
|
||||
* @type {string}
|
||||
*/
|
||||
nextText: string;
|
||||
|
||||
/**
|
||||
* @summary Text for back button
|
||||
* @type {string}
|
||||
*/
|
||||
backType: string;
|
||||
|
||||
/**
|
||||
* @summary Class(es) for next button.
|
||||
* @type {string}
|
||||
*/
|
||||
nextClasses: string;
|
||||
|
||||
/**
|
||||
* @summary Class(es) for back button.
|
||||
* @type {string}
|
||||
*/
|
||||
backClasses: string;
|
||||
|
||||
/**
|
||||
* @summary Auto-scrolling.
|
||||
* @type {boolean}
|
||||
*/
|
||||
autoScrolling: boolean;
|
||||
|
||||
/**
|
||||
* @summary Function to call on next step.
|
||||
*/
|
||||
onNext: Function;
|
||||
|
||||
/**
|
||||
* @summary Function to call on back up.
|
||||
*/
|
||||
onBack: Function;
|
||||
|
||||
/**
|
||||
* @summary A chance to hook initialization.
|
||||
*/
|
||||
onInit: Function;
|
||||
|
||||
/**
|
||||
* @summary A chance to hook destruction.
|
||||
*/
|
||||
onDestroy: Function;
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Interface for "acc-wizard" JQuery plugin.
|
||||
* @author Cyril Schumacher
|
||||
* @version 1.0
|
||||
*/
|
||||
interface JQuery {
|
||||
accwizard(options?: AccWizardOptions): void;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
--noImplicitAny
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/// <reference path='acl-mongodbBackend.d.ts'/>
|
||||
|
||||
// https://github.com/OptimalBits/node_acl/blob/master/Readme.md
|
||||
import Acl = require('acl');
|
||||
import mongodb = require('mongodb');
|
||||
|
||||
var db: mongodb.Db;
|
||||
|
||||
// Using the mongo db backend
|
||||
var acl = new Acl(new Acl.mongodbBackend(db, 'acl_', true));
|
||||
|
||||
// guest is allowed to view blogs
|
||||
acl.allow('guest', 'blogs', 'view');
|
||||
|
||||
// allow function accepts arrays as any parameter
|
||||
acl.allow('member', 'blogs', ['edit','view', 'delete']);
|
||||
|
||||
Vendored
+22
@@ -0,0 +1,22 @@
|
||||
// Type definitions for node_acl 0.4.7
|
||||
// Project: https://github.com/optimalbits/node_acl
|
||||
// Definitions by: Qubo <https://github.com/tkQubo>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="acl.d.ts" />
|
||||
/// <reference path="../mongodb/mongodb.d.ts" />
|
||||
|
||||
declare module "acl" {
|
||||
import mongo = require('mongodb');
|
||||
|
||||
interface AclStatic {
|
||||
mongodbBackend: MongodbBackendStatic;
|
||||
}
|
||||
|
||||
interface MongodbBackend extends Backend<Callback> { }
|
||||
interface MongodbBackendStatic {
|
||||
new(db: mongo.Db, prefix: string, useSingle: boolean): MongodbBackend;
|
||||
new(db: mongo.Db, prefix: string): MongodbBackend;
|
||||
new(db: mongo.Db): MongodbBackend;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
/// <reference path='acl-redisBackend.d.ts'/>
|
||||
|
||||
// https://github.com/OptimalBits/node_acl/blob/master/Readme.md
|
||||
import Acl = require('acl');
|
||||
import redis = require('redis');
|
||||
|
||||
var client: redis.RedisClient;
|
||||
|
||||
// Using the redis backend
|
||||
var acl = new Acl(new Acl.redisBackend(client, 'acl_'));
|
||||
|
||||
// guest is allowed to view blogs
|
||||
acl.allow('guest', 'blogs', 'view');
|
||||
|
||||
// allow function accepts arrays as any parameter
|
||||
acl.allow('member', 'blogs', ['edit','view', 'delete']);
|
||||
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
// Type definitions for node_acl 0.4.7
|
||||
// Project: https://github.com/optimalbits/node_acl
|
||||
// Definitions by: Qubo <https://github.com/tkQubo>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="acl.d.ts" />
|
||||
/// <reference path='../redis/redis.d.ts'/>
|
||||
|
||||
declare module "acl" {
|
||||
import redis = require('redis');
|
||||
|
||||
interface AclStatic {
|
||||
redisBackend: RedisBackendStatic;
|
||||
}
|
||||
|
||||
interface RedisBackend extends Backend<redis.RedisClient> { }
|
||||
interface RedisBackendStatic {
|
||||
new(redis: redis.RedisClient, prefix: string): RedisBackend;
|
||||
new(redis: redis.RedisClient): RedisBackend;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
/// <reference path='acl.d.ts'/>
|
||||
|
||||
// Sample code from
|
||||
// https://github.com/OptimalBits/node_acl/blob/master/Readme.md
|
||||
import Acl = require('acl');
|
||||
|
||||
var report = <T>(err: Error, value: T) => {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
}
|
||||
console.info(value);
|
||||
};
|
||||
|
||||
// Using the memory backend
|
||||
var acl = new Acl(new Acl.memoryBackend());
|
||||
|
||||
// guest is allowed to view blogs
|
||||
acl.allow('guest', 'blogs', 'view');
|
||||
|
||||
// allow function accepts arrays as any parameter
|
||||
acl.allow('member', 'blogs', ['edit','view', 'delete']);
|
||||
|
||||
acl.addUserRoles('joed', 'guest');
|
||||
|
||||
acl.addRoleParents('baz', ['foo','bar']);
|
||||
|
||||
acl.allow('foo', ['blogs','forums','news'], ['view', 'delete']);
|
||||
|
||||
acl.allow('admin', ['blogs','forums'], '*');
|
||||
|
||||
acl.allow([
|
||||
{
|
||||
roles:['guest','special-member'],
|
||||
allows:[
|
||||
{resources:'blogs', permissions:'get'},
|
||||
{resources:['forums','news'], permissions:['get','put','delete']}
|
||||
]
|
||||
},
|
||||
{
|
||||
roles:['gold','silver'],
|
||||
allows:[
|
||||
{resources:'cash', permissions:['sell','exchange']},
|
||||
{resources:['account','deposit'], permissions:['put','delete']}
|
||||
]
|
||||
}
|
||||
]);
|
||||
|
||||
acl.isAllowed('joed', 'blogs', 'view', (err, res) => {
|
||||
if (res) {
|
||||
console.log("User joed is allowed to view blogs");
|
||||
}
|
||||
});
|
||||
|
||||
acl.isAllowed('jsmith', 'blogs', ['edit','view','delete'])
|
||||
.then((result) => {
|
||||
console.dir('jsmith is allowed blogs ' + result);
|
||||
acl.addUserRoles('jsmith', 'member');
|
||||
}).then(() =>
|
||||
acl.isAllowed('jsmith', 'blogs', ['edit','view','delete'])
|
||||
).then((result) =>
|
||||
console.dir('jsmith is allowed blogs ' + result)
|
||||
).then(() => {
|
||||
acl.allowedPermissions('james', ['blogs','forums'], report);
|
||||
acl.allowedPermissions('jsmith', ['blogs','forums'], report);
|
||||
});
|
||||
Vendored
+120
@@ -0,0 +1,120 @@
|
||||
// Type definitions for node_acl 0.4.7
|
||||
// Project: https://github.com/optimalbits/node_acl
|
||||
// Definitions by: Qubo <https://github.com/tkQubo>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="../bluebird/bluebird.d.ts" />
|
||||
/// <reference path='../node/node.d.ts'/>
|
||||
|
||||
declare module "acl" {
|
||||
import http = require('http');
|
||||
import Promise = require("bluebird");
|
||||
|
||||
type strings = string|string[];
|
||||
type Value = string|number;
|
||||
type Values = Value|Value[];
|
||||
type Action = () => any;
|
||||
type Callback = (err: Error) => any;
|
||||
type AnyCallback = (err: Error, obj: any) => any;
|
||||
type AllowedCallback = (err: Error, allowed: boolean) => any;
|
||||
type GetUserId = (req: http.ServerRequest, res: http.ServerResponse) => Value;
|
||||
|
||||
interface AclStatic {
|
||||
new (backend: Backend<any>, logger: Logger, options: Option): Acl;
|
||||
new (backend: Backend<any>, logger: Logger): Acl;
|
||||
new (backend: Backend<any>): Acl;
|
||||
memoryBackend: MemoryBackendStatic;
|
||||
}
|
||||
|
||||
interface Logger {
|
||||
debug: (msg: string)=>any;
|
||||
}
|
||||
|
||||
interface Acl {
|
||||
addUserRoles: (userId: Value, roles: strings, cb?: Callback) => Promise<void>;
|
||||
removeUserRoles: (userId: Value, roles: strings, cb?: Callback) => Promise<void>;
|
||||
userRoles: (userId: Value, cb?: (err: Error, roles: string[])=>any) => Promise<string[]>;
|
||||
roleUsers: (role: Value, cb?: (err: Error, users: Values)=>any) => Promise<any>;
|
||||
hasRole: (userId: Value, role: string, cb?: (err: Error, isInRole: boolean)=>any) => Promise<boolean>;
|
||||
addRoleParents: (role: string, parents: Values, cb?: Callback) => Promise<void>;
|
||||
removeRole: (role: string, cb?: Callback) => Promise<void>;
|
||||
removeResource: (resource: string, cb?: Callback) => Promise<void>;
|
||||
allow: {
|
||||
(roles: Values, resources: strings, permissions: strings, cb?: Callback): Promise<void>;
|
||||
(aclSets: AclSet|AclSet[]): Promise<void>;
|
||||
}
|
||||
removeAllow: (role: string, resources: strings, permissions: strings, cb?: Callback) => Promise<void>;
|
||||
removePermissions: (role: string, resources: strings, permissions: strings, cb?: Function) => Promise<void>;
|
||||
allowedPermissions: (userId: Value, resources: strings, cb?: AnyCallback) => Promise<void>;
|
||||
isAllowed: (userId: Value, resources: strings, permissions: strings, cb?: AllowedCallback) => Promise<boolean>;
|
||||
areAnyRolesAllowed: (roles: strings, resource: strings, permissions: strings, cb?: AllowedCallback) => Promise<any>;
|
||||
whatResources: (roles: strings, permissions: strings, cb?: AnyCallback) => Promise<any>;
|
||||
permittedResources: (roles: strings, permissions: strings, cb?: Function) => Promise<void>;
|
||||
middleware: (numPathComponents: number, userId: Value|GetUserId, actions: strings) => Promise<any>;
|
||||
}
|
||||
|
||||
interface Option {
|
||||
buckets?: BucketsOption;
|
||||
}
|
||||
|
||||
interface BucketsOption {
|
||||
meta?: string;
|
||||
parents?: string;
|
||||
permissions?: string;
|
||||
resources?: string;
|
||||
roles?: string;
|
||||
users?: string;
|
||||
}
|
||||
|
||||
interface AclSet {
|
||||
roles: strings;
|
||||
allows: AclAllow[];
|
||||
}
|
||||
|
||||
interface AclAllow {
|
||||
resources: strings;
|
||||
permissions: strings;
|
||||
}
|
||||
|
||||
interface MemoryBackend extends Backend<Action[]> { }
|
||||
interface MemoryBackendStatic {
|
||||
new(): MemoryBackend;
|
||||
}
|
||||
|
||||
//
|
||||
// For internal use
|
||||
//
|
||||
interface Backend<T> {
|
||||
begin: () => T;
|
||||
end: (transaction: T, cb?: Action) => void;
|
||||
clean: (cb?: Action) => void;
|
||||
get: (bucket: string, key: Value, cb?: Action) => void;
|
||||
union: (bucket: string, keys: Value[], cb?: Action) => void;
|
||||
add: (transaction: T, bucket: string, key: Value, values: Values) => void;
|
||||
del: (transaction: T, bucket: string, keys: Value[]) => void;
|
||||
remove: (transaction: T, bucket: string, key: Value, values: Values) => void;
|
||||
|
||||
endAsync: Function; //TODO: Give more specific function signature
|
||||
getAsync: Function;
|
||||
cleanAsync: Function;
|
||||
unionAsync: Function;
|
||||
}
|
||||
|
||||
interface Contract {
|
||||
(args: IArguments): Contract|NoOp;
|
||||
debug: boolean;
|
||||
fulfilled: boolean;
|
||||
args: any[];
|
||||
checkedParams: string[];
|
||||
params: (...types: string[]) => Contract|NoOp;
|
||||
end: () => void;
|
||||
}
|
||||
|
||||
interface NoOp {
|
||||
params: (...types: string[]) => NoOp;
|
||||
end: () => void;
|
||||
}
|
||||
|
||||
var _: AclStatic;
|
||||
export = _;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
/// <reference path="../estree/estree.d.ts" />
|
||||
/// <reference path="acorn.d.ts" />
|
||||
|
||||
import acorn = require('acorn');
|
||||
|
||||
var token: acorn.Token;
|
||||
var tokens: acorn.Token[];
|
||||
var comment: acorn.Comment;
|
||||
var comments: acorn.Comment[];
|
||||
var program: ESTree.Program;
|
||||
var any: any;
|
||||
var string: string;
|
||||
|
||||
// acorn
|
||||
string = acorn.version;
|
||||
program = acorn.parse('code');
|
||||
program = acorn.parse('code', {range: true, onToken: tokens, onComment: comments});
|
||||
program = acorn.parse('code', {
|
||||
ranges: true,
|
||||
onToken: (token) => tokens.push(token),
|
||||
onComment: (isBlock, text, start, end) => { }
|
||||
});
|
||||
|
||||
// Token
|
||||
token = tokens[0];
|
||||
string = token.type.label;
|
||||
any = token.value;
|
||||
|
||||
// Comment
|
||||
string = comment.value;
|
||||
Vendored
+67
@@ -0,0 +1,67 @@
|
||||
// Type definitions for Acorn v1.0.1
|
||||
// Project: https://github.com/marijnh/acorn
|
||||
// Definitions by: RReverser <https://github.com/RReverser>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="../estree/estree.d.ts" />
|
||||
|
||||
declare module acorn {
|
||||
var version: string;
|
||||
function parse(input: string, options?: Options): ESTree.Program;
|
||||
function parseExpressionAt(input: string, pos: number, options?: Options): ESTree.Expression;
|
||||
var defaultOptions: Options;
|
||||
|
||||
interface TokenType {
|
||||
label: string;
|
||||
keyword: string;
|
||||
beforeExpr: boolean;
|
||||
startsExpr: boolean;
|
||||
isLoop: boolean;
|
||||
isAssign: boolean;
|
||||
prefix: boolean;
|
||||
postfix: boolean;
|
||||
binop: number;
|
||||
updateContext: (prevType: TokenType) => any;
|
||||
}
|
||||
|
||||
interface AbstractToken {
|
||||
start: number;
|
||||
end: number;
|
||||
loc: ESTree.SourceLocation;
|
||||
range: [number, number];
|
||||
}
|
||||
|
||||
interface Token extends AbstractToken {
|
||||
type: TokenType;
|
||||
value: any;
|
||||
}
|
||||
|
||||
interface Comment extends AbstractToken {
|
||||
type: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
interface Options {
|
||||
ecmaVersion?: number;
|
||||
sourceType?: string;
|
||||
onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: ESTree.Position) => any;
|
||||
onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: ESTree.Position) => any;
|
||||
allowReserved?: boolean;
|
||||
allowReturnOutsideFunction?: boolean;
|
||||
allowImportExportEverywhere?: boolean;
|
||||
allowHashBang?: boolean;
|
||||
locations?: boolean;
|
||||
onToken?: ((token: Token) => any) | Token[];
|
||||
onComment?: ((isBlock: boolean, text: string, start: number, end: number, startLoc?: ESTree.Position, endLoc?: ESTree.Position) => any) | Comment[];
|
||||
ranges?: boolean;
|
||||
program?: ESTree.Program;
|
||||
sourceFile?: string;
|
||||
directSourceFile?: string;
|
||||
preserveParens?: boolean;
|
||||
plugins?: { [name: string]: Function; };
|
||||
}
|
||||
}
|
||||
|
||||
declare module "acorn" {
|
||||
export = acorn
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/// <reference path="adm-zip.d.ts" />
|
||||
import AdmZip = require("adm-zip");
|
||||
|
||||
|
||||
// reading archives
|
||||
var zip = new AdmZip("./my_file.zip");
|
||||
var zipEntries = zip.getEntries(); // an array of ZipEntry records
|
||||
|
||||
zipEntries.forEach(function (zipEntry) {
|
||||
console.log(zipEntry.toString()); // outputs zip entries information
|
||||
if (zipEntry.entryName == "my_file.txt") {
|
||||
console.log(zipEntry.getData().toString('utf8'));
|
||||
}
|
||||
});
|
||||
// outputs the content of some_folder/my_file.txt
|
||||
console.log(zip.readAsText("some_folder/my_file.txt"));
|
||||
// extracts the specified file to the specified location
|
||||
zip.extractEntryTo(/*entry name*/"some_folder/my_file.txt", /*target path*/"/home/me/tempfolder", /*overwrite*/true)
|
||||
// extracts everything
|
||||
zip.extractAllTo(/*target path*/"/home/me/zipcontent/", /*overwrite*/true);
|
||||
|
||||
|
||||
// creating archives
|
||||
var zip = new AdmZip();
|
||||
|
||||
// add file directly
|
||||
zip.addFile("test.txt", new Buffer("inner content of the file"), "entry comment goes here");
|
||||
// add local file
|
||||
zip.addLocalFile("/home/me/some_picture.png");
|
||||
// get everything as a buffer
|
||||
var willSendthis = zip.toBuffer();
|
||||
// or write everything to disk
|
||||
zip.writeZip(/*target file name*/"/home/me/files.zip");
|
||||
Vendored
+300
@@ -0,0 +1,300 @@
|
||||
// Type definitions for adm-zip v0.4.4
|
||||
// Project: https://github.com/cthackers/adm-zip
|
||||
// Definitions by: John Vilk <https://github.com/jvilk>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="../node/node.d.ts" />
|
||||
|
||||
declare module AdmZip {
|
||||
class ZipFile {
|
||||
/**
|
||||
* Create a new, empty archive.
|
||||
*/
|
||||
constructor();
|
||||
/**
|
||||
* Read an existing archive.
|
||||
*/
|
||||
constructor(fileName: string);
|
||||
/**
|
||||
* Extracts the given entry from the archive and returns the content as a
|
||||
* Buffer object.
|
||||
* @param entry String with the full path of the entry
|
||||
* @return Buffer or Null in case of error
|
||||
*/
|
||||
readFile(entry: string): Buffer;
|
||||
/**
|
||||
* Extracts the given entry from the archive and returns the content as a
|
||||
* Buffer object.
|
||||
* @param entry ZipEntry object
|
||||
* @return Buffer or Null in case of error
|
||||
*/
|
||||
readFile(entry: IZipEntry): Buffer;
|
||||
/**
|
||||
* Asynchronous readFile
|
||||
* @param entry String with the full path of the entry
|
||||
* @param callback Called with a Buffer or Null in case of error
|
||||
*/
|
||||
readFileAsync(entry: string, callback: (data: Buffer, err: string) => any): void;
|
||||
/**
|
||||
* Asynchronous readFile
|
||||
* @param entry ZipEntry object
|
||||
* @param callback Called with a Buffer or Null in case of error
|
||||
* @return Buffer or Null in case of error
|
||||
*/
|
||||
readFileAsync(entry: IZipEntry, callback: (data: Buffer, err: string) => any): void;
|
||||
/**
|
||||
* Extracts the given entry from the archive and returns the content as
|
||||
* plain text in the given encoding
|
||||
* @param entry String with the full path of the entry
|
||||
* @param encoding Optional. If no encoding is specified utf8 is used
|
||||
* @return String
|
||||
*/
|
||||
readAsText(fileName: string, encoding?: string): string;
|
||||
/**
|
||||
* Extracts the given entry from the archive and returns the content as
|
||||
* plain text in the given encoding
|
||||
* @param entry ZipEntry object
|
||||
* @param encoding Optional. If no encoding is specified utf8 is used
|
||||
* @return String
|
||||
*/
|
||||
readAsText(fileName: IZipEntry, encoding?: string): string;
|
||||
/**
|
||||
* Asynchronous readAsText
|
||||
* @param entry String with the full path of the entry
|
||||
* @param callback Called with the resulting string.
|
||||
* @param encoding Optional. If no encoding is specified utf8 is used
|
||||
*/
|
||||
readAsTextAsync(fileName: string, callback: (data: string) => any, encoding?: string): void;
|
||||
/**
|
||||
* Asynchronous readAsText
|
||||
* @param entry ZipEntry object
|
||||
* @param callback Called with the resulting string.
|
||||
* @param encoding Optional. If no encoding is specified utf8 is used
|
||||
*/
|
||||
readAsTextAsync(fileName: IZipEntry, callback: (data: string) => any, encoding?: string): void;
|
||||
/**
|
||||
* Remove the entry from the file or the entry and all its nested directories
|
||||
* and files if the given entry is a directory
|
||||
* @param entry String with the full path of the entry
|
||||
*/
|
||||
deleteFile(entry: string): void;
|
||||
/**
|
||||
* Remove the entry from the file or the entry and all its nested directories
|
||||
* and files if the given entry is a directory
|
||||
* @param entry A ZipEntry object.
|
||||
*/
|
||||
deleteFile(entry: IZipEntry): void;
|
||||
/**
|
||||
* Adds a comment to the zip. The zip must be rewritten after
|
||||
* adding the comment.
|
||||
* @param comment Content of the comment.
|
||||
*/
|
||||
addZipComment(comment: string): void;
|
||||
/**
|
||||
* Returns the zip comment
|
||||
* @return The zip comment.
|
||||
*/
|
||||
getZipComment(): string;
|
||||
/**
|
||||
* Adds a comment to a specified zipEntry. The zip must be rewritten after
|
||||
* adding the comment.
|
||||
* The comment cannot exceed 65535 characters in length.
|
||||
* @param entry String with the full path of the entry
|
||||
* @param comment The comment to add to the entry.
|
||||
*/
|
||||
addZipEntryComment(entry: string, comment: string): void;
|
||||
/**
|
||||
* Adds a comment to a specified zipEntry. The zip must be rewritten after
|
||||
* adding the comment.
|
||||
* The comment cannot exceed 65535 characters in length.
|
||||
* @param entry ZipEntry object.
|
||||
* @param comment The comment to add to the entry.
|
||||
*/
|
||||
addZipEntryComment(entry: IZipEntry, comment: string): void;
|
||||
/**
|
||||
* Returns the comment of the specified entry.
|
||||
* @param entry String with the full path of the entry.
|
||||
* @return String The comment of the specified entry.
|
||||
*/
|
||||
getZipEntryComment(entry: string): string;
|
||||
/**
|
||||
* Returns the comment of the specified entry
|
||||
* @param entry ZipEntry object.
|
||||
* @return String The comment of the specified entry.
|
||||
*/
|
||||
getZipEntryComment(entry: IZipEntry): string;
|
||||
/**
|
||||
* Updates the content of an existing entry inside the archive. The zip
|
||||
* must be rewritten after updating the content
|
||||
* @param entry String with the full path of the entry.
|
||||
* @param content The entry's new contents.
|
||||
*/
|
||||
updateFile(entry: string, content: Buffer): void;
|
||||
/**
|
||||
* Updates the content of an existing entry inside the archive. The zip
|
||||
* must be rewritten after updating the content
|
||||
* @param entry ZipEntry object.
|
||||
* @param content The entry's new contents.
|
||||
*/
|
||||
updateFile(entry: IZipEntry, content: Buffer): void;
|
||||
/**
|
||||
* Adds a file from the disk to the archive.
|
||||
* @param localPath Path to a file on disk.
|
||||
* @param zipPath Path to a directory in the archive. Defaults to the empty
|
||||
* string.
|
||||
*/
|
||||
addLocalFile(localPath: string, zipPath?: string): void;
|
||||
/**
|
||||
* Adds a local directory and all its nested files and directories to the
|
||||
* archive.
|
||||
* @param localPath Path to a folder on disk.
|
||||
* @param zipPath Path to a folder in the archive. Defaults to an empty
|
||||
* string.
|
||||
*/
|
||||
addLocalFolder(localPath: string, zipPath?: string): void;
|
||||
/**
|
||||
* Allows you to create a entry (file or directory) in the zip file.
|
||||
* If you want to create a directory the entryName must end in / and a null
|
||||
* buffer should be provided.
|
||||
* @param entryName Entry path
|
||||
* @param content Content to add to the entry; must be a 0-length buffer
|
||||
* for a directory.
|
||||
* @param comment Comment to add to the entry.
|
||||
* @param attr Attribute to add to the entry.
|
||||
*/
|
||||
addFile(entryName: string, data: Buffer, comment?: string, attr?: number): void;
|
||||
/**
|
||||
* Returns an array of ZipEntry objects representing the files and folders
|
||||
* inside the archive
|
||||
*/
|
||||
getEntries(): IZipEntry[];
|
||||
/**
|
||||
* Returns a ZipEntry object representing the file or folder specified by
|
||||
* ``name``.
|
||||
* @param name Name of the file or folder to retrieve.
|
||||
* @return ZipEntry The entry corresponding to the name.
|
||||
*/
|
||||
getEntry(name: string): IZipEntry;
|
||||
/**
|
||||
* Extracts the given entry to the given targetPath.
|
||||
* If the entry is a directory inside the archive, the entire directory and
|
||||
* its subdirectories will be extracted.
|
||||
* @param entry String with the full path of the entry
|
||||
* @param targetPath Target folder where to write the file
|
||||
* @param maintainEntryPath If maintainEntryPath is true and the entry is
|
||||
* inside a folder, the entry folder will be created in targetPath as
|
||||
* well. Default is TRUE
|
||||
* @param overwrite If the file already exists at the target path, the file
|
||||
* will be overwriten if this is true. Default is FALSE
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
extractEntryTo(entryPath: string, targetPath: string, maintainEntryPath?: boolean, overwrite?: boolean): boolean;
|
||||
/**
|
||||
* Extracts the given entry to the given targetPath.
|
||||
* If the entry is a directory inside the archive, the entire directory and
|
||||
* its subdirectories will be extracted.
|
||||
* @param entry ZipEntry object
|
||||
* @param targetPath Target folder where to write the file
|
||||
* @param maintainEntryPath If maintainEntryPath is true and the entry is
|
||||
* inside a folder, the entry folder will be created in targetPath as
|
||||
* well. Default is TRUE
|
||||
* @param overwrite If the file already exists at the target path, the file
|
||||
* will be overwriten if this is true. Default is FALSE
|
||||
* @return Boolean
|
||||
*/
|
||||
extractEntryTo(entryPath: IZipEntry, targetPath: string, maintainEntryPath?: boolean, overwrite?: boolean): boolean;
|
||||
/**
|
||||
* Extracts the entire archive to the given location
|
||||
* @param targetPath Target location
|
||||
* @param overwrite If the file already exists at the target path, the file
|
||||
* will be overwriten if this is true. Default is FALSE
|
||||
*/
|
||||
extractAllTo(targetPath: string, overwrite?: boolean): void;
|
||||
/**
|
||||
* Writes the newly created zip file to disk at the specified location or
|
||||
* if a zip was opened and no ``targetFileName`` is provided, it will
|
||||
* overwrite the opened zip
|
||||
* @param targetFileName
|
||||
*/
|
||||
writeZip(targetPath?: string): void;
|
||||
/**
|
||||
* Returns the content of the entire zip file as a Buffer object
|
||||
* @return Buffer
|
||||
*/
|
||||
toBuffer(): Buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* The ZipEntry is more than a structure representing the entry inside the
|
||||
* zip file. Beside the normal attributes and headers a entry can have, the
|
||||
* class contains a reference to the part of the file where the compressed
|
||||
* data resides and decompresses it when requested. It also compresses the
|
||||
* data and creates the headers required to write in the zip file.
|
||||
*/
|
||||
interface IZipEntry {
|
||||
/**
|
||||
* Represents the full name and path of the file
|
||||
*/
|
||||
entryName: string;
|
||||
rawEntryName: Buffer;
|
||||
/**
|
||||
* Extra data associated with this entry.
|
||||
*/
|
||||
extra: Buffer;
|
||||
/**
|
||||
* Entry comment.
|
||||
*/
|
||||
comment: string;
|
||||
name: string;
|
||||
/**
|
||||
* Read-Only property that indicates the type of the entry.
|
||||
*/
|
||||
isDirectory: boolean;
|
||||
/**
|
||||
* Get the header associated with this ZipEntry.
|
||||
*/
|
||||
header: Buffer;
|
||||
/**
|
||||
* Retrieve the compressed data for this entry. Note that this may trigger
|
||||
* compression if any properties were modified.
|
||||
*/
|
||||
getCompressedData(): Buffer;
|
||||
/**
|
||||
* Asynchronously retrieve the compressed data for this entry. Note that
|
||||
* this may trigger compression if any properties were modified.
|
||||
*/
|
||||
getCompressedDataAsync(callback: (data: Buffer) => void): void;
|
||||
/**
|
||||
* Set the (uncompressed) data to be associated with this entry.
|
||||
*/
|
||||
setData(value: string): void;
|
||||
/**
|
||||
* Set the (uncompressed) data to be associated with this entry.
|
||||
*/
|
||||
setData(value: Buffer): void;
|
||||
/**
|
||||
* Get the decompressed data associated with this entry.
|
||||
*/
|
||||
getData(): Buffer;
|
||||
/**
|
||||
* Asynchronously get the decompressed data associated with this entry.
|
||||
*/
|
||||
getDataAsync(callback: (data: Buffer) => void): void;
|
||||
/**
|
||||
* Returns the CEN Entry Header to be written to the output zip file, plus
|
||||
* the extra data and the entry comment.
|
||||
*/
|
||||
packHeader(): Buffer;
|
||||
/**
|
||||
* Returns a nicely formatted string with the most important properties of
|
||||
* the ZipEntry.
|
||||
*/
|
||||
toString(): string;
|
||||
}
|
||||
}
|
||||
|
||||
declare module "adm-zip" {
|
||||
import zipFile = AdmZip.ZipFile;
|
||||
export = zipFile;
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/// <reference path="alertify.d.ts" />
|
||||
|
||||
alertify.init();
|
||||
|
||||
alertify.alert("This is an alert");
|
||||
alertify.alert("This is an alert with a callback", () => {
|
||||
alertify.success("Alert finished");
|
||||
}, "myCustomClass");
|
||||
|
||||
|
||||
alertify.confirm("This is a confirm request");
|
||||
alertify.confirm("This is a confirm request with a callback", () => {
|
||||
alertify.success("Confirm finished");
|
||||
}, "myCustomClass");
|
||||
|
||||
var custom = alertify.extend("custom");
|
||||
|
||||
alertify.log("log message 1");
|
||||
alertify.log("log message 2", "success", 3000);
|
||||
|
||||
alertify.prompt("prompt message 1");
|
||||
alertify.prompt("prompt message 2", () => { console.log("callback"); }, "ok", "myClass");
|
||||
|
||||
alertify.set({ delay: 1000 });
|
||||
alertify.set({ labels: { ok: "OK", cancel: "Cancel" }});
|
||||
alertify.set({ buttonFocus: "ok" });
|
||||
alertify.set({ buttonReverse: true });
|
||||
|
||||
alertify.success("This is a success message");
|
||||
alertify.error("This is an error message");
|
||||
|
||||
alertify.debug();
|
||||
Vendored
+124
@@ -0,0 +1,124 @@
|
||||
// Type definitions for alertify 0.3.11
|
||||
// Project: http://fabien-d.github.io/alertify.js/
|
||||
// Definitions by: John Jeffery <http://github.com/jjeffery>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
declare var alertify: alertify.IAlertifyStatic;
|
||||
|
||||
declare module alertify {
|
||||
interface IAlertifyStatic {
|
||||
/**
|
||||
* Create an alert dialog box
|
||||
* @param message The message passed from the callee
|
||||
* @param fn Callback function
|
||||
* @param cssClass Class(es) to append to dialog box
|
||||
* @return alertify (ie this)
|
||||
* @since 0.0.1
|
||||
*/
|
||||
alert(message: string, fn?: Function, cssClass?: string): IAlertifyStatic;
|
||||
|
||||
/**
|
||||
* Create a confirm dialog box
|
||||
* @param message The message passed from the callee
|
||||
* @param fn Callback function
|
||||
* @param cssClass Class(es) to append to dialog box
|
||||
* @return alertify (ie this)
|
||||
* @since 0.0.1
|
||||
*/
|
||||
confirm(message: string, fn?: Function, cssClass?: string): IAlertifyStatic;
|
||||
|
||||
/**
|
||||
* Extend the log method to create custom methods
|
||||
* @param type Custom method name
|
||||
* @return function for logging
|
||||
* @since 0.0.1
|
||||
*/
|
||||
extend(type: string): (message: string, wait?: number) => IAlertifyStatic;
|
||||
|
||||
/**
|
||||
* Initialize Alertify and create the 2 main elements.
|
||||
* Initialization will happen automatically on the first
|
||||
* use of alert, confirm, prompt or log.
|
||||
* @since 0.0.1
|
||||
*/
|
||||
init(): void;
|
||||
|
||||
/**
|
||||
* Show a new log message box
|
||||
* @param message The message passed from the callee
|
||||
* @param type Optional type of log message
|
||||
* @param wait Optional time (in ms) to wait before auto-hiding
|
||||
* @return alertify (ie this)
|
||||
* @since 0.0.1
|
||||
*/
|
||||
log(message: string, type?: string, wait?: number): IAlertifyStatic;
|
||||
|
||||
/**
|
||||
* Create a prompt dialog box
|
||||
* @param message The message passed from the callee
|
||||
* @param fn Callback function
|
||||
* @param placeholder Default value for prompt input
|
||||
* @param cssClass Class(es) to append to dialog
|
||||
* @return alertify (ie this)
|
||||
* @since 0.0.1
|
||||
*/
|
||||
prompt(message: string, fn?: Function, placeholder?: string, cssClass?: string): IAlertifyStatic;
|
||||
|
||||
/**
|
||||
* Shorthand for log messages
|
||||
* @param message The message passed from the callee
|
||||
* @return alertify (ie this)
|
||||
* @since 0.0.1
|
||||
*/
|
||||
success(message: string): IAlertifyStatic;
|
||||
|
||||
/**
|
||||
* Shorthand for log messages
|
||||
* @param message The message passed from the callee
|
||||
* @return alertify (ie this)
|
||||
* @since 0.0.1
|
||||
*/
|
||||
error(message: string): IAlertifyStatic;
|
||||
|
||||
/**
|
||||
* Used to set alertify properties
|
||||
* @param Properties
|
||||
* @since 0.2.11
|
||||
*/
|
||||
set(args: IProperties): void;
|
||||
|
||||
/**
|
||||
* The labels used for dialog buttons
|
||||
*/
|
||||
labels: ILabels;
|
||||
|
||||
/**
|
||||
* Attaches alertify.error to window.onerror method
|
||||
* @since 0.3.8
|
||||
*/
|
||||
debug(): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Properties for alertify.set function
|
||||
*/
|
||||
interface IProperties {
|
||||
/** Default value for milliseconds display of log messages */
|
||||
delay?: number;
|
||||
|
||||
/** Default values for display of labels */
|
||||
labels?: ILabels;
|
||||
|
||||
/** Default button for focus */
|
||||
buttonFocus?: string;
|
||||
|
||||
/** Should buttons be displayed in reverse order */
|
||||
buttonReverse?: boolean;
|
||||
}
|
||||
|
||||
/** Labels for altertify.set function */
|
||||
interface ILabels {
|
||||
ok?: string;
|
||||
cancel?: string;
|
||||
}
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -176,8 +176,7 @@ amplify.request("twitter-mentions", { user: "amplifyjs" });
|
||||
|
||||
//Example:
|
||||
|
||||
amplify.request.decoders.appEnvelope =
|
||||
function (data, status, xhr, success, error) {
|
||||
var appEnvelopeDecoder: amplifyDecoder = function (data, status, xhr, success, error) {
|
||||
if (data.status === "success") {
|
||||
success(data.data);
|
||||
} else if (data.status === "fail" || data.status === "error") {
|
||||
@@ -187,6 +186,17 @@ function (data, status, xhr, success, error) {
|
||||
}
|
||||
};
|
||||
|
||||
//a new decoder can be added to the amplifyDecoders interface
|
||||
interface amplifyDecoders {
|
||||
appEnvelope: amplifyDecoder;
|
||||
}
|
||||
|
||||
amplify.request.decoders.appEnvelope = appEnvelopeDecoder;
|
||||
|
||||
//but you can also just add it via an index
|
||||
amplify.request.decoders['appEnvelopeStr'] = appEnvelopeDecoder;
|
||||
|
||||
|
||||
amplify.request.define("decoderExample", "ajax", {
|
||||
url: "/myAjaxUrl",
|
||||
type: "POST",
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
Vendored
+28
-6
@@ -3,11 +3,33 @@
|
||||
// Definitions by: Jonas Eriksson <https://github.com/joeriks/>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="../jquery/jquery.d.ts" />
|
||||
|
||||
interface amplifyRequestSettings {
|
||||
resourceId: string;
|
||||
data?: any;
|
||||
success?: Function;
|
||||
error?: Function;
|
||||
success?: (...args: any[]) => void;
|
||||
error?: (...args: any[]) => void;
|
||||
}
|
||||
|
||||
interface amplifyDecoder {
|
||||
(
|
||||
data?: any,
|
||||
status?: string,
|
||||
xhr?: JQueryXHR,
|
||||
success?: (...args: any[]) => void,
|
||||
error?: (...args: any[]) => void
|
||||
): void
|
||||
}
|
||||
|
||||
interface amplifyDecoders {
|
||||
[decoderName: string]: amplifyDecoder;
|
||||
jsSend: amplifyDecoder;
|
||||
}
|
||||
|
||||
interface amplifyAjaxSettings extends JQueryAjaxSettings {
|
||||
cache?: any;
|
||||
decoder?: any /* string or amplifyDecoder */;
|
||||
}
|
||||
|
||||
interface amplifyRequest {
|
||||
@@ -39,7 +61,7 @@ interface amplifyRequest {
|
||||
* cache: See the cache section for more details.
|
||||
* decoder: See the decoder section for more details.
|
||||
*/
|
||||
define(resourceId: string, requestType: string, settings?: any): void;
|
||||
define(resourceId: string, requestType: string, settings?: amplifyAjaxSettings): void;
|
||||
|
||||
/***
|
||||
* Define a custom request.
|
||||
@@ -50,9 +72,9 @@ interface amplifyRequest {
|
||||
* success: Callback to invoke on success.
|
||||
* error: Callback to invoke on error.
|
||||
*/
|
||||
define(resourceId: string, resource: Function): void;
|
||||
|
||||
decoders: any;
|
||||
define(resourceId: string, resource: (settings: amplifyRequestSettings) => void): void;
|
||||
|
||||
decoders: amplifyDecoders;
|
||||
cache: any;
|
||||
}
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
""
|
||||
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
/// <reference path="./amqp-rpc.d.ts" />
|
||||
import amqp_rpc = require('amqp-rpc');
|
||||
var rpc = amqp_rpc.factory();
|
||||
|
||||
interface Name {
|
||||
name?: string;
|
||||
}
|
||||
|
||||
rpc.on<number>('inc', function (param, cb) {
|
||||
var prevVal = param;
|
||||
var nextVal = param + 2;
|
||||
cb(++param, prevVal, nextVal);
|
||||
});
|
||||
|
||||
rpc.on<Name>('say.*', function (param, cb, inf) {
|
||||
var arr = inf.cmd.split('.');
|
||||
var name = (param && param.name) ? param.name : 'world';
|
||||
cb(arr[1] + ' ' + name + '!');
|
||||
});
|
||||
|
||||
rpc.on('withoutCB', function (param, cb, inf) {
|
||||
if (cb) {
|
||||
cb('please run function without cb parameter')
|
||||
}
|
||||
else {
|
||||
console.log('this is function withoutCB');
|
||||
}
|
||||
});
|
||||
|
||||
rpc.call<number>('inc', 5, function (param1, param2, param3) {
|
||||
console.log(param1, param2, param3);
|
||||
});
|
||||
|
||||
rpc.call<Name>('say.Hello', { name: 'John' }, function (msg) {
|
||||
console.log('results of say.Hello:', msg); //output: Hello John!
|
||||
});
|
||||
|
||||
rpc.call<any>('withoutCB', {}, function (msg) {
|
||||
console.log('withoutCB results:', msg); //output: please run function without cb parameter
|
||||
});
|
||||
|
||||
rpc.call<any>('withoutCB', {}); //output message on server side console
|
||||
|
||||
import os = require('os');
|
||||
interface State {
|
||||
type: string;
|
||||
}
|
||||
|
||||
var counter = 0;
|
||||
rpc.onBroadcast<State>('getWorkerStat', function (params, cb) {
|
||||
if (params && params.type == 'fullStat') {
|
||||
cb(null, {
|
||||
pid: process.pid,
|
||||
hostname: os.hostname(),
|
||||
uptime: process.uptime(),
|
||||
counter: counter++
|
||||
});
|
||||
}
|
||||
else {
|
||||
cb(null, { counter: counter++ })
|
||||
}
|
||||
});
|
||||
|
||||
var all_stats: any = {};
|
||||
rpc.callBroadcast<State>(
|
||||
'getWorkerStat',
|
||||
{ type: 'fullStat' }, //request parameters
|
||||
{ //call options
|
||||
ttl: 1000, //wait response time (1 seconds), after run onComplete
|
||||
onResponse: function (err: any, stat: any) { //callback on each worker response
|
||||
all_stats[stat.hostname + ':' + stat.pid] = stat;
|
||||
},
|
||||
onComplete: function () { //callback on ttl expired
|
||||
console.log('----------------------- WORKER STATISTICS ----------------------------------------');
|
||||
for (var worker in all_stats) {
|
||||
var s: any = all_stats[worker];
|
||||
console.log(worker, '\tuptime=', s.uptime.toFixed(2) + ' seconds', '\tcounter=', s.counter);
|
||||
}
|
||||
}
|
||||
});
|
||||
Vendored
+72
@@ -0,0 +1,72 @@
|
||||
// Type definitions for amqp-rpc v0.0.8
|
||||
// Project: https://github.com/demchenkoe/node-amqp-rpc/
|
||||
// Definitions by: Wonshik Kim <https://github.com/wokim/>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="../node/node.d.ts" />
|
||||
|
||||
declare module "amqp-rpc" {
|
||||
|
||||
export interface Options {
|
||||
connection?: any;
|
||||
url?: string;
|
||||
exchangeInstance?: any;
|
||||
exchange?: string;
|
||||
exchange_options?: {
|
||||
exclusive?: boolean;
|
||||
autoDelete?: boolean;
|
||||
};
|
||||
ipml_options?: {
|
||||
defaultExchangeName?: string;
|
||||
}
|
||||
conn_options?: any;
|
||||
}
|
||||
|
||||
export interface CallOptions {
|
||||
correlationId?: string;
|
||||
autoDeleteCallback?: any;
|
||||
}
|
||||
|
||||
export interface HandlerOptions {
|
||||
queueName?: string;
|
||||
durable?: boolean;
|
||||
exclusive?: boolean;
|
||||
autoDelete?: boolean;
|
||||
}
|
||||
|
||||
export interface BroadcastOptions {
|
||||
ttl?: number;
|
||||
onResponse?: any;
|
||||
context?: any;
|
||||
onComplete?: any;
|
||||
}
|
||||
|
||||
export interface CommandInfo {
|
||||
cmd?: string;
|
||||
exchange?: string;
|
||||
contentType?: string;
|
||||
size?: number;
|
||||
}
|
||||
|
||||
export interface Callback {
|
||||
(...args: any[]): void;
|
||||
}
|
||||
|
||||
export interface CallbackWithError {
|
||||
(err: any, ...args: any[]): void;
|
||||
}
|
||||
|
||||
export function factory(opt?: Options): amqpRPC;
|
||||
|
||||
export class amqpRPC {
|
||||
constructor(opt?: Options);
|
||||
generateQueueName(type: string): string;
|
||||
disconnect(): void;
|
||||
call<T>(cmd: string, params: T, cb?: Callback, context?: any, options?: CallOptions): string;
|
||||
on<T>(cmd: string, cb: (param?: T, cb?: Callback, info?: CommandInfo) => void, context?: any, options?: HandlerOptions): boolean;
|
||||
off(cmd: string): boolean;
|
||||
callBroadcast<T>(cmd: string, params: T, options?: BroadcastOptions): void;
|
||||
onBroadcast<T>(cmd: string, cb?: (params?: T, cb?: CallbackWithError) => void, context?: any, options?: any): boolean;
|
||||
offBroadcast(cmd: string): boolean;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
/// <reference path="angular-agility.d.ts" />
|
||||
/// <reference path='../angularjs/angular.d.ts' />
|
||||
|
||||
var validIconStrategy:aa.IValidIconStrategy = <aa.IValidIconStrategy>{};
|
||||
validIconStrategy.validIcon = "";
|
||||
validIconStrategy.invalidIcon = "";
|
||||
validIconStrategy.getContainer(<ng.IAugmentedJQueryStatic>{});
|
||||
|
||||
var provider:aa.IFormExtensionsProvider = <aa.IFormExtensionsProvider>{};
|
||||
provider.defaultLabelStrategy = "";
|
||||
provider.defaultFieldGroupStrategy = "";
|
||||
provider.defaultValMsgPlacementStrategy = "";
|
||||
provider.validIconStrategy = validIconStrategy;
|
||||
provider.defaultSpinnerClickStrategy = "";
|
||||
provider.defaultNotifyTarget = "";
|
||||
provider.defaultOnNavigateAwayStrategy = "";
|
||||
provider.validationMessages['testName'] = 'testMessages';
|
||||
provider.valMsgForTemplate = "";
|
||||
provider.confirmResetStrategy = ():boolean=>{ return false; };
|
||||
provider.globalSettings['testSetting'] = 'test';
|
||||
provider.labelStrategies['testLabelStratgey'] = (element:ng.IAugmentedJQueryStatic, labelText:string, isRequired:boolean):void=>{};
|
||||
provider.fieldGroupStrategies['testFieldGroupStratgey'] = (element:ng.IAugmentedJQueryStatic):void=>{};
|
||||
provider.valMsgPlacementStrategies['testValMsgPlacementStrategy'] = (formFieldElement:ng.IAugmentedJQueryStatic, formName:string, formFieldName:string):void=>{};
|
||||
provider.spinnerClickStrategies['testSpinnerClickStratgey'] = (element:ng.IAugmentedJQueryStatic):void=>{};
|
||||
provider.onNavigateAwayStrategies['testOnNavigateAwayStrategy'] = (rootFormScope:ng.IScope, rootForm:ng.IAugmentedJQueryStatic, $injector:ng.auto.IInjectorService)=>{};
|
||||
|
||||
var defaults:aa.INotifyDefaults = <aa.INotifyDefaults>{};
|
||||
defaults.success = (message:string, options:any, notifier:any):any=>{};
|
||||
defaults.info = (message:string, options:any, notifier:any):any=>{};
|
||||
defaults.warning = (message:string, options:any, notifier:any):any=>{};
|
||||
defaults.danger = (message:string, options:any, notifier:any):any=>{};
|
||||
defaults.error = (message:string, options:any, notifier:any):any=>{};
|
||||
|
||||
var configWithoutTemplate:aa.INotifyConfig = {
|
||||
name: "",
|
||||
options: <aa.INotifyOptions> {},
|
||||
namedDefaults: <aa.INotifyDefaults> {}
|
||||
}
|
||||
|
||||
var configWithTemplate:aa.INotifyConfig = {
|
||||
name: "",
|
||||
template: "",
|
||||
templateName: "",
|
||||
options: <aa.INotifyOptions> {},
|
||||
namedDefaults: <aa.INotifyDefaults> {}
|
||||
}
|
||||
|
||||
var notifyOptionsWithoutCssClasses:aa.INotifyOptions = {
|
||||
messageType: "",
|
||||
allowHtml: true,
|
||||
message: ""
|
||||
}
|
||||
|
||||
var notifyOptionsWithCssClasses:aa.INotifyOptions = {
|
||||
cssClasses: "",
|
||||
messageType: "",
|
||||
allowHtml: true,
|
||||
message: ""
|
||||
}
|
||||
|
||||
var notifyConfigProvider:aa.INotifyConfigProvider = <aa.INotifyConfigProvider> {};
|
||||
notifyConfigProvider.notifyConfigs = {};
|
||||
notifyConfigProvider.defaultTargetContainerName = "";
|
||||
notifyConfigProvider.defaultNotifyConfig = "";
|
||||
notifyConfigProvider.addOrUpdateNotifyConfig("", configWithTemplate);
|
||||
notifyConfigProvider.optionsTransformer(notifyOptionsWithCssClasses, <ng.ISCEService>{});
|
||||
|
||||
var fullExternalConfig:aa.IExternalFormValidationConfig = {
|
||||
validations: "",
|
||||
ignore: "",
|
||||
globals: "",
|
||||
resolve: "",
|
||||
resolveFn: (modelValue:string):string=>{ return "" }
|
||||
}
|
||||
|
||||
var minimalExternalConfig:aa.IExternalFormValidationConfig = {
|
||||
validations: ""
|
||||
}
|
||||
Vendored
+106
@@ -0,0 +1,106 @@
|
||||
// Type definitions for AngularAgility
|
||||
// Project: https://github.com/AngularAgility/AngularAgility
|
||||
// Definitions by: Roland Zwaga <https://github.com/rolandzwaga>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path='../angularjs/angular.d.ts' />
|
||||
|
||||
declare module aa {
|
||||
|
||||
export interface ILabelStrategies {
|
||||
[strategyName: string]: (element:ng.IAugmentedJQueryStatic, labelText:string, isRequired:boolean)=>void;
|
||||
}
|
||||
|
||||
export interface IFieldGroupStrategies {
|
||||
[strategyName: string]: (element:ng.IAugmentedJQueryStatic)=>void;
|
||||
}
|
||||
|
||||
export interface IValMsgPlacementStrategies {
|
||||
[strategyName: string]: (formFieldElement:ng.IAugmentedJQueryStatic, formName:string, formFieldName:string)=>void;
|
||||
}
|
||||
|
||||
export interface IValidIconStrategy {
|
||||
validIcon:string;
|
||||
invalidIcon:string;
|
||||
getContainer(element:ng.IAugmentedJQueryStatic):void;
|
||||
}
|
||||
|
||||
export interface ISpinnerClickStrategies {
|
||||
[strategyName: string]: (element:ng.IAugmentedJQueryStatic)=>void;
|
||||
}
|
||||
|
||||
export interface IOnNavigateAwayStrategies {
|
||||
[strategyName: string]: (rootFormScope:ng.IScope, rootForm:ng.IAugmentedJQueryStatic, $injector:ng.auto.IInjectorService)=>void;
|
||||
}
|
||||
|
||||
export interface IValidationMessages {
|
||||
[validationKey: string]: string;
|
||||
}
|
||||
|
||||
export interface IGlobalSettings {
|
||||
[settingName: string]: any;
|
||||
}
|
||||
|
||||
export interface IFormExtensionsProvider extends ng.IServiceProvider {
|
||||
defaultLabelStrategy:string;
|
||||
defaultFieldGroupStrategy:string;
|
||||
defaultValMsgPlacementStrategy:string;
|
||||
validIconStrategy:IValidIconStrategy;
|
||||
defaultSpinnerClickStrategy:string;
|
||||
defaultNotifyTarget:string;
|
||||
defaultOnNavigateAwayStrategy:string;
|
||||
validationMessages:IValidationMessages;
|
||||
valMsgForTemplate:string;
|
||||
confirmResetStrategy:()=>boolean;
|
||||
globalSettings:IGlobalSettings;
|
||||
|
||||
labelStrategies:ILabelStrategies;
|
||||
fieldGroupStrategies:IFieldGroupStrategies;
|
||||
valMsgPlacementStrategies:IValMsgPlacementStrategies;
|
||||
spinnerClickStrategies:ISpinnerClickStrategies;
|
||||
onNavigateAwayStrategies:IOnNavigateAwayStrategies;
|
||||
}
|
||||
|
||||
export interface INotifyPredicate {
|
||||
(message:string, options:any, notifier:any):any;
|
||||
}
|
||||
|
||||
export interface INotifyDefaults {
|
||||
success: INotifyPredicate;
|
||||
info: INotifyPredicate;
|
||||
warning: INotifyPredicate;
|
||||
danger: INotifyPredicate;
|
||||
error: INotifyPredicate;
|
||||
}
|
||||
|
||||
export interface INotifyConfig {
|
||||
name:string;
|
||||
template?:string;
|
||||
templateName?:string;
|
||||
options:INotifyOptions;
|
||||
namedDefaults:INotifyDefaults;
|
||||
}
|
||||
|
||||
export interface INotifyOptions {
|
||||
cssClasses?:string;
|
||||
messageType:string;
|
||||
allowHtml:boolean;
|
||||
message:string;
|
||||
}
|
||||
|
||||
export interface INotifyConfigProvider extends ng.IServiceProvider {
|
||||
notifyConfigs:any;
|
||||
defaultTargetContainerName:string;
|
||||
defaultNotifyConfig:string;
|
||||
addOrUpdateNotifyConfig(name:string, opts:INotifyConfig):void;
|
||||
optionsTransformer(options:INotifyOptions, $sce:ng.ISCEService):void;
|
||||
}
|
||||
|
||||
export interface IExternalFormValidationConfig {
|
||||
validations:any;
|
||||
ignore?:any;
|
||||
globals?:any;
|
||||
resolve?:any;
|
||||
resolveFn?:(modelValue:string)=>string;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
///<reference path='angular-bootstrap-lightbox.d.ts'/>
|
||||
|
||||
var imageList:angular.bootstrap.lightbox.ILightboxImageInfo[] = [];
|
||||
imageList.push({
|
||||
url: 'url1',
|
||||
width: 100,
|
||||
height: 100
|
||||
});
|
||||
imageList.push({
|
||||
url: 'url2',
|
||||
width: 100,
|
||||
height: 100,
|
||||
thumbUrl: 'thumbUrl',
|
||||
caption: 'caption'
|
||||
});
|
||||
|
||||
var lightBox:angular.bootstrap.lightbox.ILightbox = <any> {};
|
||||
lightBox.openModal(imageList, 0);
|
||||
|
||||
var provider:angular.bootstrap.lightbox.ILightBoxProvider = <any> {};
|
||||
provider.templateUrl = 'templateUrl';
|
||||
provider.calculateImageDimensionLimits = (dimensions:angular.bootstrap.lightbox.IImageDimensionParameter):angular.bootstrap.lightbox.IImageDimensionLimits=> {
|
||||
return {
|
||||
minWidth: 100,
|
||||
minHeight: 100,
|
||||
maxWidth: dimensions.windowWidth - 102,
|
||||
maxHeight: dimensions.windowHeight - 136
|
||||
};
|
||||
};
|
||||
provider.calculateModalDimensions = (dimensions:angular.bootstrap.lightbox.IModalDimensionsParameter):angular.bootstrap.lightbox.IModalDimensions=> {
|
||||
return {
|
||||
width: Math.max(500, dimensions.imageDisplayWidth + 42),
|
||||
height: Math.max(500, dimensions.imageDisplayHeight + 76)
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,51 @@
|
||||
// Type definitions for angular-bootstrap-lightbox
|
||||
// Project: https://github.com/compact/angular-bootstrap-lightbox
|
||||
// Definitions by: Roland Zwaga <https://github.com/rolandzwaga>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
declare module angular.bootstrap.lightbox {
|
||||
|
||||
export interface ILightboxImageInfo {
|
||||
url: string;
|
||||
width: number;
|
||||
height: number;
|
||||
thumbUrl?: string;
|
||||
caption?: string;
|
||||
}
|
||||
|
||||
export interface IImageDimensionLimits {
|
||||
minWidth?: number;
|
||||
minHeight?: number;
|
||||
maxWidth?: number;
|
||||
maxHeight?: number;
|
||||
}
|
||||
|
||||
export interface IImageDimensionParameter {
|
||||
windowWidth:number;
|
||||
windowHeight:number;
|
||||
imageWidth:number;
|
||||
imageHeight:number;
|
||||
}
|
||||
|
||||
export interface IModalDimensionsParameter {
|
||||
windowWidth:number;
|
||||
windowHeight:number;
|
||||
imageDisplayWidth:number;
|
||||
imageDisplayHeight:number;
|
||||
}
|
||||
|
||||
export interface IModalDimensions {
|
||||
width:number;
|
||||
height:number;
|
||||
}
|
||||
|
||||
export interface ILightbox {
|
||||
openModal(images:ILightboxImageInfo[], index:number):void;
|
||||
}
|
||||
|
||||
export interface ILightBoxProvider {
|
||||
templateUrl:string;
|
||||
calculateImageDimensionLimits:(dimensions:IImageDimensionParameter)=>IImageDimensionLimits;
|
||||
calculateModalDimensions:(dimensions:IModalDimensionsParameter)=>IModalDimensions;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
/// <reference path="angular-file-upload.d.ts" />
|
||||
|
||||
module controllers {
|
||||
|
||||
"use strict";
|
||||
|
||||
var controllerId = "upload";
|
||||
|
||||
class Upload {
|
||||
|
||||
static $inject = ["$upload"];
|
||||
constructor(
|
||||
private $upload: ng.angularFileUpload.IUploadService
|
||||
) {
|
||||
}
|
||||
|
||||
onFileSelect($files: File[]) {
|
||||
//$files: an array of files selected, each file has name, size, and type.
|
||||
var uploads: ng.IPromise<any>[] = [];
|
||||
for (var i = 0; i < $files.length; i++) {
|
||||
var file = $files[i];
|
||||
uploads.push(this.$upload.upload<any>({
|
||||
url: "/api/upload",
|
||||
method: "POST",
|
||||
data: {
|
||||
extraData: {
|
||||
fileName: file.name, test: "anything"
|
||||
}
|
||||
},
|
||||
file: file
|
||||
})
|
||||
.progress((evt: any) => {
|
||||
console.log('progress');
|
||||
})
|
||||
.then(success => {
|
||||
// file is uploaded successfully
|
||||
console.log(success.data);
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
angular.module("app").controller(controllerId, Upload);
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// Type definitions for Angular File Upload 1.6.7
|
||||
// Project: https://github.com/danialfarid/angular-file-upload
|
||||
// Definitions by: John Reilly <https://github.com/johnnyreilly>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="../angularjs/angular.d.ts" />
|
||||
|
||||
declare module angular.angularFileUpload {
|
||||
|
||||
interface IUploadService {
|
||||
|
||||
http<T>(config: ng.IRequestConfig): IUploadPromise<T>;
|
||||
upload<T>(config: IFileUploadConfig): IUploadPromise<T>;
|
||||
}
|
||||
|
||||
interface IUploadPromise<T> extends IHttpPromise<T> {
|
||||
|
||||
progress(callback: IHttpPromiseCallback<T>): IUploadPromise<T>;
|
||||
}
|
||||
|
||||
interface IFileUploadConfig extends ng.IRequestConfig {
|
||||
|
||||
file: File;
|
||||
fileName?: string;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
/// <reference path="angular-growl-v2.d.ts" />
|
||||
|
||||
var app = angular.module("ag", ["pascalprecht.translate", "$httpProvider"]);
|
||||
|
||||
app.config((growlProvider:angular.growl.IGrowlProvider, $httpProvider:angular.IHttpProvider) => {
|
||||
var ttl:angular.growl.IGrowlTTLConfig = {
|
||||
success: 5000,
|
||||
error: 4000
|
||||
};
|
||||
|
||||
growlProvider.globalTimeToLive(ttl);
|
||||
growlProvider.globalTimeToLive(5000);
|
||||
growlProvider.globalDisableCloseButton(true);
|
||||
growlProvider.globalDisableIcons(true);
|
||||
growlProvider.globalReversedOrder(false);
|
||||
growlProvider.globalDisableCountDown(true);
|
||||
growlProvider.messageVariableKey("someKey");
|
||||
growlProvider.globalInlineMessages(false);
|
||||
growlProvider.globalPosition("top-center");
|
||||
growlProvider.messagesKey("someKey");
|
||||
growlProvider.messageTextKey("someKey");
|
||||
growlProvider.messageTitleKey("someKey");
|
||||
growlProvider.messageSeverityKey("someKey");
|
||||
growlProvider.onlyUniqueMessages(false);
|
||||
|
||||
$httpProvider.interceptors.push(growlProvider.serverMessagesInterceptor);
|
||||
});
|
||||
|
||||
app.controller("Ctrl", ($scope:angular.IScope, growl:angular.growl.IGrowlService) => {
|
||||
var config:angular.growl.IGrowlMessageConfig = {
|
||||
ttl: 5000,
|
||||
disableCountDown: true,
|
||||
disableCloseButton: true
|
||||
};
|
||||
|
||||
var message = "Some message";
|
||||
|
||||
growl.warning(message);
|
||||
growl.warning(message, config);
|
||||
growl.error(message);
|
||||
growl.error(message, config);
|
||||
growl.info(message);
|
||||
growl.info(message, config);
|
||||
growl.success(message);
|
||||
growl.success(message, config);
|
||||
growl.general(message);
|
||||
growl.general(message, config);
|
||||
growl.general(message, config, "error");
|
||||
growl.onlyUnique();
|
||||
growl.reverseOrder();
|
||||
growl.inlineMessages();
|
||||
growl.position();
|
||||
});
|
||||
+211
@@ -0,0 +1,211 @@
|
||||
// Type definitions for Angular Growl 2 v.0.7.3
|
||||
// Project: http://janstevens.github.io/angular-growl-2
|
||||
// Definitions by: Tadeusz Hucal <https://github.com/mkp05>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="../angularjs/angular.d.ts" />
|
||||
|
||||
declare module angular.growl {
|
||||
|
||||
/**
|
||||
* Global Time-To-Leave configuration.
|
||||
*/
|
||||
interface IGrowlTTLConfig {
|
||||
success?: number;
|
||||
error?: number;
|
||||
warning?: number;
|
||||
info?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom configuration used in single message call.
|
||||
*/
|
||||
interface IGrowlMessageConfig {
|
||||
title?: string;
|
||||
ttl?: number;
|
||||
disableCountDown?: boolean;
|
||||
disableIcons?: boolean;
|
||||
disableCloseButton?: boolean;
|
||||
referenceId?: number;
|
||||
onclose?: Function;
|
||||
onopen?: Function;
|
||||
}
|
||||
|
||||
/**
|
||||
* Growl message with configuration.
|
||||
*/
|
||||
interface IGrowlMessage extends IGrowlMessageConfig {
|
||||
text: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Growl service provider.
|
||||
*/
|
||||
interface IGrowlProvider extends angular.IServiceProvider {
|
||||
/**
|
||||
* Pre-defined server error interceptor.
|
||||
*/
|
||||
serverMessagesInterceptor: (string|Function)[];
|
||||
|
||||
/**
|
||||
* Set default TTL settings.
|
||||
* @param ttl configuration of TTL for different type of message
|
||||
*/
|
||||
globalTimeToLive(ttl: IGrowlTTLConfig): void;
|
||||
/**
|
||||
* Set default TTL settings.
|
||||
* @param ttl ttl in milliseconds
|
||||
*/
|
||||
globalTimeToLive(ttl: number): void;
|
||||
/**
|
||||
* Set default setting for disabling close button.
|
||||
* @param disableCloseButton
|
||||
*/
|
||||
globalDisableCloseButton(disableCloseButton: boolean): void;
|
||||
/**
|
||||
* Set default setting for disabling icons.
|
||||
* @param disableIcons
|
||||
*/
|
||||
globalDisableIcons(disableIcons: boolean): void;
|
||||
/**
|
||||
* Set reversing order of displaying new messages.
|
||||
* @param reverseOrder
|
||||
*/
|
||||
globalReversedOrder(reverseOrder: boolean): void
|
||||
/**
|
||||
* Set default setting for displaying message disappear countdown.
|
||||
* @param disableCountDown
|
||||
*/
|
||||
globalDisableCountDown(disableCountDown: boolean): void;
|
||||
/**
|
||||
* Set default allowance for inline messages.
|
||||
* @param inline
|
||||
*/
|
||||
globalInlineMessages(inline: boolean): void;
|
||||
/**
|
||||
* Set default message position.
|
||||
* @param position
|
||||
*/
|
||||
globalPosition(position: string): void;
|
||||
/**
|
||||
* Enable/disable displaying only unique messages.
|
||||
* @param onlyUniqueMessages
|
||||
*/
|
||||
onlyUniqueMessages(onlyUniqueMessages: boolean): void;
|
||||
|
||||
/**
|
||||
* Set key where messages are stored (for http interceptor).
|
||||
* @param messageVariableKey
|
||||
*/
|
||||
messagesKey(messageKey: string): void;
|
||||
/**
|
||||
* Set key where message text is stored (for http interceptor).
|
||||
* @param messageVariableKey
|
||||
*/
|
||||
messageTextKey(messageTextKey: string): void;
|
||||
/**
|
||||
* Set key where title of message is stored (for http interceptor).
|
||||
* @param messageVariableKey
|
||||
*/
|
||||
messageTitleKey(messageTitleKey: string): void;
|
||||
/**
|
||||
* Set key where severity of message is stored (for http interceptor).
|
||||
* @param messageVariableKey
|
||||
*/
|
||||
messageSeverityKey(messageSeverityKey: string): void;
|
||||
/**
|
||||
* Set key where variables for message are stored (for http interceptor).
|
||||
* @param messageVariableKey
|
||||
*/
|
||||
messageVariableKey(messageVariableKey: string): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Growl service.
|
||||
*/
|
||||
interface IGrowlService {
|
||||
/**
|
||||
* Show warning message.
|
||||
* @param message text to display (or code for angular-translate)
|
||||
*/
|
||||
warning(message: string): IGrowlMessage;
|
||||
/**
|
||||
* Show warning message.
|
||||
* @param message text to display (or code for angular-translate)
|
||||
* @param config additional message configuration
|
||||
*/
|
||||
warning(message: string, config: IGrowlMessageConfig): IGrowlMessage;
|
||||
|
||||
/**
|
||||
* Show error message.
|
||||
* @param message text to display (or code for angular-translate)
|
||||
*/
|
||||
error(message: string): IGrowlMessage;
|
||||
/**
|
||||
* Show error message.
|
||||
* @param message text to display (or code for angular-translate)
|
||||
* @param config additional message configuration
|
||||
*/
|
||||
error(message: string, config: IGrowlMessageConfig): IGrowlMessage;
|
||||
|
||||
/**
|
||||
* Show information message.
|
||||
* @param message text to display (or code for angular-translate)
|
||||
*/
|
||||
info(message: string): IGrowlMessage;
|
||||
/**
|
||||
* Show information message.
|
||||
* @param message text to display (or code for angular-translate)
|
||||
* @param config additional message configuration
|
||||
*/
|
||||
info(message: string, config: IGrowlMessageConfig): IGrowlMessage;
|
||||
|
||||
/**
|
||||
* Show success message.
|
||||
* @param message text to display (or code for angular-translate)
|
||||
* @param config additional message configuration
|
||||
*/
|
||||
success(message: string): IGrowlMessage;
|
||||
/**
|
||||
* Show success message.
|
||||
* @param message text to display (or code for angular-translate)
|
||||
*/
|
||||
success(message: string, config: IGrowlMessageConfig): IGrowlMessage;
|
||||
|
||||
/**
|
||||
* Show message (generic).
|
||||
* @param message text to display (or code for angular-translate)
|
||||
*/
|
||||
general(message: string): IGrowlMessage;
|
||||
/**
|
||||
* Show message (generic).
|
||||
* @param message text to display (or code for angular-translate)
|
||||
* @param config additional message configuration
|
||||
*/
|
||||
general(message: string, config: IGrowlMessageConfig): IGrowlMessage;
|
||||
/**
|
||||
* Show message (generic).
|
||||
* @param message text to display (or code for angular-translate)
|
||||
* @param config additional message configuration
|
||||
* @param severity message severity (error, warning, success, info).
|
||||
*/
|
||||
general(message: string, config: IGrowlMessageConfig, severity: string): IGrowlMessage;
|
||||
|
||||
/**
|
||||
* Get current setting for displaying only unique messages.
|
||||
*/
|
||||
onlyUnique(): boolean;
|
||||
/**
|
||||
* Get current setting for reversing messages order.
|
||||
*/
|
||||
reverseOrder(): boolean;
|
||||
/**
|
||||
* Get current allowance for inline messages.
|
||||
*/
|
||||
inlineMessages(): boolean;
|
||||
/**
|
||||
* Get current messages position.
|
||||
*/
|
||||
position(): string;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/// <reference path="../angularjs/angular.d.ts" />
|
||||
/// <reference path="angular-hotkeys.d.ts" />
|
||||
|
||||
var scope: ng.IScope;
|
||||
var hotkeyProvider: ng.hotkeys.HotkeysProvider;
|
||||
var hotkeyObj: ng.hotkeys.Hotkey;
|
||||
|
||||
hotkeyProvider.add("mod+s", "saves a file", (event: Event, hotkey: ng.hotkeys.Hotkey) => {} );
|
||||
hotkeyProvider.add(["mod+s"], "saves a file", (event: Event, hotkey: ng.hotkeys.Hotkey) => {} );
|
||||
hotkeyProvider.add(hotkeyObj);
|
||||
hotkeyProvider.bindTo(scope);
|
||||
hotkeyProvider.del("mod+s");
|
||||
hotkeyProvider.del(["mod+s"]);
|
||||
hotkeyProvider.get("mod+s");
|
||||
hotkeyProvider.get(["mod+s"]);
|
||||
hotkeyProvider.toggleCheatSheet();
|
||||
|
||||
hotkeyProvider.add(hotkeyObj.combo, hotkeyObj.description ,hotkeyObj.callback);
|
||||
|
||||
hotkeyProvider.bindTo(scope)
|
||||
.add(hotkeyObj)
|
||||
.add(hotkeyObj)
|
||||
.add({
|
||||
combo: 'w',
|
||||
description: 'blah blah',
|
||||
callback: function() {}
|
||||
})
|
||||
.add({
|
||||
combo: ['w', 'mod+w'],
|
||||
description: 'blah blah',
|
||||
callback: function() {}
|
||||
});
|
||||
|
||||
Vendored
+50
@@ -0,0 +1,50 @@
|
||||
// Type definitions for angular-hotkeys
|
||||
// Project: https://github.com/chieffancypants/angular-hotkeys
|
||||
// Definitions by: Jason Zhao <https://github.com/jlz27>, Stefan Steinhart <https://github.com/reppners>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="../angularjs/angular.d.ts" />
|
||||
|
||||
declare module angular.hotkeys {
|
||||
|
||||
interface HotkeysProvider {
|
||||
template: string;
|
||||
templateTitle:string;
|
||||
includeCheatSheet: boolean;
|
||||
cheatSheetHotkey: string;
|
||||
cheatSheetDescription: string;
|
||||
|
||||
add(combo: string|string[], callback: (event: Event, hotkey?: Hotkey) => void, action?: string, allowIn?: Array<string>, persistent?: boolean): ng.hotkeys.Hotkey;
|
||||
|
||||
add(combo: string|string[], description: string, callback: (event: Event, hotkey?: Hotkey) => void, action?: string, allowIn?: Array<string>, persistent?: boolean): ng.hotkeys.Hotkey;
|
||||
|
||||
add(hotkeyObj: ng.hotkeys.Hotkey): ng.hotkeys.Hotkey;
|
||||
|
||||
bindTo(scope : ng.IScope): ng.hotkeys.HotkeysProviderChained;
|
||||
|
||||
del(combo: string|string[]): void;
|
||||
|
||||
del(hotkeyObj: ng.hotkeys.Hotkey): void;
|
||||
|
||||
get(combo: string|string[]): ng.hotkeys.Hotkey;
|
||||
|
||||
toggleCheatSheet(): void;
|
||||
|
||||
purgeHotkeys(): void;
|
||||
}
|
||||
|
||||
interface HotkeysProviderChained {
|
||||
add(combo: string|string[], description: string, callback: (event: Event, hotkeys: ng.hotkeys.Hotkey) => void): HotkeysProviderChained;
|
||||
|
||||
add(hotkeyObj: ng.hotkeys.Hotkey): HotkeysProviderChained;
|
||||
}
|
||||
|
||||
interface Hotkey {
|
||||
combo: string|string[];
|
||||
description?: string;
|
||||
callback: (event: Event, hotkey: ng.hotkeys.Hotkey) => void;
|
||||
action?: string;
|
||||
allowIn?: Array<string>;
|
||||
persistent?: boolean;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
/// <reference path="./angular-http-auth.d.ts" />
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
angular.module('login', ['http-auth-interceptor'])
|
||||
|
||||
.controller('LoginController', ($scope:any, $http:any, authService:ng.httpAuth.IAuthService) => {
|
||||
$scope.submit = () => {
|
||||
$http.post('auth/login').success(() => {
|
||||
authService.loginConfirmed();
|
||||
});
|
||||
}
|
||||
});
|
||||
})();
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user