├── demo ├── src │ ├── app │ │ ├── app.component.css │ │ ├── app.component.html │ │ ├── components │ │ │ ├── login │ │ │ │ ├── login.component.css │ │ │ │ ├── login.component.html │ │ │ │ ├── login.component.spec.ts │ │ │ │ └── login.component.ts │ │ │ └── dashboard │ │ │ │ ├── dashboard.component.css │ │ │ │ ├── dashboard.component.html │ │ │ │ ├── dashboard.component.spec.ts │ │ │ │ └── dashboard.component.ts │ │ ├── services │ │ │ ├── index.ts │ │ │ └── jobs.service.ts │ │ ├── interceptors │ │ │ ├── index.ts │ │ │ ├── extra.interceptor.ts │ │ │ └── auth.interceptor.ts │ │ ├── models │ │ │ ├── category.model.ts │ │ │ ├── customer.model.ts │ │ │ ├── boq.model.ts │ │ │ ├── job.model.ts │ │ │ └── fixer.model.ts │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ └── app.module.ts │ ├── styles.css │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.ico │ ├── typings.d.ts │ ├── tsconfig.app.json │ ├── index.html │ ├── main.ts │ ├── tsconfig.spec.json │ ├── test.ts │ └── polyfills.ts ├── e2e │ ├── app.po.ts │ ├── tsconfig.e2e.json │ └── app.e2e-spec.ts ├── .editorconfig ├── tsconfig.json ├── .gitignore ├── protractor.conf.js ├── karma.conf.js ├── README.md ├── package.json ├── tslint.json └── angular.json ├── dist ├── sails.options.js ├── sails.io.client.js ├── sails.interceptor.js ├── sails.model.interface.js ├── sails.options.metadata.json ├── sails.model.interface.metadata.json ├── sails.model.interface.d.ts ├── sails.interceptor.metadata.json ├── sails.decorator.endpoint.d.ts ├── sails.decorator.endpoint.metadata.json ├── utils.d.ts ├── sails.serialize.d.ts ├── sails.options.d.ts ├── sails.config.metadata.json ├── sails.model.interface.js.map ├── sails.subscription.metadata.json ├── sails.module.d.ts ├── sails.subscription.d.ts ├── sails.options.js.map ├── utils.js ├── sails.serialize.js ├── sails.decorator.endpoint.js ├── sails.model.d.ts ├── sails.interceptor.handler.metadata.json ├── index.metadata.json ├── sails.interceptor.handler.js ├── sails.request.options.metadata.json ├── index.js ├── sails.subscription.js ├── sails.event.d.ts ├── index.d.ts ├── sails.decorator.endpoint.js.map ├── sails.request.metadata.json ├── sails.interceptor.d.ts ├── sails.config.d.ts ├── sails.event.metadata.json ├── sails.interceptor.handler.d.ts ├── sails.request.criteria.metadata.json ├── utils.js.map ├── sails.interceptor.js.map ├── sails.query.metadata.json ├── sails.response.d.ts ├── sails.request.options.d.ts ├── sails.serialize.js.map ├── sails.config.js ├── sails.serialize.metadata.json ├── sails.module.js ├── sails.subscription.js.map ├── sails.module.metadata.json ├── index.js.map ├── sails.model.metadata.json ├── sails.query.d.ts ├── sails.response.metadata.json ├── utils.metadata.json ├── sails.interceptor.handler.js.map ├── sails.request.criteria.d.ts ├── sails.request.d.ts ├── sails.module.js.map ├── sails.event.js ├── sails.config.js.map ├── sails.event.js.map ├── sails.d.ts ├── sails.metadata.json ├── sails.response.js ├── sails.io.client.js.map ├── sails.request.options.js ├── sails.request.js ├── sails.io.client.d.ts ├── sails.response.js.map ├── sails.request.options.js.map ├── sails.model.js ├── sails.model.js.map ├── sails.request.js.map ├── sails.query.js ├── sails.request.criteria.js ├── sails.js ├── sails.query.js.map └── sails.js.map ├── .npmignore ├── .gitignore ├── src ├── sails.model.interface.ts ├── sails.options.ts ├── sails.decorator.endpoint.ts ├── utils.ts ├── sails.serialize.ts ├── sails.subscription.ts ├── index.ts ├── sails.interceptor.ts ├── sails.interceptor.handler.ts ├── sails.module.ts ├── sails.config.ts ├── sails.event.ts ├── sails.request.options.ts ├── sails.response.ts ├── sails.model.ts ├── sails.request.ts ├── sails.io.client.ts ├── sails.query.ts ├── sails.request.criteria.ts └── sails.ts ├── .travis.yml ├── rollup.config.js ├── tsconfig.json ├── LICENSE ├── integrations └── build.sh ├── tslint.json ├── package.json └── README.md /demo/src/app/app.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/sails.options.js: -------------------------------------------------------------------------------- 1 | //# sourceMappingURL=sails.options.js.map -------------------------------------------------------------------------------- /demo/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /demo/src/app/components/login/login.component.css: -------------------------------------------------------------------------------- 1 | .login { 2 | 3 | } -------------------------------------------------------------------------------- /dist/sails.io.client.js: -------------------------------------------------------------------------------- 1 | //# sourceMappingURL=sails.io.client.js.map -------------------------------------------------------------------------------- /dist/sails.interceptor.js: -------------------------------------------------------------------------------- 1 | //# sourceMappingURL=sails.interceptor.js.map -------------------------------------------------------------------------------- /dist/sails.model.interface.js: -------------------------------------------------------------------------------- 1 | //# sourceMappingURL=sails.model.interface.js.map -------------------------------------------------------------------------------- /demo/src/app/components/dashboard/dashboard.component.css: -------------------------------------------------------------------------------- 1 | .dashboard { 2 | 3 | } -------------------------------------------------------------------------------- /demo/src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /demo/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /demo/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/burntblark/ngx-sails-socketio/HEAD/demo/src/favicon.ico -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | demo/ 3 | src/ 4 | *.log 5 | package-lock.json 6 | .vscode 7 | .history 8 | .gitignore -------------------------------------------------------------------------------- /dist/sails.options.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsOptions":{"__symbolic":"interface"}}}] -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .history 3 | node_modules/ 4 | package-lock.json 5 | *.DS_Store* 6 | .vscode 7 | *.log 8 | package-lock.json 9 | -------------------------------------------------------------------------------- /dist/sails.model.interface.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsModelInterface":{"__symbolic":"interface"}}}] -------------------------------------------------------------------------------- /demo/src/app/services/index.ts: -------------------------------------------------------------------------------- 1 | import { JobsService } from "./jobs.service"; 2 | 3 | export const SERVICES = [ 4 | JobsService 5 | ]; 6 | 7 | -------------------------------------------------------------------------------- /demo/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* SystemJS module definition */ 2 | declare var module: NodeModule; 3 | interface NodeModule { 4 | id: string; 5 | } 6 | -------------------------------------------------------------------------------- /dist/sails.model.interface.d.ts: -------------------------------------------------------------------------------- 1 | export interface SailsModelInterface { 2 | id: string; 3 | createdAt: Date; 4 | updatedAt: Date; 5 | getEndPoint: () => string; 6 | } 7 | -------------------------------------------------------------------------------- /src/sails.model.interface.ts: -------------------------------------------------------------------------------- 1 | export interface SailsModelInterface { 2 | id: string; 3 | createdAt: Date; 4 | updatedAt: Date; 5 | 6 | getEndPoint: () => string; 7 | } 8 | -------------------------------------------------------------------------------- /dist/sails.interceptor.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsInterceptorConstructor":{"__symbolic":"interface"},"SailsInterceptorInterface":{"__symbolic":"interface"}}}] -------------------------------------------------------------------------------- /dist/sails.decorator.endpoint.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Model's Query path Decorator 3 | * @param path Query Path for Model 4 | */ 5 | export declare function Endpoint(path?: string): (target: Function) => void; 6 | -------------------------------------------------------------------------------- /dist/sails.decorator.endpoint.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"Endpoint":{"__symbolic":"function","parameters":["path"],"value":{"__symbolic":"error","message":"Lambda not supported","line":5,"character":11},"defaults":[""]}}}] -------------------------------------------------------------------------------- /dist/utils.d.ts: -------------------------------------------------------------------------------- 1 | export declare function isUndefined(value: any): boolean; 2 | export declare function isString(value: any): boolean; 3 | export declare function isEmptyObject(value: any): boolean; 4 | export declare function isObject(value: any): boolean; 5 | -------------------------------------------------------------------------------- /dist/sails.serialize.d.ts: -------------------------------------------------------------------------------- 1 | export declare function unserialize(clazz: { 2 | new (): T; 3 | }, data: any): T; 4 | export declare function serialize(instance: T): String; 5 | export { JsonIgnore as Ignore, JsonProperty as Property } from "json-object-mapper"; 6 | -------------------------------------------------------------------------------- /dist/sails.options.d.ts: -------------------------------------------------------------------------------- 1 | import { SailsIOClient } from "./sails.io.client"; 2 | /** 3 | * Library specific configuration options 4 | * @extends SailsIOClient.Options 5 | */ 6 | export interface SailsOptions extends SailsIOClient.Options { 7 | prefix?: string; 8 | } 9 | -------------------------------------------------------------------------------- /demo/e2e/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class DemoPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.css('app-root h1')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /dist/sails.config.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsConfig":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"./sails.options","name":"SailsOptions","line":25,"character":32}]}]}}}}] -------------------------------------------------------------------------------- /src/sails.options.ts: -------------------------------------------------------------------------------- 1 | import { SailsIOClient } from "./sails.io.client"; 2 | 3 | /** 4 | * Library specific configuration options 5 | * @extends SailsIOClient.Options 6 | */ 7 | export interface SailsOptions extends SailsIOClient.Options { 8 | prefix?: string; 9 | } 10 | -------------------------------------------------------------------------------- /demo/src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "baseUrl": "./", 6 | "module": "es2015", 7 | "types": [] 8 | }, 9 | "exclude": [ 10 | "test.ts", 11 | "**/*.spec.ts" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /demo/src/app/interceptors/index.ts: -------------------------------------------------------------------------------- 1 | import { AuthInterceptor } from "./auth.interceptor"; 2 | import { ExtraInterceptor } from "./extra.interceptor"; 3 | 4 | // The order in which they appear is also important 5 | export const INTERCEPTORS = [ 6 | AuthInterceptor, 7 | ExtraInterceptor 8 | ]; 9 | -------------------------------------------------------------------------------- /demo/src/app/components/login/login.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

4 | Hello Login SocketIO! 5 |

