From c3dd962e949bfa37b899ebb0a31ff8fd89df8ecb Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 28 Jan 2016 12:18:28 -0500 Subject: [PATCH 1/3] Add ss-utils --- ss-utils/ss-utils-tests.ts | 41 ++++++++++++++ ss-utils/ss-utils.d.ts | 113 +++++++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 ss-utils/ss-utils-tests.ts create mode 100644 ss-utils/ss-utils.d.ts diff --git a/ss-utils/ss-utils-tests.ts b/ss-utils/ss-utils-tests.ts new file mode 100644 index 000000000..7527435b6 --- /dev/null +++ b/ss-utils/ss-utils-tests.ts @@ -0,0 +1,41 @@ +/// +/// + +declare var EventSource : sse.IEventSourceStatic; + +declare module sse { + interface IEventSourceStatic extends EventTarget { + new (url: string, eventSourceInitDict?: IEventSourceInit):IEventSourceStatic; + url: string; + } + + interface IEventSourceInit { + withCredentials?: boolean; + } +} + +function test_ssutils() { + $.ss.eventReceivers = { "document": document }; + + var source = new EventSource("/event-stream?channels=home,work"); + $(source).handleServerEvents({ + handlers: { + onConnect: function(connect:SSUtilsSSEConnect) {}, + onHeartbeat: function(msg:SSUtilsSSEHeartbeat, e:MessageEvent){}, + onJoin: function(msg:SSUtilsSSEJoin) {}, + onLeave: function(msg:SSUtilsSSELeave) {} + }, + receivers: { + tv: { + watch: function(){} + } + } + }); + + $(document).bindHandlers({ + announce: function (msg:string) {} + }) + .on('customEvent', function (e, msg, msgEvent) { }); + + $.ss.handlers["changeChannel"]("home"); +} \ No newline at end of file diff --git a/ss-utils/ss-utils.d.ts b/ss-utils/ss-utils.d.ts new file mode 100644 index 000000000..99f4325fd --- /dev/null +++ b/ss-utils/ss-utils.d.ts @@ -0,0 +1,113 @@ +// Type definitions for ServiceStack Utils v0.0.1 +// Project: https://servicestack.net/ +// Definitions by: Demis Bellot +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// + +interface JQuery { + setFieldError: (name: string, msg: string) => void; + serializeMap: () => { [index: string]: any }; + applyErrors: (status: ResponseStatus, opt?: SSUtilsApplyErrorsOptions) => JQuery; + clearErrors: () => JQuery; + bindForm: (opt?: SSUtilsApplyErrorsOptions) => JQuery; + applyValues: (values: { [index: string]: string }) => JQuery; + bindHandlers: (handlers: { [index: string]: Function }) => JQuery; + setActiveLinks: () => JQuery; + handleServerEvents: (opt?: SSUtilsHandleServerEventsOptions) => void; +} + +interface SSUtilsValidation { + overrideMessages: boolean; + messages: { [index: string]: string }; + errorFilter: (errorMsg: string, errorCode: string, type: string) => void; +} + +interface SSUtilsValidationOptional { + overrideMessages?: boolean; + messages?: { [index: string]: string }; + errorFilter?: (errorMsg: string, errorCode: string, type: string) => void; +} + +interface SSUtilsApplyErrorsOptions extends SSUtilsValidationOptional { +} + +interface SSUtilsBindFormOptions { + validation?: SSUtilsValidationOptional; + validate?: (form: HTMLFormElement) => boolean; + onSubmitDisable?: string; + complete?: (...args: any[]) => void; + error?: (...args: any[]) => void; +} + +interface SSUtilsHandleServerEventsOptions { + handlers?: { [index: string]: Function }; + validate?: (op?: string, target?: string, msg?: string, json?: string) => boolean; + heartbeatUrl?: string; + heartbeatIntervalMs?: number; + unRegisterUrl?: string; + receivers?: { [index: string]: any }; + success?: (selector: string, msg: string, e: any) => void; +} + +interface ResponseStatus { + errorCode: string; + message: string; + stackTrace: string; + errors: ResponseError[]; +} +interface ResponseError { + errorCode: string; + fieldName: string; + message: string; +} + +interface SSUtilsStatic { + handlers: { [index: string]: Function }; + onSubmitDisable: string; + validation: SSUtilsValidation; + clearAdjacentError: () => void; + todate: (s: string) => Date; + todfmt: (s: string) => string; + dfmt: (d: Date) => string; + dfmthm: (d: Date) => string; + tfmt12: (d: Date) => string; + splitOnFirst: (s: string) => string[]; + splitOnLast: (s: string) => string[]; + getSelection: () => string; + queryString: (url: string) => { [index: string]: string }; + createUrl: (route: string, args?: any) => string; + humanize: (s: string) => string; + + listenOn: string; + eventReceivers: any; + reconnectServerEvents: (opt: SSUtilsReconnectServerEventsOptions) => any; +} + +interface SSUtilsReconnectServerEventsOptions { + url?: string; + onerror?: (...args: any[]) => void; + onmessage?: (...args: any[]) => void; + errorArgs: any[]; +} + +interface JQueryStatic { + ss: SSUtilsStatic; +} + +interface SSUtilsSSECommand { + userId: string; + displayName: string; + channels: string; + profileUrl: string; +} +interface SSUtilsSSEHeartbeat extends SSUtilsSSECommand {} +interface SSUtilsSSEJoin extends SSUtilsSSECommand {} +interface SSUtilsSSELeave extends SSUtilsSSECommand {} +interface SSUtilsSSEConnect extends SSUtilsSSECommand { + id: string; + unRegisterUrl: string; + heartbeatUrl: string; + heartbeatIntervalMs: number; + idleTimeoutMs: number; +} From 861d4f8846969b1002f8aace6faa38cb0fc3d775 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 29 Jan 2016 06:36:02 -0500 Subject: [PATCH 2/3] Change to use Module --- ss-utils/ss-utils-tests.ts | 48 +++++++++- ss-utils/ss-utils.d.ts | 192 +++++++++++++++++++------------------ 2 files changed, 143 insertions(+), 97 deletions(-) diff --git a/ss-utils/ss-utils-tests.ts b/ss-utils/ss-utils-tests.ts index 7527435b6..52ac7151b 100644 --- a/ss-utils/ss-utils-tests.ts +++ b/ss-utils/ss-utils-tests.ts @@ -20,10 +20,10 @@ function test_ssutils() { var source = new EventSource("/event-stream?channels=home,work"); $(source).handleServerEvents({ handlers: { - onConnect: function(connect:SSUtilsSSEConnect) {}, - onHeartbeat: function(msg:SSUtilsSSEHeartbeat, e:MessageEvent){}, - onJoin: function(msg:SSUtilsSSEJoin) {}, - onLeave: function(msg:SSUtilsSSELeave) {} + onConnect: function(connect:ssutils.SSEConnect) {}, + onHeartbeat: function(msg:ssutils.SSEHeartbeat, e:MessageEvent){}, + onJoin: function(msg:ssutils.SSEJoin) {}, + onLeave: function(msg:ssutils.SSELeave) {} }, receivers: { tv: { @@ -37,5 +37,45 @@ function test_ssutils() { }) .on('customEvent', function (e, msg, msgEvent) { }); + $.ss.handlers["changeChannel"]("home"); +} + +function test_jQuery_functions(){ + $("document").setFieldError("name","message"); + var map = $("form").serializeMap(); + $("form").applyErrors({errorCode:"",message:"",stackTrace:"",errors:[]}); + $("form").clearErrors(); + $("form").bindForm({ + overrideMessages: true, + messages: {"NotFound": "Not Found"}, + errorFilter: function(errorMsg, errorCode, type){} + }); + $("form").applyValues({ + "Key": "Value" + }); + $("form").bindHandlers({ + "test": function() {} + }); +} + +function test_ssutils_Static(){ + $.ss.handlers["key"] = () => 0; + $.ss.onSubmitDisable = "class"; + $.ss.validation.messages["Code"] = "Message"; + $.ss.clearAdjacentError(); + var date:Date = $.ss.todate("2001-01-01"); + var dateFmt:String = $.ss.todfmt("2001-01-01"); + dateFmt = $.ss.dfmt(new Date(2001,1,1)); + dateFmt = $.ss.dfmthm(new Date(2001,1,1)); + dateFmt = $.ss.tfmt12(new Date(2001,1,1)); + var parts:string[] = $.ss.splitOnFirst("A,B,C"); + parts = $.ss.splitOnLast("A,B,C"); + var selectedText = $.ss.getSelection(); + var qs:{ [index: string]: string } = $.ss.queryString("http://google.com?a=b&c=d"); + var relativePath = $.ss.createUrl("/path/to/{File}", {File:"file.js"}); + var readableText = $.ss.humanize("TheVariableName"); + + $.ss.listenOn = "click onmousedown"; + $.ss.eventReceivers = { "document": document }; $.ss.handlers["changeChannel"]("home"); } \ No newline at end of file diff --git a/ss-utils/ss-utils.d.ts b/ss-utils/ss-utils.d.ts index 99f4325fd..eb21b44cb 100644 --- a/ss-utils/ss-utils.d.ts +++ b/ss-utils/ss-utils.d.ts @@ -8,106 +8,112 @@ interface JQuery { setFieldError: (name: string, msg: string) => void; serializeMap: () => { [index: string]: any }; - applyErrors: (status: ResponseStatus, opt?: SSUtilsApplyErrorsOptions) => JQuery; + applyErrors: (status: ssutils.ResponseStatus, opt?: ssutils.ApplyErrorsOptions) => JQuery; clearErrors: () => JQuery; - bindForm: (opt?: SSUtilsApplyErrorsOptions) => JQuery; + bindForm: (opt?: ssutils.ApplyErrorsOptions) => JQuery; applyValues: (values: { [index: string]: string }) => JQuery; bindHandlers: (handlers: { [index: string]: Function }) => JQuery; setActiveLinks: () => JQuery; - handleServerEvents: (opt?: SSUtilsHandleServerEventsOptions) => void; -} - -interface SSUtilsValidation { - overrideMessages: boolean; - messages: { [index: string]: string }; - errorFilter: (errorMsg: string, errorCode: string, type: string) => void; -} - -interface SSUtilsValidationOptional { - overrideMessages?: boolean; - messages?: { [index: string]: string }; - errorFilter?: (errorMsg: string, errorCode: string, type: string) => void; -} - -interface SSUtilsApplyErrorsOptions extends SSUtilsValidationOptional { -} - -interface SSUtilsBindFormOptions { - validation?: SSUtilsValidationOptional; - validate?: (form: HTMLFormElement) => boolean; - onSubmitDisable?: string; - complete?: (...args: any[]) => void; - error?: (...args: any[]) => void; -} - -interface SSUtilsHandleServerEventsOptions { - handlers?: { [index: string]: Function }; - validate?: (op?: string, target?: string, msg?: string, json?: string) => boolean; - heartbeatUrl?: string; - heartbeatIntervalMs?: number; - unRegisterUrl?: string; - receivers?: { [index: string]: any }; - success?: (selector: string, msg: string, e: any) => void; -} - -interface ResponseStatus { - errorCode: string; - message: string; - stackTrace: string; - errors: ResponseError[]; -} -interface ResponseError { - errorCode: string; - fieldName: string; - message: string; -} - -interface SSUtilsStatic { - handlers: { [index: string]: Function }; - onSubmitDisable: string; - validation: SSUtilsValidation; - clearAdjacentError: () => void; - todate: (s: string) => Date; - todfmt: (s: string) => string; - dfmt: (d: Date) => string; - dfmthm: (d: Date) => string; - tfmt12: (d: Date) => string; - splitOnFirst: (s: string) => string[]; - splitOnLast: (s: string) => string[]; - getSelection: () => string; - queryString: (url: string) => { [index: string]: string }; - createUrl: (route: string, args?: any) => string; - humanize: (s: string) => string; - - listenOn: string; - eventReceivers: any; - reconnectServerEvents: (opt: SSUtilsReconnectServerEventsOptions) => any; -} - -interface SSUtilsReconnectServerEventsOptions { - url?: string; - onerror?: (...args: any[]) => void; - onmessage?: (...args: any[]) => void; - errorArgs: any[]; + handleServerEvents: (opt?: ssutils.HandleServerEventsOptions) => void; } interface JQueryStatic { - ss: SSUtilsStatic; + ss: ssutils.Static; } -interface SSUtilsSSECommand { - userId: string; - displayName: string; - channels: string; - profileUrl: string; -} -interface SSUtilsSSEHeartbeat extends SSUtilsSSECommand {} -interface SSUtilsSSEJoin extends SSUtilsSSECommand {} -interface SSUtilsSSELeave extends SSUtilsSSECommand {} -interface SSUtilsSSEConnect extends SSUtilsSSECommand { - id: string; - unRegisterUrl: string; - heartbeatUrl: string; - heartbeatIntervalMs: number; - idleTimeoutMs: number; +declare module ssutils +{ + interface Static { + handlers: { [index: string]: Function }; + onSubmitDisable: string; + validation: Validation; + clearAdjacentError: () => void; + todate: (s: string) => Date; + todfmt: (s: string) => string; + dfmt: (d: Date) => string; + dfmthm: (d: Date) => string; + tfmt12: (d: Date) => string; + splitOnFirst: (s: string) => string[]; + splitOnLast: (s: string) => string[]; + getSelection: () => string; + queryString: (url: string) => { [index: string]: string }; + createUrl: (route: string, args?: any) => string; + humanize: (s: string) => string; + + listenOn: string; + eventReceivers: any; + reconnectServerEvents: (opt: ReconnectServerEventsOptions) => any; + } + + interface Validation { + overrideMessages: boolean; + messages: { [index: string]: string }; + errorFilter: (errorMsg: string, errorCode: string, type: string) => void; + } + + interface ValidationOptional { + overrideMessages?: boolean; + messages?: { [index: string]: string }; + errorFilter?: (errorMsg: string, errorCode: string, type: string) => void; + } + + interface ApplyErrorsOptions extends ValidationOptional { + } + + interface BindFormOptions { + validation?: ValidationOptional; + validate?: (form: HTMLFormElement) => boolean; + onSubmitDisable?: string; + complete?: (...args: any[]) => void; + error?: (...args: any[]) => void; + } + + interface HandleServerEventsOptions { + handlers?: { [index: string]: Function }; + validate?: (op?: string, target?: string, msg?: string, json?: string) => boolean; + heartbeatUrl?: string; + heartbeatIntervalMs?: number; + unRegisterUrl?: string; + receivers?: { [index: string]: any }; + success?: (selector: string, msg: string, e: any) => void; + } + + interface ResponseStatus { + errorCode: string; + message: string; + stackTrace: string; + errors: ResponseError[]; + } + interface ResponseError { + errorCode: string; + fieldName: string; + message: string; + } + + interface SSECommand { + userId: string; + displayName: string; + channels: string; + profileUrl: string; + } + + interface SSEHeartbeat extends SSECommand { } + interface SSEJoin extends SSECommand { } + interface SSELeave extends SSECommand { } + + interface SSEConnect extends SSECommand { + id: string; + unRegisterUrl: string; + heartbeatUrl: string; + heartbeatIntervalMs: number; + idleTimeoutMs: number; + } + + interface ReconnectServerEventsOptions { + url?: string; + onerror?: (...args: any[]) => void; + onmessage?: (...args: any[]) => void; + errorArgs: any[]; + } } + From 5fd34b988f985059227d7ff08fb7704edd195620 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 30 Jan 2016 07:37:43 -0500 Subject: [PATCH 3/3] update to export namespace in ambient module --- ss-utils/ss-utils.d.ts | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/ss-utils/ss-utils.d.ts b/ss-utils/ss-utils.d.ts index eb21b44cb..3d6ddfbf4 100644 --- a/ss-utils/ss-utils.d.ts +++ b/ss-utils/ss-utils.d.ts @@ -5,24 +5,8 @@ /// -interface JQuery { - setFieldError: (name: string, msg: string) => void; - serializeMap: () => { [index: string]: any }; - applyErrors: (status: ssutils.ResponseStatus, opt?: ssutils.ApplyErrorsOptions) => JQuery; - clearErrors: () => JQuery; - bindForm: (opt?: ssutils.ApplyErrorsOptions) => JQuery; - applyValues: (values: { [index: string]: string }) => JQuery; - bindHandlers: (handlers: { [index: string]: Function }) => JQuery; - setActiveLinks: () => JQuery; - handleServerEvents: (opt?: ssutils.HandleServerEventsOptions) => void; -} +declare namespace ssutils { -interface JQueryStatic { - ss: ssutils.Static; -} - -declare module ssutils -{ interface Static { handlers: { [index: string]: Function }; onSubmitDisable: string; @@ -96,11 +80,11 @@ declare module ssutils channels: string; profileUrl: string; } - + interface SSEHeartbeat extends SSECommand { } interface SSEJoin extends SSECommand { } interface SSELeave extends SSECommand { } - + interface SSEConnect extends SSECommand { id: string; unRegisterUrl: string; @@ -117,3 +101,22 @@ declare module ssutils } } +interface JQuery { + setFieldError: (name: string, msg: string) => void; + serializeMap: () => { [index: string]: any }; + applyErrors: (status: ssutils.ResponseStatus, opt?: ssutils.ApplyErrorsOptions) => JQuery; + clearErrors: () => JQuery; + bindForm: (opt?: ssutils.ApplyErrorsOptions) => JQuery; + applyValues: (values: { [index: string]: string }) => JQuery; + bindHandlers: (handlers: { [index: string]: Function }) => JQuery; + setActiveLinks: () => JQuery; + handleServerEvents: (opt?: ssutils.HandleServerEventsOptions) => void; +} + +interface JQueryStatic { + ss: ssutils.Static; +} + +declare module "ss-utils" { + export = ssutils; +} \ No newline at end of file