From 6db4460328357dc6a62e671d686f663a19aaabb5 Mon Sep 17 00:00:00 2001 From: Boris Yankov Date: Mon, 29 Oct 2012 15:38:37 +0200 Subject: [PATCH] Improve Sammy.js definitions and tests --- Definitions/sammyjs-0.7.d.ts | 427 ++++++++++++++++++----------------- Tests/sammyjs-tests.ts | 96 +++++--- 2 files changed, 282 insertions(+), 241 deletions(-) diff --git a/Definitions/sammyjs-0.7.d.ts b/Definitions/sammyjs-0.7.d.ts index b26d23ca28..42723157a5 100644 --- a/Definitions/sammyjs-0.7.d.ts +++ b/Definitions/sammyjs-0.7.d.ts @@ -5,224 +5,225 @@ /// -interface Sammy { - (): Application; - (selector: string): Application; - (handler: Function): Application; - (selector: string, handler: Function): Application; +module Sammy { + export function (): Sammy.Application; + export function (selector: string): Sammy.Application; + export function (handler: Function): Sammy.Application; + export function (selector: string, handler: Function): Sammy.Application; - Cache(app, options); - DataCacheProxy(initial, $element); - DataLocationProxy(app, data_name, href_attribute); - DefaultLocationProxy(app, run_interval_every); - EJS(app, method_alias); + export function Cache(app, options); + export function DataCacheProxy(initial, $element); + export function DataLocationProxy(app, data_name, href_attribute); + export function DefaultLocationProxy(app, run_interval_every); + export function EJS(app, method_alias); - Exceptional(app, errorReporter); - Flash(app); - Form(app); // formFor ( name, object, content_callback ) + export function Exceptional(app, errorReporter); + export function Flash(app); + export function Form(app); // formFor ( name, object, content_callback ) - Haml(app, method_alias); - Handlebars(app, method_alias); - Hogan(app, method_alias); - Hoptoad(app, errorReporter); - JSON(app); - Meld(app, method_alias); - MemoryCacheProxy(initial); - Mustache(app, method_alias); - NestedParams(app); - OAuth2(app); - PathLocationProxy(app); - Pure(app, method_alias); - PushLocationProxy(app); - Session(app, options); - Storage(app); + export function Haml(app, method_alias); + export function Handlebars(app, method_alias); + export function Hogan(app, method_alias); + export function Hoptoad(app, errorReporter); + export function JSON(app); + export function Meld(app, method_alias); + export function MemoryCacheProxy(initial); + export function Mustache(app, method_alias); + export function NestedParams(app); + export function OAuth2(app); + export function PathLocationProxy(app); + export function Pure(app, method_alias); + export function PushLocationProxy(app); + export function Session(app, options); + export function Storage(app); - Title(); - Tmpl(app, method_alias); - addLogger(logger); - log(); + export function Title(); + export function Tmpl(app, method_alias); + export function addLogger(logger); + export function log(); + + export interface Object { + + constructor (obj: any); + + escapeHTML(s: string): string; + h(s: string): string; + + has(key: string): bool; + join(...args: any[]): string; + keys(attributes_only?: bool): string[]; + log(...args: any[]): void; + toHTML(): string; + toHash(): any; + toString(include_functions?: bool): string; + } + + export interface Application extends Object { + + ROUTE_VERBS: string[]; + APP_EVENTS: string[]; + + (appFn: Function); + + $element(selector?: string): JQuery; + after(callback: Function): Application; + any(verb: string, path: string, callback: Function): void; + route(verb: string, path: string, callback: Function): void; + around(callback: Function): Application; + before(options: any, callback: Function): Application; + bind(name: string, callback: Function): Application; + bind(name: string, data: any, callback: Function): Application; + bindToAllEvents(callback: Function): Application; + clearTemplateCache(): any; + contextMatchesOptions(context: any, match_options: any, positive?: bool): bool; + del(path: string, callback: Function): Application; + del(path: RegExp, callback: Function): Application; + destroy(): Application; + error(message: string, original_error: Error): void; + eventNamespace(): string; + get(path: string, callback: Function): Application; + get(path: RegExp, callback: Function): Application; + getLocation(): string; + helper(name: string, method: Function): Application; + helpers(extensions: any): Application; + isRunning(): bool; + log(...params: any[]): void; + lookupRoute(verb: string, path: string): any; + mapRoutes(route_array: any[]): Application; + notFound(verb: string, path: string): any; + post(path: string, callback: Function): Application; + post(path: RegExp, callback: Function): Application; + put(path: string, callback: Function): Application; + put(path: RegExp, callback: Function): Application; + refresh(): Application; + routablePath(path: string): string; + route(verb: string, path: string, callback: Function): Application; + route(verb: string, path: RegExp, callback: Function): Application; + run(start_url?: string): Application; + runRoute(verb: string, path: string, params: any, target: any): any; + setLocation(new_location: string): string; + setLocationProxy(new_proxy: DataLocationProxy): void; + swap(content: any, callback: Function): string; + templateCache(key: string, value: any): any; + toString(): string; + trigger(name: string, data?: any): Application; + unload(): Application; + use(...params: any[]): void; + } + + export interface DataLocationProxy { + constructor (app, run_interval_every): DataLocationProxy; + fullPath(location_obj): string; + bind(): void; + unbind(): void; + setLocation(new_location: string): string; + _startPolling(every: number): void; + } + + export interface EventContext extends Object { + constructor (app, verb, path, params, target); + $element(): JQuery; + engineFor(engine: any): any; + eventNamespace(): string; + interpolate(content: any, data: any, engine: any, partials): EventContext; + json(str: string): any; + load(location: any, options?: any, callback?: Function): any; + loadPartials(partials); + notFound(): any; + partial(location, data, callback, partials); + redirect(...params: any[]): void; + render(location: string, data: any, callback: Function, partials): RenderContext; + renderEach(location: any, name?: string, data?: any, callback?: Function): RenderContext; + send(...params: any[]): RenderContext; + swap(contents: any, callback: Function): string; + toString(): string; + trigger(name: string, data?: any): EventContext; + } + + export interface FormBuilder { + constructor (name, object); + checkbox(keypath, value, attributes); + close(); + hidden(keypath, attributes); + label(keypath, content, attributes); + open(attributes); + password(keypath, attributes); + radio(keypath, value, attributes); + select(keypath, options, attributes); + submit(attributes); + text(keypath, attributes); + textarea(keypath, attributes); + } + + export interface GoogleAnalytics { + constructor (app, tracker); + noTrack(); + track(path); + } + + export interface RenderContext extends Object { + constructor (event_context); + appendTo(selector: string): RenderContext; + collect(array: any[], callback: Function, now?: bool): RenderContext; + interpolate(data: any, engine?: any, retain?: bool): RenderContext; + load(location: string, options?: any, callback?: Function): RenderContext; + loadPartials(partials?: any): RenderContext; + next(content: any): void; + partial(location: string, callback: Function, partials): RenderContext; + partial(location: string, data: any, callback: Function, partials): RenderContext; + prependTo(selector: string): RenderContext; + render(callback: Function): RenderContext; + render(location: string, data: any): RenderContext; + render(location: string, callback: Function, partials?: any): RenderContext; + render(location: string, data: any, callback: Function): RenderContext; + render(location: string, data: any, callback: Function, partials: any): RenderContext; + renderEach(location: string, name: string, data: any, callback: Function): RenderContext; + replace(selector: string): RenderContext; + send(...params: any[]): RenderContext; + swap(callback: Function): RenderContext; + then(callback: Function): RenderContext; + trigger(name, data); + wait(): void; + } + + + export interface StoreOptions { + name?: string; + element?: string; + type?: string; + memory?: any; + data?: any; + cookie?: any; + local?: any; + session?: any; + } + + export interface Store { + constructor (options); + + clear(key); + clearAll(); + each(callback); + exists(key); + fetch(key, callback); + filter(callback); + first(callback); + get(key); + isAvailable(); + keys(); + load(key, path, callback); + set(key, value); + + Cookie(name, element, options); + Data(name, element); + LocalStorage(name, element); + Memory(name, element); + SessionStorage(name, element); + isAvailable(type); + Template(app, method_alias); + } - Object: Object; } - -interface Object { - - constructor (obj: any); - - escapeHTML(s: string): string; - h(s: string): string; - - has(key: string): bool; - join(...args: any[]): string; - keys(attributes_only?: bool): string[]; - log(...args: any[]): void; - toHTML(): string; - toHash(): any; - toString(include_functions?: bool): string; -} - -interface Application extends Object { - - ROUTE_VERBS: string[]; - APP_EVENTS: string[]; - - (appFn: Function); - - $element(selector: string): JQuery; - after: (callback: Function): Application; - any(verb: string, path: string, callback: Function): void; - route(verb: string, path: string, callback: Function): void; - around(callback); - before(options: any, callback: Function): Application; - bind(name: string, data: any, callback: Function): Application; - bindToAllEvents(callback); - clearTemplateCache(); - contextMatchesOptions(context, match_options, positive); - del(path: string, callback: Function): Application; - del(path: RegExp, callback: Function): Application; - destroy(); - error(message, original_error); - eventNamespace(): string; - get(path: string, callback: Function): Application; - get(path: RegExp, callback: Function): Application; - getLocation(): string; - helper(name, method); - helpers(extensions); - isRunning(); - log(...params: any[]): void; - lookupRoute(verb, path); - mapRoutes(route_array: any[]): Application; - notFound(verb, path); - post(path: string, callback: Function): Application; - post(path: RegExp, callback: Function): Application; - put(path: string, callback: Function): Application; - put(path: RegExp, callback: Function): Application; - refresh(): Application; - routablePath(path); - route(verb: string, path: string, callback: Function): Application; - route(verb: string, path: RegExp, callback: Function): Application; - run(start_url); - runRoute(verb, path, params, target); - setLocation(new_location: string): string; - setLocationProxy(new_proxy: DataLocationProxy): void; - swap(content, callback); - templateCache(key, value); - toString(): string; - trigger(name: string, data: any): Application; - unload(); - use(...params: any[]): void; -} - -interface DataLocationProxy { - (app, run_interval_every): DataLocationProxy; - fullPath(location_obj): string; - bind(): void; - unbind(): void; - setLocation(new_location: string): string; - _startPolling(every: number): void; -} - -interface EventContext { - constructor (app, verb, path, params, target); - $element(); - engineFor(engine); - eventNamespace(); - interpolate(content, data, engine, partials); - json(string); - load(location, options, callback); - loadPartials(partials); - notFound(); - partial(location, data, callback, partials); - redirect(); - render(location, data, callback, partials); - renderEach(location, name, data, callback); - send(); - swap(contents, callback); - toString(); - trigger(name, data); -} - -interface FormBuilder { - constructor (name, object); - checkbox(keypath, value, attributes); - close(); - hidden(keypath, attributes); - label(keypath, content, attributes); - open(attributes); - password(keypath, attributes); - radio(keypath, value, attributes); - select(keypath, options, attributes); - submit(attributes); - text(keypath, attributes); - textarea(keypath, attributes); -} - -interface GoogleAnalytics { - constructor (app, tracker); - noTrack(); - track(path); -} - -interface RenderContext { - constructor (event_context); - appendTo(selector); - collect(array, callback, now); - interpolate(data, engine, retain); - load(location, options, callback); - loadPartials(partials); - next(content); - partial(location, data, callback, partials); - prependTo(selector); - render(location, data, callback, partials); - renderEach(location, name, data, callback); - replace(selector); - send(); - swap(callback); - then(callback); - trigger(name, data); - wait(); -} - - -interface StoreOptions { - name?: string; - element?: string; - type?: string; - memory?: any; - data?: any; - cookie?: any; - local?: any; - session?: any; -} - -interface Store { - constructor (options); - - clear(key); - clearAll(); - each(callback); - exists(key); - fetch(key, callback); - filter(callback); - first(callback); - get(key); - isAvailable(); - keys(); - load(key, path, callback); - set(key, value); - - Cookie(name, element, options); - Data(name, element); - LocalStorage(name, element); - Memory(name, element); - SessionStorage(name, element); - isAvailable(type); - Template(app, method_alias); -} - - interface JQueryStatic { sammy: Sammy; -} - -declare var Sammy: Sammy; \ No newline at end of file +} \ No newline at end of file diff --git a/Tests/sammyjs-tests.ts b/Tests/sammyjs-tests.ts index fa0fa3a67c..e6249c78a4 100644 --- a/Tests/sammyjs-tests.ts +++ b/Tests/sammyjs-tests.ts @@ -1,12 +1,11 @@ /// -var _this: RenderContext; - function test_general() { var app = Sammy('#main', function () { - var _this: Application; + var _this: Sammy.Application; _this.use('Mustache'); _this.get('#/', function () { + var _this: Sammy.RenderContext; _this.load('posts.json') .renderEach('post.mustache') .swap(); @@ -15,14 +14,16 @@ function test_general() { app.run('#/'); - _this.get('#/', function(context) { + var _this: Sammy.Application; + _this.get('#/', function (context) { + var _this: Sammy.RenderContext; _this.load('data/items.json') - .then(function(items) { - $.each(items, function(i, item) { - context.log(item.title, '-', item.artist); + .then(function (items) { + $.each(items, function (i, item) { + context.log(item.title, '-', item.artist); }); }); - }); + }); } function test_app() { @@ -30,8 +31,10 @@ function test_app() { s.toHTML(); var app = $.sammy(function () { + var current_user = false; function checkLoggedIn(callback) { + var _this: Sammy.EventContext; if (!current_user) { $.getJSON('/session', function (json) { if (json.login) { @@ -46,10 +49,12 @@ function test_app() { callback(); } }; + var _this: Sammy.Application; _this.around(checkLoggedIn); }); var app = $.sammy(function () { + var _this: Sammy.Application; _this.before('#/route', function () { }); _this.before({ except: { path: '#/route' } }, function () { _this.log('not before #/route'); @@ -81,30 +86,32 @@ function test_app() { app.contextMatchesOptions(context, { except: { path: ['#/otherpath', '#/thirdpath'] } }); var app = $.sammy(function (app) { + var _this: Sammy.Application; $.each([1, 2, 3], function (i, num) { app.helper('helper' + num, function () { _this.log("I'm helper number " + num); }); }); _this.get('#/', function () { - _this.helper2(); }); }); var app = $.sammy(function () { - helpers({ + var _this: Sammy.Application; + _this.helpers({ upcase: function (text) { return text.toString().toUpperCase(); } }); - get('#/', function () { + _this.get('#/', function () { with (_this) { - $('#main').html(upcase($('#main').text()); + $('#main').html(upcase($('#main').text())); } }); }); var app = $.sammy(function () { + var _this: Sammy.Application; _this.mapRoutes([ ['get', '#/', function () { _this.log('index'); }], ['post', '#/create', 'addUser'], @@ -113,15 +120,17 @@ function test_app() { }); var app = $.sammy(function () { }); - $(function () + $(function () { app.run(); }); var app = $.sammy(function () { + var _this: Sammy.Application; _this.setLocationProxy(new Sammy.DataLocationProxy(_this)); }); var app = $.sammy(function () { + var _this: Sammy.Application; _this.swap = function (content, callback) { var context = _this; context.$element().fadeOut('slow', function () { @@ -136,6 +145,7 @@ function test_app() { }); var MyPlugin = function (app, prepend) { + var _this: Sammy.Application; _this.helpers({ myhelper: function (text) { alert(prepend + " " + text); @@ -143,6 +153,7 @@ function test_app() { }); }; var app = $.sammy(function () { + var _this: Sammy.Application; _this.use(MyPlugin, '_this is my plugin'); _this.get('#/', function () { _this.myhelper('and dont you forget it!'); @@ -150,6 +161,7 @@ function test_app() { }); $.sammy(function () { + var _this: Sammy.Application; _this.use('Mustache'); _this.use('Storage'); }); @@ -157,6 +169,7 @@ function test_app() { function test_misc() { var app = $.sammy(function () { + var _this: Sammy.Application; _this.setLocationProxy(new Sammy.DataLocationProxy(_this, 'location', 'rel')); _this.get('about', function () { _this.partial('about.html'); @@ -164,6 +177,7 @@ function test_misc() { }); $.sammy(function () { + var _this: Sammy.Application; _this.get('#/:name', function () { if (_this.params['name'] == 'sammy') { _this.partial('name.html.erb', { name: 'Sammy' }); @@ -173,11 +187,12 @@ function test_misc() { }); }); - redirect('#/other/route'); - redirect('#', 'other', 'route'); - render('mytemplate.mustache', { name: 'quirkey' }) + var _this: Sammy.Application; + _this.redirect('#/other/route'); + _this.redirect('#', 'other', 'route'); + _this.render('mytemplate.mustache', { name: 'quirkey' }) .appendTo('ul'); - renderEach('mytemplate.mustache', [{ name: 'quirkey' }, { name: 'endor' }]); + _this.renderEach('mytemplate.mustache', [{ name: 'quirkey' }, { name: 'endor' }]); var item = { name: 'My Item', @@ -197,6 +212,7 @@ function test_misc() { form.select('size', options); $.sammy(function () { + var _this: Sammy.Application; _this.use('GoogleAnalytics') _this.get('#/dont/track/me', function () { _this.noTrack(); @@ -204,6 +220,7 @@ function test_misc() { }); var app = $.sammy(function () { + var _this: Sammy.Application; _this.use(Sammy.Haml); _this.get('#/hello/:name', function () { _this.title = 'Hello!' @@ -214,6 +231,7 @@ function test_misc() { app.run() var app = $.sammy(function () { + var _this: Sammy.Application; _this.use('Handlebars', 'hb'); _this.get('#/hello/:name', function () { _this.title = 'Hello!' @@ -223,6 +241,7 @@ function test_misc() { }); var app = $.sammy(function () { + var _this: Sammy.Application; _this.use('Handlebars', 'hb'); _this.get('#/hello/:name/to/:friend', function (context) { _this.load('mypartial.hb') @@ -236,6 +255,7 @@ function test_misc() { }); var app = $.sammy(function () { + var _this: Sammy.Application; _this.use('Hogan', 'hg'); _this.get('#/hello/:name', function () { _this.title = 'Hello!' @@ -245,6 +265,7 @@ function test_misc() { }); var app = $.sammy(function () { + var _this: Sammy.Application; _this.use('Hogan', 'hg'); _this.get('#/hello/:name/to/:friend', function (context) { _this.load('mypartial.hg') @@ -258,6 +279,7 @@ function test_misc() { }); var app = $.sammy(function () { + var _this: Sammy.Application; _this.use(Sammy.JSON); _this.get('#/', function () { _this.json({ user_id: 123 }); @@ -267,6 +289,7 @@ function test_misc() { }) var app = $.sammy(function () { + var _this: Sammy.Application; _this.use('Mustache', 'ms'); _this.get('#/hello/:name', function () { _this.title = 'Hello!' @@ -276,6 +299,7 @@ function test_misc() { }); var app = $.sammy(function () { + var _this: Sammy.Application; _this.use('Mustache', 'ms'); _this.get('#/hello/:name/to/:friend', function (context) { _this.load('mypartial.ms') @@ -289,12 +313,14 @@ function test_misc() { }); var app = $.sammy(function (app) { + var _this: Sammy.Application; _this.use(Sammy.NestedParams); _this.post('#/parse_me', function (context) { $.log(_this.params); }); }); + var _this: Sammy.Application; _this.use('Storage'); _this.use('OAuth2'); _this.oauthorize = "/oauth/authorize"; @@ -407,46 +433,54 @@ function test_misc() { } function test_routes() { - route('get', '#/', function () { + var _this: Sammy.Application; + + _this.route('get', '#/', function () { }); - put('#/post/form', function () { + _this.put('#/post/form', function () { return false; }); - get('/test/123', function () { + _thisget('/test/123', function () { }); - get('#/by_name/:name', function () { + _thisget('#/by_name/:name', function () { alert(_this.params['name']); }); - get(/\#\/by_name\/(.*)/, function () { + _thisget(/\#\/by_name\/(.*)/, function () { alert(_this.params['splat']); }); - get('#/by_name/:name', function () { + _thisget('#/by_name/:name', function () { _this.redirect('#', _this.params['name']); }); - get('#/by_name/:name', function (context) { + _thisget('#/by_name/:name', function (context) { context.redirect('#', _this.params['name']); }); } function test_events() { - bind('db-loaded', function (e, data) { + var _this: Sammy.Application; + + _this.bind('db-loaded', function (e, data) { + var _this: Sammy.EventContext; _this.redirect('#/'); }); var app = $.sammy(function () { - bind('test', function () { + var _this: Sammy.Application; + _this.bind('test', function () { + var _this: Sammy.EventContext; _this.trigger('other-event'); }); }); app.trigger('other-event'); var app = $.sammy(function () { - bind('test', function (e, data) { + var _this: Sammy.Application; + _this.bind('test', function (e, data) { alert(data['my_data']); }); - get('#/', function () { + _this.get('#/', function () { _this.trigger('test', { my_data: 'EVENTED!' }); }); }); @@ -454,6 +488,7 @@ function test_events() { function test_plugins() { var MyPlugin = function (app) { + var _this: Sammy.Application; _this.helpers({ alert: function (message) { _this.log("ALERT! " + message); @@ -461,12 +496,15 @@ function test_plugins() { }); }; var app = $.sammy(function () { + var _this: Sammy.Application; _this.use(MyPlugin); _this.get('#/', function () { + var _this: Sammy.EventContext; _this.alert("I'm home"); }); }); var MyAdvancedPlugin = function (app, prefix, suffix) { + var _this: Sammy.Application; _this.helpers({ alert: function (message) { _this.log(prefix, message, suffix); @@ -475,6 +513,7 @@ function test_plugins() { }; var app = $.sammy(function () { + var _this: Sammy.Application; _this.use(MyAdvancedPlugin, 'BEFORE!', 'AFTER!'); _this.get('#/', function () { _this.alert("I'm home"); @@ -482,6 +521,7 @@ function test_plugins() { }); var dbLoadAndDisplay = function (app) { + var _this: Sammy.Application; _this.get('#/', function () { _this.record = _this.app.db[_this.app.element_selector]; _this.app.swap(_this.record.toHTML());