diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000000..92b6a8b7190b --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +packages/*/lib +packages/*/lib6 +packages/*/api-docs diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000000..f58b81dd7be2 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "bracketSpacing": false, + "singleQuote": true, + "printWidth": 80, + "trailingComma": "all" +} diff --git a/.vscode/settings.json b/.vscode/settings.json index be0def3821c7..959989256ff4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,8 @@ "editor.tabCompletion": true, "editor.tabSize": 2, "editor.trimAutoWhitespace": true, + "editor.formatOnSave": true, + "files.exclude": { "**/.DS_Store": true, "**/.git": true, @@ -19,10 +21,6 @@ "files.trimTrailingWhitespace": true, "prettier.eslintIntegration": true, - "prettier.bracketSpacing": false, - "prettier.singleQuote": true, - "prettier.printWidth": 80, - "prettier.trailingComma": "all", "tslint.ignoreDefinitionFiles": true, "typescript.tsdk": "./node_modules/typescript/lib" diff --git a/package.json b/package.json index 78b19b336cc2..09b52228451f 100644 --- a/package.json +++ b/package.json @@ -10,18 +10,19 @@ }, "license": "MIT", "devDependencies": { + "@commitlint/cli": "^3.2.0", + "@commitlint/config-angular": "^3.1.1", + "@commitlint/config-lerna-scopes": "^3.1.1", "@types/mocha": "^2.2.42", "@types/node": "^8.0.27", "@types/request": "^2.0.3", "@types/request-promise": "^4.1.37", - "@commitlint/cli": "^3.2.0", - "@commitlint/config-angular": "^3.1.1", - "@commitlint/config-lerna-scopes": "^3.1.1", "coveralls": "^2.13.1", - "lerna": "^2.1.2", "cz-conventional-changelog": "^2.0.0", + "lerna": "^2.1.2", "mocha": "^3.4.0", "nyc": "^11.2.1", + "prettier": "^1.7.3", "request": "^2.79.0", "request-promise": "^4.1.1", "strong-docs": "^1.4.0", @@ -34,8 +35,13 @@ "coverage:ci": "nyc report --reporter=text-lcov | coveralls", "precoverage": "npm test", "coverage": "open coverage/index.html", - "lint": "tslint -c tslint.full.json --project tsconfig.json --type-check", - "lint:fix": "npm run lint -- --fix", + "lint": "npm run prettier:check && npm run tslint", + "lint:fix": "npm run prettier:fix && npm run tslint:fix", + "tslint": "tslint -c tslint.full.json --project tsconfig.json --type-check", + "tslint:fix": "npm run tslint -- --fix", + "prettier:cli": "prettier \"**/*.ts\"", + "prettier:check": "npm run prettier:cli -- -l", + "prettier:fix": "npm run prettier:cli -- --write", "clean": "lerna run --loglevel=silent clean", "build": "lerna run --loglevel=silent build", "build:current": "lerna run --loglevel=silent build:current", diff --git a/packages/authentication/test/unit/authenticate-action.test.ts b/packages/authentication/test/unit/authenticate-action.test.ts index d663c0c848d1..60d49e55dc09 100644 --- a/packages/authentication/test/unit/authenticate-action.test.ts +++ b/packages/authentication/test/unit/authenticate-action.test.ts @@ -40,14 +40,14 @@ describe('AuthenticationProvider', () => { const authenticate: AuthenticateFn = await Promise.resolve( provider.value(), ); - const request = {}; + const request = {}; const user = await authenticate(request); expect(user).to.be.equal(mockUser); }); it('updates current user', async () => { const authenticate = await Promise.resolve(provider.value()); - const request = {}; + const request = {}; await authenticate(request); expect(currentUser).to.equal(mockUser); }); @@ -59,7 +59,7 @@ describe('AuthenticationProvider', () => { context .bind(AuthenticationBindings.AUTH_ACTION) .toProvider(AuthenticationProvider); - const request = {}; + const request = {}; const authenticate = await context.get( AuthenticationBindings.AUTH_ACTION, ); @@ -76,7 +76,7 @@ describe('AuthenticationProvider', () => { const authenticate = await context.get( AuthenticationBindings.AUTH_ACTION, ); - const request = {}; + const request = {}; let error; try { await authenticate(request); @@ -95,7 +95,7 @@ describe('AuthenticationProvider', () => { const authenticate = await context.get( AuthenticationBindings.AUTH_ACTION, ); - const request = {}; + const request = {}; request.headers = {testState: 'fail'}; let error; try { diff --git a/packages/authentication/test/unit/authenticate-decorator.test.ts b/packages/authentication/test/unit/authenticate-decorator.test.ts index 353cebe24e4d..b3f9f3cecd2b 100644 --- a/packages/authentication/test/unit/authenticate-decorator.test.ts +++ b/packages/authentication/test/unit/authenticate-decorator.test.ts @@ -4,10 +4,7 @@ // License text available at https://opensource.org/licenses/MIT import {expect} from '@loopback/testlab'; -import { - authenticate, - getAuthenticateMetadata, -} from '../..'; +import {authenticate, getAuthenticateMetadata} from '../..'; describe('Authentication', () => { describe('@authenticate decorator', () => { diff --git a/packages/authentication/test/unit/strategy-adapter.test.ts b/packages/authentication/test/unit/strategy-adapter.test.ts index afca026e1ce1..7071fd55120e 100644 --- a/packages/authentication/test/unit/strategy-adapter.test.ts +++ b/packages/authentication/test/unit/strategy-adapter.test.ts @@ -25,7 +25,7 @@ describe('Strategy Adapter', () => { } const strategy = new Strategy(); const adapter = new StrategyAdapter(strategy); - const request = {}; + const request = {}; await adapter.authenticate(request); expect(calledFlag).to.be.true(); }); @@ -34,7 +34,7 @@ describe('Strategy Adapter', () => { const strategy = new MockStrategy(); strategy.setMockUser(mockUser); const adapter = new StrategyAdapter(strategy); - const request = {}; + const request = {}; const user: Object = await adapter.authenticate(request); expect(user).to.be.eql(mockUser); }); @@ -43,7 +43,7 @@ describe('Strategy Adapter', () => { const strategy = new MockStrategy(); strategy.setMockUser(mockUser); const adapter = new StrategyAdapter(strategy); - const request = {}; + const request = {}; request.headers = {testState: 'fail'}; let error; try { @@ -58,7 +58,7 @@ describe('Strategy Adapter', () => { const strategy = new MockStrategy(); strategy.setMockUser(mockUser); const adapter = new StrategyAdapter(strategy); - const request = {}; + const request = {}; request.headers = {testState: 'error'}; let error; try { diff --git a/packages/context/src/binding.ts b/packages/context/src/binding.ts index b2b7d9a8e0b5..6999dd5c53c0 100644 --- a/packages/context/src/binding.ts +++ b/packages/context/src/binding.ts @@ -120,7 +120,7 @@ export class Binding { return { key: keyWithPath.substr(0, index).trim(), - path: keyWithPath.substr(index+1), + path: keyWithPath.substr(index + 1), }; } diff --git a/packages/context/src/is-promise.ts b/packages/context/src/is-promise.ts index 27bd5261f5f9..e07b90f0ba28 100644 --- a/packages/context/src/is-promise.ts +++ b/packages/context/src/is-promise.ts @@ -9,8 +9,9 @@ * * @param value The value to check. */ -export function isPromise(value: T | PromiseLike): - value is PromiseLike { +export function isPromise( + value: T | PromiseLike, +): value is PromiseLike { if (!value) return false; if (typeof value !== 'object' && typeof value !== 'function') return false; return typeof (value as PromiseLike).then === 'function'; diff --git a/packages/context/src/reflect.ts b/packages/context/src/reflect.ts index ce89365024f6..aca65c9442f4 100644 --- a/packages/context/src/reflect.ts +++ b/packages/context/src/reflect.ts @@ -161,7 +161,7 @@ export class NamespacedReflect { if (targetKey) { return Reflect.decorate(decorators, target, targetKey, descriptor); } else { - return Reflect.decorate( decorators, target); + return Reflect.decorate(decorators, target); } } diff --git a/packages/context/test/acceptance/child-context.ts b/packages/context/test/acceptance/child-context.ts index b487d01ce472..e97c2ccddacc 100644 --- a/packages/context/test/acceptance/child-context.ts +++ b/packages/context/test/acceptance/child-context.ts @@ -32,9 +32,18 @@ describe('Context bindings - contexts inheritance', () => { }); it('includes parent bindings when searching via findByTag()', () => { - parentCtx.bind('foo').to('parent:foo').tag('a-tag'); - parentCtx.bind('bar').to('parent:bar').tag('a-tag'); - childCtx.bind('foo').to('child:foo').tag('a-tag'); + parentCtx + .bind('foo') + .to('parent:foo') + .tag('a-tag'); + parentCtx + .bind('bar') + .to('parent:bar') + .tag('a-tag'); + childCtx + .bind('foo') + .to('child:foo') + .tag('a-tag'); const found = childCtx.findByTag('a-tag').map(b => b.getValue(childCtx)); expect(found).to.deepEqual(['child:foo', 'parent:bar']); diff --git a/packages/context/test/acceptance/class-level-bindings.ts b/packages/context/test/acceptance/class-level-bindings.ts index 9cfbd9670aa9..8ee75964a7f2 100644 --- a/packages/context/test/acceptance/class-level-bindings.ts +++ b/packages/context/test/acceptance/class-level-bindings.ts @@ -138,10 +138,7 @@ describe('Context bindings - Injecting dependencies of classes', () => { ctx.bind('key').to('value'); class Store { - constructor( - @inject.getter('key') - public getter: Getter, - ) {} + constructor(@inject.getter('key') public getter: Getter) {} } ctx.bind('store').toClass(Store); @@ -157,10 +154,7 @@ describe('Context bindings - Injecting dependencies of classes', () => { it('injects a setter function', async () => { class Store { - constructor( - @inject.setter('key') - public setter: Setter, - ) {} + constructor(@inject.setter('key') public setter: Setter) {} } ctx.bind('store').toClass(Store); @@ -173,10 +167,7 @@ describe('Context bindings - Injecting dependencies of classes', () => { it('injects a nested property', async () => { class TestComponent { - constructor( - @inject('config#test') - public config: string, - ) {} + constructor(@inject('config#test') public config: string) {} } ctx.bind('config').to({test: 'test-config'}); diff --git a/packages/context/test/acceptance/finding-bindings.ts b/packages/context/test/acceptance/finding-bindings.ts index 21ab935cddb1..9d94a779e474 100644 --- a/packages/context/test/acceptance/finding-bindings.ts +++ b/packages/context/test/acceptance/finding-bindings.ts @@ -59,8 +59,14 @@ describe('Context bindings - Finding bindings', () => { function createTaggedBindings() { class Dog {} - ctx.bind('spot').to(new Dog()).tag('dog'); - ctx.bind('fido').to(new Dog()).tag('dog'); + ctx + .bind('spot') + .to(new Dog()) + .tag('dog'); + ctx + .bind('fido') + .to(new Dog()) + .tag('dog'); } }); diff --git a/packages/context/test/acceptance/locking-bindings.ts b/packages/context/test/acceptance/locking-bindings.ts index 2d22517c9c2e..7c290e8b0aec 100644 --- a/packages/context/test/acceptance/locking-bindings.ts +++ b/packages/context/test/acceptance/locking-bindings.ts @@ -39,9 +39,7 @@ describe('Context bindings - Locking bindings', () => { const key = 'foo'; const operation = () => ctx.bind('foo'); expect(operation).to.throw( - new RegExp( - `Cannot rebind key "${key}" to a locked binding`, - ), + new RegExp(`Cannot rebind key "${key}" to a locked binding`), ); }); }); diff --git a/packages/openapi-spec-builder/src/openapi-spec-builder.ts b/packages/openapi-spec-builder/src/openapi-spec-builder.ts index ef9ff810aaac..f321de34076d 100644 --- a/packages/openapi-spec-builder/src/openapi-spec-builder.ts +++ b/packages/openapi-spec-builder/src/openapi-spec-builder.ts @@ -49,7 +49,8 @@ export class BuilderBase { withExtension(key: string, value: ExtensionValue): this { assert( key.startsWith('x-'), - `Invalid extension ${key}, extension keys must be prefixed with "x-"`); + `Invalid extension ${key}, extension keys must be prefixed with "x-"`, + ); this._spec[key] = value; return this; @@ -83,8 +84,8 @@ export class OpenApiSpecBuilder extends BuilderBase { */ withOperation( verb: string, - path: string, - spec: OperationObject | OperationSpecBuilder, + path: string, + spec: OperationObject | OperationSpecBuilder, ): this { if (spec instanceof OperationSpecBuilder) spec = spec.build(); if (!this._spec.paths[path]) this._spec.paths[path] = {}; @@ -106,8 +107,7 @@ export class OpenApiSpecBuilder extends BuilderBase { operationName?: string, ): this { const spec = anOperationSpec().withStringResponse(200); - if (operationName) - spec.withOperationName(operationName); + if (operationName) spec.withOperationName(operationName); return this.withOperation(verb, path, spec); } diff --git a/packages/openapi-spec/src/openapi-spec-v2.ts b/packages/openapi-spec/src/openapi-spec-v2.ts index 1973139b916b..1bf1e09ed6fc 100644 --- a/packages/openapi-spec/src/openapi-spec-v2.ts +++ b/packages/openapi-spec/src/openapi-spec-v2.ts @@ -282,7 +282,7 @@ export interface SecuritySchemeObject extends Extensible { /** * The location of the API key. Valid values are "query" or "header". */ - 'in'?: 'query' | 'header'; + in?: 'query' | 'header'; /** * The flow used by the OAuth2 security scheme. Valid values are "implicit", @@ -350,8 +350,7 @@ export interface SecurityDefinitionsObject * The name used for each property MUST correspond to a security scheme declared * in the Security Definitions. */ -export interface SecurityRequirementObject - extends MapObject> { +export interface SecurityRequirementObject extends MapObject> { /** * Each name must correspond to a security scheme which is declared in the * Security Definitions. If the security scheme is of type "oauth2", then the @@ -393,8 +392,7 @@ export interface ParametersDefinitionsObject * * This does not define global operation responses. */ -export interface ResponsesDefinitionsObject - extends MapObject { +export interface ResponsesDefinitionsObject extends MapObject { /** * A single response definition, mapping a "name" to the response it defines. */ @@ -575,8 +573,13 @@ export interface OperationObject extends Extensible { security?: SecurityRequirementObject; } -export type ParameterType = 'string' | 'number' | 'integer' | 'boolean' | - 'array' | 'file'; +export type ParameterType = + | 'string' + | 'number' + | 'integer' + | 'boolean' + | 'array' + | 'file'; /** * Simple type - primitive types or array of such types. It is used by parameter @@ -636,7 +639,7 @@ export interface SimpleType { * Unlike JSON Schema this value MUST conform to the defined type for this * parameter. */ - 'default'?: ExtensionValue; + default?: ExtensionValue; /** * See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.2. @@ -704,8 +707,7 @@ export interface SimpleType { * "number", "integer", "boolean", or "array". Files and models are not * allowed. */ -export type ItemType = 'string' | 'number' | 'integer' | 'boolean' | - 'array'; +export type ItemType = 'string' | 'number' | 'integer' | 'boolean' | 'array'; /** * A limited subset of JSON-Schema's items object. It is used by parameter @@ -817,14 +819,15 @@ export interface ReferenceObject { * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#responsesObject */ export interface ResponsesObject - extends MapObject, Extensible { + extends MapObject, + Extensible { /** * The documentation of responses other than the ones declared for specific * HTTP response codes. It can be used to cover undeclared responses. * Reference Object can be used to link to a response that is defined at * the Swagger Object's responses section. */ - 'default'?: ResponseObject | ReferenceObject; + default?: ResponseObject | ReferenceObject; } /** @@ -909,7 +912,7 @@ export interface SchemaObject extends Extensible { format?: string; title?: string; description?: string; - 'default'?: ExtensionValue; + default?: ExtensionValue; multipleOf?: number; maximum?: number; exclusiveMaximum?: number; diff --git a/packages/repository/examples/juggler-bridge/note-with-repo-class.ts b/packages/repository/examples/juggler-bridge/note-with-repo-class.ts index f585909bbb01..28a4e21eff5a 100644 --- a/packages/repository/examples/juggler-bridge/note-with-repo-class.ts +++ b/packages/repository/examples/juggler-bridge/note-with-repo-class.ts @@ -16,14 +16,13 @@ import { } from '../../'; class NoteController { - @repository('noteRepo') - public noteRepo: EntityCrudRepository; + @repository('noteRepo') public noteRepo: EntityCrudRepository; } const ds: juggler.DataSource = new DataSourceConstructor({ - name: 'db', - connector: 'memory', - }); + name: 'db', + connector: 'memory', +}); class Note extends Entity { static definition = new ModelDefinition({ @@ -39,9 +38,10 @@ class MyNoteRepository extends DefaultCrudRepository { // juggler is undefined if the following is used: // @inject('dataSources.memory') dataSource: juggler.DataSource // tslint:disable-next-line:no-any - @inject('dataSources.memory') dataSource: any) { - super(myModel, dataSource); - } + @inject('dataSources.memory') dataSource: any, + ) { + super(myModel, dataSource); + } } async function main() { @@ -72,14 +72,16 @@ async function main() { } // Invoke the example -main().then(notes => { - // It should print out: - // ``` - // Notes [ { title: 't1', content: 'Note 1', id: 1 }, - // { title: 't2', content: 'Note 2', id: 2 } ] - // ``` - console.log('Notes', notes); -}).catch(err => { - // It should not happen - console.error(err); -}); +main() + .then(notes => { + // It should print out: + // ``` + // Notes [ { title: 't1', content: 'Note 1', id: 1 }, + // { title: 't2', content: 'Note 2', id: 2 } ] + // ``` + console.log('Notes', notes); + }) + .catch(err => { + // It should not happen + console.error(err); + }); diff --git a/packages/repository/examples/juggler-bridge/note-with-repo-instance.ts b/packages/repository/examples/juggler-bridge/note-with-repo-instance.ts index 77dda2927660..8a2c872c0c5f 100644 --- a/packages/repository/examples/juggler-bridge/note-with-repo-instance.ts +++ b/packages/repository/examples/juggler-bridge/note-with-repo-instance.ts @@ -71,11 +71,12 @@ async function main() { } // Invoke the example -main().then(notes => { - // It should print `Notes [ { title: 't1', content: 'Note 1', id: 1 } ]` - console.log('Notes', notes); -}).catch(err => { - // It should not happen - console.error(err); -}); - +main() + .then(notes => { + // It should print `Notes [ { title: 't1', content: 'Note 1', id: 1 } ]` + console.log('Notes', notes); + }) + .catch(err => { + // It should not happen + console.error(err); + }); diff --git a/packages/repository/src/decorators/repository.ts b/packages/repository/src/decorators/repository.ts index cdd53d5f5d77..6b7819407a73 100644 --- a/packages/repository/src/decorators/repository.ts +++ b/packages/repository/src/decorators/repository.ts @@ -59,18 +59,18 @@ export class RepositoryMetadata { modelOrRepo: string | typeof Entity, dataSource?: string | juggler.DataSource | DataSource, ) { - this.name = typeof modelOrRepo === 'string' && dataSource === undefined - ? modelOrRepo - : undefined; - this.modelName = typeof modelOrRepo === 'string' && dataSource != null - ? modelOrRepo - : undefined; - this.modelClass = typeof modelOrRepo === 'function' - ? modelOrRepo - : undefined; - this.dataSourceName = typeof dataSource === 'string' - ? dataSource - : undefined; + this.name = + typeof modelOrRepo === 'string' && dataSource === undefined + ? modelOrRepo + : undefined; + this.modelName = + typeof modelOrRepo === 'string' && dataSource != null + ? modelOrRepo + : undefined; + this.modelClass = + typeof modelOrRepo === 'function' ? modelOrRepo : undefined; + this.dataSourceName = + typeof dataSource === 'string' ? dataSource : undefined; this.dataSource = typeof dataSource === 'object' ? dataSource : undefined; } } @@ -128,7 +128,7 @@ async function resolve(ctx: Context, injection: Injection) { const meta = injection.metadata as RepositoryMetadata; let modelClass = meta.modelClass; if (meta.modelName) { - modelClass = await ctx.get('models.' + meta.modelName) as typeof Entity; + modelClass = (await ctx.get('models.' + meta.modelName)) as typeof Entity; } if (!modelClass) { throw new Error( @@ -141,9 +141,12 @@ async function resolve(ctx: Context, injection: Injection) { if (meta.dataSourceName) { dataSource = await ctx.get('datasources.' + meta.dataSourceName); } - assert(dataSource instanceof DataSourceConstructor, - 'DataSource must be provided'); + assert( + dataSource instanceof DataSourceConstructor, + 'DataSource must be provided', + ); return new DefaultCrudRepository( modelClass, - dataSource! as juggler.DataSource); + dataSource! as juggler.DataSource, + ); } diff --git a/packages/repository/src/legacy-juggler-bridge.ts b/packages/repository/src/legacy-juggler-bridge.ts index d14ee15c7e66..c07a0b3c4dfe 100644 --- a/packages/repository/src/legacy-juggler-bridge.ts +++ b/packages/repository/src/legacy-juggler-bridge.ts @@ -7,11 +7,7 @@ export const jugglerModule = require('loopback-datasource-juggler'); import * as assert from 'assert'; import {isPromise} from '@loopback/context'; -import { - DataObject, - Options, - AnyObject, -} from './common-types'; +import {DataObject, Options, AnyObject} from './common-types'; import {Entity} from './model'; import {Filter, Where} from './query'; import {EntityCrudRepository} from './repository'; @@ -23,11 +19,9 @@ type DataSourceType = juggler.DataSource; export {DataSourceType}; /* tslint:disable-next-line:variable-name */ -export const DataSourceConstructor = - jugglerModule.DataSource as typeof juggler.DataSource; +export const DataSourceConstructor = jugglerModule.DataSource as typeof juggler.DataSource; /* tslint:disable-next-line:variable-name */ -export const ModelBaseConstructor = - jugglerModule.ModelBaseClass as typeof juggler.ModelBase; +export const ModelBaseConstructor = jugglerModule.ModelBaseClass as typeof juggler.ModelBase; /** * This is a bridge to the legacy DAO class. The function mixes DAO methods @@ -128,7 +122,7 @@ export class DefaultCrudRepository return this.create(entity, options); } else { return this.replaceById(id, entity, options).then( - result => (result ? this.toEntity(entity): null), + result => (result ? this.toEntity(entity) : null), ); } } @@ -170,11 +164,7 @@ export class DefaultCrudRepository return this.updateAll(data, where, options).then(count => count > 0); } - replaceById( - id: ID, - data: Partial, - options?: Options, - ): Promise { + replaceById(id: ID, data: Partial, options?: Options): Promise { return ensurePromise(this.modelClass.replaceById(id, data, options)).then( result => !!result, ); diff --git a/packages/repository/src/model.ts b/packages/repository/src/model.ts index 8aae1a8c435e..af36c559f3c3 100644 --- a/packages/repository/src/model.ts +++ b/packages/repository/src/model.ts @@ -36,8 +36,7 @@ export interface PropertyForm { name?: string; // Custom name for this form } -export interface PropertyDefinitionMap { -} +export interface PropertyDefinitionMap {} /** * DSL for building a model definition. @@ -48,7 +47,6 @@ export interface ModelDefinitionSyntax { settings?: {[name: string]: any}; } - /** * Definition for a model */ @@ -86,9 +84,9 @@ export class ModelDefinition { name: string, definitionOrType: PropertyDefinition | PropertyType, ): this { - const definition = (definitionOrType as PropertyDefinition).type ? - definitionOrType as PropertyDefinition : - {type: definitionOrType}; + const definition = (definitionOrType as PropertyDefinition).type + ? definitionOrType as PropertyDefinition + : {type: definitionOrType}; this.properties[name] = definition; return this; } @@ -126,8 +124,9 @@ export class ModelDefinition { } else if (Array.isArray(this.settings.id)) { return this.settings.id; } - const idProps = Object.keys(this.properties) - .filter(prop => this.properties[prop].id); + const idProps = Object.keys(this.properties).filter( + prop => this.properties[prop].id, + ); return idProps; } } @@ -144,7 +143,7 @@ export abstract class Model { */ toJSON(): Object { const json: AnyObject = {}; - const def = ( this.constructor).definition; + const def = (this.constructor).definition; if (def == null) { return this.toObject({ignoreUnknownProperties: false}); } diff --git a/packages/repository/src/repository-mixin.ts b/packages/repository/src/repository-mixin.ts index 1ec4d84b3516..8f263b60d9f0 100644 --- a/packages/repository/src/repository-mixin.ts +++ b/packages/repository/src/repository-mixin.ts @@ -3,8 +3,8 @@ // This file is licensed under the MIT License. // License text available at https://opensource.org/licenses/MIT -import { Class } from './common-types'; -import { Repository } from './repository'; +import {Class} from './common-types'; +import {Repository} from './repository'; // tslint:disable:no-any diff --git a/packages/repository/src/types/object.ts b/packages/repository/src/types/object.ts index 0c7187cb8f30..a3c734254726 100644 --- a/packages/repository/src/types/object.ts +++ b/packages/repository/src/types/object.ts @@ -22,8 +22,9 @@ export class ObjectType implements Type { } isCoercible(value: any): boolean { - return value == null || - (typeof value === 'object' && !Array.isArray(value)); + return ( + value == null || (typeof value === 'object' && !Array.isArray(value)) + ); } defaultValue() { diff --git a/packages/repository/test/unit/decorator/repository-with-di.ts b/packages/repository/test/unit/decorator/repository-with-di.ts index cd31cd981486..e5024cbdf5aa 100644 --- a/packages/repository/test/unit/decorator/repository-with-di.ts +++ b/packages/repository/test/unit/decorator/repository-with-di.ts @@ -17,9 +17,7 @@ import { } from '../../../'; class MyController { - constructor( - @repository('noteRepo') public noteRepo: Repository, - ) {} + constructor(@repository('noteRepo') public noteRepo: Repository) {} } describe('repository class', () => { @@ -52,7 +50,8 @@ describe('repository class', () => { class MyRepository extends DefaultCrudRepository { constructor( @inject('models.Note') myModel: typeof Note, - @inject('dataSources.memory') dataSource: DataSourceType) { + @inject('dataSources.memory') dataSource: DataSourceType, + ) { super(myModel, dataSource); } } diff --git a/packages/repository/test/unit/decorator/repository-with-value-provider.ts b/packages/repository/test/unit/decorator/repository-with-value-provider.ts index b51f59d84415..37ce477a0bf2 100644 --- a/packages/repository/test/unit/decorator/repository-with-value-provider.ts +++ b/packages/repository/test/unit/decorator/repository-with-value-provider.ts @@ -17,23 +17,19 @@ import { } from '../../../'; class MyController { - constructor( - @repository('noteRepo') public noteRepo: Repository, - ) {} + constructor(@repository('noteRepo') public noteRepo: Repository) {} } -class MyRepositoryProvider implements - Provider> { +class MyRepositoryProvider + implements Provider> { constructor( @inject('models.Note') private myModel: typeof Entity, - @inject('dataSources.memory') - private dataSource: DataSourceType) {} + @inject('dataSources.memory') private dataSource: DataSourceType, + ) {} value(): ValueOrPromise> { - return new DefaultCrudRepository( - this.myModel, - this.dataSource as DataSourceType, - ); + return new DefaultCrudRepository(this.myModel, this + .dataSource as DataSourceType); } } diff --git a/packages/rest/src/internal-types.ts b/packages/rest/src/internal-types.ts index 1fcf5e977c80..9ddd8a698cf1 100644 --- a/packages/rest/src/internal-types.ts +++ b/packages/rest/src/internal-types.ts @@ -52,10 +52,7 @@ export type InvokeMethod = ( * @param response The response the response to send to. * @param result The operation result to send. */ -export type Send = ( - response: ServerResponse, - result: OperationRetval, -) => void; +export type Send = (response: ServerResponse, result: OperationRetval) => void; /** * Reject the request with an error. diff --git a/packages/rest/src/providers/log-error-provider.ts b/packages/rest/src/providers/log-error-provider.ts index 988e02857c53..223818a9ba91 100644 --- a/packages/rest/src/providers/log-error-provider.ts +++ b/packages/rest/src/providers/log-error-provider.ts @@ -8,10 +8,7 @@ import {ServerRequest} from '../'; export class LogErrorProvider implements Provider { value() { - return (err: Error, - statusCode: number, - req: ServerRequest, - ) => { + return (err: Error, statusCode: number, req: ServerRequest) => { console.error( 'Unhandled error in %s %s: %s %s', req.method, diff --git a/packages/rest/src/router/metadata.ts b/packages/rest/src/router/metadata.ts index 9b323ab4d7e7..776b66a4c00f 100644 --- a/packages/rest/src/router/metadata.ts +++ b/packages/rest/src/router/metadata.ts @@ -299,8 +299,10 @@ export function param(paramSpec: ParameterObject) { } else { // Mixed usage of @param at method/parameter level is not allowed if (operationSpec[paramDecoratorStyle] !== decoratorStyle) { - throw new Error('Mixed usage of @param at method/parameter level' + - ' is not allowed.'); + throw new Error( + 'Mixed usage of @param at method/parameter level' + + ' is not allowed.', + ); } } @@ -486,10 +488,7 @@ export namespace param { }; } -function createParamShortcut( - source: ParameterLocation, - type: ParameterType, -) { +function createParamShortcut(source: ParameterLocation, type: ParameterType) { // TODO(bajtos) @param.IN.TYPE('foo', {required: true}) return (name: string) => { return param({name, in: source, type}); diff --git a/packages/rest/src/router/routing-table.ts b/packages/rest/src/router/routing-table.ts index 8b1c9c209849..4f6b7144841b 100644 --- a/packages/rest/src/router/routing-table.ts +++ b/packages/rest/src/router/routing-table.ts @@ -262,9 +262,10 @@ export class ControllerRoute extends BaseRoute { if (!methodName) { throw new Error( 'methodName must be provided either via the ControllerRoute argument ' + - 'or via "x-operation-name" extension field in OpenAPI spec. ' + - `Operation: "${verb} ${path}" ` + - `Controller: ${this._controllerCtor.name}.`); + 'or via "x-operation-name" extension field in OpenAPI spec. ' + + `Operation: "${verb} ${path}" ` + + `Controller: ${this._controllerCtor.name}.`, + ); } this._methodName = methodName; @@ -300,12 +301,12 @@ export class ControllerRoute extends BaseRoute { this._controllerCtor, requestContext, ); - return await Promise.resolve(valueOrPromise) as ControllerInstance; + return (await Promise.resolve(valueOrPromise)) as ControllerInstance; } } function describeOperationParameters(opSpec: OperationObject) { return ((opSpec.parameters as ParameterObject[]) || []) - .map(p => p.name) - .join(', '); + .map(p => p.name) + .join(', '); } diff --git a/packages/rest/test/acceptance/routing/routing.acceptance.ts b/packages/rest/test/acceptance/routing/routing.acceptance.ts index f1715ab860f0..445768cb13df 100644 --- a/packages/rest/test/acceptance/routing/routing.acceptance.ts +++ b/packages/rest/test/acceptance/routing/routing.acceptance.ts @@ -253,12 +253,12 @@ describe('Routing', () => { const app = givenAnApplication(); const server = await givenAServer(app); - const routeSpec = { + const routeSpec = { parameters: [ - {name: 'name', in: 'query', type: 'string'}, + {name: 'name', in: 'query', type: 'string'}, ], responses: { - 200: { + 200: { description: 'greeting text', schema: {type: 'string'}, }, diff --git a/packages/rest/test/integration/http-handler.integration.ts b/packages/rest/test/integration/http-handler.integration.ts index 7d5c84632eb5..673a9c4fa323 100644 --- a/packages/rest/test/integration/http-handler.integration.ts +++ b/packages/rest/test/integration/http-handler.integration.ts @@ -108,7 +108,7 @@ describe('HttpHandler', () => { 'x-operation-name': 'echo', parameters: [ // the type cast is not required, but improves Intellisense - { + { name: 'msg', in: 'query', type: 'string', @@ -159,7 +159,7 @@ describe('HttpHandler', () => { .withOperation('get', '/users/{username}', { 'x-operation-name': 'getUserByUsername', parameters: [ - { + { name: 'username', in: 'path', description: 'The name of the user to look up.', @@ -203,7 +203,7 @@ describe('HttpHandler', () => { .withOperation('get', '/show-authorization', { 'x-operation-name': 'showAuthorization', parameters: [ - { + { name: 'Authorization', in: 'header', description: 'Authorization credentials.', @@ -264,7 +264,7 @@ describe('HttpHandler', () => { .withOperation('post', '/show-formdata', { 'x-operation-name': 'showFormData', parameters: [ - { + { name: 'key', in: 'formData', description: 'Any value.', @@ -325,7 +325,7 @@ describe('HttpHandler', () => { .withOperation('post', '/show-body', { 'x-operation-name': 'showBody', parameters: [ - { + { name: 'data', in: 'body', description: 'Any object value.', diff --git a/packages/rest/test/unit/parser.test.ts b/packages/rest/test/unit/parser.test.ts index a947649122aa..18f7d499c973 100644 --- a/packages/rest/test/unit/parser.test.ts +++ b/packages/rest/test/unit/parser.test.ts @@ -53,7 +53,7 @@ describe('operationArgsParser', () => { }); function givenOperationWithParameters(params?: ParameterObject[]) { - return { + return { 'x-operation-name': 'testOp', parameters: params, responses: {}, diff --git a/packages/rest/test/unit/router/metadata/param-form-data.test.ts b/packages/rest/test/unit/router/metadata/param-form-data.test.ts index c3f0f53d37b1..0cd239204ce3 100644 --- a/packages/rest/test/unit/router/metadata/param-form-data.test.ts +++ b/packages/rest/test/unit/router/metadata/param-form-data.test.ts @@ -87,4 +87,3 @@ describe('Routing metadata for parameters', () => { }); }); }); - diff --git a/packages/rest/test/unit/router/metadata/param-header.test.ts b/packages/rest/test/unit/router/metadata/param-header.test.ts index aa5f25a3a488..e993d56c23f9 100644 --- a/packages/rest/test/unit/router/metadata/param-header.test.ts +++ b/packages/rest/test/unit/router/metadata/param-header.test.ts @@ -87,4 +87,3 @@ describe('Routing metadata for parameters', () => { }); }); }); - diff --git a/packages/rest/test/unit/router/metadata/param-query.test.ts b/packages/rest/test/unit/router/metadata/param-query.test.ts index 599d0070d842..8a7ff881f0dc 100644 --- a/packages/rest/test/unit/router/metadata/param-query.test.ts +++ b/packages/rest/test/unit/router/metadata/param-query.test.ts @@ -87,4 +87,3 @@ describe('Routing metadata for parameters', () => { }); }); }); - diff --git a/packages/rest/test/unit/router/routing-table.test.ts b/packages/rest/test/unit/router/routing-table.test.ts index 4726d41b64ce..042764cb2b1a 100644 --- a/packages/rest/test/unit/router/routing-table.test.ts +++ b/packages/rest/test/unit/router/routing-table.test.ts @@ -19,8 +19,7 @@ describe('RoutingTable', () => { .withOperationReturningString('get', '/hello', 'greet') .build(); - class TestController { - } + class TestController {} const table = new RoutingTable(); table.registerController(TestController, spec); @@ -33,7 +32,9 @@ describe('RoutingTable', () => { const route = table.find(request); expect(route).to.be.instanceOf(ControllerRoute); - expect(route).to.have.property('spec').containEql(spec.paths['/hello'].get); + expect(route) + .to.have.property('spec') + .containEql(spec.paths['/hello'].get); expect(route).to.have.property('pathParams'); expect(route.describe()).to.equal('TestController.greet'); }); diff --git a/packages/rest/test/unit/writer.test.ts b/packages/rest/test/unit/writer.test.ts index 6f63df15b4ed..31b3c8054c87 100644 --- a/packages/rest/test/unit/writer.test.ts +++ b/packages/rest/test/unit/writer.test.ts @@ -5,11 +5,7 @@ import {ServerResponse, writeResultToResponse} from '../..'; -import { - expect, - mockResponse, - ShotObservedResponse, -} from '@loopback/testlab'; +import {expect, mockResponse, ShotObservedResponse} from '@loopback/testlab'; describe('writer', () => { let response: ServerResponse; diff --git a/packages/testlab/src/shot.ts b/packages/testlab/src/shot.ts index 37ded6848dbd..f847c8e35bbd 100644 --- a/packages/testlab/src/shot.ts +++ b/packages/testlab/src/shot.ts @@ -25,13 +25,16 @@ export const ShotRequest: ShotRequestCtor = require('shot/lib/request'); // tslint:disable-next-line:variable-name export const ShotResponse: ShotResponseCtor = require('shot/lib/response'); -export type ShotRequestCtor = - new (options: ShotRequestOptions) => ServerRequest; +export type ShotRequestCtor = new ( + options: ShotRequestOptions, +) => ServerRequest; export type ShotCallback = (response: ResponseObject) => void; -export type ShotResponseCtor = - new (request: ServerRequest, onEnd: ShotCallback) => ServerResponse; +export type ShotResponseCtor = new ( + request: ServerRequest, + onEnd: ShotCallback, +) => ServerResponse; export type ShotObservedResponse = ResponseObject; diff --git a/tslint.json b/tslint.json index 1ceb34b74fe0..2580d16e72cc 100644 --- a/tslint.json +++ b/tslint.json @@ -23,58 +23,6 @@ "no-unused-variable": true, "no-var-keyword": true, "triple-equals": [true, "allow-null-check", "allow-undefined-check"], - "typeof-compare": true, - - // These rules make code maintenance easier - "eofline": true, - "indent": [true, "spaces"], - "no-default-export": true, - "no-trailing-whitespace": true, - "prefer-const": true, - "trailing-comma": [ - true, - { - "multiline": "always", - "singleline": "never" - } - ], - - // These rules enforce consistent style across your codebase: - "arrow-return-shorthand": [true], - "class-name": true, - "comment-format": [true, "check-space"], - "file-header": [true, "Copyright IBM"], - "max-line-length": [true, 80], - "no-consecutive-blank-lines": [true, 2], - "no-unnecessary-callback-wrapper": true, - "one-variable-per-declaration": [true, "ignore-for-loop"], - "prefer-method-signature": true, - "quotemark": [true, "single", "avoid-escape"], - "semicolon": [true, "always"], - "space-before-function-paren": [ - true, - { - "anonymous": "never", - "named": "never", - "asyncArrow": "always", - "method": "never", - "constructor": "never" - } - ], - "variable-name": [ - true, - "allow-leading-underscore", - "ban-keywords", - "check-format" - ], - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-separator", - "check-type", - "check-typecast", - "check-preblock" - ] + "typeof-compare": true } }