6 | 7 |
8 | 9 | LOGIN 10 |
11 | -------------------------------------------------------------------------------- /dist/sails.model.interface.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.model.interface.js","sourceRoot":"","sources":["../src/sails.model.interface.ts"],"names":[],"mappings":"","sourcesContent":["export interface SailsModelInterface {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n\n getEndPoint: () => string;\n}\n"]} -------------------------------------------------------------------------------- /demo/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 4 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /demo/e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": [ 9 | "jasmine", 10 | "jasminewd2", 11 | "node" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/sails.decorator.endpoint.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Model's Query path Decorator 3 | * @param path Query Path for Model 4 | */ 5 | export function Endpoint(path: string = "") { 6 | return (target: Function) => { 7 | target.prototype.getEndPoint = () => { 8 | return path; 9 | }; 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /dist/sails.subscription.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsSubscription":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"./sails","name":"Sails","line":6,"character":31}]}],"on":[{"__symbolic":"method"}],"off":[{"__symbolic":"method"}]}}}}] -------------------------------------------------------------------------------- /dist/sails.module.d.ts: -------------------------------------------------------------------------------- 1 | import { ModuleWithProviders } from "@angular/core"; 2 | import { SailsOptions } from "./sails.options"; 3 | import { SailsInterceptorConstructor } from "./sails.interceptor"; 4 | export declare class SailsModule { 5 | static forRoot(options: SailsOptions, interceptors?: SailsInterceptorConstructor[]): ModuleWithProviders; 6 | } 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | dist: trusty 3 | 4 | #install google chrome, using addons 5 | addons: 6 | apt: 7 | sources: 8 | - google-chrome 9 | packages: 10 | - google-chrome-stable 11 | 12 | language: node_js 13 | node_js: 14 | - "10.9.0" 15 | 16 | before_install: 17 | - npm install -g --quiet mocha @angular/cli 18 | - npm link 19 | -------------------------------------------------------------------------------- /dist/sails.subscription.d.ts: -------------------------------------------------------------------------------- 1 | import { Sails } from "./sails"; 2 | import { SailsEvent } from "./sails.event"; 3 | import { Observable } from "rxjs"; 4 | export declare class SailsSubscription { 5 | private sails; 6 | constructor(sails: Sails); 7 | on(eventName: any): Observable; 8 | off(eventName: any): Observable; 9 | } 10 | -------------------------------------------------------------------------------- /demo/src/app/components/dashboard/dashboard.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

4 | Hello Dashboard! 5 |

6 | 7 |
8 | 9 |
{{ boqs$ | async | json }}
10 | 11 | LOGOUT 12 |
13 | -------------------------------------------------------------------------------- /demo/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Demo 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo/e2e/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { DemoPage } from './app.po'; 2 | 3 | describe('demo App', () => { 4 | let page: DemoPage; 5 | 6 | beforeEach(() => { 7 | page = new DemoPage(); 8 | }); 9 | 10 | it('should display welcome message', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toEqual('Welcome to app!'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /dist/sails.options.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.options.js","sourceRoot":"","sources":["../src/sails.options.ts"],"names":[],"mappings":"","sourcesContent":["import { SailsIOClient } from \"./sails.io.client\";\n\n/**\n * Library specific configuration options\n * @extends SailsIOClient.Options\n */\nexport interface SailsOptions extends SailsIOClient.Options {\n prefix?: string;\n}\n"]} -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | export function isUndefined(value) { 2 | return typeof value === "undefined"; 3 | } 4 | 5 | export function isString(value) { 6 | return typeof value === "string"; 7 | } 8 | 9 | export function isEmptyObject(value) { 10 | return !Object.keys(value).length; 11 | } 12 | 13 | export function isObject(value) { 14 | return value instanceof Object; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /demo/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from "@angular/core"; 2 | import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; 3 | 4 | import { AppModule } from "./app/app.module"; 5 | import { environment } from "./environments/environment"; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule); 12 | -------------------------------------------------------------------------------- /dist/utils.js: -------------------------------------------------------------------------------- 1 | export function isUndefined(value) { 2 | return typeof value === "undefined"; 3 | } 4 | export function isString(value) { 5 | return typeof value === "string"; 6 | } 7 | export function isEmptyObject(value) { 8 | return !Object.keys(value).length; 9 | } 10 | export function isObject(value) { 11 | return value instanceof Object; 12 | } 13 | //# sourceMappingURL=utils.js.map -------------------------------------------------------------------------------- /dist/sails.serialize.js: -------------------------------------------------------------------------------- 1 | import { ObjectMapper } from "json-object-mapper"; 2 | export function unserialize(clazz, data) { 3 | return ObjectMapper.deserialize(clazz, data); 4 | } 5 | export function serialize(instance) { 6 | return ObjectMapper.serialize(instance); 7 | } 8 | export { JsonIgnore as Ignore, JsonProperty as Property } from "json-object-mapper"; 9 | //# sourceMappingURL=sails.serialize.js.map -------------------------------------------------------------------------------- /dist/sails.decorator.endpoint.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Model's Query path Decorator 3 | * @param path Query Path for Model 4 | */ 5 | export function Endpoint(path) { 6 | if (path === void 0) { path = ""; } 7 | return function (target) { 8 | target.prototype.getEndPoint = function () { 9 | return path; 10 | }; 11 | }; 12 | } 13 | //# sourceMappingURL=sails.decorator.endpoint.js.map -------------------------------------------------------------------------------- /demo/src/app/models/category.model.ts: -------------------------------------------------------------------------------- 1 | import { SailsModel, Property, Endpoint } from "ngx-sails-socketio"; 2 | 3 | @Endpoint("category") 4 | export class CategoryModel extends SailsModel { 5 | @Property() 6 | baseFee: number = null; 7 | @Property() 8 | cancellationFee: number = null; 9 | @Property() 10 | description: string = null; 11 | @Property() 12 | name: string = null; 13 | } 14 | -------------------------------------------------------------------------------- /demo/src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | }, 13 | "files": [ 14 | "test.ts" 15 | ], 16 | "include": [ 17 | "**/*.spec.ts", 18 | "**/*.d.ts" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /src/sails.serialize.ts: -------------------------------------------------------------------------------- 1 | import { ObjectMapper } from "json-object-mapper"; 2 | 3 | export function unserialize(clazz: { new(): T }, data: any): T { 4 | return ObjectMapper.deserialize(clazz, data); 5 | } 6 | 7 | export function serialize(instance: T): String { 8 | return ObjectMapper.serialize(instance); 9 | } 10 | 11 | export { JsonIgnore as Ignore, JsonProperty as Property } from "json-object-mapper"; -------------------------------------------------------------------------------- /dist/sails.model.d.ts: -------------------------------------------------------------------------------- 1 | import { SailsModelInterface } from "./sails.model.interface"; 2 | export declare abstract class SailsModel implements SailsModelInterface { 3 | id: string; 4 | createdAt: Date; 5 | updatedAt: Date; 6 | getEndPoint(): string; 7 | static serialize(model: U): U; 8 | static unserialize(modelClazz: any, data: U | U[]): U | U[]; 9 | } 10 | -------------------------------------------------------------------------------- /demo/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // The file contents for the current environment will overwrite these during build. 2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 4 | // The list of which env maps to which file can be found in `.angular-cli.json`. 5 | 6 | export const environment = { 7 | production: false 8 | }; 9 | -------------------------------------------------------------------------------- /dist/sails.interceptor.handler.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsInterceptorHandlerInterface":{"__symbolic":"interface"},"SailsInterceptorHandler":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"any"},{"__symbolic":"reference","module":"./sails.interceptor","name":"SailsInterceptorInterface","line":10,"character":85}]}],"handle":[{"__symbolic":"method"}]}}}}] -------------------------------------------------------------------------------- /src/sails.subscription.ts: -------------------------------------------------------------------------------- 1 | import { Sails } from "./sails"; 2 | import { SailsEvent } from "./sails.event"; 3 | import { Observable } from "rxjs"; 4 | 5 | export class SailsSubscription { 6 | 7 | constructor(private sails: Sails) { } 8 | 9 | public on(eventName): Observable { 10 | return this.sails.on(eventName.toLowerCase()); 11 | } 12 | 13 | public off(eventName): Observable { 14 | return this.sails.off(eventName.toLowerCase()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /dist/index.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{},"exports":[{"from":"./sails"},{"from":"./sails.model"},{"from":"./sails.query"},{"from":"./sails.module"},{"from":"./sails.request"},{"from":"./sails.subscription"},{"from":"./sails.options"},{"from":"./sails.response"},{"from":"./sails.event"},{"from":"./sails.serialize"},{"from":"./sails.interceptor"},{"from":"./sails.request.options"},{"from":"./sails.request.criteria"},{"from":"./sails.decorator.endpoint"},{"from":"./sails.interceptor.handler"}]}] -------------------------------------------------------------------------------- /dist/sails.interceptor.handler.js: -------------------------------------------------------------------------------- 1 | var SailsInterceptorHandler = /** @class */ (function () { 2 | function SailsInterceptorHandler(next, interceptor) { 3 | this.next = next; 4 | this.interceptor = interceptor; 5 | } 6 | SailsInterceptorHandler.prototype.handle = function (request) { 7 | return this.interceptor.intercept(request, this.next); 8 | }; 9 | return SailsInterceptorHandler; 10 | }()); 11 | export { SailsInterceptorHandler }; 12 | //# sourceMappingURL=sails.interceptor.handler.js.map -------------------------------------------------------------------------------- /dist/sails.request.options.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsRequestOptionsInterface":{"__symbolic":"interface"},"SailsRequestOptions":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"select","expression":{"__symbolic":"reference","module":"./sails.io.client","name":"SailsIOClient","line":12,"character":50},"member":"RequestOptions"}]}],"clone":[{"__symbolic":"method"}],"toMap":[{"__symbolic":"method"}],"toObject":[{"__symbolic":"method"}],"serialize":[{"__symbolic":"method"}]}}}}] -------------------------------------------------------------------------------- /dist/index.js: -------------------------------------------------------------------------------- 1 | export * from "./sails"; 2 | export * from "./sails.model"; 3 | export * from "./sails.query"; 4 | export * from "./sails.module"; 5 | export * from "./sails.request"; 6 | export * from "./sails.subscription"; 7 | export * from "./sails.response"; 8 | export * from "./sails.event"; 9 | export * from "./sails.serialize"; 10 | export * from "./sails.request.options"; 11 | export * from "./sails.request.criteria"; 12 | export * from "./sails.decorator.endpoint"; 13 | export * from "./sails.interceptor.handler"; 14 | //# sourceMappingURL=index.js.map -------------------------------------------------------------------------------- /dist/sails.subscription.js: -------------------------------------------------------------------------------- 1 | var SailsSubscription = /** @class */ (function () { 2 | function SailsSubscription(sails) { 3 | this.sails = sails; 4 | } 5 | SailsSubscription.prototype.on = function (eventName) { 6 | return this.sails.on(eventName.toLowerCase()); 7 | }; 8 | SailsSubscription.prototype.off = function (eventName) { 9 | return this.sails.off(eventName.toLowerCase()); 10 | }; 11 | return SailsSubscription; 12 | }()); 13 | export { SailsSubscription }; 14 | //# sourceMappingURL=sails.subscription.js.map -------------------------------------------------------------------------------- /demo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist/out-tsc", 5 | "sourceMap": true, 6 | "declaration": false, 7 | "moduleResolution": "node", 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "target": "es5", 11 | "typeRoots": [ 12 | "node_modules/@types" 13 | ], 14 | "lib": [ 15 | "es2016", 16 | "dom" 17 | ], 18 | "paths": { 19 | "@angular/*": [ 20 | "../node_modules/@angular/*" 21 | ] 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /demo/src/app/models/customer.model.ts: -------------------------------------------------------------------------------- 1 | import { Endpoint, SailsModel, Property } from "ngx-sails-socketio"; 2 | 3 | 4 | @Endpoint("customer") 5 | export class CustomerModel extends SailsModel { 6 | @Property() 7 | firstname: string = null; 8 | @Property() 9 | lastname: string = null; 10 | @Property() 11 | email: string = null; 12 | @Property() 13 | callingCode: number = null; 14 | @Property() 15 | phone: number = null; 16 | @Property() 17 | status: string = null; 18 | @Property() 19 | fullname: string = null; 20 | } 21 | -------------------------------------------------------------------------------- /dist/sails.event.d.ts: -------------------------------------------------------------------------------- 1 | import { SailsIOClient } from "./sails.io.client"; 2 | export declare const Verb: { 3 | CREATED: string; 4 | UPDATED: string; 5 | ADDED: string; 6 | DESTROYED: string; 7 | REMOVED: string; 8 | }; 9 | export declare class SailsEvent { 10 | private JWR; 11 | constructor(JWR: SailsIOClient.JWR.Event); 12 | isCreated(): boolean; 13 | isUpdated(): boolean; 14 | isDestroyed(): boolean; 15 | isAdded(): boolean; 16 | isRemoved(): boolean; 17 | getVerb(): string; 18 | getData(): object; 19 | getId(): string | number; 20 | } 21 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./sails"; 2 | export * from "./sails.model"; 3 | export * from "./sails.query"; 4 | export * from "./sails.module"; 5 | export * from "./sails.request"; 6 | export * from "./sails.subscription"; 7 | export * from "./sails.options"; 8 | export * from "./sails.response"; 9 | export * from "./sails.event"; 10 | export * from "./sails.serialize"; 11 | export * from "./sails.interceptor"; 12 | export * from "./sails.request.options"; 13 | export * from "./sails.request.criteria"; 14 | export * from "./sails.decorator.endpoint"; 15 | export * from "./sails.interceptor.handler"; -------------------------------------------------------------------------------- /demo/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, async } from "@angular/core/testing"; 2 | 3 | import { AppComponent } from "./app.component"; 4 | 5 | describe("AppComponent", () => { 6 | beforeEach(async(() => { 7 | TestBed.configureTestingModule({ 8 | declarations: [ 9 | AppComponent 10 | ], 11 | }).compileComponents(); 12 | })); 13 | 14 | it("should create the app", async(() => { 15 | const fixture = TestBed.createComponent(AppComponent); 16 | const app = fixture.debugElement.componentInstance; 17 | expect(app).toBeTruthy(); 18 | })); 19 | }); 20 | -------------------------------------------------------------------------------- /dist/index.d.ts: -------------------------------------------------------------------------------- 1 | export * from "./sails"; 2 | export * from "./sails.model"; 3 | export * from "./sails.query"; 4 | export * from "./sails.module"; 5 | export * from "./sails.request"; 6 | export * from "./sails.subscription"; 7 | export * from "./sails.options"; 8 | export * from "./sails.response"; 9 | export * from "./sails.event"; 10 | export * from "./sails.serialize"; 11 | export * from "./sails.interceptor"; 12 | export * from "./sails.request.options"; 13 | export * from "./sails.request.criteria"; 14 | export * from "./sails.decorator.endpoint"; 15 | export * from "./sails.interceptor.handler"; 16 | -------------------------------------------------------------------------------- /dist/sails.decorator.endpoint.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.decorator.endpoint.js","sourceRoot":"","sources":["../src/sails.decorator.endpoint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,mBAAmB,IAAiB;IAAjB,qBAAA,EAAA,SAAiB;IACtC,OAAO,UAAC,MAAgB;QACpB,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG;YAC3B,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;IACN,CAAC,CAAC;AACN,CAAC","sourcesContent":["/**\n * Model's Query path Decorator\n * @param path Query Path for Model\n */\nexport function Endpoint(path: string = \"\") {\n return (target: Function) => {\n target.prototype.getEndPoint = () => {\n return path;\n };\n };\n}\n"]} -------------------------------------------------------------------------------- /demo/src/app/models/boq.model.ts: -------------------------------------------------------------------------------- 1 | import { SailsModel, Property, Endpoint } from "ngx-sails-socketio"; 2 | import { CustomerModel } from "./customer.model"; 3 | import { CategoryModel } from "./category.model"; 4 | import { JobModel } from "./job.model"; 5 | 6 | @Endpoint("boq") 7 | export class BoqModel extends SailsModel { 8 | @Property({ type: CustomerModel }) 9 | customer: CustomerModel = null; 10 | @Property({ type: CategoryModel }) 11 | category: CategoryModel = null; 12 | @Property({ type: JobModel }) 13 | job: JobModel = null; 14 | @Property() 15 | status: boolean = null; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /dist/sails.request.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"Method":{"GET":"get","POST":"post","PUT":"put","DELETE":"delete","PATCH":"patch"},"SailsRequest":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"./sails","name":"Sails","line":38,"character":31}]}],"get":[{"__symbolic":"method"}],"post":[{"__symbolic":"method"}],"put":[{"__symbolic":"method"}],"delete":[{"__symbolic":"method"}],"patch":[{"__symbolic":"method"}],"_request":[{"__symbolic":"method"}],"addParam":[{"__symbolic":"method"}],"getParams":[{"__symbolic":"method"}],"buildQuery":[{"__symbolic":"method"}]}}}}] -------------------------------------------------------------------------------- /dist/sails.interceptor.d.ts: -------------------------------------------------------------------------------- 1 | import { SailsResponse } from "./sails.response"; 2 | import { SailsRequestOptions } from "./sails.request.options"; 3 | import { SailsInterceptorHandlerInterface } from "./sails.interceptor.handler"; 4 | import { Observable } from "rxjs"; 5 | export interface SailsInterceptorConstructor { 6 | /** 7 | * Allows Angular Dependency Injection 8 | */ 9 | new (...args: any[]): any; 10 | } 11 | export interface SailsInterceptorInterface { 12 | /** 13 | * @returns Observable 14 | */ 15 | intercept(request: SailsRequestOptions, next: SailsInterceptorHandlerInterface): Observable; 16 | } 17 | -------------------------------------------------------------------------------- /src/sails.interceptor.ts: -------------------------------------------------------------------------------- 1 | import { SailsResponse } from "./sails.response"; 2 | import { SailsRequestOptions } from "./sails.request.options"; 3 | import { SailsInterceptorHandlerInterface } from "./sails.interceptor.handler"; 4 | import { Observable } from "rxjs"; 5 | 6 | export interface SailsInterceptorConstructor { 7 | /** 8 | * Allows Angular Dependency Injection 9 | */ 10 | new(...args: any[]): any; 11 | } 12 | 13 | export interface SailsInterceptorInterface { 14 | /** 15 | * @returns Observable 16 | */ 17 | intercept(request: SailsRequestOptions, next: SailsInterceptorHandlerInterface): Observable; 18 | } 19 | -------------------------------------------------------------------------------- /demo/src/app/components/login/login.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, inject } from '@angular/core/testing'; 2 | 3 | import { LoginComponent } from './login.component'; 4 | 5 | describe('a login component', () => { 6 | let component: LoginComponent; 7 | 8 | // register all needed dependencies 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | providers: [ 12 | LoginComponent 13 | ] 14 | }); 15 | }); 16 | 17 | // instantiation through framework injection 18 | beforeEach(inject([LoginComponent], (LoginComponent) => { 19 | component = LoginComponent; 20 | })); 21 | 22 | it('should have an instance', () => { 23 | expect(component).toBeDefined(); 24 | }); 25 | }); -------------------------------------------------------------------------------- /dist/sails.config.d.ts: -------------------------------------------------------------------------------- 1 | import { SailsOptions } from "./sails.options"; 2 | export declare class SailsConfig implements SailsOptions { 3 | url: string; 4 | query: string; 5 | reconnection: boolean; 6 | autoConnect: boolean; 7 | transports: string[]; 8 | useCORSRouteToGetCookie: boolean; 9 | headers: {}; 10 | timeout: number; 11 | path: string; 12 | prefix: string; 13 | initialConnectionHeaders: any; 14 | multiplex: any; 15 | reconnectionAttempts: any; 16 | reconnectionDelay: any; 17 | reconnectionDelayMax: any; 18 | rejectUnauthorized: any; 19 | randomizationFactor: any; 20 | environment: any; 21 | constructor(options: SailsOptions); 22 | } 23 | -------------------------------------------------------------------------------- /dist/sails.event.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"Verb":{"CREATED":"created","UPDATED":"updated","ADDED":"added","DESTROYED":"destroyed","REMOVED":"removed"},"SailsEvent":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"select","expression":{"__symbolic":"error","message":"Expression form not supported","line":11,"character":29},"member":"Event"}]}],"isCreated":[{"__symbolic":"method"}],"isUpdated":[{"__symbolic":"method"}],"isDestroyed":[{"__symbolic":"method"}],"isAdded":[{"__symbolic":"method"}],"isRemoved":[{"__symbolic":"method"}],"getVerb":[{"__symbolic":"method"}],"getData":[{"__symbolic":"method"}],"getId":[{"__symbolic":"method"}]}}}}] -------------------------------------------------------------------------------- /dist/sails.interceptor.handler.d.ts: -------------------------------------------------------------------------------- 1 | import { SailsResponse } from "./sails.response"; 2 | import { SailsRequestOptions } from "./sails.request.options"; 3 | import { SailsInterceptorInterface } from "./sails.interceptor"; 4 | import { Observable } from "rxjs"; 5 | export interface SailsInterceptorHandlerInterface { 6 | handle(request: SailsRequestOptions): Observable; 7 | } 8 | export declare class SailsInterceptorHandler implements SailsInterceptorHandlerInterface { 9 | private next; 10 | private interceptor; 11 | constructor(next: SailsInterceptorHandlerInterface, interceptor: SailsInterceptorInterface); 12 | handle(request: SailsRequestOptions): Observable; 13 | } 14 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | 8 | # dependencies 9 | /node_modules 10 | 11 | # IDEs and editors 12 | /.idea 13 | .project 14 | .classpath 15 | .c9/ 16 | *.launch 17 | .settings/ 18 | *.sublime-workspace 19 | 20 | # IDE - VSCode 21 | .vscode/* 22 | !.vscode/settings.json 23 | !.vscode/tasks.json 24 | !.vscode/launch.json 25 | !.vscode/extensions.json 26 | 27 | # misc 28 | /.sass-cache 29 | /connect.lock 30 | /coverage 31 | /libpeerconnection.log 32 | npm-debug.log 33 | testem.log 34 | /typings 35 | 36 | # e2e 37 | /e2e/*.js 38 | /e2e/*.map 39 | 40 | # System Files 41 | .DS_Store 42 | Thumbs.db 43 | .gitkeep 44 | -------------------------------------------------------------------------------- /demo/src/app/components/dashboard/dashboard.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, inject } from '@angular/core/testing'; 2 | 3 | import { DashboardComponent } from './dashboard.component'; 4 | 5 | describe('a dashboard component', () => { 6 | let component: DashboardComponent; 7 | 8 | // register all needed dependencies 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | providers: [ 12 | DashboardComponent 13 | ] 14 | }); 15 | }); 16 | 17 | // instantiation through framework injection 18 | beforeEach(inject([DashboardComponent], (DashboardComponent) => { 19 | component = DashboardComponent; 20 | })); 21 | 22 | it('should have an instance', () => { 23 | expect(component).toBeDefined(); 24 | }); 25 | }); -------------------------------------------------------------------------------- /dist/sails.request.criteria.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"RequestCriteria":{"__symbolic":"class","members":{"or":[{"__symbolic":"method"}],"whereNotEqualTo":[{"__symbolic":"method"}],"whereLike":[{"__symbolic":"method"}],"whereEqualTo":[{"__symbolic":"method"}],"whereContains":[{"__symbolic":"method"}],"whereIn":[{"__symbolic":"method"}],"whereStartsWith":[{"__symbolic":"method"}],"whereEndsWith":[{"__symbolic":"method"}],"whereNotIn":[{"__symbolic":"method"}],"whereLessThan":[{"__symbolic":"method"}],"whereLessThanOrEqualTo":[{"__symbolic":"method"}],"whereGreaterThan":[{"__symbolic":"method"}],"whereGreaterThanOrEqualTo":[{"__symbolic":"method"}],"build":[{"__symbolic":"method"}],"toString":[{"__symbolic":"method"}]}}}}] -------------------------------------------------------------------------------- /dist/utils.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,sBAAsB,KAAK;IAC7B,OAAO,OAAO,KAAK,KAAK,WAAW,CAAC;AACxC,CAAC;AAED,MAAM,mBAAmB,KAAK;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACrC,CAAC;AAED,MAAM,wBAAwB,KAAK;IAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AACtC,CAAC;AAED,MAAM,mBAAmB,KAAK;IAC1B,OAAO,KAAK,YAAY,MAAM,CAAC;AACnC,CAAC","sourcesContent":["export function isUndefined(value) {\n return typeof value === \"undefined\";\n}\n\nexport function isString(value) {\n return typeof value === \"string\";\n}\n\nexport function isEmptyObject(value) {\n return !Object.keys(value).length;\n}\n\nexport function isObject(value) {\n return value instanceof Object;\n}\n\n"]} -------------------------------------------------------------------------------- /dist/sails.interceptor.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.interceptor.js","sourceRoot":"","sources":["../src/sails.interceptor.ts"],"names":[],"mappings":"","sourcesContent":["import { SailsResponse } from \"./sails.response\";\nimport { SailsRequestOptions } from \"./sails.request.options\";\nimport { SailsInterceptorHandlerInterface } from \"./sails.interceptor.handler\";\nimport { Observable } from \"rxjs\";\n\nexport interface SailsInterceptorConstructor {\n /**\n * Allows Angular Dependency Injection\n */\n new(...args: any[]): any;\n}\n\nexport interface SailsInterceptorInterface {\n /**\n * @returns Observable\n */\n intercept(request: SailsRequestOptions, next: SailsInterceptorHandlerInterface): Observable;\n}\n"]} -------------------------------------------------------------------------------- /dist/sails.query.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsQuery":{"__symbolic":"class","arity":1,"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"./sails","name":"Sails","line":17,"character":23},{"__symbolic":"error","message":"Expression form not supported","line":17,"character":50}]}],"find":[{"__symbolic":"method"}],"findById":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}],"update":[{"__symbolic":"method"}],"remove":[{"__symbolic":"method"}],"setLimit":[{"__symbolic":"method"}],"setSort":[{"__symbolic":"method"}],"setSkip":[{"__symbolic":"method"}],"setPopulation":[{"__symbolic":"method"}],"setRequestCriteria":[{"__symbolic":"method"}],"getRequestCriteria":[{"__symbolic":"method"}]}}}}] -------------------------------------------------------------------------------- /src/sails.interceptor.handler.ts: -------------------------------------------------------------------------------- 1 | import { SailsResponse } from "./sails.response"; 2 | import { SailsRequestOptions } from "./sails.request.options"; 3 | import { SailsInterceptorInterface } from "./sails.interceptor"; 4 | import { Observable } from "rxjs"; 5 | 6 | export interface SailsInterceptorHandlerInterface { 7 | handle(request: SailsRequestOptions): Observable; 8 | } 9 | 10 | export class SailsInterceptorHandler implements SailsInterceptorHandlerInterface { 11 | constructor(private next: SailsInterceptorHandlerInterface, private interceptor: SailsInterceptorInterface) { } 12 | 13 | handle(request: SailsRequestOptions): Observable { 14 | return this.interceptor.intercept(request, this.next); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /dist/sails.response.d.ts: -------------------------------------------------------------------------------- 1 | import { SailsIOClient } from "./sails.io.client"; 2 | export declare class SailsResponse { 3 | private JWR; 4 | constructor(JWR: SailsIOClient.JWR.Response); 5 | isOk(): boolean; 6 | isCreated(): boolean; 7 | isUnauthorized(): boolean; 8 | isForbidden(): boolean; 9 | isNotFound(): boolean; 10 | isBadRequest(): boolean; 11 | isError(): boolean; 12 | isClientError(): boolean; 13 | isServerError(): boolean; 14 | getCode(): string; 15 | getData(): any; 16 | getMessage(): string; 17 | getBody(): any; 18 | getHeaders(): SailsIOClient.Headers; 19 | getError(): string; 20 | getStatusCode(): number; 21 | pipe(): Error; 22 | toPOJO(): object; 23 | toString(): string; 24 | } 25 | -------------------------------------------------------------------------------- /src/sails.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule, ModuleWithProviders } from "@angular/core"; 2 | import { Sails, SAILS_OPTIONS, SAILS_INTERCEPTORS } from "./sails"; 3 | import { SailsOptions } from "./sails.options"; 4 | import { SailsInterceptorConstructor } from "./sails.interceptor"; 5 | 6 | @NgModule() 7 | export class SailsModule { 8 | static forRoot(options: SailsOptions, interceptors: SailsInterceptorConstructor[] = []): ModuleWithProviders { 9 | return { 10 | ngModule: SailsModule, 11 | providers: [ 12 | Sails, 13 | ...interceptors, 14 | { provide: SAILS_OPTIONS, useValue: options }, 15 | { provide: SAILS_INTERCEPTORS, useValue: interceptors }, 16 | ] 17 | }; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /dist/sails.request.options.d.ts: -------------------------------------------------------------------------------- 1 | import { SailsIOClient } from "./sails.io.client"; 2 | export interface SailsRequestOptionsInterface { 3 | url?: string; 4 | method?: string; 5 | params?: Map; 6 | headers?: Map; 7 | } 8 | export declare class SailsRequestOptions { 9 | private readonly options; 10 | constructor({ url, method, params, headers }: SailsIOClient.RequestOptions); 11 | clone(options: SailsRequestOptionsInterface): this; 12 | private toMap; 13 | private toObject; 14 | readonly method: string | undefined; 15 | readonly url: string | undefined; 16 | readonly params: Map | undefined; 17 | readonly headers: Map | undefined; 18 | serialize(): SailsIOClient.RequestOptions; 19 | } 20 | -------------------------------------------------------------------------------- /dist/sails.serialize.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.serialize.js","sourceRoot":"","sources":["../src/sails.serialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,sBAAyB,KAAmB,EAAE,IAAS;IACzD,OAAO,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,oBAAuB,QAAW;IACpC,OAAO,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,YAAY,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["import { ObjectMapper } from \"json-object-mapper\";\n\nexport function unserialize(clazz: { new(): T }, data: any): T {\n return ObjectMapper.deserialize(clazz, data);\n}\n\nexport function serialize(instance: T): String {\n return ObjectMapper.serialize(instance);\n}\n\nexport { JsonIgnore as Ignore, JsonProperty as Property } from \"json-object-mapper\";"]} -------------------------------------------------------------------------------- /demo/src/app/interceptors/extra.interceptor.ts: -------------------------------------------------------------------------------- 1 | import { SailsResponse, SailsInterceptorInterface, SailsRequestOptions, SailsInterceptorHandlerInterface } from "ngx-sails-socketio"; 2 | import { Router } from "@angular/router"; 3 | import { Injectable } from "@angular/core"; 4 | import { Observable } from "rxjs/Observable"; 5 | 6 | @Injectable() 7 | export class ExtraInterceptor implements SailsInterceptorInterface { 8 | 9 | constructor(private router: Router) { 10 | } 11 | 12 | intercept(request: SailsRequestOptions, next: SailsInterceptorHandlerInterface): Observable { 13 | console.log("Extra: ", request); 14 | request.clone({ 15 | headers: request.headers.set("Content-type", "text/plain") 16 | }); 17 | return next.handle(request); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /dist/sails.config.js: -------------------------------------------------------------------------------- 1 | var __SAILS_VERSION__ = "0.11.0"; 2 | var __OS_PLATFORM__ = "windows"; 3 | var SailsConfig = /** @class */ (function () { 4 | function SailsConfig(options) { 5 | this.url = "ws://localhost:1337"; 6 | this.query = "__sails_io_sdk_version=" + __SAILS_VERSION__ + "&__sails_io_sdk_platform=" + __OS_PLATFORM__ + "&__sails_io_sdk_language=javascript"; 7 | this.reconnection = true; 8 | this.autoConnect = true; 9 | this.transports = ["websocket"]; 10 | this.useCORSRouteToGetCookie = false; 11 | this.headers = {}; 12 | this.timeout = 20000; 13 | this.path = ""; 14 | this.prefix = ""; 15 | Object.assign(this, options); 16 | } 17 | return SailsConfig; 18 | }()); 19 | export { SailsConfig }; 20 | //# sourceMappingURL=sails.config.js.map -------------------------------------------------------------------------------- /demo/src/app/models/job.model.ts: -------------------------------------------------------------------------------- 1 | import { SailsModel, Property, Endpoint } from "ngx-sails-socketio"; 2 | import { CustomerModel } from "./customer.model"; 3 | import { CategoryModel } from "./category.model"; 4 | import { FixerModel } from "./fixer.model"; 5 | 6 | @Endpoint("job") 7 | export class JobModel extends SailsModel { 8 | @Property({ type: CustomerModel }) 9 | customer: CustomerModel = null; 10 | @Property({ type: CategoryModel }) 11 | category: CategoryModel = null; 12 | @Property({ type: FixerModel }) 13 | fixer: FixerModel = null; 14 | @Property() 15 | coordinates: number[] = null; 16 | @Property() 17 | progress: number = null; 18 | @Property() 19 | reference: string = null; 20 | @Property() 21 | status: string = null; 22 | @Property() 23 | brief: string = null; 24 | } 25 | -------------------------------------------------------------------------------- /demo/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: [ 9 | './e2e/**/*.e2e-spec.ts' 10 | ], 11 | capabilities: { 12 | 'browserName': 'chrome' 13 | }, 14 | directConnect: true, 15 | baseUrl: 'http://localhost:4200/', 16 | framework: 'jasmine', 17 | jasmineNodeOpts: { 18 | showColors: true, 19 | defaultTimeoutInterval: 30000, 20 | print: function() {} 21 | }, 22 | onPrepare() { 23 | require('ts-node').register({ 24 | project: 'e2e/tsconfig.e2e.json' 25 | }); 26 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | 2 | export default { 3 | entry: 'dist/index.js', 4 | dest: 'dist/bundles/ngx.sails.socketio.umd.js', 5 | sourceMap: false, 6 | format: 'umd', 7 | moduleName: 'ng.amazing', 8 | globals: { 9 | '@angular/core': 'ng.core', 10 | 'rxjs/Observable': 'Rx', 11 | 'rxjs/ReplaySubject': 'Rx', 12 | 'rxjs/add/operator/map': 'Rx.Observable.prototype', 13 | 'rxjs/add/operator/filter': 'Rx.Observable.prototype', 14 | 'rxjs/add/operator/mergeMap': 'Rx.Observable.prototype', 15 | 'rxjs/add/operator/merge': 'Rx.Observable.prototype', 16 | 'rxjs/add/operator/switchMap': 'Rx.Observable.prototype', 17 | 'rxjs/add/operator/switch': 'Rx.Observable.prototype', 18 | 'rxjs/add/observable/fromEvent': 'Rx.Observable', 19 | 'rxjs/add/observable/of': 'Rx.Observable' 20 | } 21 | } -------------------------------------------------------------------------------- /dist/sails.serialize.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"unserialize":{"__symbolic":"function","parameters":["clazz","data"],"value":{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"json-object-mapper","name":"ObjectMapper","line":3,"character":11},"member":"deserialize"},"arguments":[{"__symbolic":"reference","name":"clazz"},{"__symbolic":"reference","name":"data"}]}},"serialize":{"__symbolic":"function","parameters":["instance"],"value":{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"json-object-mapper","name":"ObjectMapper","line":7,"character":11},"member":"serialize"},"arguments":[{"__symbolic":"reference","name":"instance"}]}}},"exports":[{"from":"json-object-mapper","export":[{"name":"JsonIgnore","as":"Ignore"},{"name":"JsonProperty","as":"Property"}]}]}] -------------------------------------------------------------------------------- /dist/sails.module.js: -------------------------------------------------------------------------------- 1 | import { NgModule } from "@angular/core"; 2 | import { Sails, SAILS_OPTIONS, SAILS_INTERCEPTORS } from "./sails"; 3 | var SailsModule = /** @class */ (function () { 4 | function SailsModule() { 5 | } 6 | SailsModule.forRoot = function (options, interceptors) { 7 | if (interceptors === void 0) { interceptors = []; } 8 | return { 9 | ngModule: SailsModule, 10 | providers: [ 11 | Sails 12 | ].concat(interceptors, [ 13 | { provide: SAILS_OPTIONS, useValue: options }, 14 | { provide: SAILS_INTERCEPTORS, useValue: interceptors }, 15 | ]) 16 | }; 17 | }; 18 | SailsModule.decorators = [ 19 | { type: NgModule }, 20 | ]; 21 | return SailsModule; 22 | }()); 23 | export { SailsModule }; 24 | //# sourceMappingURL=sails.module.js.map -------------------------------------------------------------------------------- /dist/sails.subscription.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.subscription.js","sourceRoot":"","sources":["../src/sails.subscription.ts"],"names":[],"mappings":"AAIA;IAEI,2BAAoB,KAAY;QAAZ,UAAK,GAAL,KAAK,CAAO;IAAI,CAAC;IAE9B,8BAAE,GAAT,UAAU,SAAS;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC;IAEM,+BAAG,GAAV,UAAW,SAAS;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IACnD,CAAC;IACL,wBAAC;AAAD,CAAC,AAXD,IAWC","sourcesContent":["import { Sails } from \"./sails\";\nimport { SailsEvent } from \"./sails.event\";\nimport { Observable } from \"rxjs\";\n\nexport class SailsSubscription {\n\n constructor(private sails: Sails) { }\n\n public on(eventName): Observable {\n return this.sails.on(eventName.toLowerCase());\n }\n\n public off(eventName): Observable {\n return this.sails.off(eventName.toLowerCase());\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/sails.module.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":5,"character":1}}],"statics":{"forRoot":{"__symbolic":"function","parameters":["options","interceptors"],"value":{"ngModule":{"__symbolic":"reference","name":"SailsModule"},"providers":[{"__symbolic":"reference","module":"./sails","name":"Sails","line":11,"character":16},{"__symbolic":"spread","expression":{"__symbolic":"reference","name":"interceptors"}},{"provide":{"__symbolic":"reference","module":"./sails","name":"SAILS_OPTIONS","line":13,"character":27},"useValue":{"__symbolic":"reference","name":"options"}},{"provide":{"__symbolic":"reference","module":"./sails","name":"SAILS_INTERCEPTORS","line":14,"character":27},"useValue":{"__symbolic":"reference","name":"interceptors"}}]},"defaults":[null,[]]}}}}}] -------------------------------------------------------------------------------- /dist/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AAErC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAElC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC","sourcesContent":["export * from \"./sails\";\nexport * from \"./sails.model\";\nexport * from \"./sails.query\";\nexport * from \"./sails.module\";\nexport * from \"./sails.request\";\nexport * from \"./sails.subscription\";\nexport * from \"./sails.options\";\nexport * from \"./sails.response\";\nexport * from \"./sails.event\";\nexport * from \"./sails.serialize\";\nexport * from \"./sails.interceptor\";\nexport * from \"./sails.request.options\";\nexport * from \"./sails.request.criteria\";\nexport * from \"./sails.decorator.endpoint\";\nexport * from \"./sails.interceptor.handler\";"]} -------------------------------------------------------------------------------- /dist/sails.model.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsModel":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"./sails.decorator.endpoint","name":"Endpoint","line":5,"character":1}}],"members":{"id":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"./sails.serialize","name":"Property","line":7,"character":5}}]}],"createdAt":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"./sails.serialize","name":"Property","line":8,"character":5},"arguments":[{"type":{"__symbolic":"reference","name":"Date"}}]}]}],"updatedAt":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"./sails.serialize","name":"Property","line":9,"character":5},"arguments":[{"type":{"__symbolic":"reference","name":"Date"}}]}]}],"getEndPoint":[{"__symbolic":"method"}]}}}}] -------------------------------------------------------------------------------- /demo/src/app/models/fixer.model.ts: -------------------------------------------------------------------------------- 1 | import { SailsModel, Property, Endpoint } from "ngx-sails-socketio"; 2 | 3 | @Endpoint("fixer") 4 | export class FixerModel extends SailsModel { 5 | @Property() 6 | bankAccount: number = null; 7 | @Property() 8 | location: string = null; 9 | 10 | @Property() 11 | address: string = null; 12 | @Property() 13 | firstname: string = null; 14 | @Property() 15 | lastname: string = null; 16 | @Property() 17 | email: string = null; 18 | @Property() 19 | phone: string = null; 20 | @Property() 21 | gender: string = null; 22 | @Property() 23 | freelancer: boolean = null; 24 | @Property() 25 | coordinates: number[] = null; 26 | @Property() 27 | totalRating: number = null; 28 | @Property() 29 | engaged: false; 30 | @Property() 31 | status: string = null; 32 | @Property() 33 | fullname: string = null; 34 | @Property() 35 | rating: number = null; 36 | } 37 | -------------------------------------------------------------------------------- /dist/sails.query.d.ts: -------------------------------------------------------------------------------- 1 | import { Sails } from "./sails"; 2 | import { SailsModelInterface } from "./sails.model.interface"; 3 | import { RequestCriteria } from "./sails.request.criteria"; 4 | import { Observable } from "rxjs"; 5 | export declare class SailsQuery { 6 | private modelClass; 7 | private model; 8 | private request; 9 | private criteria; 10 | private errorMsg; 11 | constructor(sails: Sails, modelClass: { 12 | new (): T; 13 | }); 14 | find(): Observable; 15 | findById(id: string): Observable; 16 | save(model: T): Observable; 17 | update(id: string, model: Partial): Observable; 18 | remove(id: string): Observable; 19 | setLimit(limit: number): this; 20 | setSort(sort: string): this; 21 | setSkip(skip: number): this; 22 | setPopulation(...population: string[]): this; 23 | setRequestCriteria(criteria: RequestCriteria): this; 24 | private getRequestCriteria; 25 | } 26 | -------------------------------------------------------------------------------- /dist/sails.response.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SailsResponse":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"select","expression":{"__symbolic":"error","message":"Expression form not supported","line":3,"character":29},"member":"Response"}]}],"isOk":[{"__symbolic":"method"}],"isCreated":[{"__symbolic":"method"}],"isUnauthorized":[{"__symbolic":"method"}],"isForbidden":[{"__symbolic":"method"}],"isNotFound":[{"__symbolic":"method"}],"isBadRequest":[{"__symbolic":"method"}],"isError":[{"__symbolic":"method"}],"isClientError":[{"__symbolic":"method"}],"isServerError":[{"__symbolic":"method"}],"getCode":[{"__symbolic":"method"}],"getData":[{"__symbolic":"method"}],"getMessage":[{"__symbolic":"method"}],"getBody":[{"__symbolic":"method"}],"getHeaders":[{"__symbolic":"method"}],"getError":[{"__symbolic":"method"}],"getStatusCode":[{"__symbolic":"method"}],"pipe":[{"__symbolic":"method"}],"toPOJO":[{"__symbolic":"method"}],"toString":[{"__symbolic":"method"}]}}}}] -------------------------------------------------------------------------------- /dist/utils.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"isUndefined":{"__symbolic":"function","parameters":["value"],"value":{"__symbolic":"binop","operator":"===","left":{"__symbolic":"error","message":"Expression form not supported","line":1,"character":11},"right":"undefined"}},"isString":{"__symbolic":"function","parameters":["value"],"value":{"__symbolic":"binop","operator":"===","left":{"__symbolic":"error","message":"Expression form not supported","line":5,"character":11},"right":"string"}},"isEmptyObject":{"__symbolic":"function","parameters":["value"],"value":{"__symbolic":"pre","operator":"!","operand":{"__symbolic":"select","expression":{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","name":"Object"},"member":"keys"},"arguments":[{"__symbolic":"reference","name":"value"}]},"member":"length"}}},"isObject":{"__symbolic":"function","parameters":["value"],"value":{"__symbolic":"binop","operator":"instanceof","left":{"__symbolic":"reference","name":"value"},"right":{"__symbolic":"reference","name":"Object"}}}}}] -------------------------------------------------------------------------------- /src/sails.config.ts: -------------------------------------------------------------------------------- 1 | import { SailsOptions } from "./sails.options"; 2 | 3 | const __SAILS_VERSION__ = "0.11.0"; 4 | const __OS_PLATFORM__ = "windows"; 5 | 6 | export class SailsConfig implements SailsOptions { 7 | public url = "ws://localhost:1337"; 8 | public query = `__sails_io_sdk_version=${__SAILS_VERSION__}&__sails_io_sdk_platform=${__OS_PLATFORM__}&__sails_io_sdk_language=javascript`; 9 | public reconnection = true; 10 | public autoConnect = true; 11 | public transports = ["websocket"]; 12 | public useCORSRouteToGetCookie = false; 13 | public headers = {}; 14 | public timeout = 20000; 15 | public path = ""; 16 | public prefix = ""; 17 | public initialConnectionHeaders; 18 | public multiplex; 19 | public reconnectionAttempts; 20 | public reconnectionDelay; 21 | public reconnectionDelayMax; 22 | public rejectUnauthorized; 23 | public randomizationFactor; 24 | public environment; 25 | 26 | public constructor(options: SailsOptions) { 27 | Object.assign(this, options); 28 | } 29 | } -------------------------------------------------------------------------------- /demo/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/0.13/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular/cli'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular/cli/plugins/karma') 14 | ], 15 | client:{ 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | reports: [ 'html', 'lcovonly' ], 20 | fixWebpackSourcePaths: true 21 | }, 22 | angularCli: { 23 | environment: 'dev' 24 | }, 25 | reporters: ['progress', 'kjhtml'], 26 | port: 9876, 27 | colors: true, 28 | logLevel: config.LOG_INFO, 29 | autoWatch: true, 30 | browsers: ['Chrome'], 31 | singleRun: false 32 | }); 33 | }; 34 | -------------------------------------------------------------------------------- /demo/src/app/interceptors/auth.interceptor.ts: -------------------------------------------------------------------------------- 1 | import { SailsRequestOptions, SailsResponse, SailsInterceptorInterface, SailsInterceptorHandlerInterface } from "ngx-sails-socketio"; 2 | import { Router } from "@angular/router"; 3 | import { Injectable } from "@angular/core"; 4 | import { Observable } from "rxjs"; 5 | import { map } from "rxjs/operators"; 6 | 7 | @Injectable() 8 | export class AuthInterceptor implements SailsInterceptorInterface { 9 | 10 | constructor(private router: Router) { 11 | } 12 | 13 | intercept(request: SailsRequestOptions, next: SailsInterceptorHandlerInterface): Observable { 14 | request.clone({ 15 | headers: request.headers.set("Authorization", localStorage.getItem("token")) 16 | }); 17 | const response = next.handle(request); 18 | 19 | return response.pipe(map((res: SailsResponse) => { 20 | if (res.getStatusCode() === 401) { 21 | this.router.navigateByUrl("login"); 22 | } 23 | return res; 24 | })); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /dist/sails.interceptor.handler.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.interceptor.handler.js","sourceRoot":"","sources":["../src/sails.interceptor.handler.ts"],"names":[],"mappings":"AASA;IACI,iCAAoB,IAAsC,EAAU,WAAsC;QAAtF,SAAI,GAAJ,IAAI,CAAkC;QAAU,gBAAW,GAAX,WAAW,CAA2B;IAAI,CAAC;IAE/G,wCAAM,GAAN,UAAO,OAA4B;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IACL,8BAAC;AAAD,CAAC,AAND,IAMC","sourcesContent":["import { SailsResponse } from \"./sails.response\";\nimport { SailsRequestOptions } from \"./sails.request.options\";\nimport { SailsInterceptorInterface } from \"./sails.interceptor\";\nimport { Observable } from \"rxjs\";\n\nexport interface SailsInterceptorHandlerInterface {\n handle(request: SailsRequestOptions): Observable;\n}\n\nexport class SailsInterceptorHandler implements SailsInterceptorHandlerInterface {\n constructor(private next: SailsInterceptorHandlerInterface, private interceptor: SailsInterceptorInterface) { }\n\n handle(request: SailsRequestOptions): Observable {\n return this.interceptor.intercept(request, this.next);\n }\n}\n"]} -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "rootDir": "./src", 4 | "outDir": "dist", 5 | "baseUrl": ".", 6 | "declaration": true, 7 | "stripInternal": true, 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "strictNullChecks": true, 11 | "noImplicitAny": false, 12 | "lib": [ 13 | "es2016", 14 | "dom" 15 | ], 16 | "module": "es2015", 17 | "moduleResolution": "node", 18 | "sourceMap": true, 19 | "inlineSources": true, 20 | "target": "es5", 21 | "skipLibCheck": true, 22 | "typeRoots": [ 23 | "../node_modules/@types" 24 | ], 25 | "paths": { 26 | "@angular/*": [ 27 | "../node_modules/@angular/*" 28 | ], 29 | "rxjs/*": [ 30 | "../node_modules/rxjs/*" 31 | ] 32 | } 33 | }, 34 | "angularCompilerOptions": { 35 | "genDir": "./dist", 36 | "strictMetadataEmit": true, 37 | "skipTemplateCodegen": true 38 | }, 39 | "files": [ 40 | "./src/index.ts" 41 | ], 42 | "exclude": [ 43 | "node_modules", 44 | "demo", 45 | "bin" 46 | ] 47 | } -------------------------------------------------------------------------------- /dist/sails.request.criteria.d.ts: -------------------------------------------------------------------------------- 1 | export declare class RequestCriteria { 2 | or(): RequestCriteria; 3 | whereNotEqualTo(key: string, value: string): RequestCriteria; 4 | whereLike(key: string, value: string): RequestCriteria; 5 | whereEqualTo(key: string, value: string): RequestCriteria; 6 | whereContains(key: string, value: string): RequestCriteria; 7 | whereIn(key: string, ...value: string[]): RequestCriteria; 8 | whereStartsWith(key: string, value: string): RequestCriteria; 9 | whereEndsWith(key: string, value: string): RequestCriteria; 10 | whereNotIn(key: string, value: string): RequestCriteria; 11 | whereLessThan(key: string, value: string | number | boolean | Date): RequestCriteria; 12 | whereLessThanOrEqualTo(key: string, value: string | number | boolean | Date): RequestCriteria; 13 | whereGreaterThan(key: string, value: string | number | boolean | Date): RequestCriteria; 14 | whereGreaterThanOrEqualTo(key: string, value: string | number | boolean | Date): RequestCriteria; 15 | private criteria; 16 | private orCriteria; 17 | private build; 18 | toString(): string; 19 | } 20 | -------------------------------------------------------------------------------- /src/sails.event.ts: -------------------------------------------------------------------------------- 1 | import { SailsIOClient } from "./sails.io.client"; 2 | 3 | export const Verb = { 4 | CREATED: "created", 5 | UPDATED: "updated", 6 | ADDED: "added", 7 | DESTROYED: "destroyed", 8 | REMOVED: "removed", 9 | }; 10 | 11 | export class SailsEvent { 12 | constructor(private JWR: SailsIOClient.JWR.Event) { } 13 | 14 | public isCreated(): boolean { 15 | return this.getVerb() === Verb.CREATED; 16 | } 17 | 18 | public isUpdated(): boolean { 19 | return this.getVerb() === Verb.UPDATED; 20 | } 21 | 22 | public isDestroyed(): boolean { 23 | return this.getVerb() === Verb.DESTROYED; 24 | } 25 | 26 | public isAdded(): boolean { 27 | return this.getVerb() === Verb.ADDED; 28 | } 29 | 30 | public isRemoved(): boolean { 31 | return this.getVerb() === Verb.REMOVED; 32 | } 33 | 34 | public getVerb(): string { 35 | return this.JWR.verb; 36 | } 37 | 38 | public getData(): object { 39 | return this.JWR.data; 40 | } 41 | 42 | public getId(): string | number { 43 | return this.JWR.id; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Familusi Babatunde 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /dist/sails.request.d.ts: -------------------------------------------------------------------------------- 1 | import { Sails } from "./sails"; 2 | import { SailsResponse } from "./sails.response"; 3 | import { SailsIOClient } from "./sails.io.client"; 4 | import { Observable } from "rxjs"; 5 | export declare const Method: { 6 | GET: string; 7 | POST: string; 8 | PUT: string; 9 | DELETE: string; 10 | PATCH: string; 11 | }; 12 | export declare class SailsRequest { 13 | private sails; 14 | private parameters; 15 | constructor(sails: Sails); 16 | get(url: string, headers?: SailsIOClient.Headers): Observable; 17 | post(url: string, params: object, headers?: SailsIOClient.Headers): Observable; 18 | put(url: string, params: object, headers?: SailsIOClient.Headers): Observable; 19 | delete(url: string, headers?: SailsIOClient.Headers): Observable; 20 | patch(url: string, headers?: SailsIOClient.Headers): Observable; 21 | private _request; 22 | addParam(name: string, value: boolean | number | string | { 23 | toString(): string; 24 | }): this; 25 | private getParams; 26 | private buildQuery; 27 | } 28 | -------------------------------------------------------------------------------- /demo/README.md: -------------------------------------------------------------------------------- 1 | # Demo 2 | 3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.2.1. 4 | 5 | ## Development server 6 | 7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. 8 | 9 | ## Code scaffolding 10 | 11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|module`. 12 | 13 | ## Build 14 | 15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. 16 | 17 | ## Running unit tests 18 | 19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). 20 | 21 | ## Running end-to-end tests 22 | 23 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). 24 | Before running the tests make sure you are serving the app via `ng serve`. 25 | 26 | ## Further help 27 | 28 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). 29 | -------------------------------------------------------------------------------- /demo/src/app/components/dashboard/dashboard.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from "@angular/core"; 2 | import { Router } from "@angular/router"; 3 | import { Sails } from "ngx-sails-socketio"; 4 | import { JobsService } from "../../services/jobs.service"; 5 | import { merge } from 'rxjs'; 6 | import { tap } from 'rxjs/operators'; 7 | import { BoqModel } from "../../models/boq.model"; 8 | 9 | @Component({ 10 | selector: "app-dashboard", 11 | templateUrl: "./dashboard.component.html", 12 | styleUrls: ["./dashboard.component.css"] 13 | }) 14 | 15 | export class DashboardComponent implements OnInit { 16 | boqs$; 17 | 18 | constructor(private router: Router, private sails: Sails, private jobs: JobsService) { } 19 | 20 | ngOnInit() { 21 | this.boqs$ = merge( 22 | this.jobs.listenAll().pipe(tap(() => console.log("Second"))), 23 | this.jobs.getQueried().pipe(tap(() => console.log("First"))) 24 | ); 25 | } 26 | 27 | onLogout(e: Event) { 28 | e.preventDefault(); 29 | 30 | setTimeout(() => { 31 | localStorage.clear(); 32 | this.router.navigateByUrl("/login"); 33 | }, 1000); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /demo/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/long-stack-trace-zone'; 4 | import 'zone.js/dist/proxy.js'; 5 | import 'zone.js/dist/sync-test'; 6 | import 'zone.js/dist/jasmine-patch'; 7 | import 'zone.js/dist/async-test'; 8 | import 'zone.js/dist/fake-async-test'; 9 | import { getTestBed } from '@angular/core/testing'; 10 | import { 11 | BrowserDynamicTestingModule, 12 | platformBrowserDynamicTesting 13 | } from '@angular/platform-browser-dynamic/testing'; 14 | 15 | // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. 16 | declare const __karma__: any; 17 | declare const require: any; 18 | 19 | // Prevent Karma from running prematurely. 20 | __karma__.loaded = function () {}; 21 | 22 | // First, initialize the Angular testing environment. 23 | getTestBed().initTestEnvironment( 24 | BrowserDynamicTestingModule, 25 | platformBrowserDynamicTesting() 26 | ); 27 | // Then we find all the tests. 28 | const context = require.context('./', true, /\.spec\.ts$/); 29 | // And load the modules. 30 | context.keys().map(context); 31 | // Finally, start Karma to run the tests. 32 | __karma__.start(); 33 | -------------------------------------------------------------------------------- /dist/sails.module.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.module.js","sourceRoot":"","sources":["../src/sails.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAuB,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAInE;IAAA;IAaA,CAAC;IAXU,mBAAO,GAAd,UAAe,OAAqB,EAAE,YAAgD;QAAhD,6BAAA,EAAA,iBAAgD;QAClF,OAAO;YACH,QAAQ,EAAE,WAAW;YACrB,SAAS;gBACL,KAAK;qBACF,YAAY;gBACf,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC7C,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,YAAY,EAAE;cAC1D;SACJ,CAAC;IACN,CAAC;;gBAZJ,QAAQ;;IAaT,kBAAC;CAAA,AAbD,IAaC;SAZY,WAAW","sourcesContent":["import { NgModule, ModuleWithProviders } from \"@angular/core\";\nimport { Sails, SAILS_OPTIONS, SAILS_INTERCEPTORS } from \"./sails\";\nimport { SailsOptions } from \"./sails.options\";\nimport { SailsInterceptorConstructor } from \"./sails.interceptor\";\n\n@NgModule()\nexport class SailsModule {\n static forRoot(options: SailsOptions, interceptors: SailsInterceptorConstructor[] = []): ModuleWithProviders {\n return {\n ngModule: SailsModule,\n providers: [\n Sails,\n ...interceptors,\n { provide: SAILS_OPTIONS, useValue: options },\n { provide: SAILS_INTERCEPTORS, useValue: interceptors },\n ]\n };\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/sails.event.js: -------------------------------------------------------------------------------- 1 | export var Verb = { 2 | CREATED: "created", 3 | UPDATED: "updated", 4 | ADDED: "added", 5 | DESTROYED: "destroyed", 6 | REMOVED: "removed", 7 | }; 8 | var SailsEvent = /** @class */ (function () { 9 | function SailsEvent(JWR) { 10 | this.JWR = JWR; 11 | } 12 | SailsEvent.prototype.isCreated = function () { 13 | return this.getVerb() === Verb.CREATED; 14 | }; 15 | SailsEvent.prototype.isUpdated = function () { 16 | return this.getVerb() === Verb.UPDATED; 17 | }; 18 | SailsEvent.prototype.isDestroyed = function () { 19 | return this.getVerb() === Verb.DESTROYED; 20 | }; 21 | SailsEvent.prototype.isAdded = function () { 22 | return this.getVerb() === Verb.ADDED; 23 | }; 24 | SailsEvent.prototype.isRemoved = function () { 25 | return this.getVerb() === Verb.REMOVED; 26 | }; 27 | SailsEvent.prototype.getVerb = function () { 28 | return this.JWR.verb; 29 | }; 30 | SailsEvent.prototype.getData = function () { 31 | return this.JWR.data; 32 | }; 33 | SailsEvent.prototype.getId = function () { 34 | return this.JWR.id; 35 | }; 36 | return SailsEvent; 37 | }()); 38 | export { SailsEvent }; 39 | //# sourceMappingURL=sails.event.js.map -------------------------------------------------------------------------------- /demo/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from "@angular/core"; 2 | import { Sails, SailsListener } from "ngx-sails-socketio"; 3 | 4 | @Component({ 5 | selector: "app-root", 6 | templateUrl: "./app.component.html", 7 | styleUrls: ["./app.component.css"] 8 | }) 9 | export class AppComponent implements OnInit { 10 | 11 | constructor(private sails: Sails) { 12 | sails.addEventListener(SailsListener.CONNECTING, data => { 13 | console.log("CONNECTING..."); 14 | console.dir(data); 15 | }); 16 | 17 | sails.addEventListener(SailsListener.RECONNECTING, data => { 18 | console.log("RECONNECTING..."); 19 | console.dir(data); 20 | }); 21 | 22 | sails.addEventListener(SailsListener.RECONNECT, data => { 23 | console.log("RECONNECT..."); 24 | console.dir(data); 25 | }); 26 | 27 | sails.addEventListener(SailsListener.DISCONNECT, data => { 28 | console.log("DISCONNECT..."); 29 | console.dir(data); 30 | }); 31 | 32 | sails.addEventListener(SailsListener.CONNECT, data => { 33 | console.log("🎉🎉🎉 IT WORKS!!! 🎉🎉🎉"); 34 | console.log("CONNECTED!!!"); 35 | console.dir(data); 36 | }); 37 | 38 | sails.connect(); 39 | } 40 | 41 | ngOnInit() { 42 | 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /demo/src/app/components/login/login.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from "@angular/core"; 2 | import { Sails } from "ngx-sails-socketio"; 3 | import { Router } from "@angular/router"; 4 | 5 | @Component({ 6 | selector: "app-login", 7 | templateUrl: "./login.component.html", 8 | styleUrls: ["./login.component.css"] 9 | }) 10 | 11 | export class LoginComponent implements OnInit { 12 | 13 | constructor(private router: Router, private sails: Sails) { } 14 | 15 | ngOnInit() { } 16 | 17 | onLogin(e: Event) { 18 | e.preventDefault(); 19 | // tslint:disable-next-line:max-line-length 20 | const token = "JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImZpcnN0bmFtZSI6IkJhYmF0dW5kZXgiLCJsYXN0bmFtZSI6IkZhbWlsdXNpIiwiZW1haWwiOiJ0ZmFtaWx1c2lAeWFob28uY29tIiwiY2FsbGluZ0NvZGUiOiIrMjM0IiwicGhvbmUiOiI4MTg2MDc3NTI3Iiwic3RhdHVzIjoiZGlzYWJsZWQiLCJjcmVhdGVkQXQiOiIyMDE3LTA4LTExVDE0OjEwOjQyLjEzOVoiLCJ1cGRhdGVkQXQiOiIyMDE3LTA4LTE5VDEzOjE3OjQwLjM2NVoiLCJpZCI6IjU5OGRiYWUyZTA1Y2ZlZWYxZDBhZmI5MSIsImlkZW50aXR5IjoiY3VzdG9tZXIiLCJmdWxsbmFtZSI6IkJhYmF0dW5kZXggRmFtaWx1c2kifSwiaWF0IjoxNTAzMjI1OTEzLCJleHAiOjE1MzQ3NjE5MTMsImF1ZCI6IkZpeGVyc2h1YiIsImlzcyI6IlRvbml0b24ifQ.V_nb3F9aYfnaOMyCphuX-DYBNU2H64uHjtUhWM4S_2Q"; 21 | 22 | setTimeout(() => { 23 | localStorage.setItem("token", token); 24 | this.router.navigateByUrl("/"); 25 | }, 1000); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /dist/sails.config.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.config.js","sourceRoot":"","sources":["../src/sails.config.ts"],"names":[],"mappings":"AAEA,IAAM,iBAAiB,GAAG,QAAQ,CAAC;AACnC,IAAM,eAAe,GAAG,SAAS,CAAC;AAElC;IAoBI,qBAAmB,OAAqB;QAnBjC,QAAG,GAAG,qBAAqB,CAAC;QAC5B,UAAK,GAAG,4BAA0B,iBAAiB,iCAA4B,eAAe,wCAAqC,CAAC;QACpI,iBAAY,GAAG,IAAI,CAAC;QACpB,gBAAW,GAAG,IAAI,CAAC;QACnB,eAAU,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3B,4BAAuB,GAAG,KAAK,CAAC;QAChC,YAAO,GAAG,EAAE,CAAC;QACb,YAAO,GAAG,KAAK,CAAC;QAChB,SAAI,GAAG,EAAE,CAAC;QACV,WAAM,GAAG,EAAE,CAAC;QAWf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IACL,kBAAC;AAAD,CAAC,AAvBD,IAuBC","sourcesContent":["import { SailsOptions } from \"./sails.options\";\n\nconst __SAILS_VERSION__ = \"0.11.0\";\nconst __OS_PLATFORM__ = \"windows\";\n\nexport class SailsConfig implements SailsOptions {\n public url = \"ws://localhost:1337\";\n public query = `__sails_io_sdk_version=${__SAILS_VERSION__}&__sails_io_sdk_platform=${__OS_PLATFORM__}&__sails_io_sdk_language=javascript`;\n public reconnection = true;\n public autoConnect = true;\n public transports = [\"websocket\"];\n public useCORSRouteToGetCookie = false;\n public headers = {};\n public timeout = 20000;\n public path = \"\";\n public prefix = \"\";\n public initialConnectionHeaders;\n public multiplex;\n public reconnectionAttempts;\n public reconnectionDelay;\n public reconnectionDelayMax;\n public rejectUnauthorized;\n public randomizationFactor;\n public environment;\n\n public constructor(options: SailsOptions) {\n Object.assign(this, options);\n }\n}"]} -------------------------------------------------------------------------------- /demo/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from "@angular/platform-browser"; 2 | import { NgModule } from "@angular/core"; 3 | import { RouterModule } from "@angular/router"; 4 | 5 | import { AppComponent } from "./app.component"; 6 | import { SERVICES } from "./services/index"; 7 | import { SailsModule, SailsOptions, SailsEnvironment } from "ngx-sails-socketio"; 8 | import { INTERCEPTORS } from "./interceptors"; 9 | import { LoginComponent } from "./components/login/login.component"; 10 | import { DashboardComponent } from "./components/dashboard/dashboard.component"; 11 | 12 | const options: SailsOptions = { 13 | url: "ws://52.36.91.56:8081", 14 | prefix: "/api", 15 | environment: SailsEnvironment.DEV, 16 | query: "__sails_io_sdk_version=0.11.0&__sails_io_sdk_platform=windows&__sails_io_sdk_language=javascript", 17 | reconnection: true, 18 | autoConnect: false, 19 | // headers: { 20 | // // tslint:disable-next-line:max-line-length 21 | // Authorization: localStorage.getItem("token") 22 | // }, 23 | // timeout: 3000, 24 | }; 25 | 26 | @NgModule({ 27 | declarations: [ 28 | AppComponent, 29 | DashboardComponent, 30 | LoginComponent 31 | ], 32 | imports: [ 33 | BrowserModule, 34 | RouterModule.forRoot([ 35 | { path: "", component: DashboardComponent, pathMatch: "full" }, 36 | { path: "login", component: LoginComponent }, 37 | ]), 38 | SailsModule.forRoot(options, INTERCEPTORS) 39 | ], 40 | providers: SERVICES, 41 | bootstrap: [AppComponent] 42 | }) 43 | export class AppModule { } 44 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "scripts": { 6 | "ng": "ng", 7 | "start": "ng serve", 8 | "build": "ng build", 9 | "test": "ng test", 10 | "lint": "ng lint", 11 | "e2e": "ng e2e" 12 | }, 13 | "private": true, 14 | "dependencies": { 15 | "@angular-devkit/build-angular": "^0.10.4", 16 | "@angular/animations": "^6.1.0", 17 | "@angular/common": "^6.1.0", 18 | "@angular/compiler": "^6.1.0", 19 | "@angular/core": "^6.1.0", 20 | "@angular/forms": "^6.1.0", 21 | "@angular/http": "^6.1.0", 22 | "@angular/platform-browser": "^6.1.0", 23 | "@angular/platform-browser-dynamic": "^6.1.0", 24 | "@angular/router": "^6.1.0", 25 | "core-js": "^2.4.1", 26 | "ngx-sails-socketio": "file:..", 27 | "rxjs": "^6.3.3", 28 | "rxjs-compat": "^6.3.3", 29 | "socket.io-client": "^2.1.1", 30 | "zone.js": "~0.8.26" 31 | }, 32 | "devDependencies": { 33 | "@angular/cli": "~6.2.3", 34 | "@angular/compiler-cli": "^6.1.0", 35 | "@angular/language-service": "^6.1.0", 36 | "@types/socket.io-client": "^1.4.30", 37 | "@types/jasmine": "~2.5.53", 38 | "@types/jasminewd2": "~2.0.2", 39 | "@types/node": "~6.0.60", 40 | "codelyzer": "~4.5.0", 41 | "jasmine-core": "~2.6.2", 42 | "jasmine-spec-reporter": "~4.1.0", 43 | "karma": "~1.7.0", 44 | "karma-chrome-launcher": "~2.1.1", 45 | "karma-cli": "~1.0.1", 46 | "karma-coverage-istanbul-reporter": "^1.2.1", 47 | "karma-jasmine": "~1.1.0", 48 | "karma-jasmine-html-reporter": "^0.2.2", 49 | "protractor": "~5.1.2", 50 | "ts-node": "~3.0.4", 51 | "tslint": "~5.3.2", 52 | "typescript": "^2.9.2" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /integrations/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Script that runs simple tests or full integration tests based on $TEST_SUITE 4 | 5 | # The script should immediately exit if any command in the script fails. 6 | set -e 7 | set -o pipefail 8 | 9 | # Clean previous builds 10 | rm -rf tmp 11 | 12 | buildLibProject(){ 13 | LIB_FOLDER="tmp/my-ngx-library-$1" 14 | YO_RC="integrations/.yo-rc.$1.json" 15 | 16 | echo -e "\n" 17 | echo -e "#########################################\n" 18 | echo -e " Integration Test for $1 \n" 19 | echo -e "#########################################\n" 20 | 21 | echo "#1 - Creating lib folder at '$LIB_FOLDER'" 22 | mkdir -p $LIB_FOLDER 23 | 24 | echo "#2 - Copying .yo-rc.json to lib folder" 25 | cp $YO_RC "$LIB_FOLDER/.yo-rc.json" 26 | 27 | echo "#3 - Moving to lib folder" 28 | cd $LIB_FOLDER 29 | 30 | echo "#4 - Running generator for '$1'" 31 | yo ngx-library 32 | 33 | echo "#5 - Building library for '$1'" 34 | gulp build 35 | 36 | echo "#6 - Moving back to root folder" 37 | cd ../.. 38 | } 39 | 40 | runUnitTests(){ 41 | echo -e "\n" 42 | echo -e "#########################################\n" 43 | echo -e " Unit Tests \n" 44 | echo -e "#########################################\n" 45 | # Simply run unit tests 46 | gulp coveralls 47 | } 48 | 49 | runIntegrationTests(){ 50 | # Building and testing library project 51 | buildLibProject $1 52 | } 53 | 54 | 55 | case $TEST_SUITE in 56 | "units") runUnitTests ;; 57 | "integrations:ng2") runIntegrationTests "ng2" ;; 58 | "integrations:ng4") runIntegrationTests "ng4" ;; 59 | "integrations:ng5") runIntegrationTests "ng5" ;; 60 | *) echo "Unknown value for 'TEST_SUITE': '$TEST_SUITE'. Aborting" 61 | exit 1 ;; 62 | esac 63 | 64 | exit 0 65 | -------------------------------------------------------------------------------- /dist/sails.event.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.event.js","sourceRoot":"","sources":["../src/sails.event.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,IAAM,IAAI,GAAG;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;CACrB,CAAC;AAEF;IACI,oBAAoB,GAA4B;QAA5B,QAAG,GAAH,GAAG,CAAyB;IAAI,CAAC;IAE9C,8BAAS,GAAhB;QACI,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAEM,8BAAS,GAAhB;QACI,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAEM,gCAAW,GAAlB;QACI,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC;IAC7C,CAAC;IAEM,4BAAO,GAAd;QACI,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC;IACzC,CAAC;IAEM,8BAAS,GAAhB;QACI,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAEM,4BAAO,GAAd;QACI,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB,CAAC;IAEM,4BAAO,GAAd;QACI,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB,CAAC;IAEM,0BAAK,GAAZ;QACI,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACvB,CAAC;IACL,iBAAC;AAAD,CAAC,AAlCD,IAkCC","sourcesContent":["import { SailsIOClient } from \"./sails.io.client\";\n\nexport const Verb = {\n CREATED: \"created\",\n UPDATED: \"updated\",\n ADDED: \"added\",\n DESTROYED: \"destroyed\",\n REMOVED: \"removed\",\n};\n\nexport class SailsEvent {\n constructor(private JWR: SailsIOClient.JWR.Event) { }\n\n public isCreated(): boolean {\n return this.getVerb() === Verb.CREATED;\n }\n\n public isUpdated(): boolean {\n return this.getVerb() === Verb.UPDATED;\n }\n\n public isDestroyed(): boolean {\n return this.getVerb() === Verb.DESTROYED;\n }\n\n public isAdded(): boolean {\n return this.getVerb() === Verb.ADDED;\n }\n\n public isRemoved(): boolean {\n return this.getVerb() === Verb.REMOVED;\n }\n\n public getVerb(): string {\n return this.JWR.verb;\n }\n\n public getData(): object {\n return this.JWR.data;\n }\n\n public getId(): string | number {\n return this.JWR.id;\n }\n}\n"]} -------------------------------------------------------------------------------- /src/sails.request.options.ts: -------------------------------------------------------------------------------- 1 | import { SailsIOClient } from "./sails.io.client"; 2 | 3 | export interface SailsRequestOptionsInterface { 4 | url?: string; 5 | method?: string; 6 | params?: Map; 7 | headers?: Map; 8 | } 9 | 10 | export class SailsRequestOptions { 11 | private readonly options: SailsRequestOptionsInterface; 12 | 13 | constructor({ url, method, params, headers }: SailsIOClient.RequestOptions) { 14 | this.options = { url, method, params: this.toMap(params), headers: this.toMap(headers) }; 15 | } 16 | 17 | clone(options: SailsRequestOptionsInterface): this { 18 | // Strip out undefined values 19 | for (const name in options) { 20 | if (!this.options.hasOwnProperty(name) || !options[name]) { 21 | delete options[name]; 22 | } 23 | } 24 | 25 | Object.assign(this.options, options); 26 | return this; 27 | } 28 | 29 | private toMap(obj: { [key: string]: any } = {}) { 30 | let map = new Map; 31 | Object.keys(obj).forEach(k => (map.set(k, obj[k]))); 32 | return map; 33 | } 34 | 35 | private toObject(map: Map = new Map) { 36 | let obj = {}; 37 | map.forEach((v, k) => (obj[k] = v)); 38 | return obj; 39 | } 40 | 41 | get method(): string | undefined { 42 | return this.options.method; 43 | } 44 | 45 | get url(): string | undefined { 46 | return this.options.url; 47 | } 48 | 49 | get params(): Map | undefined { 50 | return this.options.params; 51 | } 52 | 53 | get headers(): Map | undefined { 54 | return this.options.headers; 55 | } 56 | 57 | serialize(): SailsIOClient.RequestOptions { 58 | return { 59 | url: this.url, 60 | method: this.method, 61 | params: this.toObject(this.params), 62 | headers: this.toObject(this.headers) 63 | }; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /dist/sails.d.ts: -------------------------------------------------------------------------------- 1 | import { SailsResponse } from "./sails.response"; 2 | import { InjectionToken, Injector } from "@angular/core"; 3 | import { SailsInterceptorConstructor, SailsInterceptorInterface } from "./sails.interceptor"; 4 | import { SailsInterceptorHandlerInterface } from "./sails.interceptor.handler"; 5 | import { SailsOptions } from "./sails.options"; 6 | import { SailsRequestOptions } from "./sails.request.options"; 7 | import { SailsEvent } from "./sails.event"; 8 | import { Observable } from "rxjs"; 9 | export declare const SAILS_OPTIONS: InjectionToken<{}>; 10 | export declare const SAILS_INTERCEPTORS: InjectionToken<{}>; 11 | export declare const SailsEnvironment: { 12 | DEV: string; 13 | PROD: string; 14 | }; 15 | export declare const SailsListener: { 16 | ERROR: string; 17 | CONNECT: string; 18 | RECONNECT: string; 19 | CONNECTING: string; 20 | DISCONNECT: string; 21 | RECONNECTING: string; 22 | CONNECT_ERROR: string; 23 | CONNECT_TIMEOUT: string; 24 | }; 25 | export declare class Sails implements SailsInterceptorInterface, SailsInterceptorHandlerInterface { 26 | private injector; 27 | private Interceptors; 28 | private Socket; 29 | private Config; 30 | private Listeners; 31 | private socket; 32 | constructor(injector: Injector, options: SailsOptions, Interceptors?: SailsInterceptorConstructor[]); 33 | connect(): Sails; 34 | connected(): boolean; 35 | isConnecting(): Sails; 36 | disconnect(): Sails; 37 | addEventListener(eventName: string, callback: (data: string) => void): this; 38 | removeEventListener(eventName: string, callback: any): this; 39 | on(eventName: string): Observable; 40 | off(eventName: string): Observable; 41 | request(request: SailsRequestOptions): Observable; 42 | intercept(request: SailsRequestOptions, next?: SailsInterceptorHandlerInterface): Observable; 43 | handle(request: SailsRequestOptions): Observable; 44 | private debugReqRes; 45 | } 46 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-unused-expression": true, 4 | "no-duplicate-variable": true, 5 | "no-unused-variable": true, 6 | "curly": true, 7 | "class-name": true, 8 | "semicolon": true, 9 | "triple-equals": [ 10 | true, 11 | "allow-null-check" 12 | ], 13 | "no-console": [ 14 | true, 15 | "debug", 16 | "info", 17 | "time", 18 | "timeEnd", 19 | "trace" 20 | ], 21 | "no-construct": true, 22 | "no-debugger": true, 23 | "no-empty": false, 24 | "no-eval": true, 25 | "no-null-keyword": false, 26 | // "no-shadowed-variable": true, 27 | "no-string-literal": false, 28 | "no-switch-case-fall-through": true, 29 | "no-var-keyword": true, 30 | "radix": false, 31 | "switch-default": true, 32 | "indent": [true], 33 | "no-require-imports": false, 34 | "no-trailing-whitespace": true, 35 | "object-literal-sort-keys": false, 36 | "trailing-comma": [ 37 | true, 38 | { 39 | "multiline": false, 40 | "singleline": "never" 41 | } 42 | ], 43 | "comment-format": [ 44 | true, 45 | "check-space" 46 | ], 47 | "no-consecutive-blank-lines": [ 48 | true, 49 | 2 50 | ], 51 | "quotemark": [ 52 | true, 53 | "double", 54 | "avoid-escape" 55 | ], 56 | "variable-name": [ 57 | true, 58 | // "check-format", 59 | "allow-leading-underscore", 60 | "allow-pascal-case", 61 | "ban-keywords" 62 | ], 63 | "whitespace": [ 64 | true, 65 | "check-branch", 66 | "check-decl", 67 | "check-module", 68 | "check-operator", 69 | "check-separator", 70 | "check-type" 71 | ] 72 | } 73 | } -------------------------------------------------------------------------------- /src/sails.response.ts: -------------------------------------------------------------------------------- 1 | import { SailsIOClient } from "./sails.io.client"; 2 | 3 | export class SailsResponse { 4 | constructor(private JWR: SailsIOClient.JWR.Response) { } 5 | 6 | public isOk(): boolean { 7 | return this.getStatusCode() >= 200 && this.getStatusCode() < 300; 8 | } 9 | 10 | public isCreated(): boolean { 11 | return this.getStatusCode() === 201; 12 | } 13 | 14 | public isUnauthorized(): boolean { 15 | return this.getStatusCode() === 401; 16 | } 17 | 18 | public isForbidden(): boolean { 19 | return this.getStatusCode() === 403; 20 | } 21 | 22 | public isNotFound(): boolean { 23 | return this.getStatusCode() === 404; 24 | } 25 | 26 | public isBadRequest(): boolean { 27 | return this.getStatusCode() === 400; 28 | } 29 | 30 | public isError(): boolean { 31 | return this.isClientError() || this.isServerError(); 32 | } 33 | 34 | public isClientError(): boolean { 35 | return this.getStatusCode() >= 400 && !this.isServerError(); 36 | } 37 | 38 | public isServerError(): boolean { 39 | return this.getStatusCode() >= 500; 40 | } 41 | 42 | public getCode(): string { 43 | return this.getBody().code; 44 | } 45 | 46 | public getData(): any { 47 | return this.getBody().data || this.getBody(); 48 | } 49 | 50 | public getMessage(): string { 51 | return this.getBody().message; 52 | } 53 | 54 | public getBody(): any { 55 | return this.JWR.body; 56 | } 57 | 58 | public getHeaders(): SailsIOClient.Headers { 59 | return this.JWR.headers; 60 | } 61 | 62 | public getError(): string { 63 | return this.JWR.error; 64 | } 65 | 66 | public getStatusCode(): number { 67 | return this.JWR.statusCode; 68 | } 69 | 70 | public pipe() { 71 | return this.JWR.pipe(); 72 | } 73 | 74 | public toPOJO() { 75 | return this.JWR.toPOJO(); 76 | } 77 | 78 | public toString() { 79 | return this.JWR.toString(); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /dist/sails.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":4,"metadata":{"SAILS_OPTIONS":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":14,"character":33},"arguments":["SAILS_OPTIONS"]},"SAILS_INTERCEPTORS":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":15,"character":38},"arguments":["SAILS_INTERCEPTORS"]},"SailsEnvironment":{"DEV":"development","PROD":"production"},"SailsListener":{"ERROR":"error","CONNECT":"connect","RECONNECT":"reconnect","CONNECTING":"connecting","DISCONNECT":"disconnect","RECONNECTING":"reconnecting","CONNECT_ERROR":"connect_error","CONNECT_TIMEOUT":"connect_timeout"},"Sails":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":56,"character":9},"arguments":[{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":56,"character":16}]}],[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":57,"character":9},"arguments":[{"__symbolic":"reference","name":"SAILS_OPTIONS"}]}],[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":58,"character":9},"arguments":[{"__symbolic":"reference","name":"SAILS_INTERCEPTORS"}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":56,"character":44},{"__symbolic":"reference","module":"./sails.options","name":"SailsOptions","line":57,"character":40},{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"./sails.interceptor","name":"SailsInterceptorConstructor","line":58,"character":58}]}]}],"connect":[{"__symbolic":"method"}],"connected":[{"__symbolic":"method"}],"isConnecting":[{"__symbolic":"method"}],"disconnect":[{"__symbolic":"method"}],"addEventListener":[{"__symbolic":"method"}],"removeEventListener":[{"__symbolic":"method"}],"on":[{"__symbolic":"method"}],"off":[{"__symbolic":"method"}],"request":[{"__symbolic":"method"}],"intercept":[{"__symbolic":"method"}],"handle":[{"__symbolic":"method"}],"debugReqRes":[{"__symbolic":"method"}]}}}}] -------------------------------------------------------------------------------- /src/sails.model.ts: -------------------------------------------------------------------------------- 1 | import { Property, unserialize } from "./sails.serialize"; 2 | import { SailsModelInterface } from "./sails.model.interface"; 3 | import { Endpoint } from "./sails.decorator.endpoint"; 4 | import { isObject } from "./utils"; 5 | 6 | @Endpoint() 7 | export abstract class SailsModel implements SailsModelInterface { 8 | @Property() id: string = ""; 9 | @Property({ type: Date }) createdAt: Date; 10 | @Property({ type: Date }) updatedAt: Date; 11 | 12 | getEndPoint(): string { 13 | return this.getEndPoint(); 14 | } 15 | 16 | static serialize(model: U): U { 17 | const recr = (obj) => { 18 | for (const key in obj) { 19 | const prop: U = obj[key]; 20 | // Ignore NULL values 21 | if (prop === null || typeof prop === "function") { 22 | delete obj[key]; 23 | } 24 | 25 | // Convert Property Models to their ID representations 26 | if (prop && prop instanceof SailsModel && prop.id !== null) { 27 | obj[key] = prop.id; 28 | } 29 | 30 | if (prop && prop instanceof SailsModel) { 31 | obj[key] = SailsModel.serialize(prop); 32 | } 33 | 34 | if (prop && prop instanceof Array) { 35 | obj[key] = prop.map(ob => { 36 | if (ob instanceof SailsModel) { 37 | return SailsModel.serialize(ob); 38 | } 39 | 40 | return ob; 41 | }); 42 | } 43 | } 44 | return obj; 45 | }; 46 | return recr(Object.assign({}, model)); 47 | } 48 | 49 | static unserialize(modelClazz, data: U | U[]): U | U[] { 50 | const callFn = (model) => unserialize(modelClazz, model) as U; 51 | if (Array.isArray(data)) { 52 | return data.map(callFn); 53 | } else if (isObject(data)) { 54 | return callFn(data); 55 | } 56 | throw new Error("SailsModel.unserialize requires a data parameter of either a Literal Object or an Array of Literal Objects"); 57 | } 58 | } -------------------------------------------------------------------------------- /dist/sails.response.js: -------------------------------------------------------------------------------- 1 | var SailsResponse = /** @class */ (function () { 2 | function SailsResponse(JWR) { 3 | this.JWR = JWR; 4 | } 5 | SailsResponse.prototype.isOk = function () { 6 | return this.getStatusCode() >= 200 && this.getStatusCode() < 300; 7 | }; 8 | SailsResponse.prototype.isCreated = function () { 9 | return this.getStatusCode() === 201; 10 | }; 11 | SailsResponse.prototype.isUnauthorized = function () { 12 | return this.getStatusCode() === 401; 13 | }; 14 | SailsResponse.prototype.isForbidden = function () { 15 | return this.getStatusCode() === 403; 16 | }; 17 | SailsResponse.prototype.isNotFound = function () { 18 | return this.getStatusCode() === 404; 19 | }; 20 | SailsResponse.prototype.isBadRequest = function () { 21 | return this.getStatusCode() === 400; 22 | }; 23 | SailsResponse.prototype.isError = function () { 24 | return this.isClientError() || this.isServerError(); 25 | }; 26 | SailsResponse.prototype.isClientError = function () { 27 | return this.getStatusCode() >= 400 && !this.isServerError(); 28 | }; 29 | SailsResponse.prototype.isServerError = function () { 30 | return this.getStatusCode() >= 500; 31 | }; 32 | SailsResponse.prototype.getCode = function () { 33 | return this.getBody().code; 34 | }; 35 | SailsResponse.prototype.getData = function () { 36 | return this.getBody().data || this.getBody(); 37 | }; 38 | SailsResponse.prototype.getMessage = function () { 39 | return this.getBody().message; 40 | }; 41 | SailsResponse.prototype.getBody = function () { 42 | return this.JWR.body; 43 | }; 44 | SailsResponse.prototype.getHeaders = function () { 45 | return this.JWR.headers; 46 | }; 47 | SailsResponse.prototype.getError = function () { 48 | return this.JWR.error; 49 | }; 50 | SailsResponse.prototype.getStatusCode = function () { 51 | return this.JWR.statusCode; 52 | }; 53 | SailsResponse.prototype.pipe = function () { 54 | return this.JWR.pipe(); 55 | }; 56 | SailsResponse.prototype.toPOJO = function () { 57 | return this.JWR.toPOJO(); 58 | }; 59 | SailsResponse.prototype.toString = function () { 60 | return this.JWR.toString(); 61 | }; 62 | return SailsResponse; 63 | }()); 64 | export { SailsResponse }; 65 | //# sourceMappingURL=sails.response.js.map -------------------------------------------------------------------------------- /dist/sails.io.client.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.io.client.js","sourceRoot":"","sources":["../src/sails.io.client.ts"],"names":[],"mappings":"","sourcesContent":["export declare namespace SailsIOClient {\n\n interface Headers {\n [key: string]: string | boolean;\n }\n\n namespace JWR {\n\n interface Response {\n body: any;\n error: any;\n headers: Headers;\n statusCode: number;\n toString: () => string;\n toPOJO: () => object;\n pipe: () => Error;\n }\n\n interface Event {\n verb: any;\n id: any;\n data: object;\n }\n }\n\n interface IO {\n socket: Socket;\n sails: SailsSocket;\n }\n\n interface Options {\n url: string;\n query: string;\n reconnection: boolean;\n environment: string;\n autoConnect?: boolean;\n useCORSRouteToGetCookie?: boolean;\n transports?: string[];\n path?: string;\n headers?: Headers;\n timeout?: number;\n initialConnectionHeaders?: Headers;\n multiplex?: any;\n reconnectionAttempts?: number;\n reconnectionDelay?: number;\n reconnectionDelayMax?: number;\n rejectUnauthorized?: boolean;\n randomizationFactor?: number;\n }\n\n interface SailsSocket extends Options {\n connect: (url, opts) => Socket;\n }\n\n interface RequestOptions {\n url?: string;\n method?: string;\n params?: object;\n headers?: Headers;\n }\n\n interface EventCallback {\n (response): void;\n }\n\n interface ResponseCallback {\n (body: any, JWR: JWR.Response): void;\n }\n\n interface Socket {\n _connect(): void;\n reconnect(): any;\n disconnect(): any;\n isConnected(): boolean;\n isConnecting(): boolean;\n mightBeAboutToAutoConnect(): boolean;\n replay(): Socket;\n on(eventName, callback: EventCallback): Socket;\n off(eventName, callback: EventCallback): Socket;\n removeAllListeners(): Socket;\n get(url: string, data: any, callback: ResponseCallback): void;\n post(url: string, data: any, callback: ResponseCallback): void;\n put(url: string, data: any, callback: ResponseCallback): void;\n patch(url: string, data: any, callback: ResponseCallback): void;\n delete(url: string, data: any, callback: ResponseCallback): void;\n request(options: RequestOptions, callback: ResponseCallback): void;\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/sails.request.options.js: -------------------------------------------------------------------------------- 1 | var SailsRequestOptions = /** @class */ (function () { 2 | function SailsRequestOptions(_a) { 3 | var url = _a.url, method = _a.method, params = _a.params, headers = _a.headers; 4 | this.options = { url: url, method: method, params: this.toMap(params), headers: this.toMap(headers) }; 5 | } 6 | SailsRequestOptions.prototype.clone = function (options) { 7 | // Strip out undefined values 8 | for (var name_1 in options) { 9 | if (!this.options.hasOwnProperty(name_1) || !options[name_1]) { 10 | delete options[name_1]; 11 | } 12 | } 13 | Object.assign(this.options, options); 14 | return this; 15 | }; 16 | SailsRequestOptions.prototype.toMap = function (obj) { 17 | if (obj === void 0) { obj = {}; } 18 | var map = new Map; 19 | Object.keys(obj).forEach(function (k) { return (map.set(k, obj[k])); }); 20 | return map; 21 | }; 22 | SailsRequestOptions.prototype.toObject = function (map) { 23 | if (map === void 0) { map = new Map; } 24 | var obj = {}; 25 | map.forEach(function (v, k) { return (obj[k] = v); }); 26 | return obj; 27 | }; 28 | Object.defineProperty(SailsRequestOptions.prototype, "method", { 29 | get: function () { 30 | return this.options.method; 31 | }, 32 | enumerable: true, 33 | configurable: true 34 | }); 35 | Object.defineProperty(SailsRequestOptions.prototype, "url", { 36 | get: function () { 37 | return this.options.url; 38 | }, 39 | enumerable: true, 40 | configurable: true 41 | }); 42 | Object.defineProperty(SailsRequestOptions.prototype, "params", { 43 | get: function () { 44 | return this.options.params; 45 | }, 46 | enumerable: true, 47 | configurable: true 48 | }); 49 | Object.defineProperty(SailsRequestOptions.prototype, "headers", { 50 | get: function () { 51 | return this.options.headers; 52 | }, 53 | enumerable: true, 54 | configurable: true 55 | }); 56 | SailsRequestOptions.prototype.serialize = function () { 57 | return { 58 | url: this.url, 59 | method: this.method, 60 | params: this.toObject(this.params), 61 | headers: this.toObject(this.headers) 62 | }; 63 | }; 64 | return SailsRequestOptions; 65 | }()); 66 | export { SailsRequestOptions }; 67 | //# sourceMappingURL=sails.request.options.js.map -------------------------------------------------------------------------------- /demo/src/app/services/jobs.service.ts: -------------------------------------------------------------------------------- 1 | import { SailsModel, Sails, SailsQuery, RequestCriteria, SailsRequest, SailsResponse, SailsSubscription } from "ngx-sails-socketio"; 2 | import { Injectable } from "@angular/core"; 3 | import { JobModel } from "../models/job.model"; 4 | import { BoqModel } from "../models/boq.model"; 5 | import { Observable, of } from "rxjs"; 6 | import { filter, switchMap, map } from "rxjs/operators"; 7 | 8 | @Injectable() 9 | export class JobsService { 10 | 11 | constructor(private sails: Sails) { 12 | } 13 | 14 | getQueried(): Observable { 15 | const req = new SailsRequest(this.sails); 16 | const criteria = (new RequestCriteria()) 17 | .whereGreaterThan("createdAt", new Date("Fri Sep 29 2017 08:13:03 GMT+0100 (WAT)")); 18 | // .or() 19 | // .whereLessThanOrEqualTo("createdAt", new Date("Fri Sep 29 2017 08:13:03 GMT+0100 (WAT)")); 20 | 21 | req.addParam("where", criteria); 22 | req.addParam("populate", `[${["customer", "createdBy", "job", "category", "fixer"].join(",")}]`) 23 | .addParam("limit", 25); 24 | 25 | return req.get("/boq").pipe(map((response: SailsResponse) => { 26 | return SailsModel.unserialize(BoqModel, response.getData()) as BoqModel[]; 27 | })); 28 | } 29 | 30 | getJobs() { 31 | const query = new SailsQuery(this.sails, JobModel); 32 | query.setPopulation("customer", "fixer", "category"); 33 | return query.find(); 34 | } 35 | 36 | listenOne() { 37 | return of("JUST UPDATED A NEW BOQ"); 38 | } 39 | 40 | listenAll(): Observable { 41 | console.log("Refreshing..."); 42 | // return of("JUST CREATED A NEW BOQ"); 43 | return this.getQueried(); 44 | } 45 | 46 | getBoqs() { 47 | const query = new SailsQuery(this.sails, BoqModel); 48 | const criteria = (new RequestCriteria()) 49 | .whereContains("status", "pending") 50 | .whereLessThan("createdAt", new Date) 51 | .or() 52 | .whereLessThanOrEqualTo("createdAt", new Date); 53 | 54 | query.setRequestCriteria(criteria).setPopulation("customer", "job", "category", "fixer").setLimit(25); 55 | return query.find(); 56 | } 57 | 58 | saveBoq(model) { 59 | const query = new SailsQuery(this.sails, BoqModel); 60 | return query.save(model); 61 | } 62 | 63 | updateJob(model) { 64 | const query = new SailsQuery(this.sails, JobModel); 65 | return query.update(model.id, model); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/sails.request.ts: -------------------------------------------------------------------------------- 1 | import { Sails } from "./sails"; 2 | import { SailsResponse } from "./sails.response"; 3 | import { SailsIOClient } from "./sails.io.client"; 4 | import { SailsRequestOptions } from "./sails.request.options"; 5 | import { Observable } from "rxjs"; 6 | 7 | class QueryBuilder { 8 | constructor(private query: string = "") { } 9 | 10 | append(criteria: string) { 11 | if (typeof criteria === "string") { 12 | if (this.query.length) { 13 | this.query += "&"; 14 | } 15 | this.query += criteria; 16 | } 17 | return this; 18 | } 19 | 20 | toString() { 21 | if (this.query && this.query.charAt(0) !== "?") { 22 | this.query = "?" + this.query; 23 | } 24 | return this.query; 25 | } 26 | } 27 | 28 | export const Method = { 29 | GET: "get", 30 | POST: "post", 31 | PUT: "put", 32 | DELETE: "delete", 33 | PATCH: "patch", 34 | }; 35 | 36 | export class SailsRequest { 37 | private parameters: string[] = []; 38 | 39 | constructor(private sails: Sails) { } 40 | 41 | public get(url: string, headers?: SailsIOClient.Headers) { 42 | return this._request(Method.GET, url, headers); 43 | } 44 | 45 | public post(url: string, params: object, headers?: SailsIOClient.Headers) { 46 | return this._request(Method.POST, url, params, headers); 47 | } 48 | 49 | public put(url: string, params: object, headers?: SailsIOClient.Headers) { 50 | return this._request(Method.PUT, url, params, headers); 51 | } 52 | 53 | public delete(url: string, headers?: SailsIOClient.Headers) { 54 | return this._request(Method.DELETE, url, headers); 55 | } 56 | 57 | public patch(url: string, headers?: SailsIOClient.Headers) { 58 | return this._request(Method.PATCH, url, headers); 59 | } 60 | 61 | private _request(method: string, url: string, params?: Object, headers?: SailsIOClient.Headers): Observable { 62 | const request = new SailsRequestOptions({ method, url: this.buildQuery(url), params, headers }); 63 | return this.sails.request(request); 64 | } 65 | 66 | public addParam(name: string, value: boolean | number | string | { toString(): string }): this { 67 | if (value.toString().length) { 68 | this.parameters.push(`${name}=${value}`); 69 | } 70 | return this; 71 | } 72 | 73 | private getParams(): string { 74 | return this.parameters.join("&"); 75 | } 76 | 77 | private buildQuery(url: string): string { 78 | return url + new QueryBuilder(this.getParams()); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /dist/sails.request.js: -------------------------------------------------------------------------------- 1 | import { SailsRequestOptions } from "./sails.request.options"; 2 | var QueryBuilder = /** @class */ (function () { 3 | function QueryBuilder(query) { 4 | if (query === void 0) { query = ""; } 5 | this.query = query; 6 | } 7 | QueryBuilder.prototype.append = function (criteria) { 8 | if (typeof criteria === "string") { 9 | if (this.query.length) { 10 | this.query += "&"; 11 | } 12 | this.query += criteria; 13 | } 14 | return this; 15 | }; 16 | QueryBuilder.prototype.toString = function () { 17 | if (this.query && this.query.charAt(0) !== "?") { 18 | this.query = "?" + this.query; 19 | } 20 | return this.query; 21 | }; 22 | return QueryBuilder; 23 | }()); 24 | export var Method = { 25 | GET: "get", 26 | POST: "post", 27 | PUT: "put", 28 | DELETE: "delete", 29 | PATCH: "patch", 30 | }; 31 | var SailsRequest = /** @class */ (function () { 32 | function SailsRequest(sails) { 33 | this.sails = sails; 34 | this.parameters = []; 35 | } 36 | SailsRequest.prototype.get = function (url, headers) { 37 | return this._request(Method.GET, url, headers); 38 | }; 39 | SailsRequest.prototype.post = function (url, params, headers) { 40 | return this._request(Method.POST, url, params, headers); 41 | }; 42 | SailsRequest.prototype.put = function (url, params, headers) { 43 | return this._request(Method.PUT, url, params, headers); 44 | }; 45 | SailsRequest.prototype.delete = function (url, headers) { 46 | return this._request(Method.DELETE, url, headers); 47 | }; 48 | SailsRequest.prototype.patch = function (url, headers) { 49 | return this._request(Method.PATCH, url, headers); 50 | }; 51 | SailsRequest.prototype._request = function (method, url, params, headers) { 52 | var request = new SailsRequestOptions({ method: method, url: this.buildQuery(url), params: params, headers: headers }); 53 | return this.sails.request(request); 54 | }; 55 | SailsRequest.prototype.addParam = function (name, value) { 56 | if (value.toString().length) { 57 | this.parameters.push(name + "=" + value); 58 | } 59 | return this; 60 | }; 61 | SailsRequest.prototype.getParams = function () { 62 | return this.parameters.join("&"); 63 | }; 64 | SailsRequest.prototype.buildQuery = function (url) { 65 | return url + new QueryBuilder(this.getParams()); 66 | }; 67 | return SailsRequest; 68 | }()); 69 | export { SailsRequest }; 70 | //# sourceMappingURL=sails.request.js.map -------------------------------------------------------------------------------- /dist/sails.io.client.d.ts: -------------------------------------------------------------------------------- 1 | export declare namespace SailsIOClient { 2 | interface Headers { 3 | [key: string]: string | boolean; 4 | } 5 | namespace JWR { 6 | interface Response { 7 | body: any; 8 | error: any; 9 | headers: Headers; 10 | statusCode: number; 11 | toString: () => string; 12 | toPOJO: () => object; 13 | pipe: () => Error; 14 | } 15 | interface Event { 16 | verb: any; 17 | id: any; 18 | data: object; 19 | } 20 | } 21 | interface IO { 22 | socket: Socket; 23 | sails: SailsSocket; 24 | } 25 | interface Options { 26 | url: string; 27 | query: string; 28 | reconnection: boolean; 29 | environment: string; 30 | autoConnect?: boolean; 31 | useCORSRouteToGetCookie?: boolean; 32 | transports?: string[]; 33 | path?: string; 34 | headers?: Headers; 35 | timeout?: number; 36 | initialConnectionHeaders?: Headers; 37 | multiplex?: any; 38 | reconnectionAttempts?: number; 39 | reconnectionDelay?: number; 40 | reconnectionDelayMax?: number; 41 | rejectUnauthorized?: boolean; 42 | randomizationFactor?: number; 43 | } 44 | interface SailsSocket extends Options { 45 | connect: (url: any, opts: any) => Socket; 46 | } 47 | interface RequestOptions { 48 | url?: string; 49 | method?: string; 50 | params?: object; 51 | headers?: Headers; 52 | } 53 | interface EventCallback { 54 | (response: any): void; 55 | } 56 | interface ResponseCallback { 57 | (body: any, JWR: JWR.Response): void; 58 | } 59 | interface Socket { 60 | _connect(): void; 61 | reconnect(): any; 62 | disconnect(): any; 63 | isConnected(): boolean; 64 | isConnecting(): boolean; 65 | mightBeAboutToAutoConnect(): boolean; 66 | replay(): Socket; 67 | on(eventName: any, callback: EventCallback): Socket; 68 | off(eventName: any, callback: EventCallback): Socket; 69 | removeAllListeners(): Socket; 70 | get(url: string, data: any, callback: ResponseCallback): void; 71 | post(url: string, data: any, callback: ResponseCallback): void; 72 | put(url: string, data: any, callback: ResponseCallback): void; 73 | patch(url: string, data: any, callback: ResponseCallback): void; 74 | delete(url: string, data: any, callback: ResponseCallback): void; 75 | request(options: RequestOptions, callback: ResponseCallback): void; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/sails.io.client.ts: -------------------------------------------------------------------------------- 1 | export declare namespace SailsIOClient { 2 | 3 | interface Headers { 4 | [key: string]: string | boolean; 5 | } 6 | 7 | namespace JWR { 8 | 9 | interface Response { 10 | body: any; 11 | error: any; 12 | headers: Headers; 13 | statusCode: number; 14 | toString: () => string; 15 | toPOJO: () => object; 16 | pipe: () => Error; 17 | } 18 | 19 | interface Event { 20 | verb: any; 21 | id: any; 22 | data: object; 23 | } 24 | } 25 | 26 | interface IO { 27 | socket: Socket; 28 | sails: SailsSocket; 29 | } 30 | 31 | interface Options { 32 | url: string; 33 | query: string; 34 | reconnection: boolean; 35 | environment: string; 36 | autoConnect?: boolean; 37 | useCORSRouteToGetCookie?: boolean; 38 | transports?: string[]; 39 | path?: string; 40 | headers?: Headers; 41 | timeout?: number; 42 | initialConnectionHeaders?: Headers; 43 | multiplex?: any; 44 | reconnectionAttempts?: number; 45 | reconnectionDelay?: number; 46 | reconnectionDelayMax?: number; 47 | rejectUnauthorized?: boolean; 48 | randomizationFactor?: number; 49 | } 50 | 51 | interface SailsSocket extends Options { 52 | connect: (url, opts) => Socket; 53 | } 54 | 55 | interface RequestOptions { 56 | url?: string; 57 | method?: string; 58 | params?: object; 59 | headers?: Headers; 60 | } 61 | 62 | interface EventCallback { 63 | (response): void; 64 | } 65 | 66 | interface ResponseCallback { 67 | (body: any, JWR: JWR.Response): void; 68 | } 69 | 70 | interface Socket { 71 | _connect(): void; 72 | reconnect(): any; 73 | disconnect(): any; 74 | isConnected(): boolean; 75 | isConnecting(): boolean; 76 | mightBeAboutToAutoConnect(): boolean; 77 | replay(): Socket; 78 | on(eventName, callback: EventCallback): Socket; 79 | off(eventName, callback: EventCallback): Socket; 80 | removeAllListeners(): Socket; 81 | get(url: string, data: any, callback: ResponseCallback): void; 82 | post(url: string, data: any, callback: ResponseCallback): void; 83 | put(url: string, data: any, callback: ResponseCallback): void; 84 | patch(url: string, data: any, callback: ResponseCallback): void; 85 | delete(url: string, data: any, callback: ResponseCallback): void; 86 | request(options: RequestOptions, callback: ResponseCallback): void; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /demo/src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE9, IE10 and IE11 requires all of the following polyfills. **/ 22 | // import 'core-js/es6/symbol'; 23 | // import 'core-js/es6/object'; 24 | // import 'core-js/es6/function'; 25 | // import 'core-js/es6/parse-int'; 26 | // import 'core-js/es6/parse-float'; 27 | // import 'core-js/es6/number'; 28 | // import 'core-js/es6/math'; 29 | // import 'core-js/es6/string'; 30 | // import 'core-js/es6/date'; 31 | // import 'core-js/es6/array'; 32 | // import 'core-js/es6/regexp'; 33 | // import 'core-js/es6/map'; 34 | // import 'core-js/es6/weak-map'; 35 | // import 'core-js/es6/set'; 36 | 37 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 38 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 39 | 40 | /** Evergreen browsers require these. **/ 41 | import "core-js/es6/reflect"; 42 | import "core-js/es7/reflect"; 43 | 44 | 45 | /** 46 | * Required to support Web Animations `@angular/animation`. 47 | * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation 48 | **/ 49 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 50 | 51 | 52 | 53 | /*************************************************************************************************** 54 | * Zone JS is required by Angular itself. 55 | */ 56 | import "zone.js/dist/zone"; // Included with Angular CLI. 57 | 58 | 59 | 60 | /*************************************************************************************************** 61 | * APPLICATION IMPORTS 62 | */ 63 | 64 | /** 65 | * Date, currency, decimal and percent pipes. 66 | * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 67 | */ 68 | // import 'intl'; // Run `npm install --save intl`. 69 | /** 70 | * Need to import at least one locale-data with intl. 71 | */ 72 | // import 'intl/locale-data/jsonp/en'; 73 | 74 | /** 75 | * Make te Library socket.io-client compatible with latest Angular 6 76 | * See https://github.com/socketio/socket.io-client/issues/1206 77 | */ 78 | (window as any).global = window; 79 | -------------------------------------------------------------------------------- /dist/sails.response.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.response.js","sourceRoot":"","sources":["../src/sails.response.ts"],"names":[],"mappings":"AAEA;IACI,uBAAoB,GAA+B;QAA/B,QAAG,GAAH,GAAG,CAA4B;IAAI,CAAC;IAEjD,4BAAI,GAAX;QACI,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,GAAG,CAAC;IACrE,CAAC;IAEM,iCAAS,GAAhB;QACI,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,CAAC;IACxC,CAAC;IAEM,sCAAc,GAArB;QACI,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,CAAC;IACxC,CAAC;IAEM,mCAAW,GAAlB;QACI,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,CAAC;IACxC,CAAC;IAEM,kCAAU,GAAjB;QACI,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,CAAC;IACxC,CAAC;IAEM,oCAAY,GAAnB;QACI,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,CAAC;IACxC,CAAC;IAEM,+BAAO,GAAd;QACI,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;IACxD,CAAC;IAEM,qCAAa,GAApB;QACI,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAChE,CAAC;IAEM,qCAAa,GAApB;QACI,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,CAAC;IACvC,CAAC;IAEM,+BAAO,GAAd;QACI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;IAC/B,CAAC;IAEM,+BAAO,GAAd;QACI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC;IAEM,kCAAU,GAAjB;QACI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;IAClC,CAAC;IAEM,+BAAO,GAAd;QACI,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB,CAAC;IAEM,kCAAU,GAAjB;QACI,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IAC5B,CAAC;IAEM,gCAAQ,GAAf;QACI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B,CAAC;IAEM,qCAAa,GAApB;QACI,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B,CAAC;IAEM,4BAAI,GAAX;QACI,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEM,8BAAM,GAAb;QACI,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IAEM,gCAAQ,GAAf;QACI,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IACL,oBAAC;AAAD,CAAC,AA9ED,IA8EC","sourcesContent":["import { SailsIOClient } from \"./sails.io.client\";\n\nexport class SailsResponse {\n constructor(private JWR: SailsIOClient.JWR.Response) { }\n\n public isOk(): boolean {\n return this.getStatusCode() >= 200 && this.getStatusCode() < 300;\n }\n\n public isCreated(): boolean {\n return this.getStatusCode() === 201;\n }\n\n public isUnauthorized(): boolean {\n return this.getStatusCode() === 401;\n }\n\n public isForbidden(): boolean {\n return this.getStatusCode() === 403;\n }\n\n public isNotFound(): boolean {\n return this.getStatusCode() === 404;\n }\n\n public isBadRequest(): boolean {\n return this.getStatusCode() === 400;\n }\n\n public isError(): boolean {\n return this.isClientError() || this.isServerError();\n }\n\n public isClientError(): boolean {\n return this.getStatusCode() >= 400 && !this.isServerError();\n }\n\n public isServerError(): boolean {\n return this.getStatusCode() >= 500;\n }\n\n public getCode(): string {\n return this.getBody().code;\n }\n\n public getData(): any {\n return this.getBody().data || this.getBody();\n }\n\n public getMessage(): string {\n return this.getBody().message;\n }\n\n public getBody(): any {\n return this.JWR.body;\n }\n\n public getHeaders(): SailsIOClient.Headers {\n return this.JWR.headers;\n }\n\n public getError(): string {\n return this.JWR.error;\n }\n\n public getStatusCode(): number {\n return this.JWR.statusCode;\n }\n\n public pipe() {\n return this.JWR.pipe();\n }\n\n public toPOJO() {\n return this.JWR.toPOJO();\n }\n\n public toString() {\n return this.JWR.toString();\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/sails.request.options.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.request.options.js","sourceRoot":"","sources":["../src/sails.request.options.ts"],"names":[],"mappings":"AASA;IAGI,6BAAY,EAA8D;YAA5D,YAAG,EAAE,kBAAM,EAAE,kBAAM,EAAE,oBAAO;QACtC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,KAAA,EAAE,MAAM,QAAA,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7F,CAAC;IAED,mCAAK,GAAL,UAAM,OAAqC;QACvC,6BAA6B;QAC7B,KAAK,IAAM,MAAI,IAAI,OAAO,EAAE;YACxB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAI,CAAC,EAAE;gBACtD,OAAO,OAAO,CAAC,MAAI,CAAC,CAAC;aACxB;SACJ;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,mCAAK,GAAb,UAAc,GAAgC;QAAhC,oBAAA,EAAA,QAAgC;QAC1C,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAApB,CAAoB,CAAC,CAAC;QACpD,OAAO,GAAG,CAAC;IACf,CAAC;IAEO,sCAAQ,GAAhB,UAAiB,GAAkC;QAAlC,oBAAA,EAAA,UAA+B,GAAG;QAC/C,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,OAAO,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAZ,CAAY,CAAC,CAAC;QACpC,OAAO,GAAG,CAAC;IACf,CAAC;IAED,sBAAI,uCAAM;aAAV;YACI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,CAAC;;;OAAA;IAED,sBAAI,oCAAG;aAAP;YACI,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAC5B,CAAC;;;OAAA;IAED,sBAAI,uCAAM;aAAV;YACI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,CAAC;;;OAAA;IAED,sBAAI,wCAAO;aAAX;YACI,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAChC,CAAC;;;OAAA;IAED,uCAAS,GAAT;QACI,OAAO;YACH,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAClC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;SACvC,CAAC;IACN,CAAC;IACL,0BAAC;AAAD,CAAC,AAvDD,IAuDC","sourcesContent":["import { SailsIOClient } from \"./sails.io.client\";\n\nexport interface SailsRequestOptionsInterface {\n url?: string;\n method?: string;\n params?: Map;\n headers?: Map;\n}\n\nexport class SailsRequestOptions {\n private readonly options: SailsRequestOptionsInterface;\n\n constructor({ url, method, params, headers }: SailsIOClient.RequestOptions) {\n this.options = { url, method, params: this.toMap(params), headers: this.toMap(headers) };\n }\n\n clone(options: SailsRequestOptionsInterface): this {\n // Strip out undefined values\n for (const name in options) {\n if (!this.options.hasOwnProperty(name) || !options[name]) {\n delete options[name];\n }\n }\n\n Object.assign(this.options, options);\n return this;\n }\n\n private toMap(obj: { [key: string]: any } = {}) {\n let map = new Map;\n Object.keys(obj).forEach(k => (map.set(k, obj[k])));\n return map;\n }\n\n private toObject(map: Map = new Map) {\n let obj = {};\n map.forEach((v, k) => (obj[k] = v));\n return obj;\n }\n\n get method(): string | undefined {\n return this.options.method;\n }\n\n get url(): string | undefined {\n return this.options.url;\n }\n\n get params(): Map | undefined {\n return this.options.params;\n }\n\n get headers(): Map | undefined {\n return this.options.headers;\n }\n\n serialize(): SailsIOClient.RequestOptions {\n return {\n url: this.url,\n method: this.method,\n params: this.toObject(this.params),\n headers: this.toObject(this.headers)\n };\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/sails.model.js: -------------------------------------------------------------------------------- 1 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 2 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 3 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 4 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 5 | return c > 3 && r && Object.defineProperty(target, key, r), r; 6 | }; 7 | var __metadata = (this && this.__metadata) || function (k, v) { 8 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); 9 | }; 10 | import { Property, unserialize } from "./sails.serialize"; 11 | import { Endpoint } from "./sails.decorator.endpoint"; 12 | import { isObject } from "./utils"; 13 | var SailsModel = /** @class */ (function () { 14 | function SailsModel() { 15 | this.id = ""; 16 | } 17 | SailsModel_1 = SailsModel; 18 | SailsModel.prototype.getEndPoint = function () { 19 | return this.getEndPoint(); 20 | }; 21 | SailsModel.serialize = function (model) { 22 | var recr = function (obj) { 23 | for (var key in obj) { 24 | var prop = obj[key]; 25 | // Ignore NULL values 26 | if (prop === null || typeof prop === "function") { 27 | delete obj[key]; 28 | } 29 | // Convert Property Models to their ID representations 30 | if (prop && prop instanceof SailsModel_1 && prop.id !== null) { 31 | obj[key] = prop.id; 32 | } 33 | if (prop && prop instanceof SailsModel_1) { 34 | obj[key] = SailsModel_1.serialize(prop); 35 | } 36 | if (prop && prop instanceof Array) { 37 | obj[key] = prop.map(function (ob) { 38 | if (ob instanceof SailsModel_1) { 39 | return SailsModel_1.serialize(ob); 40 | } 41 | return ob; 42 | }); 43 | } 44 | } 45 | return obj; 46 | }; 47 | return recr(Object.assign({}, model)); 48 | }; 49 | SailsModel.unserialize = function (modelClazz, data) { 50 | var callFn = function (model) { return unserialize(modelClazz, model); }; 51 | if (Array.isArray(data)) { 52 | return data.map(callFn); 53 | } 54 | else if (isObject(data)) { 55 | return callFn(data); 56 | } 57 | throw new Error("SailsModel.unserialize requires a data parameter of either a Literal Object or an Array of Literal Objects"); 58 | }; 59 | var SailsModel_1; 60 | __decorate([ 61 | Property(), 62 | __metadata("design:type", String) 63 | ], SailsModel.prototype, "id", void 0); 64 | __decorate([ 65 | Property({ type: Date }), 66 | __metadata("design:type", Date) 67 | ], SailsModel.prototype, "createdAt", void 0); 68 | __decorate([ 69 | Property({ type: Date }), 70 | __metadata("design:type", Date) 71 | ], SailsModel.prototype, "updatedAt", void 0); 72 | SailsModel = SailsModel_1 = __decorate([ 73 | Endpoint() 74 | ], SailsModel); 75 | return SailsModel; 76 | }()); 77 | export { SailsModel }; 78 | //# sourceMappingURL=sails.model.js.map -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_args": [ 3 | [ 4 | "ngx-sails-socketio@0.1.3", 5 | "/home/thomas/Projects/Medecine-Online/repos/simply-doctor-webapp" 6 | ] 7 | ], 8 | "_from": "ngx-sails-socketio@0.1.3", 9 | "_id": "ngx-sails-socketio@0.1.3", 10 | "_inBundle": false, 11 | "_integrity": "sha512-T0orwNaNqW0EqFvlNew5VQ7pAC+hmDcHtsEE/rz6mlPGCqSlPi+Wv8/8OsC2+ubWNJmS3FtCzWrYpNkScJwJNA==", 12 | "_location": "/ngx-sails-socketio", 13 | "_phantomChildren": {}, 14 | "_requested": { 15 | "type": "version", 16 | "registry": true, 17 | "raw": "ngx-sails-socketio@0.1.3", 18 | "name": "ngx-sails-socketio", 19 | "escapedName": "ngx-sails-socketio", 20 | "rawSpec": "0.1.3", 21 | "saveSpec": null, 22 | "fetchSpec": "0.1.3" 23 | }, 24 | "_requiredBy": [ 25 | "/" 26 | ], 27 | "_resolved": "https://registry.npmjs.org/ngx-sails-socketio/-/ngx-sails-socketio-0.1.3.tgz", 28 | "_spec": "0.1.3", 29 | "_where": "/home/thomas/Projects/Medecine-Online/repos/simply-doctor-webapp", 30 | "author": { 31 | "name": "burntblark" 32 | }, 33 | "bugs": { 34 | "url": "https://github.com/burntblark/ngx-sails-socketio/issues" 35 | }, 36 | "contributors": [ 37 | { 38 | "name": "Jeremiah Ogbomo" 39 | } 40 | ], 41 | "dependencies": { 42 | "@angular/platform-browser": "^6.1.10", 43 | "json-object-mapper": "^1.5.1", 44 | "rxjs": "^6.3.3", 45 | "rxjs-compat": "^6.3.3", 46 | "sails.io.js": "^1.1.12", 47 | "socket.io-client": "^2.1.1", 48 | "zone.js": "^0.8.26" 49 | }, 50 | "description": "An Angular module for connecting SailsJs backend through SocketIO.", 51 | "devDependencies": { 52 | "@angular/cli": "~6.2.3", 53 | "@angular/common": "^6.1.0", 54 | "@angular/compiler": "^6.1.0", 55 | "@angular/compiler-cli": "^6.1.0", 56 | "@angular/core": "^6.1.0", 57 | "@angular/router": "^6.1.0", 58 | "@types/lodash": "^4.14.74", 59 | "@types/socket.io-client": "^1.4.30", 60 | "rollup": "^0.59.4", 61 | "tslint": "^5.4.3", 62 | "typescript": "^2.9.2", 63 | "uglify-js": "^3.4.0", 64 | "watch": "^1.0.2" 65 | }, 66 | "homepage": "https://github.com/burntblark/ngx-sails-socketio#readme", 67 | "keywords": [ 68 | "Ng", 69 | "Ngx", 70 | "Angular", 71 | "Angular2", 72 | "IO", 73 | "Sails", 74 | "WebSocket", 75 | "Socket", 76 | "SocketIO", 77 | "Model", 78 | "Query" 79 | ], 80 | "license": "MIT", 81 | "main": "./dist/index", 82 | "name": "ngx-sails-socketio", 83 | "peerDependencies": { 84 | "@angular/core": "^6.1.0", 85 | "@angular/common": "^6.1.0", 86 | "@angular/platform-browser": "^6.1.0", 87 | "@angular/router": "^6.1.0", 88 | "typescript": "~2.9.2", 89 | "zone.js": "~0.8.26", 90 | "rxjs": "~6.2.0" 91 | }, 92 | "repository": { 93 | "type": "git", 94 | "url": "git+https://github.com/burntblark/ngx-sails-socketio.git" 95 | }, 96 | "scripts": { 97 | "build": "npm run transpile && npm run package && npm run minify", 98 | "demo": "npm run build && cd ./demo && npm i ../", 99 | "demo:watch": "watch 'npm run demo' ./src", 100 | "lint": "tslint --project ./tsconfig.json --type-check --fix", 101 | "minify": "uglifyjs dist/bundles/ngx.sails.socketio.umd.js --screw-ie8 --compress --mangle --comments --output dist/bundles/ngx.sails.socketio.min.js", 102 | "package": "rollup -c", 103 | "test": "echo \"Error: no test specified\" && exit 1", 104 | "transpile": "ngc" 105 | }, 106 | "typings": "./dist/index.d.ts", 107 | "version": "0.1.3" 108 | } 109 | -------------------------------------------------------------------------------- /demo/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/codelyzer" 4 | ], 5 | "rules": { 6 | "arrow-return-shorthand": true, 7 | "callable-types": true, 8 | "class-name": true, 9 | "comment-format": [ 10 | true, 11 | "check-space" 12 | ], 13 | "curly": true, 14 | "eofline": true, 15 | "forin": true, 16 | "import-blacklist": [ 17 | true, 18 | "rxjs" 19 | ], 20 | "import-spacing": true, 21 | "indent": [ 22 | true, 23 | "spaces" 24 | ], 25 | "interface-over-type-literal": true, 26 | "label-position": true, 27 | "max-line-length": [ 28 | true, 29 | 140 30 | ], 31 | "member-access": false, 32 | "member-ordering": [ 33 | true, 34 | { 35 | "order": [ 36 | "static-field", 37 | "instance-field", 38 | "static-method", 39 | "instance-method" 40 | ] 41 | } 42 | ], 43 | "no-arg": true, 44 | "no-bitwise": true, 45 | "no-console": [ 46 | true, 47 | "debug", 48 | "info", 49 | "time", 50 | "timeEnd", 51 | "trace" 52 | ], 53 | "no-construct": true, 54 | "no-debugger": true, 55 | "no-duplicate-super": true, 56 | "no-empty": false, 57 | "no-empty-interface": true, 58 | "no-eval": true, 59 | "no-inferrable-types": [ 60 | true, 61 | "ignore-params" 62 | ], 63 | "no-misused-new": true, 64 | "no-non-null-assertion": true, 65 | "no-shadowed-variable": true, 66 | "no-string-literal": false, 67 | "no-string-throw": true, 68 | "no-switch-case-fall-through": true, 69 | "no-trailing-whitespace": true, 70 | "no-unnecessary-initializer": true, 71 | "no-unused-expression": true, 72 | "no-use-before-declare": true, 73 | "no-var-keyword": true, 74 | "object-literal-sort-keys": false, 75 | "one-line": [ 76 | true, 77 | "check-open-brace", 78 | "check-catch", 79 | "check-else", 80 | "check-whitespace" 81 | ], 82 | "prefer-const": true, 83 | "quotemark": [ 84 | true, 85 | "double" 86 | ], 87 | "radix": true, 88 | "semicolon": [ 89 | true, 90 | "always" 91 | ], 92 | "triple-equals": [ 93 | true, 94 | "allow-null-check" 95 | ], 96 | "typedef-whitespace": [ 97 | true, 98 | { 99 | "call-signature": "nospace", 100 | "index-signature": "nospace", 101 | "parameter": "nospace", 102 | "property-declaration": "nospace", 103 | "variable-declaration": "nospace" 104 | } 105 | ], 106 | "typeof-compare": true, 107 | "unified-signatures": true, 108 | "variable-name": false, 109 | "whitespace": [ 110 | true, 111 | "check-branch", 112 | "check-decl", 113 | "check-operator", 114 | "check-separator", 115 | "check-type" 116 | ], 117 | "directive-selector": [ 118 | true, 119 | "attribute", 120 | "app", 121 | "camelCase" 122 | ], 123 | "component-selector": [ 124 | true, 125 | "element", 126 | "app", 127 | "kebab-case" 128 | ], 129 | "use-input-property-decorator": true, 130 | "use-output-property-decorator": true, 131 | "use-host-property-decorator": true, 132 | "no-input-rename": true, 133 | "no-output-rename": true, 134 | "use-life-cycle-interface": true, 135 | "use-pipe-transform-interface": true, 136 | "component-class-suffix": true, 137 | "directive-class-suffix": true, 138 | "no-access-missing-member": true, 139 | "templates-use-public": true, 140 | "invoke-injectable": true 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /dist/sails.model.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.model.js","sourceRoot":"","sources":["../src/sails.model.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;;IAEnC;QAEgB,OAAE,GAAW,EAAE,CAAC;IAkDhC,CAAC;mBAnDqB,UAAU;IAK5B,gCAAW,GAAX;QACI,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEM,oBAAS,GAAhB,UAAgD,KAAQ;QACpD,IAAM,IAAI,GAAG,UAAC,GAAG;YACb,KAAK,IAAM,GAAG,IAAI,GAAG,EAAE;gBACnB,IAAM,IAAI,GAAM,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzB,qBAAqB;gBACrB,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;oBAC7C,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;iBACnB;gBAED,sDAAsD;gBACtD,IAAI,IAAI,IAAI,IAAI,YAAY,YAAU,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE;oBACxD,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;iBACtB;gBAED,IAAI,IAAI,IAAI,IAAI,YAAY,YAAU,EAAE;oBACpC,GAAG,CAAC,GAAG,CAAC,GAAG,YAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;iBACzC;gBAED,IAAI,IAAI,IAAI,IAAI,YAAY,KAAK,EAAE;oBAC/B,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAA,EAAE;wBAClB,IAAI,EAAE,YAAY,YAAU,EAAE;4BAC1B,OAAO,YAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;yBACnC;wBAED,OAAO,EAAE,CAAC;oBACd,CAAC,CAAC,CAAC;iBACN;aACJ;YACD,OAAO,GAAG,CAAC;QACf,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEM,sBAAW,GAAlB,UAAkD,UAAU,EAAE,IAAa;QACvE,IAAM,MAAM,GAAG,UAAC,KAAK,IAAK,OAAA,WAAW,CAAI,UAAU,EAAE,KAAK,CAAM,EAAtC,CAAsC,CAAC;QACjE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACrB,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC3B;aAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;YACvB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;SACvB;QACD,MAAM,IAAI,KAAK,CAAC,4GAA4G,CAAC,CAAC;IAClI,CAAC;;IAjDW;QAAX,QAAQ,EAAE;;0CAAiB;IACF;QAAzB,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;kCAAY,IAAI;iDAAC;IAChB;QAAzB,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;kCAAY,IAAI;iDAAC;IAHxB,UAAU;QAD/B,QAAQ,EAAE;OACW,UAAU,CAmD/B;IAAD,iBAAC;CAAA,IAAA;SAnDqB,UAAU","sourcesContent":["import { Property, unserialize } from \"./sails.serialize\";\nimport { SailsModelInterface } from \"./sails.model.interface\";\nimport { Endpoint } from \"./sails.decorator.endpoint\";\nimport { isObject } from \"./utils\";\n\n@Endpoint()\nexport abstract class SailsModel implements SailsModelInterface {\n @Property() id: string = \"\";\n @Property({ type: Date }) createdAt: Date;\n @Property({ type: Date }) updatedAt: Date;\n\n getEndPoint(): string {\n return this.getEndPoint();\n }\n\n static serialize(model: U): U {\n const recr = (obj) => {\n for (const key in obj) {\n const prop: U = obj[key];\n // Ignore NULL values\n if (prop === null || typeof prop === \"function\") {\n delete obj[key];\n }\n\n // Convert Property Models to their ID representations\n if (prop && prop instanceof SailsModel && prop.id !== null) {\n obj[key] = prop.id;\n }\n\n if (prop && prop instanceof SailsModel) {\n obj[key] = SailsModel.serialize(prop);\n }\n\n if (prop && prop instanceof Array) {\n obj[key] = prop.map(ob => {\n if (ob instanceof SailsModel) {\n return SailsModel.serialize(ob);\n }\n\n return ob;\n });\n }\n }\n return obj;\n };\n return recr(Object.assign({}, model));\n }\n\n static unserialize(modelClazz, data: U | U[]): U | U[] {\n const callFn = (model) => unserialize(modelClazz, model) as U;\n if (Array.isArray(data)) {\n return data.map(callFn);\n } else if (isObject(data)) {\n return callFn(data);\n }\n throw new Error(\"SailsModel.unserialize requires a data parameter of either a Literal Object or an Array of Literal Objects\");\n }\n}"]} -------------------------------------------------------------------------------- /demo/angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "demo": { 7 | "root": "", 8 | "sourceRoot": "src", 9 | "projectType": "application", 10 | "prefix": "app", 11 | "schematics": { 12 | "@schematics/angular:component": { 13 | "styleext": "css" 14 | } 15 | }, 16 | "architect": { 17 | "build": { 18 | "builder": "@angular-devkit/build-angular:browser", 19 | "options": { 20 | "outputPath": "dist/demo", 21 | "index": "src/index.html", 22 | "main": "src/main.ts", 23 | "polyfills": "src/polyfills.ts", 24 | "tsConfig": "src/tsconfig.app.json", 25 | "assets": [ 26 | "src/assets", 27 | "src/favicon.ico" 28 | ], 29 | "styles": [ 30 | "src/styles.css" 31 | ], 32 | "scripts": [ 33 | ] 34 | }, 35 | "configurations": { 36 | "production": { 37 | "fileReplacements": [ 38 | { 39 | "replace": "src/environments/environment.ts", 40 | "with": "src/environments/environment.prod.ts" 41 | } 42 | ], 43 | "optimization": true, 44 | "outputHashing": "all", 45 | "sourceMap": false, 46 | "extractCss": true, 47 | "namedChunks": false, 48 | "aot": true, 49 | "extractLicenses": true, 50 | "vendorChunk": false, 51 | "buildOptimizer": true 52 | } 53 | } 54 | }, 55 | "serve": { 56 | "builder": "@angular-devkit/build-angular:dev-server", 57 | "options": { 58 | "browserTarget": "demo:build" 59 | }, 60 | "configurations": { 61 | "production": { 62 | "browserTarget": "demo:build:production" 63 | } 64 | } 65 | }, 66 | "extract-i18n": { 67 | "builder": "@angular-devkit/build-angular:extract-i18n", 68 | "options": { 69 | "browserTarget": "demo:build" 70 | } 71 | }, 72 | "test": { 73 | "builder": "@angular-devkit/build-angular:karma", 74 | "options": { 75 | "main": "src/test.ts", 76 | "polyfills": "src/polyfills.ts", 77 | "tsConfig": "src/tsconfig.spec.json", 78 | "karmaConfig": "src/karma.conf.js", 79 | "styles": [ 80 | "src/styles.css" 81 | ], 82 | "scripts": [], 83 | "assets": [ 84 | "assets", 85 | "favicon.ico" 86 | ] 87 | } 88 | }, 89 | "lint": { 90 | "builder": "@angular-devkit/build-angular:tslint", 91 | "options": { 92 | "tsConfig": [ 93 | "src/tsconfig.app.json", 94 | "src/tsconfig.spec.json" 95 | ], 96 | "exclude": [ 97 | "**/node_modules/**" 98 | ] 99 | } 100 | } 101 | } 102 | }, 103 | "demo-e2e": { 104 | "root": "e2e/", 105 | "projectType": "application", 106 | "architect": { 107 | "e2e": { 108 | "builder": "@angular-devkit/build-angular:protractor", 109 | "options": { 110 | "protractorConfig": "./protractor.conf.js", 111 | "devServerTarget": "demo:serve" 112 | }, 113 | "configurations": { 114 | "production": { 115 | "devServerTarget": "demo:serve:production" 116 | } 117 | } 118 | }, 119 | "lint": { 120 | "builder": "@angular-devkit/build-angular:tslint", 121 | "options": { 122 | "tsConfig": "e2e/tsconfig.e2e.json", 123 | "exclude": [ 124 | "**/node_modules/**" 125 | ] 126 | } 127 | } 128 | } 129 | } 130 | }, 131 | "defaultProject": "demo" 132 | } 133 | -------------------------------------------------------------------------------- /dist/sails.request.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.request.js","sourceRoot":"","sources":["../src/sails.request.ts"],"names":[],"mappings":"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","sourcesContent":["import { Sails } from \"./sails\";\nimport { SailsResponse } from \"./sails.response\";\nimport { SailsIOClient } from \"./sails.io.client\";\nimport { SailsRequestOptions } from \"./sails.request.options\";\nimport { Observable } from \"rxjs\";\n\nclass QueryBuilder {\n constructor(private query: string = \"\") { }\n\n append(criteria: string) {\n if (typeof criteria === \"string\") {\n if (this.query.length) {\n this.query += \"&\";\n }\n this.query += criteria;\n }\n return this;\n }\n\n toString() {\n if (this.query && this.query.charAt(0) !== \"?\") {\n this.query = \"?\" + this.query;\n }\n return this.query;\n }\n}\n\nexport const Method = {\n GET: \"get\",\n POST: \"post\",\n PUT: \"put\",\n DELETE: \"delete\",\n PATCH: \"patch\",\n};\n\nexport class SailsRequest {\n private parameters: string[] = [];\n\n constructor(private sails: Sails) { }\n\n public get(url: string, headers?: SailsIOClient.Headers) {\n return this._request(Method.GET, url, headers);\n }\n\n public post(url: string, params: object, headers?: SailsIOClient.Headers) {\n return this._request(Method.POST, url, params, headers);\n }\n\n public put(url: string, params: object, headers?: SailsIOClient.Headers) {\n return this._request(Method.PUT, url, params, headers);\n }\n\n public delete(url: string, headers?: SailsIOClient.Headers) {\n return this._request(Method.DELETE, url, headers);\n }\n\n public patch(url: string, headers?: SailsIOClient.Headers) {\n return this._request(Method.PATCH, url, headers);\n }\n\n private _request(method: string, url: string, params?: Object, headers?: SailsIOClient.Headers): Observable {\n const request = new SailsRequestOptions({ method, url: this.buildQuery(url), params, headers });\n return this.sails.request(request);\n }\n\n public addParam(name: string, value: boolean | number | string | { toString(): string }): this {\n if (value.toString().length) {\n this.parameters.push(`${name}=${value}`);\n }\n return this;\n }\n\n private getParams(): string {\n return this.parameters.join(\"&\");\n }\n\n private buildQuery(url: string): string {\n return url + new QueryBuilder(this.getParams());\n }\n}\n"]} -------------------------------------------------------------------------------- /src/sails.query.ts: -------------------------------------------------------------------------------- 1 | import { Sails } from "./sails"; 2 | import { SailsModel } from "./sails.model"; 3 | import { SailsRequest } from "./sails.request"; 4 | import { SailsModelInterface } from "./sails.model.interface"; 5 | import { RequestCriteria } from "./sails.request.criteria"; 6 | import { Observable } from "rxjs"; 7 | import { map } from "rxjs/operators"; 8 | 9 | export class SailsQuery { 10 | private model: T; 11 | private request: SailsRequest; 12 | private criteria: RequestCriteria; 13 | private errorMsg = `[SailsSocketIO]: the data is not an instance of ${this.modelClass.name}. 14 | You could SailsModel.unserialize(${this.modelClass.name}, data) as ${this.modelClass.name}[] (Array of Models), Or 15 | SailsModel.unserialize(${this.modelClass.name}, data) as ${this.modelClass.name} (Single Models) 16 | after fetching the data with SailsRequest.`; 17 | 18 | constructor(sails: Sails, private modelClass: { new(): T }) { 19 | this.request = new SailsRequest(sails); 20 | this.model = new modelClass(); 21 | } 22 | 23 | public find(): Observable { 24 | this.request.addParam("where", this.getRequestCriteria()); 25 | return this.request.get(`/${this.model.getEndPoint()}`).pipe(map(res => { 26 | if (res.isOk()) { 27 | return SailsModel.unserialize(this.modelClass, res.getData()) as T[]; 28 | } 29 | throw res; 30 | })); 31 | } 32 | 33 | public findById(id: string): Observable { 34 | this.request.addParam("where", this.getRequestCriteria()); 35 | return this.request.get(`/${this.model.getEndPoint()}/${id}`).pipe(map(res => { 36 | if (res.isOk()) { 37 | return SailsModel.unserialize(this.modelClass, res.getData()) as T; 38 | } 39 | throw res; 40 | })); 41 | } 42 | 43 | public save(model: T): Observable { 44 | if (!(model instanceof this.modelClass)) { 45 | throw new TypeError(this.errorMsg); 46 | } 47 | 48 | const data = SailsModel.serialize(model); 49 | const url = `/${model.getEndPoint()}`; 50 | if (model.id === null) { 51 | return this.request.post(url, data).pipe(map(res => { 52 | if (res.isOk()) { 53 | return SailsModel.unserialize(this.modelClass, res.getData()) as T; 54 | } 55 | throw res; 56 | })); 57 | } else { 58 | return this.request.put(url.concat("/", model.id), data).pipe(map(res => { 59 | if (res.isOk()) { 60 | return SailsModel.unserialize(this.modelClass, res.getData()) as T; 61 | } 62 | throw res; 63 | })); 64 | } 65 | } 66 | 67 | public update(id: string, model: Partial): Observable { 68 | if (model.createdAt) { 69 | delete model.createdAt; 70 | } 71 | if (model.updatedAt) { 72 | delete model.updatedAt; 73 | } 74 | const data = model instanceof SailsModel ? SailsModel.serialize(model) : Object.assign({}, model); 75 | return this.request.put(`/${this.model.getEndPoint()}/${id}`, data).pipe(map(res => { 76 | if (res.isOk()) { 77 | return SailsModel.unserialize(this.modelClass, res.getData()) as T; 78 | } 79 | throw res; 80 | })); 81 | } 82 | 83 | public remove(id: string): Observable { 84 | return this.request.delete(`/${this.model.getEndPoint()}/${id}`).pipe(map(res => { 85 | if (res.isOk()) { 86 | return SailsModel.unserialize(this.modelClass, res.getData()) as T; 87 | } 88 | throw res; 89 | })); 90 | } 91 | 92 | public setLimit(limit: number): this { 93 | this.request.addParam("limit", limit); 94 | return this; 95 | } 96 | 97 | public setSort(sort: string): this { 98 | this.request.addParam("sort", sort); 99 | return this; 100 | } 101 | 102 | public setSkip(skip: number): this { 103 | this.request.addParam("skip", skip); 104 | return this; 105 | } 106 | 107 | public setPopulation(...population: string[]): this { 108 | this.request.addParam("populate", `[${population.join(",")}]`); 109 | return this; 110 | } 111 | 112 | public setRequestCriteria(criteria: RequestCriteria): this { 113 | this.criteria = criteria; 114 | return this; 115 | } 116 | 117 | private getRequestCriteria(): RequestCriteria { 118 | return this.criteria || new RequestCriteria(); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ngx-sails-socketio 2 | [![npm version](https://badge.fury.io/js/ngx-sails-socketio.svg)](https://badge.fury.io/js/ngx-sails-socketio) 3 | [![Build Status](https://travis-ci.org/burntblark/ngx-sails-socketio.svg?branch=master)](https://travis-ci.org/burntblark/ngx-sails-socketio) 4 | [![Coverage Status](https://coveralls.io/repos/github/burntblark/ngx-sails-socketio/badge.svg?branch=master&cacheBuster=1)](https://coveralls.io/github/burntblark/ngx-sails-socketio?branch=master) 5 | 6 | An Angular module for connecting to your SailsJs Backend/API through SocketIO. 7 | 8 | ## Installation 9 | 10 | ```bash 11 | npm i ngx-sails-socketio 12 | ``` 13 | 14 | ## Usage 15 | 16 | Add `SailsModule` to your application module. 17 | 18 | ```ts 19 | // Override options to configure connection to your sailsjs backend 20 | const options: SailsOptions = { 21 | url: "ws://127.0.0.1:1337", 22 | prefix: "/api", // Optional uri prefix 23 | environment: SailsEnvironment.DEV, 24 | query: "__sails_io_sdk_version=0.11.0&__sails_io_sdk_platform=windows&__sails_io_sdk_language=javascript", 25 | reconnection: true, 26 | autoConnect: false 27 | }; 28 | 29 | @NgModule({ 30 | declarations: [ 31 | AppComponent 32 | ], 33 | imports: [ 34 | SailsModule.forRoot(options, [AuthInterceptor,]) 35 | ... 36 | ], 37 | providers: [], 38 | bootstrap: [AppComponent] 39 | }) 40 | 41 | export class AppModule { } 42 | ``` 43 | 44 | An implementation of the AuthInterceptor class 45 | 46 | ```ts 47 | @Injectable() 48 | export class AuthInterceptor implements SailsInterceptorInterface { 49 | 50 | constructor(private router: Router, private jobs: JobsService) { 51 | } 52 | 53 | intercept(request: SailsRequestOptions, next: SailsInterceptorHandlerInterface): Observable { 54 | request.clone({ 55 | headers: request.headers.set("Authorization", [token]) // Replace [token] with your auth token 56 | }); 57 | const response = next.handle(request); 58 | 59 | return response.map(res => { 60 | if (res.getStatusCode() === 401) { 61 | // handle unauthorised request. 62 | } 63 | return res; 64 | }); 65 | } 66 | } 67 | ``` 68 | 69 | Inject the `Sails` into your components/services and instatiate classes specific to your objective. 70 | 71 | ```ts 72 | class ExampleComponent implements OnInit { 73 | 74 | data: any; 75 | 76 | constructor(private sails: SailsClient) { } 77 | 78 | ngOnInit() { 79 | const req = new SailsRequest(this.sails); 80 | req.get('/model/action').subscribe(res => { 81 | this.data = res.getBody(); 82 | }); 83 | } 84 | 85 | } 86 | ``` 87 | 88 | ## API 89 | 90 | ### class SailsRequest 91 | 92 | Makes a request for a resource to the configured sails server. Has methods that maps to the various supported RESTful API verbs. 93 | 94 | #### Methods 95 | 96 | * get(url: `string`): `Observable` 97 | * post(url: `string`, data: `any`): `Observable` 98 | * put(url: `string`, data: `any`): `Observable` 99 | * patch(url: `string`, body: `any`): `Observable` 100 | * delete(url: `string`): `Observable` 101 | 102 | ### class SailsSubscription 103 | 104 | A class for subscribing to resourceful Pub-Sub events emitted from a sailsjs backend. 105 | 106 | #### Methods 107 | 108 | * on(eventName: `string`): `Observable` 109 | * off(eventName: `string`): `Observable` 110 | 111 | #### Example(s) 112 | 113 | *Under construction* 114 | 115 | ### class SailsEvent 116 | 117 | A class representing an event on a resource from the server. This follows the structure as described in the sailsjs Pub-Sub event documentation. 118 | 119 | ### class SailsQuery 120 | 121 | A class for querying records from the server. Similar to `SailsRequests` but has methods mapping actions as detail on waterline api used by sailsjs. 122 | 123 | ### interface SailsInterceptorInterface 124 | 125 | An interface to construct an iterceptor to use for requests. 126 | 127 | #### Example(s) 128 | 129 | An authentication interceptor to set the *Authorization* header on every request. 130 | 131 | ```ts 132 | @Injectable() 133 | export class AuthInterceptor implements SailsInterceptorInterface { 134 | 135 | constructor(private router: Router) { 136 | } 137 | 138 | intercept(request: SailsRequestOptions, next: SailsInterceptorHandlerInterface): Promise { 139 | request.clone({ 140 | headers: request.headers.set("Authorization", token) 141 | }); 142 | 143 | const response = next.handle(request); 144 | 145 | return response.then(res => { 146 | if (res.getStatusCode() === 401) { 147 | this.router.navigateByUrl("login"); 148 | } 149 | return res; 150 | }); 151 | } 152 | } 153 | ``` 154 | -------------------------------------------------------------------------------- /dist/sails.query.js: -------------------------------------------------------------------------------- 1 | import { SailsModel } from "./sails.model"; 2 | import { SailsRequest } from "./sails.request"; 3 | import { RequestCriteria } from "./sails.request.criteria"; 4 | import { map } from "rxjs/operators"; 5 | var SailsQuery = /** @class */ (function () { 6 | function SailsQuery(sails, modelClass) { 7 | this.modelClass = modelClass; 8 | this.errorMsg = "[SailsSocketIO]: the data is not an instance of " + this.modelClass.name + ".\n You could SailsModel.unserialize(" + this.modelClass.name + ", data) as " + this.modelClass.name + "[] (Array of Models), Or\n SailsModel.unserialize(" + this.modelClass.name + ", data) as " + this.modelClass.name + " (Single Models)\n after fetching the data with SailsRequest."; 9 | this.request = new SailsRequest(sails); 10 | this.model = new modelClass(); 11 | } 12 | SailsQuery.prototype.find = function () { 13 | var _this = this; 14 | this.request.addParam("where", this.getRequestCriteria()); 15 | return this.request.get("/" + this.model.getEndPoint()).pipe(map(function (res) { 16 | if (res.isOk()) { 17 | return SailsModel.unserialize(_this.modelClass, res.getData()); 18 | } 19 | throw res; 20 | })); 21 | }; 22 | SailsQuery.prototype.findById = function (id) { 23 | var _this = this; 24 | this.request.addParam("where", this.getRequestCriteria()); 25 | return this.request.get("/" + this.model.getEndPoint() + "/" + id).pipe(map(function (res) { 26 | if (res.isOk()) { 27 | return SailsModel.unserialize(_this.modelClass, res.getData()); 28 | } 29 | throw res; 30 | })); 31 | }; 32 | SailsQuery.prototype.save = function (model) { 33 | var _this = this; 34 | if (!(model instanceof this.modelClass)) { 35 | throw new TypeError(this.errorMsg); 36 | } 37 | var data = SailsModel.serialize(model); 38 | var url = "/" + model.getEndPoint(); 39 | if (model.id === null) { 40 | return this.request.post(url, data).pipe(map(function (res) { 41 | if (res.isOk()) { 42 | return SailsModel.unserialize(_this.modelClass, res.getData()); 43 | } 44 | throw res; 45 | })); 46 | } 47 | else { 48 | return this.request.put(url.concat("/", model.id), data).pipe(map(function (res) { 49 | if (res.isOk()) { 50 | return SailsModel.unserialize(_this.modelClass, res.getData()); 51 | } 52 | throw res; 53 | })); 54 | } 55 | }; 56 | SailsQuery.prototype.update = function (id, model) { 57 | var _this = this; 58 | if (model.createdAt) { 59 | delete model.createdAt; 60 | } 61 | if (model.updatedAt) { 62 | delete model.updatedAt; 63 | } 64 | var data = model instanceof SailsModel ? SailsModel.serialize(model) : Object.assign({}, model); 65 | return this.request.put("/" + this.model.getEndPoint() + "/" + id, data).pipe(map(function (res) { 66 | if (res.isOk()) { 67 | return SailsModel.unserialize(_this.modelClass, res.getData()); 68 | } 69 | throw res; 70 | })); 71 | }; 72 | SailsQuery.prototype.remove = function (id) { 73 | var _this = this; 74 | return this.request.delete("/" + this.model.getEndPoint() + "/" + id).pipe(map(function (res) { 75 | if (res.isOk()) { 76 | return SailsModel.unserialize(_this.modelClass, res.getData()); 77 | } 78 | throw res; 79 | })); 80 | }; 81 | SailsQuery.prototype.setLimit = function (limit) { 82 | this.request.addParam("limit", limit); 83 | return this; 84 | }; 85 | SailsQuery.prototype.setSort = function (sort) { 86 | this.request.addParam("sort", sort); 87 | return this; 88 | }; 89 | SailsQuery.prototype.setSkip = function (skip) { 90 | this.request.addParam("skip", skip); 91 | return this; 92 | }; 93 | SailsQuery.prototype.setPopulation = function () { 94 | var population = []; 95 | for (var _i = 0; _i < arguments.length; _i++) { 96 | population[_i] = arguments[_i]; 97 | } 98 | this.request.addParam("populate", "[" + population.join(",") + "]"); 99 | return this; 100 | }; 101 | SailsQuery.prototype.setRequestCriteria = function (criteria) { 102 | this.criteria = criteria; 103 | return this; 104 | }; 105 | SailsQuery.prototype.getRequestCriteria = function () { 106 | return this.criteria || new RequestCriteria(); 107 | }; 108 | return SailsQuery; 109 | }()); 110 | export { SailsQuery }; 111 | //# sourceMappingURL=sails.query.js.map -------------------------------------------------------------------------------- /src/sails.request.criteria.ts: -------------------------------------------------------------------------------- 1 | import { isUndefined, isString, isEmptyObject, isObject } from "./utils"; 2 | 3 | export class RequestCriteria { 4 | 5 | public or(): RequestCriteria { 6 | if (isUndefined(this.orCriteria["or"])) { 7 | this.orCriteria["or"] = [this.criteria]; 8 | this.criteria = {}; 9 | return this; 10 | } 11 | if (Array.isArray(this.orCriteria["or"])) { 12 | this.orCriteria["or"].push(this.criteria); 13 | } else if (isObject(this.criteria["or"])) { 14 | this.orCriteria["or"] = [this.criteria]; 15 | } 16 | this.criteria = {}; 17 | return this; 18 | } 19 | 20 | public whereNotEqualTo(key: string, value: string): RequestCriteria { 21 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 22 | this.criteria[key] = { "!": value }; 23 | return this; 24 | } 25 | if (isUndefined(this.criteria[key]["!"])) { 26 | this.criteria[key]["!"] = value; 27 | return this; 28 | } 29 | throw new Error("DuplicateError: ! clause, use whereNotIn instead"); 30 | } 31 | 32 | public whereLike(key: string, value: string): RequestCriteria { 33 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 34 | this.criteria[key] = { "like": value }; 35 | return this; 36 | } 37 | if (isUndefined(this.criteria[key]["like"])) { 38 | this.criteria[key]["like"] = value; 39 | return this; 40 | } 41 | throw new Error("DuplicateError: like clause has already been used in this query"); 42 | } 43 | 44 | public whereEqualTo(key: string, value: string): RequestCriteria { 45 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 46 | this.criteria[key] = value; 47 | return this; 48 | } 49 | throw new Error("DuplicateError: contains clause has already been used in this query"); 50 | } 51 | 52 | public whereContains(key: string, value: string): RequestCriteria { 53 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 54 | this.criteria[key] = { "contains": value }; 55 | return this; 56 | } 57 | if (isUndefined(this.criteria[key]["contains"])) { 58 | this.criteria[key]["contains"] = value; 59 | return this; 60 | } 61 | throw new Error("DuplicateError: contains clause has already been used in this query"); 62 | } 63 | 64 | public whereIn(key: string, ...value: string[]): RequestCriteria { 65 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 66 | this.criteria[key] = value; 67 | return this; 68 | } 69 | throw new Error("DuplicateError: contains clause has already been used in this query"); 70 | } 71 | 72 | public whereStartsWith(key: string, value: string): RequestCriteria { 73 | if (isString(this.criteria[key])) { 74 | this.criteria[key] = { "startsWith": value }; 75 | return this; 76 | } 77 | if (isUndefined(this.criteria[key]["startsWith"])) { 78 | this.criteria[key]["startsWith"] = value; 79 | return this; 80 | } 81 | throw new Error("DuplicateError: startsWith clause has already been used in this query"); 82 | } 83 | 84 | public whereEndsWith(key: string, value: string): RequestCriteria { 85 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 86 | this.criteria[key] = { "endsWith": value }; 87 | return this; 88 | } 89 | if (isUndefined(this.criteria[key]["endsWith"])) { 90 | this.criteria[key]["endsWith"] = value; 91 | return this; 92 | } 93 | throw new Error("DuplicateError: endsWith clause has already been used in this query"); 94 | } 95 | 96 | public whereNotIn(key: string, value: string): RequestCriteria { 97 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 98 | this.criteria[key] = { "!": [value] }; 99 | return this; 100 | } 101 | if (isUndefined(this.criteria[key]["!"])) { 102 | this.criteria[key]["!"] = [value]; 103 | return this; 104 | } 105 | if (Array.isArray(this.criteria[key]["!"])) { 106 | this.criteria[key]["!"].push(value); 107 | } else { 108 | this.criteria[key]["!"] = [this.criteria[key]["!"], value]; 109 | } 110 | return this; 111 | } 112 | 113 | public whereLessThan(key: string, value: string | number | boolean | Date): RequestCriteria { 114 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 115 | this.criteria[key] = { "<": value }; 116 | return this; 117 | } 118 | if (isUndefined(this.criteria[key]["<"])) { 119 | this.criteria[key]["<"] = value; 120 | return this; 121 | } 122 | throw new Error("DuplicateError: < clause has already been used in this query"); 123 | } 124 | 125 | public whereLessThanOrEqualTo(key: string, value: string | number | boolean | Date): RequestCriteria { 126 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 127 | this.criteria[key] = { "<=": value }; 128 | return this; 129 | } 130 | if (isUndefined(this.criteria[key]["<="])) { 131 | this.criteria[key]["<="] = value; 132 | return this; 133 | } 134 | throw new Error("DuplicateError: <= clause has already been used in this query"); 135 | } 136 | 137 | public whereGreaterThan(key: string, value: string | number | boolean | Date): RequestCriteria { 138 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 139 | this.criteria[key] = { ">": value }; 140 | return this; 141 | } 142 | if (isUndefined(this.criteria[key][">"])) { 143 | this.criteria[key][">"] = value; 144 | return this; 145 | } 146 | throw new Error("DuplicateError: > clause has already been used in this query"); 147 | } 148 | 149 | public whereGreaterThanOrEqualTo(key: string, value: string | number | boolean | Date): RequestCriteria { 150 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 151 | this.criteria[key] = { ">=": value }; 152 | return this; 153 | } 154 | if (isUndefined(this.criteria[key][">="])) { 155 | this.criteria[key][">="] = value; 156 | return this; 157 | } 158 | throw new Error("DuplicateError: >= clause has already been used in this query"); 159 | } 160 | 161 | private criteria: object = {}; 162 | private orCriteria: object = {}; 163 | 164 | private build(): string { 165 | if (isEmptyObject(this.criteria)) { 166 | return ""; 167 | } 168 | const stringify = criteria => JSON.stringify(criteria); 169 | 170 | if (!isEmptyObject(this.orCriteria)) { 171 | if (Array.isArray(this.orCriteria["or"])) { 172 | this.orCriteria["or"].push(this.criteria); 173 | } 174 | return stringify(this.orCriteria); 175 | } 176 | return stringify(this.criteria); 177 | } 178 | 179 | public toString() { 180 | return this.build(); 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /dist/sails.request.criteria.js: -------------------------------------------------------------------------------- 1 | import { isUndefined, isString, isEmptyObject, isObject } from "./utils"; 2 | var RequestCriteria = /** @class */ (function () { 3 | function RequestCriteria() { 4 | this.criteria = {}; 5 | this.orCriteria = {}; 6 | } 7 | RequestCriteria.prototype.or = function () { 8 | if (isUndefined(this.orCriteria["or"])) { 9 | this.orCriteria["or"] = [this.criteria]; 10 | this.criteria = {}; 11 | return this; 12 | } 13 | if (Array.isArray(this.orCriteria["or"])) { 14 | this.orCriteria["or"].push(this.criteria); 15 | } 16 | else if (isObject(this.criteria["or"])) { 17 | this.orCriteria["or"] = [this.criteria]; 18 | } 19 | this.criteria = {}; 20 | return this; 21 | }; 22 | RequestCriteria.prototype.whereNotEqualTo = function (key, value) { 23 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 24 | this.criteria[key] = { "!": value }; 25 | return this; 26 | } 27 | if (isUndefined(this.criteria[key]["!"])) { 28 | this.criteria[key]["!"] = value; 29 | return this; 30 | } 31 | throw new Error("DuplicateError: ! clause, use whereNotIn instead"); 32 | }; 33 | RequestCriteria.prototype.whereLike = function (key, value) { 34 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 35 | this.criteria[key] = { "like": value }; 36 | return this; 37 | } 38 | if (isUndefined(this.criteria[key]["like"])) { 39 | this.criteria[key]["like"] = value; 40 | return this; 41 | } 42 | throw new Error("DuplicateError: like clause has already been used in this query"); 43 | }; 44 | RequestCriteria.prototype.whereEqualTo = function (key, value) { 45 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 46 | this.criteria[key] = value; 47 | return this; 48 | } 49 | throw new Error("DuplicateError: contains clause has already been used in this query"); 50 | }; 51 | RequestCriteria.prototype.whereContains = function (key, value) { 52 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 53 | this.criteria[key] = { "contains": value }; 54 | return this; 55 | } 56 | if (isUndefined(this.criteria[key]["contains"])) { 57 | this.criteria[key]["contains"] = value; 58 | return this; 59 | } 60 | throw new Error("DuplicateError: contains clause has already been used in this query"); 61 | }; 62 | RequestCriteria.prototype.whereIn = function (key) { 63 | var value = []; 64 | for (var _i = 1; _i < arguments.length; _i++) { 65 | value[_i - 1] = arguments[_i]; 66 | } 67 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 68 | this.criteria[key] = value; 69 | return this; 70 | } 71 | throw new Error("DuplicateError: contains clause has already been used in this query"); 72 | }; 73 | RequestCriteria.prototype.whereStartsWith = function (key, value) { 74 | if (isString(this.criteria[key])) { 75 | this.criteria[key] = { "startsWith": value }; 76 | return this; 77 | } 78 | if (isUndefined(this.criteria[key]["startsWith"])) { 79 | this.criteria[key]["startsWith"] = value; 80 | return this; 81 | } 82 | throw new Error("DuplicateError: startsWith clause has already been used in this query"); 83 | }; 84 | RequestCriteria.prototype.whereEndsWith = function (key, value) { 85 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 86 | this.criteria[key] = { "endsWith": value }; 87 | return this; 88 | } 89 | if (isUndefined(this.criteria[key]["endsWith"])) { 90 | this.criteria[key]["endsWith"] = value; 91 | return this; 92 | } 93 | throw new Error("DuplicateError: endsWith clause has already been used in this query"); 94 | }; 95 | RequestCriteria.prototype.whereNotIn = function (key, value) { 96 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 97 | this.criteria[key] = { "!": [value] }; 98 | return this; 99 | } 100 | if (isUndefined(this.criteria[key]["!"])) { 101 | this.criteria[key]["!"] = [value]; 102 | return this; 103 | } 104 | if (Array.isArray(this.criteria[key]["!"])) { 105 | this.criteria[key]["!"].push(value); 106 | } 107 | else { 108 | this.criteria[key]["!"] = [this.criteria[key]["!"], value]; 109 | } 110 | return this; 111 | }; 112 | RequestCriteria.prototype.whereLessThan = function (key, value) { 113 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 114 | this.criteria[key] = { "<": value }; 115 | return this; 116 | } 117 | if (isUndefined(this.criteria[key]["<"])) { 118 | this.criteria[key]["<"] = value; 119 | return this; 120 | } 121 | throw new Error("DuplicateError: < clause has already been used in this query"); 122 | }; 123 | RequestCriteria.prototype.whereLessThanOrEqualTo = function (key, value) { 124 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 125 | this.criteria[key] = { "<=": value }; 126 | return this; 127 | } 128 | if (isUndefined(this.criteria[key]["<="])) { 129 | this.criteria[key]["<="] = value; 130 | return this; 131 | } 132 | throw new Error("DuplicateError: <= clause has already been used in this query"); 133 | }; 134 | RequestCriteria.prototype.whereGreaterThan = function (key, value) { 135 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 136 | this.criteria[key] = { ">": value }; 137 | return this; 138 | } 139 | if (isUndefined(this.criteria[key][">"])) { 140 | this.criteria[key][">"] = value; 141 | return this; 142 | } 143 | throw new Error("DuplicateError: > clause has already been used in this query"); 144 | }; 145 | RequestCriteria.prototype.whereGreaterThanOrEqualTo = function (key, value) { 146 | if (isUndefined(this.criteria[key]) || isString(this.criteria[key])) { 147 | this.criteria[key] = { ">=": value }; 148 | return this; 149 | } 150 | if (isUndefined(this.criteria[key][">="])) { 151 | this.criteria[key][">="] = value; 152 | return this; 153 | } 154 | throw new Error("DuplicateError: >= clause has already been used in this query"); 155 | }; 156 | RequestCriteria.prototype.build = function () { 157 | if (isEmptyObject(this.criteria)) { 158 | return ""; 159 | } 160 | var stringify = function (criteria) { return JSON.stringify(criteria); }; 161 | if (!isEmptyObject(this.orCriteria)) { 162 | if (Array.isArray(this.orCriteria["or"])) { 163 | this.orCriteria["or"].push(this.criteria); 164 | } 165 | return stringify(this.orCriteria); 166 | } 167 | return stringify(this.criteria); 168 | }; 169 | RequestCriteria.prototype.toString = function () { 170 | return this.build(); 171 | }; 172 | return RequestCriteria; 173 | }()); 174 | export { RequestCriteria }; 175 | //# sourceMappingURL=sails.request.criteria.js.map -------------------------------------------------------------------------------- /src/sails.ts: -------------------------------------------------------------------------------- 1 | import SailsIO from "sails.io.js"; 2 | import * as SocketIO from "socket.io-client"; 3 | import { SailsResponse } from "./sails.response"; 4 | import { SailsConfig } from "./sails.config"; 5 | import { Inject, InjectionToken, Injector } from "@angular/core"; 6 | import { SailsIOClient } from "./sails.io.client"; 7 | import { SailsInterceptorConstructor, SailsInterceptorInterface } from "./sails.interceptor"; 8 | import { SailsInterceptorHandler, SailsInterceptorHandlerInterface } from "./sails.interceptor.handler"; 9 | import { SailsOptions } from "./sails.options"; 10 | import { isString } from "./utils"; 11 | import { SailsRequestOptions } from "./sails.request.options"; 12 | import { SailsEvent } from "./sails.event"; 13 | import { Observable } from "rxjs"; 14 | 15 | export const SAILS_OPTIONS = new InjectionToken("SAILS_OPTIONS"); 16 | export const SAILS_INTERCEPTORS = new InjectionToken("SAILS_INTERCEPTORS"); 17 | 18 | export const SailsEnvironment = { 19 | DEV: "development", 20 | PROD: "production" 21 | }; 22 | 23 | export const SailsListener = { 24 | ERROR: "error", 25 | CONNECT: "connect", 26 | RECONNECT: "reconnect", 27 | CONNECTING: "connecting", 28 | DISCONNECT: "disconnect", 29 | RECONNECTING: "reconnecting", 30 | CONNECT_ERROR: "connect_error", 31 | CONNECT_TIMEOUT: "connect_timeout", 32 | }; 33 | 34 | export class Sails implements SailsInterceptorInterface, SailsInterceptorHandlerInterface { 35 | private Socket: SailsIOClient.Socket; 36 | private Config: SailsConfig; 37 | private Listeners: { [eventName: string]: ((data: any) => void)[] } = { 38 | [SailsListener.CONNECT]: [], 39 | [SailsListener.CONNECT_ERROR]: [], 40 | [SailsListener.CONNECT_TIMEOUT]: [], 41 | [SailsListener.CONNECTING]: [], 42 | [SailsListener.RECONNECT]: [], 43 | [SailsListener.RECONNECTING]: [], 44 | [SailsListener.DISCONNECT]: [], 45 | [SailsListener.ERROR]: [], 46 | }; 47 | 48 | private get socket(): SailsIOClient.Socket { 49 | return this.Socket; 50 | } 51 | 52 | private set socket(Socket: SailsIOClient.Socket) { 53 | this.Socket = Socket; 54 | } 55 | 56 | constructor( 57 | @Inject(Injector) private injector: Injector, 58 | @Inject(SAILS_OPTIONS) options: SailsOptions, 59 | @Inject(SAILS_INTERCEPTORS) private Interceptors: SailsInterceptorConstructor[] = []) { 60 | 61 | const io: SailsIOClient.IO = SailsIO(SocketIO); 62 | const socket = io.socket; 63 | 64 | // Helper function for Listeners 65 | const handleListeners = eventName => data => { 66 | this.Listeners[eventName].forEach(callback => callback(data)); 67 | }; 68 | // Set up Event Listeners 69 | socket.on(SailsListener.CONNECT, handleListeners(SailsListener.CONNECT)); 70 | socket.on(SailsListener.CONNECT_ERROR, handleListeners(SailsListener.CONNECT_ERROR)); 71 | socket.on(SailsListener.CONNECT_TIMEOUT, handleListeners(SailsListener.CONNECT_TIMEOUT)); 72 | socket.on(SailsListener.CONNECTING, handleListeners(SailsListener.CONNECTING)); 73 | socket.on(SailsListener.RECONNECT, handleListeners(SailsListener.RECONNECT)); 74 | socket.on(SailsListener.ERROR, handleListeners(SailsListener.ERROR)); 75 | socket.on(SailsListener.RECONNECTING, handleListeners(SailsListener.RECONNECTING)); 76 | socket.on(SailsListener.DISCONNECT, handleListeners(SailsListener.DISCONNECT)); 77 | 78 | // Setup Config 79 | const Config = new SailsConfig(options); 80 | // Merge Config with Sails 81 | Object.assign(io.sails, Config); 82 | 83 | this.socket = socket; 84 | this.Config = Config; 85 | } 86 | 87 | public connect(): Sails { 88 | if (!this.connected()) { 89 | this.socket._connect(); 90 | } 91 | 92 | return this; 93 | } 94 | 95 | public connected(): boolean { 96 | return this.socket.isConnected(); 97 | } 98 | 99 | public isConnecting(): Sails { 100 | this.socket.isConnecting(); 101 | return this; 102 | } 103 | 104 | public disconnect(): Sails { 105 | if (this.connected()) { 106 | this.socket.disconnect(); 107 | } 108 | return this; 109 | } 110 | 111 | public addEventListener(eventName: string, callback: (data: string) => void): this { 112 | if (!this.Listeners[eventName]) { 113 | throw new Error(`The event [${eventName}] has not yet been supported by this library.`); 114 | } 115 | this.Listeners[eventName].push(callback); 116 | return this; 117 | } 118 | 119 | public removeEventListener(eventName: string, callback): this { 120 | if (!this.Listeners[eventName]) { 121 | throw new Error(`The event [${eventName}] has not yet been supported by this library.`); 122 | } 123 | if (this.Listeners[eventName].indexOf(callback) > -1) { 124 | this.Listeners[eventName].splice(this.Listeners[eventName].indexOf(callback), 1); 125 | } 126 | return this; 127 | } 128 | 129 | public on(eventName: string): Observable { 130 | return new Observable((obs) => { 131 | this.socket.on(eventName, response => { 132 | if (response) { 133 | const event = new SailsEvent(response); 134 | obs.next(event); 135 | this.debugReqRes(eventName, event); 136 | } 137 | }); 138 | return () => this.socket.off(eventName, () => { }); 139 | }); 140 | } 141 | 142 | public off(eventName: string): Observable { 143 | return new Observable((obs) => { 144 | this.socket.off(eventName, response => { 145 | if (response) { 146 | const event = new SailsEvent(response); 147 | obs.next(event); 148 | this.debugReqRes(eventName, event); 149 | } 150 | return () => { }; 151 | }); 152 | }); 153 | } 154 | 155 | public request(request: SailsRequestOptions): Observable { 156 | const req = request.clone({ 157 | url: this.Config.prefix + request.url, 158 | }); 159 | 160 | return this.intercept(req); 161 | } 162 | 163 | intercept(request: SailsRequestOptions, next: SailsInterceptorHandlerInterface = this): Observable { 164 | const handler = this.Interceptors.reduceRight((next: SailsInterceptorHandlerInterface, interceptor) => { 165 | return new SailsInterceptorHandler(next, this.injector.get(interceptor)); 166 | }, next); 167 | 168 | return handler.handle(request); 169 | } 170 | 171 | handle(request: SailsRequestOptions): Observable { 172 | return new Observable((obs) => { 173 | this.socket.request(request.serialize(), (body: any, jwr: SailsIOClient.JWR.Response) => { 174 | const response = new SailsResponse(jwr); 175 | if (response.isError()) { 176 | obs.error(response.getError()); 177 | } else { 178 | obs.next(response); 179 | } 180 | 181 | obs.complete(); 182 | this.debugReqRes(request, response); 183 | }); 184 | }); 185 | } 186 | 187 | private debugReqRes(request, response) { 188 | if (this.Config.environment === SailsEnvironment.DEV) { 189 | console.groupCollapsed("[SailsSocketIO] > Debug Output"); 190 | isString(request) ? console.log(request) : console.dir(request); 191 | console.dir(response); 192 | console.groupEnd(); 193 | } 194 | } 195 | } 196 | -------------------------------------------------------------------------------- /dist/sails.js: -------------------------------------------------------------------------------- 1 | import SailsIO from "sails.io.js"; 2 | import * as SocketIO from "socket.io-client"; 3 | import { SailsResponse } from "./sails.response"; 4 | import { SailsConfig } from "./sails.config"; 5 | import { Inject, InjectionToken, Injector } from "@angular/core"; 6 | import { SailsInterceptorHandler } from "./sails.interceptor.handler"; 7 | import { isString } from "./utils"; 8 | import { SailsEvent } from "./sails.event"; 9 | import { Observable } from "rxjs"; 10 | export var SAILS_OPTIONS = new InjectionToken("SAILS_OPTIONS"); 11 | export var SAILS_INTERCEPTORS = new InjectionToken("SAILS_INTERCEPTORS"); 12 | export var SailsEnvironment = { 13 | DEV: "development", 14 | PROD: "production" 15 | }; 16 | export var SailsListener = { 17 | ERROR: "error", 18 | CONNECT: "connect", 19 | RECONNECT: "reconnect", 20 | CONNECTING: "connecting", 21 | DISCONNECT: "disconnect", 22 | RECONNECTING: "reconnecting", 23 | CONNECT_ERROR: "connect_error", 24 | CONNECT_TIMEOUT: "connect_timeout", 25 | }; 26 | var Sails = /** @class */ (function () { 27 | function Sails(injector, options, Interceptors) { 28 | var _a; 29 | if (Interceptors === void 0) { Interceptors = []; } 30 | var _this = this; 31 | this.injector = injector; 32 | this.Interceptors = Interceptors; 33 | this.Listeners = (_a = {}, 34 | _a[SailsListener.CONNECT] = [], 35 | _a[SailsListener.CONNECT_ERROR] = [], 36 | _a[SailsListener.CONNECT_TIMEOUT] = [], 37 | _a[SailsListener.CONNECTING] = [], 38 | _a[SailsListener.RECONNECT] = [], 39 | _a[SailsListener.RECONNECTING] = [], 40 | _a[SailsListener.DISCONNECT] = [], 41 | _a[SailsListener.ERROR] = [], 42 | _a); 43 | var io = SailsIO(SocketIO); 44 | var socket = io.socket; 45 | // Helper function for Listeners 46 | var handleListeners = function (eventName) { return function (data) { 47 | _this.Listeners[eventName].forEach(function (callback) { return callback(data); }); 48 | }; }; 49 | // Set up Event Listeners 50 | socket.on(SailsListener.CONNECT, handleListeners(SailsListener.CONNECT)); 51 | socket.on(SailsListener.CONNECT_ERROR, handleListeners(SailsListener.CONNECT_ERROR)); 52 | socket.on(SailsListener.CONNECT_TIMEOUT, handleListeners(SailsListener.CONNECT_TIMEOUT)); 53 | socket.on(SailsListener.CONNECTING, handleListeners(SailsListener.CONNECTING)); 54 | socket.on(SailsListener.RECONNECT, handleListeners(SailsListener.RECONNECT)); 55 | socket.on(SailsListener.ERROR, handleListeners(SailsListener.ERROR)); 56 | socket.on(SailsListener.RECONNECTING, handleListeners(SailsListener.RECONNECTING)); 57 | socket.on(SailsListener.DISCONNECT, handleListeners(SailsListener.DISCONNECT)); 58 | // Setup Config 59 | var Config = new SailsConfig(options); 60 | // Merge Config with Sails 61 | Object.assign(io.sails, Config); 62 | this.socket = socket; 63 | this.Config = Config; 64 | } 65 | Object.defineProperty(Sails.prototype, "socket", { 66 | get: function () { 67 | return this.Socket; 68 | }, 69 | set: function (Socket) { 70 | this.Socket = Socket; 71 | }, 72 | enumerable: true, 73 | configurable: true 74 | }); 75 | Sails.prototype.connect = function () { 76 | if (!this.connected()) { 77 | this.socket._connect(); 78 | } 79 | return this; 80 | }; 81 | Sails.prototype.connected = function () { 82 | return this.socket.isConnected(); 83 | }; 84 | Sails.prototype.isConnecting = function () { 85 | this.socket.isConnecting(); 86 | return this; 87 | }; 88 | Sails.prototype.disconnect = function () { 89 | if (this.connected()) { 90 | this.socket.disconnect(); 91 | } 92 | return this; 93 | }; 94 | Sails.prototype.addEventListener = function (eventName, callback) { 95 | if (!this.Listeners[eventName]) { 96 | throw new Error("The event [" + eventName + "] has not yet been supported by this library."); 97 | } 98 | this.Listeners[eventName].push(callback); 99 | return this; 100 | }; 101 | Sails.prototype.removeEventListener = function (eventName, callback) { 102 | if (!this.Listeners[eventName]) { 103 | throw new Error("The event [" + eventName + "] has not yet been supported by this library."); 104 | } 105 | if (this.Listeners[eventName].indexOf(callback) > -1) { 106 | this.Listeners[eventName].splice(this.Listeners[eventName].indexOf(callback), 1); 107 | } 108 | return this; 109 | }; 110 | Sails.prototype.on = function (eventName) { 111 | var _this = this; 112 | return new Observable(function (obs) { 113 | _this.socket.on(eventName, function (response) { 114 | if (response) { 115 | var event_1 = new SailsEvent(response); 116 | obs.next(event_1); 117 | _this.debugReqRes(eventName, event_1); 118 | } 119 | }); 120 | return function () { return _this.socket.off(eventName, function () { }); }; 121 | }); 122 | }; 123 | Sails.prototype.off = function (eventName) { 124 | var _this = this; 125 | return new Observable(function (obs) { 126 | _this.socket.off(eventName, function (response) { 127 | if (response) { 128 | var event_2 = new SailsEvent(response); 129 | obs.next(event_2); 130 | _this.debugReqRes(eventName, event_2); 131 | } 132 | return function () { }; 133 | }); 134 | }); 135 | }; 136 | Sails.prototype.request = function (request) { 137 | var req = request.clone({ 138 | url: this.Config.prefix + request.url, 139 | }); 140 | return this.intercept(req); 141 | }; 142 | Sails.prototype.intercept = function (request, next) { 143 | var _this = this; 144 | if (next === void 0) { next = this; } 145 | var handler = this.Interceptors.reduceRight(function (next, interceptor) { 146 | return new SailsInterceptorHandler(next, _this.injector.get(interceptor)); 147 | }, next); 148 | return handler.handle(request); 149 | }; 150 | Sails.prototype.handle = function (request) { 151 | var _this = this; 152 | return new Observable(function (obs) { 153 | _this.socket.request(request.serialize(), function (body, jwr) { 154 | var response = new SailsResponse(jwr); 155 | if (response.isError()) { 156 | obs.error(response.getError()); 157 | } 158 | else { 159 | obs.next(response); 160 | } 161 | obs.complete(); 162 | _this.debugReqRes(request, response); 163 | }); 164 | }); 165 | }; 166 | Sails.prototype.debugReqRes = function (request, response) { 167 | if (this.Config.environment === SailsEnvironment.DEV) { 168 | console.groupCollapsed("[SailsSocketIO] > Debug Output"); 169 | isString(request) ? console.log(request) : console.dir(request); 170 | console.dir(response); 171 | console.groupEnd(); 172 | } 173 | }; 174 | /** @nocollapse */ 175 | Sails.ctorParameters = function () { return [ 176 | { type: Injector, decorators: [{ type: Inject, args: [Injector,] }] }, 177 | { type: undefined, decorators: [{ type: Inject, args: [SAILS_OPTIONS,] }] }, 178 | { type: Array, decorators: [{ type: Inject, args: [SAILS_INTERCEPTORS,] }] } 179 | ]; }; 180 | return Sails; 181 | }()); 182 | export { Sails }; 183 | //# sourceMappingURL=sails.js.map -------------------------------------------------------------------------------- /dist/sails.query.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.query.js","sourceRoot":"","sources":["../src/sails.query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Sails } from \"./sails\";\nimport { SailsModel } from \"./sails.model\";\nimport { SailsRequest } from \"./sails.request\";\nimport { SailsModelInterface } from \"./sails.model.interface\";\nimport { RequestCriteria } from \"./sails.request.criteria\";\nimport { Observable } from \"rxjs\";\nimport { map } from \"rxjs/operators\";\n\nexport class SailsQuery {\n private model: T;\n private request: SailsRequest;\n private criteria: RequestCriteria;\n private errorMsg = `[SailsSocketIO]: the data is not an instance of ${this.modelClass.name}.\n You could SailsModel.unserialize(${this.modelClass.name}, data) as ${this.modelClass.name}[] (Array of Models), Or\n SailsModel.unserialize(${this.modelClass.name}, data) as ${this.modelClass.name} (Single Models)\n after fetching the data with SailsRequest.`;\n\n constructor(sails: Sails, private modelClass: { new(): T }) {\n this.request = new SailsRequest(sails);\n this.model = new modelClass();\n }\n\n public find(): Observable {\n this.request.addParam(\"where\", this.getRequestCriteria());\n return this.request.get(`/${this.model.getEndPoint()}`).pipe(map(res => {\n if (res.isOk()) {\n return SailsModel.unserialize(this.modelClass, res.getData()) as T[];\n }\n throw res;\n }));\n }\n\n public findById(id: string): Observable {\n this.request.addParam(\"where\", this.getRequestCriteria());\n return this.request.get(`/${this.model.getEndPoint()}/${id}`).pipe(map(res => {\n if (res.isOk()) {\n return SailsModel.unserialize(this.modelClass, res.getData()) as T;\n }\n throw res;\n }));\n }\n\n public save(model: T): Observable {\n if (!(model instanceof this.modelClass)) {\n throw new TypeError(this.errorMsg);\n }\n\n const data = SailsModel.serialize(model);\n const url = `/${model.getEndPoint()}`;\n if (model.id === null) {\n return this.request.post(url, data).pipe(map(res => {\n if (res.isOk()) {\n return SailsModel.unserialize(this.modelClass, res.getData()) as T;\n }\n throw res;\n }));\n } else {\n return this.request.put(url.concat(\"/\", model.id), data).pipe(map(res => {\n if (res.isOk()) {\n return SailsModel.unserialize(this.modelClass, res.getData()) as T;\n }\n throw res;\n }));\n }\n }\n\n public update(id: string, model: Partial): Observable {\n if (model.createdAt) {\n delete model.createdAt;\n }\n if (model.updatedAt) {\n delete model.updatedAt;\n }\n const data = model instanceof SailsModel ? SailsModel.serialize(model) : Object.assign({}, model);\n return this.request.put(`/${this.model.getEndPoint()}/${id}`, data).pipe(map(res => {\n if (res.isOk()) {\n return SailsModel.unserialize(this.modelClass, res.getData()) as T;\n }\n throw res;\n }));\n }\n\n public remove(id: string): Observable {\n return this.request.delete(`/${this.model.getEndPoint()}/${id}`).pipe(map(res => {\n if (res.isOk()) {\n return SailsModel.unserialize(this.modelClass, res.getData()) as T;\n }\n throw res;\n }));\n }\n\n public setLimit(limit: number): this {\n this.request.addParam(\"limit\", limit);\n return this;\n }\n\n public setSort(sort: string): this {\n this.request.addParam(\"sort\", sort);\n return this;\n }\n\n public setSkip(skip: number): this {\n this.request.addParam(\"skip\", skip);\n return this;\n }\n\n public setPopulation(...population: string[]): this {\n this.request.addParam(\"populate\", `[${population.join(\",\")}]`);\n return this;\n }\n\n public setRequestCriteria(criteria: RequestCriteria): this {\n this.criteria = criteria;\n return this;\n }\n\n private getRequestCriteria(): RequestCriteria {\n return this.criteria || new RequestCriteria();\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/sails.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"sails.js","sourceRoot":"","sources":["../src/sails.ts"],"names":[],"mappings":"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","sourcesContent":["import SailsIO from \"sails.io.js\";\nimport * as SocketIO from \"socket.io-client\";\nimport { SailsResponse } from \"./sails.response\";\nimport { SailsConfig } from \"./sails.config\";\nimport { Inject, InjectionToken, Injector } from \"@angular/core\";\nimport { SailsIOClient } from \"./sails.io.client\";\nimport { SailsInterceptorConstructor, SailsInterceptorInterface } from \"./sails.interceptor\";\nimport { SailsInterceptorHandler, SailsInterceptorHandlerInterface } from \"./sails.interceptor.handler\";\nimport { SailsOptions } from \"./sails.options\";\nimport { isString } from \"./utils\";\nimport { SailsRequestOptions } from \"./sails.request.options\";\nimport { SailsEvent } from \"./sails.event\";\nimport { Observable } from \"rxjs\";\n\nexport const SAILS_OPTIONS = new InjectionToken(\"SAILS_OPTIONS\");\nexport const SAILS_INTERCEPTORS = new InjectionToken(\"SAILS_INTERCEPTORS\");\n\nexport const SailsEnvironment = {\n DEV: \"development\",\n PROD: \"production\"\n};\n\nexport const SailsListener = {\n ERROR: \"error\",\n CONNECT: \"connect\",\n RECONNECT: \"reconnect\",\n CONNECTING: \"connecting\",\n DISCONNECT: \"disconnect\",\n RECONNECTING: \"reconnecting\",\n CONNECT_ERROR: \"connect_error\",\n CONNECT_TIMEOUT: \"connect_timeout\",\n};\n\nexport class Sails implements SailsInterceptorInterface, SailsInterceptorHandlerInterface {\n private Socket: SailsIOClient.Socket;\n private Config: SailsConfig;\n private Listeners: { [eventName: string]: ((data: any) => void)[] } = {\n [SailsListener.CONNECT]: [],\n [SailsListener.CONNECT_ERROR]: [],\n [SailsListener.CONNECT_TIMEOUT]: [],\n [SailsListener.CONNECTING]: [],\n [SailsListener.RECONNECT]: [],\n [SailsListener.RECONNECTING]: [],\n [SailsListener.DISCONNECT]: [],\n [SailsListener.ERROR]: [],\n };\n\n private get socket(): SailsIOClient.Socket {\n return this.Socket;\n }\n\n private set socket(Socket: SailsIOClient.Socket) {\n this.Socket = Socket;\n }\n\n constructor(\n @Inject(Injector) private injector: Injector,\n @Inject(SAILS_OPTIONS) options: SailsOptions,\n @Inject(SAILS_INTERCEPTORS) private Interceptors: SailsInterceptorConstructor[] = []) {\n\n const io: SailsIOClient.IO = SailsIO(SocketIO);\n const socket = io.socket;\n\n // Helper function for Listeners\n const handleListeners = eventName => data => {\n this.Listeners[eventName].forEach(callback => callback(data));\n };\n // Set up Event Listeners\n socket.on(SailsListener.CONNECT, handleListeners(SailsListener.CONNECT));\n socket.on(SailsListener.CONNECT_ERROR, handleListeners(SailsListener.CONNECT_ERROR));\n socket.on(SailsListener.CONNECT_TIMEOUT, handleListeners(SailsListener.CONNECT_TIMEOUT));\n socket.on(SailsListener.CONNECTING, handleListeners(SailsListener.CONNECTING));\n socket.on(SailsListener.RECONNECT, handleListeners(SailsListener.RECONNECT));\n socket.on(SailsListener.ERROR, handleListeners(SailsListener.ERROR));\n socket.on(SailsListener.RECONNECTING, handleListeners(SailsListener.RECONNECTING));\n socket.on(SailsListener.DISCONNECT, handleListeners(SailsListener.DISCONNECT));\n\n // Setup Config\n const Config = new SailsConfig(options);\n // Merge Config with Sails\n Object.assign(io.sails, Config);\n\n this.socket = socket;\n this.Config = Config;\n }\n\n public connect(): Sails {\n if (!this.connected()) {\n this.socket._connect();\n }\n\n return this;\n }\n\n public connected(): boolean {\n return this.socket.isConnected();\n }\n\n public isConnecting(): Sails {\n this.socket.isConnecting();\n return this;\n }\n\n public disconnect(): Sails {\n if (this.connected()) {\n this.socket.disconnect();\n }\n return this;\n }\n\n public addEventListener(eventName: string, callback: (data: string) => void): this {\n if (!this.Listeners[eventName]) {\n throw new Error(`The event [${eventName}] has not yet been supported by this library.`);\n }\n this.Listeners[eventName].push(callback);\n return this;\n }\n\n public removeEventListener(eventName: string, callback): this {\n if (!this.Listeners[eventName]) {\n throw new Error(`The event [${eventName}] has not yet been supported by this library.`);\n }\n if (this.Listeners[eventName].indexOf(callback) > -1) {\n this.Listeners[eventName].splice(this.Listeners[eventName].indexOf(callback), 1);\n }\n return this;\n }\n\n public on(eventName: string): Observable {\n return new Observable((obs) => {\n this.socket.on(eventName, response => {\n if (response) {\n const event = new SailsEvent(response);\n obs.next(event);\n this.debugReqRes(eventName, event);\n }\n });\n return () => this.socket.off(eventName, () => { });\n });\n }\n\n public off(eventName: string): Observable {\n return new Observable((obs) => {\n this.socket.off(eventName, response => {\n if (response) {\n const event = new SailsEvent(response);\n obs.next(event);\n this.debugReqRes(eventName, event);\n }\n return () => { };\n });\n });\n }\n\n public request(request: SailsRequestOptions): Observable {\n const req = request.clone({\n url: this.Config.prefix + request.url,\n });\n\n return this.intercept(req);\n }\n\n intercept(request: SailsRequestOptions, next: SailsInterceptorHandlerInterface = this): Observable {\n const handler = this.Interceptors.reduceRight((next: SailsInterceptorHandlerInterface, interceptor) => {\n return new SailsInterceptorHandler(next, this.injector.get(interceptor));\n }, next);\n\n return handler.handle(request);\n }\n\n handle(request: SailsRequestOptions): Observable {\n return new Observable((obs) => {\n this.socket.request(request.serialize(), (body: any, jwr: SailsIOClient.JWR.Response) => {\n const response = new SailsResponse(jwr);\n if (response.isError()) {\n obs.error(response.getError());\n } else {\n obs.next(response);\n }\n\n obs.complete();\n this.debugReqRes(request, response);\n });\n });\n }\n\n private debugReqRes(request, response) {\n if (this.Config.environment === SailsEnvironment.DEV) {\n console.groupCollapsed(\"[SailsSocketIO] > Debug Output\");\n isString(request) ? console.log(request) : console.dir(request);\n console.dir(response);\n console.groupEnd();\n }\n }\n}\n"]} --------------------------------------------------------------------------------