diff --git a/.editorconfig b/.editorconfig index 6e87a00..995010c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,11 +2,14 @@ root = true [*] + charset = utf-8 indent_style = space indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true +tab_width = 2 +max_line_length = 120 [*.md] max_line_length = off diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..bd3f3e2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,8 @@ +# prettier v2 dictates LF +# https://prettier.io/docs/en/options.html#end-of-line +* text=auto eol=lf + +.vscode/*.json linguist-language=jsonc +tslint.json linguist-language=jsonc +tsconfig.json linguist-language=jsonc +tsconfig.*.json linguist-language=jsonc diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 0000000..31354ec --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..0bd658f --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..760fc9e --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm run affected:lint diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100755 index 0000000..6413fcb --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm affected:test diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..c42da84 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/.nxignore b/.nxignore new file mode 100644 index 0000000..9635c7e --- /dev/null +++ b/.nxignore @@ -0,0 +1,3 @@ +libs/buildspecs/* +libs/cf-templates/* +libs/maintenance/* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e5740dd --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Oleksandr Bondarenko + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/angular.json b/angular.json index a4a5b3a..730f4d8 100644 --- a/angular.json +++ b/angular.json @@ -28,7 +28,8 @@ "unitTestRunner": "jest" }, "@nrwl/angular:component": { - "style": "scss" + "style": "scss", + "changeDetection": "OnPush" } }, "projects": { @@ -47,8 +48,14 @@ "polyfills": "apps/quotes/src/polyfills.ts", "tsConfig": "apps/quotes/tsconfig.app.json", "aot": true, - "assets": ["apps/quotes/src/favicon.ico", "apps/quotes/src/assets"], - "styles": ["apps/quotes/src/styles.scss"], + "assets": [ + "apps/quotes/src/favicon.ico", + "apps/quotes/src/assets" + ], + "styles": [ + "node_modules/ngx-toastr/toastr.css", + "apps/quotes/src/styles.scss" + ], "scripts": [] }, "configurations": { @@ -104,7 +111,7 @@ "options": { "lintFilePatterns": [ "apps/quotes/src/**/*.ts", - "apps/quotes/src/**/*.html" + "apps/quotes/src/**/*.component.html" ] } }, diff --git a/apps/api/.npmrc b/apps/api/.npmrc new file mode 100644 index 0000000..5deb95f --- /dev/null +++ b/apps/api/.npmrc @@ -0,0 +1 @@ +prefix = ../../ diff --git a/apps/api/.versionrc b/apps/api/.versionrc new file mode 100644 index 0000000..0dcd29d --- /dev/null +++ b/apps/api/.versionrc @@ -0,0 +1,5 @@ +{ + "path": ".", + "tag-prefix": "quotes-api-v", + "releaseCommitMessageFormat": "chore(release): quotes-api@{{currentTag}}" +} diff --git a/apps/api/README.md b/apps/api/README.md new file mode 100644 index 0000000..8c26ad8 --- /dev/null +++ b/apps/api/README.md @@ -0,0 +1,2 @@ +# Quotes API + diff --git a/apps/api/package.json b/apps/api/package.json new file mode 100644 index 0000000..b4287a3 --- /dev/null +++ b/apps/api/package.json @@ -0,0 +1,17 @@ +{ + "name": "quotes-api", + "version": "0.0.0", + "description": "", + "keywords": [], + "homepage": "https://github.com/boale/quotes/tree/main/apps/api#readme", + "bugs": { + "url": "https://github.com/boale/quotes/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/boale/quotes", + "directory": "apps/api" + }, + "license": "MIT", + "author": "Oleksandr Bondarenko" +} diff --git a/apps/api/src/app/app.controller.spec.ts b/apps/api/src/app/app.controller.spec.ts index b991ea7..7ffe29a 100644 --- a/apps/api/src/app/app.controller.spec.ts +++ b/apps/api/src/app/app.controller.spec.ts @@ -1,22 +1,25 @@ import { Test, TestingModule } from '@nestjs/testing'; import { AppController } from './app.controller'; -import { AppService } from './app.service'; describe('AppController', () => { let app: TestingModule; + let appController: AppController; beforeAll(async () => { app = await Test.createTestingModule({ controllers: [AppController], - providers: [AppService], + providers: [], }).compile(); }); - describe('getData', () => { - it('should return "Welcome to api!"', () => { - const appController = app.get(AppController); - expect(appController.getData()).toEqual({ message: 'Welcome to api!' }); + beforeEach(async () => { + appController = app.get(AppController); + }); + + describe('health-check', () => { + it('should return health-check object', () => { + expect(appController.ping()).toEqual({ statusCode: 200, message: 'OK' }); }); }); }); diff --git a/apps/api/src/app/app.controller.ts b/apps/api/src/app/app.controller.ts index 1e76a1a..94855e1 100644 --- a/apps/api/src/app/app.controller.ts +++ b/apps/api/src/app/app.controller.ts @@ -1,15 +1,10 @@ import { Controller, Get } from '@nestjs/common'; -import { Message } from '@quotes/api-interfaces'; - -import { AppService } from './app.service'; - @Controller() export class AppController { - constructor(private readonly appService: AppService) {} - @Get('hello') - getData(): Message { - return this.appService.getData(); + @Get([ 'ping', 'health' ]) + ping() { + return { statusCode: 200, message: 'OK' }; } } diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 6a9bc16..d0946a8 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -1,11 +1,25 @@ import { Module } from '@nestjs/common'; +import { ServeStaticModule } from '@nestjs/serve-static'; +import { join } from 'path'; + +import { isDev } from "./shared/utils"; +import { QuotesModule } from "./quotes/quotes.module"; import { AppController } from './app.controller'; -import { AppService } from './app.service'; @Module({ - imports: [], - controllers: [AppController], - providers: [AppService], + imports: [ + QuotesModule, + // TODO: remove once it split into separate apps in further tasks... + ...( + !isDev() ? [ + ServeStaticModule.forRoot({ + rootPath: join(__dirname, 'assets', 'client'), + exclude: ['/api*', '/ping', '/health'], + }) , + ] : [] + ), + ], + controllers: [ AppController ], }) export class AppModule {} diff --git a/apps/api/src/app/app.service.spec.ts b/apps/api/src/app/app.service.spec.ts deleted file mode 100644 index 884b5c9..0000000 --- a/apps/api/src/app/app.service.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Test } from '@nestjs/testing'; - -import { AppService } from './app.service'; - -describe('AppService', () => { - let service: AppService; - - beforeAll(async () => { - const app = await Test.createTestingModule({ - providers: [AppService], - }).compile(); - - service = app.get(AppService); - }); - - describe('getData', () => { - it('should return "Welcome to api!"', () => { - expect(service.getData()).toEqual({ message: 'Welcome to api!' }); - }); - }); -}); diff --git a/apps/api/src/app/app.service.ts b/apps/api/src/app/app.service.ts deleted file mode 100644 index 76f52f8..0000000 --- a/apps/api/src/app/app.service.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { Message } from '@quotes/api-interfaces'; - -@Injectable() -export class AppService { - getData(): Message { - return { message: 'Welcome to api!' }; - } -} diff --git a/apps/api/src/app/json-db-collection/index.ts b/apps/api/src/app/json-db-collection/index.ts new file mode 100644 index 0000000..13118a5 --- /dev/null +++ b/apps/api/src/app/json-db-collection/index.ts @@ -0,0 +1,3 @@ +export * from './models'; +export * from './utils'; +export * from './json-db-collection.service'; diff --git a/apps/api/src/app/json-db-collection/json-db-collection.service.ts b/apps/api/src/app/json-db-collection/json-db-collection.service.ts new file mode 100644 index 0000000..c899f5d --- /dev/null +++ b/apps/api/src/app/json-db-collection/json-db-collection.service.ts @@ -0,0 +1,173 @@ +import { Injectable, Logger } from "@nestjs/common"; + +import { v4 } from 'uuid'; + +import { + BaseRepo, CollectionRecords, + CollectionResult, + ForceOpts, + SearchCriteria, + SoftDeleteFlag, + TimeStamps, + WithId +} from './models'; +import { + doesRecordMatchCriteria, + isEmptyRecord, mapArrayToCollection, + mapCollectionToArray, + mapToCollectionResult, readJson, + sliceAndSort, writeJson +} from './utils'; +import { PathLike } from 'fs'; + +@Injectable() +export class JsonDbCollectionService { + protected collectionRecords: CollectionRecords = {} + protected collectionPath: string | PathLike; + isLoaded = false; + isSynced = false; + + loadCollection(path?: string | PathLike) { + if (this.isLoaded || this.collectionPath) { + return Promise.resolve(); + } + + this.collectionPath = path; + + return readJson(this.collectionPath) + .then((data: T[]) => { + this.collectionRecords = { ...mapArrayToCollection(data) }; + this.isLoaded = true; + this.isSynced = true; + }); + } + + syncCollection(): Promise { + if (this.isSynced) { + return Promise.resolve(); + } + + return writeJson(this.collectionPath, mapCollectionToArray(this.collectionRecords)) + .then(() => { + this.isSynced = true; + // this.isLoaded = false; + }); + } + + constructor(private logger: Logger) { + } + + find({ where, limit, page = 0, sortBy, order }: SearchCriteria = {}): Promise> { + return this.loadCollection() + .then(() => { + const collectionArray = mapCollectionToArray(this.collectionRecords); + if (isEmptyRecord(where as Record)) { + const sorted = sliceAndSort(collectionArray, { page, limit, sortBy, order }); + + return mapToCollectionResult(sorted, { page, limit, total: collectionArray.length }) + } + + if (limit === 1) { + return mapToCollectionResult(collectionArray.find((q: T): boolean => { + return doesRecordMatchCriteria(q, { where }); + }), { limit: 1, page: 0, total: 1 }) + } + + const collection = collectionArray.filter((q: T): boolean => doesRecordMatchCriteria(q, { where })) + const sorted = sliceAndSort(collection, { page, limit, sortBy, order }); + + return mapToCollectionResult(sorted, { page, limit, total: collection.length }); + }); + } + + findById(id: string): Promise> { + return this.loadCollection().then(() => mapToCollectionResult(this.collectionRecords[ id ])); + } + + update(id: string, data: Partial|SoftDeleteFlag): Promise> { + // TODO: handle case when isSynced = false; + if (!(id && data)) { + return Promise.reject(new Error(`${ !id ? 'id' : 'data'} has not been provided.`)); + } + + const collectionRecord = this.collectionRecords[ id ]; + if (!collectionRecord) { + return Promise.reject(new Error(`Record with id=${ id } has not been found.`)); + } + + // TODO: add validation + const recordData: T = { + ...collectionRecord, + ...data, + updatedAt: Date.now(), + } + + return this.loadCollection() + .then(() => { + this.collectionRecords[ id ] = { ...recordData }; + this.isSynced = false; + + return this.syncCollection(); + }) + .then(() => mapToCollectionResult(true)) + .catch((err) => { + this.logger.error(err); + + return mapToCollectionResult(false); + }); + } + + create(data: Partial): Promise> { + if (!data) { + return Promise.reject(new Error('Data has not been provided')); + } + + const id = v4(); + // TODO: handle relations + // TODO: validation + const recordData = { + ...data, + id, + isDeleted: false, + createdAt: Date.now(), + updatedAt: Date.now(), + }; + + return this.loadCollection().then(() => { + this.collectionRecords[ id ] = recordData as T&WithId&SoftDeleteFlag&TimeStamps; + this.isSynced = false; + + return this.syncCollection() + .then(() => mapToCollectionResult(true)) + .catch((err) => { + this.logger.error(err); + + return mapToCollectionResult(false); + }); + }); + } + + delete(id: string, { force = false }: ForceOpts = {}): Promise> { + // TODO: handle case when isSynced = false; + const quoteRecord = this.collectionRecords[ id ]; + if (!quoteRecord) { + return Promise.reject(new Error(`Record with id=${ id } has not been found.`)); + } + + if (force) { + delete this.collectionRecords[ id ]; + } else { + return this.update(id, { isDeleted: true }); + } + + this.isSynced = false; + + return this.syncCollection() + .then(() => mapToCollectionResult(true)) + .catch((err) => { + this.logger.error(err); + + return mapToCollectionResult(false); + }); + } +} diff --git a/apps/api/src/app/json-db-collection/models.ts b/apps/api/src/app/json-db-collection/models.ts new file mode 100644 index 0000000..1c11198 --- /dev/null +++ b/apps/api/src/app/json-db-collection/models.ts @@ -0,0 +1,90 @@ + +export type RepoResult = CollectionResult + +export interface Repo { + find(criteria: C, opts: O): Promise>; + + findOne(id: string): Promise>; + + update(id: string, data: Partial): Promise>; + + delete(id: string): Promise>; +} + +export abstract class BaseRepo implements Repo { + + find(criteria: C, opts: O): Promise> { + throw new Error('Not implemented'); + } + + findOne(id: string): Promise> { + throw new Error('Not implemented'); + } + + update(id: string, data: Partial): Promise> { + throw new Error('Not implemented'); + } + + delete(id: string): Promise> { + throw new Error('Not implemented'); + } +} + +export interface PageLimit { + limit?: number; + page?: number; +} + +export interface PageLimitTotalOpts extends PageLimit { + total?: number; +} + +export interface ResultReturnOptions extends PageLimit { + sortBy?: string; + order?: SortOrder +} + +export interface SearchCriteria extends ResultReturnOptions{ + where?: T; +} + +export interface CollectionResult { + result: T | T[] | null; + resultCount?: number; + error?: Error; + limit?: number; + page?: number; + total?: number; +} + +export enum SortOrder { + ASC = 'ASC', + DESC = 'DESC', +} + +export interface ForceOpts { + force?: boolean; +} + +export interface StrictOpts { + strict?: boolean; +} + +export type ValueCheckerFn = (current: T, expected: T, opts?: StrictOpts ) => boolean; + +export interface CollectionRecords { + [ id: string ]: T; +} + +export interface WithId { + id?: string; +} + +export interface SoftDeleteFlag { + isDeleted?: boolean; +} + +export interface TimeStamps { + createdAt: number, + updatedAt: null, +} diff --git a/apps/api/src/app/json-db-collection/utils.ts b/apps/api/src/app/json-db-collection/utils.ts new file mode 100644 index 0000000..adaed67 --- /dev/null +++ b/apps/api/src/app/json-db-collection/utils.ts @@ -0,0 +1,141 @@ +import {PathLike} from "fs"; +import {readFile, writeFile} from "fs/promises"; + +import { + CollectionRecords, + CollectionResult, + PageLimitTotalOpts, + ResultReturnOptions, + SearchCriteria, + SortOrder, ValueCheckerFn, WithId +} from "./models"; + +export const PROP_VALUE_CHECK_MAP: { [ type: string ]: ValueCheckerFn } = { + undefined: ((current, expected) => Object.is(current, expected)) as ValueCheckerFn, + boolean: ((current, expected) => Object.is(current, expected)) as ValueCheckerFn, + string: ((current, expected, { strict = false } = {}) => { + return strict ? current === expected : current.includes(expected); + }) as ValueCheckerFn, + object: ((current, expected, { strict = false } = {}) => { + if (Array.isArray(current) && Array.isArray(expected)) { + if (strict) { + return (current.length === expected.length) && current.reduce((memo, val) => { + return memo && expected.includes(val); + }, true) + } + + return expected.reduce((memo, val) => (memo && current.includes(val)), true); + } + + return Object.is(current, expected); // TODO: object equal check + }) as ValueCheckerFn>, +} + +export function doesRecordMatchCriteria(record: T, criteria: SearchCriteria, schema?: any): boolean { + const { where } = criteria; + + if (!where) { + return true; + } + + return Object.entries(where) + .reduce((memo: boolean, [ prop, value ]: [ string, string|string[]|boolean|unknown ]) => { + const recordPropValue = record[ prop ]; + + if (typeof value === 'undefined') { + return memo && true; + } + + return memo && prop in record && PROP_VALUE_CHECK_MAP[ typeof recordPropValue ](recordPropValue, value); + }, true); +} + +export function mapArrayToCollection(data: T[]): CollectionRecords { + return data.reduce((memo: CollectionRecords, item: T&WithId) => { + return { + ...memo, + [ item.id ]: { ...item }, + }; + }, {}); +} + +export function mapCollectionToArray(collection: CollectionRecords): T[] { + return Object.values(collection); +} + +export function readJson(path: PathLike): Promise { + return readFile(path, { encoding: 'utf-8' }) + .then((fileStr: string) => (JSON.parse(fileStr) as T)); +} + +export function writeJson(path: PathLike, data: T): Promise { + try { + const dataStr = JSON.stringify(data); + + return writeFile(this.quotesJsonPath, dataStr, {encoding: 'utf-8'}); + } catch (e) { + return Promise.reject(e); + } +} + +export function mapToCollectionResult(data: T|T[], { page, limit, total }: PageLimitTotalOpts = {}): CollectionResult { + if (typeof data === 'boolean') { + return { + result: data, + }; + } + + if (data && !Array.isArray(data)) { + return { + result: data, + resultCount: 1, + }; + } + + return { + result: data, + resultCount: Array.isArray(data) && data.length || 0, + ...{ total, page, limit }, + }; +} + +export function sliceAndSort(data: T[], { page = 0, limit, sortBy, order }: ResultReturnOptions = {}): T[] { + const pageNumber = Number(page); + const limitNumber = Number(limit); + const exactPage = (!pageNumber || pageNumber - 1 <= 0) ? 0 : pageNumber - 1; + const startFromIndex = limitNumber * exactPage; + const endWithIndex = startFromIndex + limitNumber; + + const dataSlice = limit ? data.slice(startFromIndex, endWithIndex) : data; + + return sortBy + ? dataSlice.sort((first: T, second: T): number => { + const firstFieldValue = first[sortBy]; + const secondFieldValue = second[sortBy]; + + if (!sortBy || firstFieldValue === secondFieldValue) { + return 0; + } + + if (order === SortOrder.ASC) { + return firstFieldValue > secondFieldValue ? 1 : -1; + } + + return firstFieldValue < secondFieldValue ? 1 : -1; + }) + : dataSlice; +} + +export function isEmptyRecord(data: Record): boolean { + if (Array.isArray(data)) { + return !!data.length; + } + + return !Object + .keys(data) + .find(key => { + const value = data[ key ]; + + return typeof value === 'boolean' || typeof value === 'string' || !!value; + }); +} diff --git a/apps/api/src/app/quotes/index.ts b/apps/api/src/app/quotes/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/apps/api/src/app/quotes/models/index.ts b/apps/api/src/app/quotes/models/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/apps/api/src/app/quotes/quotes.controller.spec.ts b/apps/api/src/app/quotes/quotes.controller.spec.ts new file mode 100644 index 0000000..59253dc --- /dev/null +++ b/apps/api/src/app/quotes/quotes.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { QuotesController } from './quotes.controller'; + +describe('QuotesController', () => { + let controller: QuotesController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [QuotesController], + }).compile(); + + controller = module.get(QuotesController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/apps/api/src/app/quotes/quotes.controller.ts b/apps/api/src/app/quotes/quotes.controller.ts new file mode 100644 index 0000000..045f1ec --- /dev/null +++ b/apps/api/src/app/quotes/quotes.controller.ts @@ -0,0 +1,120 @@ +import {Controller, Get, Delete, Post, Put, Query, HttpStatus, Res, Param, Body} from '@nestjs/common'; +import { Response } from 'express'; + +import { ApiResponseData, Quote } from "@quotes/api-interfaces"; + +import { QuotesService } from "./services"; +import { RepoResult } from '../json-db-collection'; +import { convertQueryDataToArray, mapToApiResponseData } from '../shared/utils'; + +@Controller('api/quotes') +export class QuotesController { + + constructor(private quotesService: QuotesService) { + } + + @Get() + findAll( + @Query() query, + ): Promise> { + // TODO: DRY + const { tags, tag, page, limit, author, order, sortBy } = query; + const normalizedTags = [ + ...convertQueryDataToArray(tags), + ...convertQueryDataToArray(tag), + ].filter(t => Boolean(t)) as string[]; + + return this.quotesService + .find({ + isDeleted: false, // TODO: expose all for authorized users... + tags: normalizedTags, + author: convertQueryDataToArray(author) as string[], + }, { + page, + limit, + order, + sortBy, + }) + .then(({ result, error }: RepoResult) => { + return error + ? mapToApiResponseData(result as null, 500, 'Oops..', error) + : mapToApiResponseData(result) + }); + } + + @Post() + create() { + return { created: true }; + } + + @Get('random') + random( + @Query() query, + @Res({ passthrough: true }) res: Response, + ) { + const { tags, tag, author } = query + + // TODO: DRY... + const normalizedTags = [ + ...convertQueryDataToArray(tags), + ...convertQueryDataToArray(tag), + ].filter(t => Boolean(t)) as string[]; + + return this.quotesService + .random({ + isDeleted: false, + tags: normalizedTags, + author: convertQueryDataToArray(author) as string[], + }) + .then(({ result, error }: RepoResult) => { + if (!result && ! error) { + res.status(HttpStatus.NOT_FOUND) + + return mapToApiResponseData(result, HttpStatus.NOT_FOUND, 'Not found') + } + + return error + ? mapToApiResponseData(result as null, 500, 'Oops..', error) + : mapToApiResponseData(result as Quote) + }); + } + + @Get(':id') + findById( + @Param('id') id: string, + @Res({ passthrough: true }) res: Response, + ) { + return this.quotesService + .findOne(id) + .then(({ result }) => { + if (!result) { + res.status(HttpStatus.NOT_FOUND) + + return mapToApiResponseData(result, HttpStatus.NOT_FOUND, 'Not found') + } + + return mapToApiResponseData(result); + }); + } + + @Put(':id') + updateById( + @Param('id') id: string, + @Body() body, + ) { + // TODO: check 404... + return this.quotesService + .update(id, body) + .then(() => this.quotesService.findOne(id)) + .then(({ result }) => mapToApiResponseData(result)); + } + + @Delete(':id') + deleteById( + @Param('id') id: string, + ) { + return this.quotesService + .delete(id) + .then(() => mapToApiResponseData(null)); + } +} diff --git a/apps/api/src/app/quotes/quotes.module.ts b/apps/api/src/app/quotes/quotes.module.ts new file mode 100644 index 0000000..4fe2329 --- /dev/null +++ b/apps/api/src/app/quotes/quotes.module.ts @@ -0,0 +1,15 @@ +import { Logger, Module } from '@nestjs/common'; + +import { QuotesService } from "./services"; +import { JsonDbCollectionService } from "../json-db-collection"; +import { QuotesController } from './quotes.controller'; + +@Module({ + controllers: [ QuotesController ], + providers: [ + JsonDbCollectionService, + QuotesService, + Logger, + ] +}) +export class QuotesModule {} diff --git a/apps/api/src/app/quotes/services/index.ts b/apps/api/src/app/quotes/services/index.ts new file mode 100644 index 0000000..43154f8 --- /dev/null +++ b/apps/api/src/app/quotes/services/index.ts @@ -0,0 +1 @@ +export * from './quotes.service'; diff --git a/apps/api/src/app/quotes/services/quotes.service.ts b/apps/api/src/app/quotes/services/quotes.service.ts new file mode 100644 index 0000000..c977581 --- /dev/null +++ b/apps/api/src/app/quotes/services/quotes.service.ts @@ -0,0 +1,68 @@ +import { Injectable } from "@nestjs/common"; + +import { join } from "path"; + +import { Quote } from "@quotes/api-interfaces"; + +import { getRandomFromArray } from "../../shared/utils"; +import { ResultReturnOptions, JsonDbCollectionService, BaseRepo, RepoResult } from '../../json-db-collection'; + +export interface QuoteSearchCriteria { + author?: string|string[]; + tags?: string[]; + isDeleted?: boolean; + text?: string; +} + +@Injectable() +export class QuotesService extends BaseRepo{ + + constructor(private quotesJson: JsonDbCollectionService) { + super(); + + this.quotesJson + .loadCollection(join(__dirname, 'assets', 'quotes.json')) // get from config.. + .then() + .catch() + .finally(); + } + + find( + searchCriteria: QuoteSearchCriteria = {}, + { limit, page = 0, sortBy, order }: ResultReturnOptions = {}, + ): Promise> { + const { tags, author, isDeleted } = searchCriteria; + + return this.quotesJson.find({ + where: { tags, author, isDeleted }, + sortBy, order, limit, page, + }) + .then(({ result, resultCount, total, limit, page }) => ({ + result, resultCount, page, limit, total, + })) + .catch((error) => ({ result: null, error })); + } + + findOne(id: string): Promise> { + return this.quotesJson.findById(id) + .then(({ result }) => ({ result })) + .catch(error => ({ result: null, error })); + } + + random({ author, tags, isDeleted }: QuoteSearchCriteria): Promise> { + return this.quotesJson.find({ where: { author, tags, isDeleted } }) + .then(({ result }) => (Array.isArray(result) ? result : [ result ])) + .then((quotes: Quote[]) => ({ + result: getRandomFromArray(quotes), + })).catch(error => ({ result: null, error })); + } + + update(id: string, data: Partial): Promise> { + return this.quotesJson.update(id, data); + } + + delete(id: string): Promise> { + return this.quotesJson.delete(id); + } + +} diff --git a/apps/api/src/app/shared/utils/array.utils.ts b/apps/api/src/app/shared/utils/array.utils.ts new file mode 100644 index 0000000..052c25b --- /dev/null +++ b/apps/api/src/app/shared/utils/array.utils.ts @@ -0,0 +1,7 @@ +/** + * @param {T} arr + * @returns {T} + */ +export function getRandomFromArray(arr: T[]): T { + return Array.isArray(arr) && arr[ Math.floor(Math.random() * arr.length) ]; +} diff --git a/apps/api/src/app/shared/utils/env.utils.ts b/apps/api/src/app/shared/utils/env.utils.ts new file mode 100644 index 0000000..356acfc --- /dev/null +++ b/apps/api/src/app/shared/utils/env.utils.ts @@ -0,0 +1,6 @@ +/** + * @returns {boolean} + */ +export function isDev(): boolean { + return [ 'dev', 'develop', 'development', 'dv', '', undefined ].includes(process.env.NODE_ENV); +} diff --git a/apps/api/src/app/shared/utils/index.ts b/apps/api/src/app/shared/utils/index.ts new file mode 100644 index 0000000..bf06239 --- /dev/null +++ b/apps/api/src/app/shared/utils/index.ts @@ -0,0 +1,21 @@ +import { ApiResponseData } from '@quotes/api-interfaces'; + +export * from './array.utils'; +export * from './env.utils'; + +export function mapToApiResponseData(data: T, statusCode = 200, message = 'OK', error?: E): ApiResponseData { + return { data, message, statusCode, error }; +} + +export function convertQueryDataToArray(queryData: unknown, sep = ','): T[] | string[] | unknown[] { + if (Array.isArray(queryData)) { + return queryData.reduce((memo, data) => ([ ...memo, ...convertQueryDataToArray(data)]), []); + } + + if(typeof queryData === 'string') { + return queryData.split(sep); + } + + return [ queryData ]; +} + diff --git a/apps/api/src/assets/quotes.json b/apps/api/src/assets/quotes.json new file mode 100644 index 0000000..a6e9a2c --- /dev/null +++ b/apps/api/src/assets/quotes.json @@ -0,0 +1,17553 @@ +[ + { + "id": "ec5f0d07-df5d-4447-934a-4674c8734f88", + "isDeleted": false, + "createdAt": 1613993133669, + "updatedAt": 1613993133669, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "A house divided against itself cannot stand." + }, + { + "id": "72e0d405-8921-40d7-8a65-48e309e83411", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "Important principles may, and must, be inflexible." + }, + { + "id": "e92036a4-d1be-47b5-bd2d-1d86f0e4d256", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "I destroy my enemies when I make them my friends." + }, + { + "id": "d16ea763-c939-4906-ba58-15325b6fb0d5", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "You have to do your own growing no matter how tall your grandfather was." + }, + { + "id": "cf7dfce5-d0a8-41d9-962d-73b951792600", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "Most people are about as happy as they make up their minds to be" + }, + { + "id": "c8842450-81e9-4a13-9e78-bad68ca60efe", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "Most folks are about as happy as they make up their minds to be." + }, + { + "id": "dc460615-6375-403f-9d25-32040bde8134", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "Give me six hours to chop down a tree and I will spend the first four sharpening the axe." + }, + { + "id": "811d0d63-588a-4e35-bd4e-dd47149b483d", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "When you have got an elephant by the hind legs and he is trying to run away, it's best to let him run." + }, + { + "id": "60155a72-283a-409a-9805-0bae22d06632", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "The best thing about the future is that it only comes one day at a time." + }, + { + "id": "80d45ac6-829a-472a-b84d-63ad918b1d16", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [ + "future", + "prediction", + "create", + "creation", + "life" + ], + "source": "https://www.goodreads.com/quotes/328848", + "author": "Abraham Lincoln", + "text": "The best way to predict your future is to create it." + }, + { + "id": "d1bdea22-e94b-455d-a943-5b07bd394e80", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "Character is like a tree and reputation like a shadow. The shadow is what we think of it; the tree is the real thing." + }, + { + "id": "5ab01584-5ae3-44ae-90b1-089d6593fcb9", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "As our case is new, we must think and act anew." + }, + { + "id": "c2fdb1f5-2e15-4ff3-b4b9-8215ff4fadfb", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "Be sure you put your feet in the right place, then stand firm." + }, + { + "id": "807ce623-c220-4f4d-9273-ecf9bad403ed", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "Always bear in mind that your own resolution to succeed is more important than any one thing." + }, + { + "id": "10f58432-52c4-4ad6-9cb4-35959df24a05", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "I walk slowly, but I never walk backward." + }, + { + "id": "3f13a7e2-e5a7-42f7-975b-7d606b588543", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "Truth is generally the best vindication against slander." + }, + { + "id": "425cfc33-a3b7-447c-9e90-6e890ca4bfa9", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "Most folks are as happy as they make up their minds to be." + }, + { + "id": "de2f97a5-da18-4270-8740-bf4b5db60515", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Lincoln", + "text": "I will prepare and some day my chance will come." + }, + { + "id": "5487bed0-f79d-4ad2-81ba-738886e33b0a", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Abraham Maslow", + "text": "What is necessary to change a person is to change his awareness of himself." + }, + { + "id": "083e5ee9-a874-4807-99d2-2960bdaeba96", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aesop", + "text": "No act of kindness, no matter how small, is ever wasted." + }, + { + "id": "8f76e9f1-c600-4e08-ac31-758bff31fa44", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ajahn Chah", + "text": "If you let go a little, you will have a little peace. If you let go a lot, you will have a lot of peace." + }, + { + "id": "fc09678f-fc46-4d0b-a2bd-c8390d1626c5", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alan Watts", + "text": "No valid plans for the future can be made by those who have no capacity for living now." + }, + { + "id": "76abe0c8-1b10-4a93-98c8-fc821854d9e1", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Camus", + "text": "Autumn is a second spring when every leaf is a flower." + }, + { + "id": "d241ec53-3fc8-48ad-9e4b-4ba249ceccce", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Camus", + "text": "In the depth of winter, I finally learned that there was within me an invincible summer." + }, + { + "id": "bb890371-ab07-45ab-bb9c-5d1ebe3c26d0", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "God always takes the simplest way." + }, + { + "id": "7392f703-0398-4685-9048-3b491654201e", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Learn from yesterday, live for today, hope for tomorrow." + }, + { + "id": "62396bb5-a6d3-4a57-a93a-e395bc4d3026", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "The only real valuable thing is intuition." + }, + { + "id": "51a5fbf2-cf33-47ac-afba-6f33d7d0526c", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Once we accept our limits, we go beyond them." + }, + { + "id": "ffa149c8-bc2b-4862-badd-a36db2134354", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Life is like riding a bicycle. To keep your balance you must keep moving." + }, + { + "id": "6e0b3f63-cc33-4fa5-b1d2-ea4ad7d79a26", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Feeling and longing are the motive forces behind all human endeavor and human creations." + }, + { + "id": "c4e474c6-5a00-4ddf-aec8-bf01a1f5cb51", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "I believe that a simple and unassuming manner of life is best for everyone, best both for the body and the mind." + }, + { + "id": "e194caf0-8f1a-48a5-a4da-c3883171378e", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Try not to become a man of success, but rather try to become a man of value." + }, + { + "id": "63c79695-ea6e-4a79-bb2f-9c058f337ece", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "When the solution is simple, God is answering." + }, + { + "id": "73c8ec80-2866-480d-a281-3756fb7c5d25", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "A man should look for what is, and not for what he thinks should be." + }, + { + "id": "cc83121e-9136-4fba-b39f-e3670e47ceee", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Imagination is more important than knowledge. For while knowledge defines all we currently know and understand, imagination points to all we might yet discover and create." + }, + { + "id": "ad8a2761-fcd4-4a7a-a9ce-7e06cba4befe", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut." + }, + { + "id": "ae755af7-b8e9-4e5d-9866-a1c0107fb1a4", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Reality is merely an illusion, albeit a very persistent one." + }, + { + "id": "1ec38a26-e4ac-4019-9784-7f8ee0e242ac", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Peace cannot be kept by force. It can only be achieved by understanding." + }, + { + "id": "f8cad643-8599-44e5-8fe5-0725515018a8", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "We cannot solve our problems with the same thinking we used when we created them." + }, + { + "id": "aa035670-bb71-456b-ad1b-bb65edc9833a", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "If you can't explain it simply, you don't understand it well enough." + }, + { + "id": "5daadabb-0e60-4dad-9ee4-be13f0b2badf", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": ["imagination", "creativity", "inspiration"], + "source": "https://www.goodreads.com/quotes/38836", + "author": "Albert Einstein", + "text": "Imagination is everything. It is the preview of life's coming attractions." + }, + { + "id": "80ef3042-b53d-409f-9f1b-7a3f3100804e", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": ["imagination", "creativity", "intelligence"], + "source": "https://www.goodreads.com/quotes/297929", + "author": "Albert Einstein", + "text": "The true sign of intelligence is not knowledge but imagination." + }, + { + "id": "971f093b-5820-40e9-9357-0219992ba7e0", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "In the middle of every difficulty lies opportunity." + }, + { + "id": "5986e533-de8e-45e2-85e0-d5777078dd9c", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Setting an example is not the main means of influencing another, it is the only means." + }, + { + "id": "791dfa4b-2b02-4420-bd29-d6a608cd902e", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Logic will get you from A to B. Imagination will take you everywhere." + }, + { + "id": "a71905fb-5fa9-4558-98df-79488c9cef89", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Great ideas often receive violent opposition from mediocre minds." + }, + { + "id": "d33cac89-9fa4-4bc1-aba0-436e242c8dc7", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "Anyone who doesn't take truth seriously in small matters cannot be trusted in large ones either." + }, + { + "id": "4a93aa8c-a922-47b8-9375-756b17ceda71", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle." + }, + { + "id": "d3d8ca45-a6cf-4398-a52e-e23170bc005e", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "One may say the eternal mystery of the world is its comprehensibility." + }, + { + "id": "134f71af-dd4b-4433-b67f-192ba4e9d29d", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Einstein", + "text": "A person who never made a mistake never tried anything new." + }, + { + "id": "0f76fe67-dada-45f8-ae2c-991ca8983d6f", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": ["talent", "curious", "curiosity", "passion"], + "source": "https://www.goodreads.com/quotes/11458", + "author": "Albert Einstein", + "text": "I have no special talent. I am only passionately curious." + }, + { + "id": "20b67997-bdb8-4f25-b326-b9e899e3b88d", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Gray", + "text": "Winners have simply formed the habit of doing things losers don't like to do." + }, + { + "id": "700e1abc-b929-4688-b495-9201d502d369", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Schweitzer", + "text": "Do something wonderful, people may imitate it." + }, + { + "id": "0d1d9876-1fbb-4eb2-9f3b-0b56891d33aa", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Schweitzer", + "text": "We should all be thankful for those people who rekindle the inner spirit." + }, + { + "id": "4fba0556-b1fc-4ed9-a7ae-767f49b9caf8", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Schweitzer", + "text": "One who gains strength by overcoming obstacles possesses the only strength which can overcome adversity." + }, + { + "id": "f3678030-0128-4cee-a5a0-40ea069b61f8", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Schweitzer", + "text": "Wherever a man turns he can find someone who needs him." + }, + { + "id": "3997b555-d927-4bc7-89a8-6285456bf33a", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Schweitzer", + "text": "Constant kindness can accomplish much. As the sun makes ice melt, kindness causes misunderstanding, mistrust, and hostility to evaporate." + }, + { + "id": "3f7ba8ca-bb9d-48a8-bf83-a610ea3a33b8", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Schweitzer", + "text": "Success is not the key to happiness. Happiness is the key to success. If you love what you are doing, you will be successful." + }, + { + "id": "1193edc3-9c8f-48d1-a5b1-b04acac7826f", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Schweitzer", + "text": "An optimist is a person who sees a green light everywhere, while the pessimist sees only the red spotlight... The truly wise person is colour-blind." + }, + { + "id": "7e24a7ac-f531-46b6-a4b4-a6671bf0b7f8", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Albert Schweitzer", + "text": "Never say there is nothing beautiful in the world any more. There is always something to make you wonder in the shape of a tree, the trembling of a leaf." + }, + { + "id": "9274b907-bc7f-4db3-aea4-5babf7f37d8e", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aldous Huxley", + "text": "There is only one corner of the universe you can be certain of improving, and that's your own self." + }, + { + "id": "3d8510e3-8380-4392-b5bb-b83177ad00cd", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aldous Huxley", + "text": "Experience is not what happens to a man. It is what a man does with what happens to him." + }, + { + "id": "ebbb74f8-ccad-41c8-b125-6f35104edb4a", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alexander Pope", + "text": "Do good by stealth, and blush to find it fame." + }, + { + "id": "87343ae4-fefc-489b-9637-d1c2801afd63", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alexander Pope", + "text": "Blessed is the man who expects nothing, for he shall never be disappointed." + }, + { + "id": "e526eb26-2381-4ca0-81da-87758c961ba3", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alexander the Great", + "text": "There is nothing impossible to him who will try." + }, + { + "id": "42e76f02-c4df-4cef-bd00-95573c5ef4d7", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alexis Carrel", + "text": "All great men are gifted with intuition. They know without reasoning or analysis, what they need to know." + }, + { + "id": "2ba60403-b84c-47a6-a68e-3f3d806654c7", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alfred Adler", + "text": "Trust only movement. Life happens at the level of events, not of words. Trust movement." + }, + { + "id": "1c2d5c42-4b0e-4645-9650-13bdf168548d", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alfred Korzybski", + "text": "There are two ways to slide easily through life: to believe everything or to doubt everything; both ways save us from thinking." + }, + { + "id": "82e843af-5ee9-422c-a772-9073cd399c60", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alfred Painter", + "text": "Saying thank you is more than good manners. It is good spirituality." + }, + { + "id": "610712dd-ca62-4f38-aee4-7c8dbd2bd325", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alfred Sheinwold", + "text": "Learn all you can from the mistakes of others. You won't have time to make them all yourself." + }, + { + "id": "311b5e1a-1319-4bd0-9e28-d44b83d248bb", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alfred Tennyson", + "text": "The happiness of a man in this life does not consist in the absence but in the mastery of his passions." + }, + { + "id": "08613cc4-f331-4d50-925f-6412107c2b8b", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alfred Whitehead", + "text": "The art of progress is to preserve order amid change, and to preserve change amid order." + }, + { + "id": "f18115cb-76e5-45ae-869d-e1a0e8eb4e8b", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alice Walker", + "text": "No person is your friend who demands your silence, or denies your right to grow." + }, + { + "id": "2b9e33f1-36a4-4206-a565-f56bf10dd146", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Alphonse Karr", + "text": "Some people are always grumbling because roses have thorns; I am thankful that thorns have roses." + }, + { + "id": "47bfa93d-35e2-43dc-8714-439dae5cdad6", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ambrose Bierce", + "text": "Speak when you are angry and you will make the best speech you will ever regret." + }, + { + "id": "0ff22ca9-7746-4339-922a-b1cefd1def46", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Amelia Earhart", + "text": "Never do things others can do and will do, if there are things others cannot do or will not do." + }, + { + "id": "8b6a9456-7a5b-4b1f-b8de-cc7fc0941f04", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "American proverb", + "text": "From little acorns mighty oaks do grow." + }, + { + "id": "36efa861-34aa-4d09-9114-731971073256", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Amiel", + "text": "Without passion man is a mere latent force and possibility, like the flint which awaits the shock of the iron before it can give forth its spark." + }, + { + "id": "95eaf28f-2e06-4fb3-9faf-e3c99f0e5431", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Amy Bloom", + "text": "Love at first sight is easy to understand; its when two people have been looking at each other for a lifetime that it becomes a miracle." + }, + { + "id": "ff0827a2-e9ed-46fe-9b4f-876ab14c67ff", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Amy Tan", + "text": "I am like a falling star who has finally found her place next to another in a lovely constellation, where we will sparkle in the heavens forever." + }, + { + "id": "89a961ba-aee2-4b25-8121-96184db85a4a", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anais Nin", + "text": "Life shrinks or expands in proportion to one's courage." + }, + { + "id": "3d5a85ca-40e3-41a4-b3d6-d81aa45d5b22", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anais Nin", + "text": "The possession of knowledge does not kill the sense of wonder and mystery. There is always more mystery." + }, + { + "id": "c0b3cc78-a4dd-4026-a66c-b2f2c9a73105", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anais Nin", + "text": "Dreams pass into the reality of action. From the actions stems the dream again; and this interdependence produces the highest form of living." + }, + { + "id": "33d98721-d095-4526-aef4-33ab25ada3ac", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anais Nin", + "text": "The personal life deeply lived always expands into truths beyond itself." + }, + { + "id": "f18fd984-98a1-434b-8a6b-3af203dabf1e", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anais Nin", + "text": "Age does not protect you from love. But love, to some extent, protects you from age." + }, + { + "id": "99c25623-678f-4b97-8823-c0da71d39cc1", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anais Nin", + "text": "The dream was always running ahead of me. To catch up, to live for a moment in unison with it, that was the miracle." + }, + { + "id": "843d6b16-f7ed-4370-be33-1be808c69f9f", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anais Nin", + "text": "There is not one big cosmic meaning for all, there is only the meaning we each give to our life." + }, + { + "id": "f2456206-7087-4f5a-b26e-f9485f10bf55", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anatole France", + "text": "To accomplish great things, we must dream as well as act." + }, + { + "id": "b3c16762-69e4-4864-95f6-f5614c406818", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anatole France", + "text": "To accomplish great things, we must not only act, but also dream; not only plan, but also believe." + }, + { + "id": "34fd663f-d866-428a-bf9b-b3e0ff5f640b", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anatole France", + "text": "It is better to understand a little than to misunderstand a lot." + }, + { + "id": "52b84292-e741-404f-99a1-534b14cd8883", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anatole France", + "text": "You learn to speak by speaking, to study by studying, to run by running, to work by working; in just the same way, you learn to love by loving." + }, + { + "id": "e81fcac9-c3fe-453e-a1dc-9e3ebb227679", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Andre Gide", + "text": "One does not discover new lands without consenting to lose sight of the shore for a very long time." + }, + { + "id": "84a6f044-1925-4f51-915e-f47a4aac131a", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Andre Gide", + "text": "The most decisive actions of our life... are most often unconsidered actions." + }, + { + "id": "e9ef251e-b028-4a14-b136-e10fd5eb73a3", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Andrew Gide", + "text": "The most decisive actions of our life... are most often unconsidered actions." + }, + { + "id": "a38ff42e-16bc-4f5e-94f4-3498af2aced1", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Andy Rooney", + "text": "If you smile when no one else is around, you really mean it." + }, + { + "id": "66f06111-e52e-4de9-a049-e3c6f6e533f8", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Andy Warhol", + "text": "They say that time changes things, but you actually have to change them yourself." + }, + { + "id": "e8eae225-8225-4e5b-829d-29c3f90424c1", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Angela Schwindt", + "text": "While we try to teach our children all about life, our children teach us what life is all about." + }, + { + "id": "dc01d795-73a0-47d6-88dd-3e8caee7dc09", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anna Pavlova", + "text": "To follow, without halt, one aim: There is the secret of success." + }, + { + "id": "d8c39ae5-749b-4d9a-ad91-2ac23ead4022", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anne Bradstreet", + "text": "If we had no winter, the spring would not be so pleasant; if we did not sometimes taste of adversity, prosperity would not be so welcome." + }, + { + "id": "c297bc9b-5cc6-450b-a612-228781689729", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anne Bronte", + "text": "All our talents increase in the using, and the every faculty, both good and bad, strengthen by exercise." + }, + { + "id": "be59db01-6965-40f0-a703-a977a75bb4ff", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anne Frank", + "text": "We all live with the objective of being happy; our lives are all different and yet the same." + }, + { + "id": "7d8f267b-4e66-45de-9c0b-2b2504b675f7", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anne Frank", + "text": "How wonderful it is that nobody need wait a single moment before starting to improve the world." + }, + { + "id": "7d29ea64-b80b-4cc6-b3ef-78fe597af16f", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anne Frank", + "text": "No one has ever become poor by giving." + }, + { + "id": "ebb1bc39-4173-4b30-b9e2-a266263d29dc", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anne Frank", + "text": "Parents can only give good advice or put them on the right paths, but the final forming of a persons character lies in their own hands." + }, + { + "id": "5fba3d50-a04a-4d9f-99d7-2d2f38b0902f", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anne Lamott", + "text": "Joy is the best makeup." + }, + { + "id": "19f417e4-a774-47b4-9d06-d3c569a3a7f4", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anne Lindbergh", + "text": "If one is estranged from oneself, then one is estranged from others too. If one is out of touch with oneself, then one cannot touch others." + }, + { + "id": "35b63da8-28f8-4188-b53b-beb6f1b27588", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anne Schaef", + "text": "Life is a process. We are a process. The universe is a process." + }, + { + "id": "eaff664c-7ce4-4f9f-8825-5e1c1e647349", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anne Wilson Schaef", + "text": "Trusting our intuition often saves us from disaster." + }, + { + "id": "ec2a4b92-00a9-4afc-8d2c-42804a905671", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": ["passion", "try", "live"], + "source": "https://www.goodreads.com/quotes/530337", + "author": "Annie Dillard", + "text": "How we spend our days is, of course, how we spend our lives." + }, + { + "id": "3b7c20cf-f485-47e1-94a1-c2063e20c109", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anthony D'Angelo", + "text": "Listen to your intuition. It will tell you everything you need to know." + }, + { + "id": "b91d6b09-b8c5-46a9-b094-c4b589b22c31", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anthony Robbins", + "text": "Life is a gift, and it offers us the privilege, opportunity, and responsibility to give something back by becoming more" + }, + { + "id": "e3eb2235-3e87-4042-8cd9-b709646419b3", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anthony Robbins", + "text": "The path to success is to take massive, determined action." + }, + { + "id": "b32cb1d1-ce8a-4ade-97bd-5e6fbb05beb2", + "isDeleted": false, + "createdAt": 1613993133670, + "updatedAt": 1613993133670, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Anthony Robbins", + "text": "To effectively communicate, we must realize that we are all different in the way we perceive the world and use this understanding as a guide to our communication with others." + }, + { + "id": "80254580-438a-4f31-a8b3-78a2016dbe4f", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Antoine de Saint-Exupery", + "text": "It is only with the heart that one can see rightly, what is essential is invisible to the eye." + }, + { + "id": "556419cb-9e6a-40fd-ad46-27b5be8009ad", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Antoine de Saint-Exupery", + "text": "I know but one freedom and that is the freedom of the mind." + }, + { + "id": "2183d2c8-8ef5-4f26-b867-26b31bf944cc", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Antoine de Saint-Exupery", + "text": "Love does not consist of gazing at each other, but in looking together in the same direction." + }, + { + "id": "3ec6cd3b-d0a3-4edd-b56f-861903c0b715", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Arie de Gues", + "text": "Your ability to learn faster than your competition is your only sustainable competitive advantage." + }, + { + "id": "924e09f8-c56e-4fe1-a15b-bf2fbbcd01cf", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "Well begun is half done." + }, + { + "id": "67d23e14-1f23-4660-baf9-6aa2ffb25712", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "Change in all things is sweet." + }, + { + "id": "aa58a561-62e8-4f5c-a2d0-e727872fb85d", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "It is the mark of an educated mind to be able to entertain a thought without accepting it." + }, + { + "id": "a9025be9-e75b-49b3-b425-4d37c7d0e2fe", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "Happiness depends upon ourselves." + }, + { + "id": "854f14d7-1341-4010-80f3-4436124794bd", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "In all things of nature there is something of the marvellous." + }, + { + "id": "f1db5620-3940-4e69-a668-4accfe914755", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "We are what we repeatedly do. Excellence, then, is not an act, but a habit." + }, + { + "id": "d9a9b90f-035e-42ee-9d54-d3042ab110ca", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "Those that know, do. Those that understand, teach." + }, + { + "id": "47594dd1-bb0e-4d9e-8d2f-b3e05f84ffbd", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "Criticism is something you can easily avoid by saying nothing, doing nothing, and being nothing." + }, + { + "id": "a1aa89be-2320-47ed-bd94-4fc0a8ab5a8b", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "We are what we repeatedly do. Excellence, then, is not an act but a habit." + }, + { + "id": "571df51d-a41c-42ff-8c61-4a6d330c03dc", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "Moral excellence comes about as a result of habit. We become just by doing just acts, temperate by doing temperate acts, brave by doing brave acts." + }, + { + "id": "e105fb49-b5d5-4380-9ca1-a9ed2a6467c9", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "The energy of the mind is the essence of life." + }, + { + "id": "d4e0850d-88b6-4bea-8ce6-a469c4894428", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Aristotle", + "text": "If one way be better than another, that you may be sure is natures way." + }, + { + "id": "a7bdbe96-20ba-4d1f-81dc-3180a8f0d317", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Arthur Conan Doyle", + "text": "Whenever you have eliminated the impossible, whatever remains, however improbable, must be the truth." + }, + { + "id": "5775c205-baf5-430f-80ab-7e2757394d04", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Arthur Conan Doyle", + "text": "Mediocrity knows nothing higher than itself, but talent instantly recognizes genius." + }, + { + "id": "a3f72063-84d2-48b1-bb9f-7e39e989ce55", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Arthur Rubinstein", + "text": "Of course there is no formula for success except perhaps an unconditional acceptance of life and what it brings." + }, + { + "id": "dd3c29ca-627b-487a-a910-320cede4efd5", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Arthur Schopenhauer", + "text": "Every man takes the limits of his own field of vision for the limits of the world." + }, + { + "id": "d965f9ca-e74e-4da2-8eff-16e92adcdb3b", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Audre Lorde", + "text": "When I dare to be powerful, to use my strength in the service of my vision, then it becomes less and less important whether I am afraid." + }, + { + "id": "7698ea38-99f7-41fe-8aef-42bceeaec518", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Augustinus Sanctus", + "text": "The world is a book, and those who do not travel read only a page." + }, + { + "id": "78da0d36-16f9-429e-a3ed-c58019d3975b", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Babatunde Olatunji", + "text": "Yesterday is history. Tomorrow is a mystery. And today? Today is a gift. That is why we call it the present." + }, + { + "id": "43a39af7-1116-4687-a6c2-2688f4f72fd5", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Babe Ruth", + "text": "Yesterdays home runs don't win today's games." + }, + { + "id": "53576bf6-e472-4651-945e-d9ef7d7eba67", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Baltasar Gracian", + "text": "Without courage, wisdom bears no fruit." + }, + { + "id": "7f93ce71-0d2c-4182-9bf8-d6b4ad9bebc0", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Barack Obama", + "text": "If you're walking down the right path and you're willing to keep walking, eventually you'll make progress." + }, + { + "id": "e70e1191-dd8a-4441-ae7c-f313ce42107a", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Barack Obama", + "text": "Focusing your life solely on making a buck shows a poverty of ambition. It asks too little of yourself. And it will leave you unfulfilled." + }, + { + "id": "b31e6c67-5f15-4ffe-a7da-06c5520f4739", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Barack Obama", + "text": "Change will not come if we wait for some other person or some other time. We are the ones weve been waiting for. We are the change that we seek." + }, + { + "id": "157802af-3abf-4ac6-82ed-9efe7e338879", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Barbara Baron", + "text": "Don't wait for your feelings to change to take the action. Take the action and your feelings will change." + }, + { + "id": "32e4db98-fb04-4bfe-8ce2-84a247910e99", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Barbara De Angelis", + "text": "We need to find the courage to say NO to the things and people that are not serving us if we want to rediscover ourselves and live our lives with authenticity." + }, + { + "id": "9730b5dc-e38f-4fdb-8e8d-9512db3658ef", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ben Stein", + "text": "The first step to getting the things you want out of life is this: decide what you want." + }, + { + "id": "b44badfc-9253-40bd-9365-bf3c7b20232e", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ben Sweetland", + "text": "We cannot hold a torch to light another's path without brightening our own." + }, + { + "id": "05de3933-ea86-425c-8d94-8ad974cb1296", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "The secret of success is constancy to purpose." + }, + { + "id": "f68be7c0-30b8-4a51-98ee-27c4550f81c1", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "Action may not always bring happiness; but there is no happiness without action." + }, + { + "id": "ea0dc6c9-badc-4006-80f7-f03093cbcdb8", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "Through perseverance many people win success out of what seemed destined to be certain failure." + }, + { + "id": "bbb14ce6-2aa5-4ebb-bd2e-8ade0a0ec31a", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "Never apologize for showing feelings. When you do so, you apologize for the truth." + }, + { + "id": "effae147-bfc7-4133-a1d3-d58e6fdeba12", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "One secret of success in life is for a man to be ready for his opportunity when it comes." + }, + { + "id": "bfb41819-9b00-4004-b0a1-10ea5eb8ad43", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "The greatest good you can do for another is not just to share your riches but to reveal to him his own." + }, + { + "id": "1798ea3e-baae-4eaf-8c2c-8862a1defe3e", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "The greatest good you can do for another is not just share your riches, but reveal to them their own." + }, + { + "id": "4f47abb8-c2af-4e50-b8e4-8095563e98ab", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "Ignorance never settle a question." + }, + { + "id": "12403ccf-3b65-4946-950e-14b7bb3c134e", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "Action may not always bring happiness, but there is no happiness without action." + }, + { + "id": "17bf8d36-e1be-457e-8c40-7cb4b950b736", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "Never apologize for showing feeling. When you do so, you apologize for truth." + }, + { + "id": "e0098fda-0593-4d5e-87cb-026184323113", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Disraeli", + "text": "We make our own fortunes and we call them fate." + }, + { + "id": "279bc35a-d27e-487f-bb77-dc832c243609", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Franklin", + "text": "Well done is better than well said." + }, + { + "id": "c1debec3-69e2-470e-bd1b-b432c668b32a", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Franklin", + "text": "One today is worth two tomorrows." + }, + { + "id": "edc7c2b2-6be4-4e2d-85ad-c4374a25f5c0", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Franklin", + "text": "There never was a good knife made of bad steel." + }, + { + "id": "35cf546e-1897-4d06-bce8-031826bc8590", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Franklin", + "text": "Watch the little things; a small leak will sink a great ship." + }, + { + "id": "0d32e4e6-a5a7-452e-923c-1d795c143d9d", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Franklin", + "text": "Experience keeps a dear school, but fools will learn in no other." + }, + { + "id": "37ebfdd2-2aef-40e1-96bb-1c4415c7be7a", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Haydon", + "text": "There surely is in human nature an inherent propensity to extract all the good out of all the evil." + }, + { + "id": "bf2b2161-e271-4355-bd83-d3f5bfb99ea1", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Benjamin Spock", + "text": "Trust yourself. You know more than you think you do." + }, + { + "id": "52ff13f6-0274-4ae2-9b16-b441eeac90be", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bernadette Devlin", + "text": "Yesterday I dared to struggle. Today I dare to win." + }, + { + "id": "3e45970f-a649-4de2-807a-0b9d708f1f80", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bernard Shaw", + "text": "Life isn't about finding yourself. Life is about creating yourself." + }, + { + "id": "ed815cb3-3f8b-4fc2-9e96-17d904ed2661", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bernard Shaw", + "text": "A life spent making mistakes is not only more honourable but more useful than a life spent in doing nothing." + }, + { + "id": "c8e834ab-5f3d-4a96-bc30-b38c39552c00", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bernard Shaw", + "text": "I am of the opinion that my life belongs to the community, and as long as I live it is my privilege to do for it whatever I can." + }, + { + "id": "14106c35-6915-4fda-a1b5-df41c0ac19d7", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bernard Shaw", + "text": "We don't stop playing because we grow old; we grow old because we stop playing." + }, + { + "id": "ad04ae43-40ca-4631-bd03-b71feb00f37b", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": ["meaning", "creativity"], + "source": "https://www.goodreads.com/quotes/8727", + "author": "Bernard Shaw", + "text": "Life isn't about finding yourself. Life is about creating yourself." + }, + { + "id": "fae6d345-29b7-4c11-8948-2e383ef54666", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bernice Reagon", + "text": "Life's challenges are not supposed to paralyse you, they're supposed to help you discover who you are." + }, + { + "id": "a4492184-32ff-4626-96cd-f1ae7a349b4d", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bernice Reagon", + "text": "Life's challenges are not supposed to paralyze you, they're supposed to help you discover who you are." + }, + { + "id": "d30cc472-57fa-4d7d-873f-13a249b0c597", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bertrand Russell", + "text": "The happiness that is genuinely satisfying is accompanied by the fullest exercise of our faculties and the fullest realization of the world in which we live." + }, + { + "id": "4f4b2fef-2403-4155-9858-723c8777d583", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Betty Friedan", + "text": "It is easier to live through someone else than to become complete yourself." + }, + { + "id": "149c4a43-26ca-438a-9336-0ca0cd44c398", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Billie Armstrong", + "text": "Our passion is our strength." + }, + { + "id": "68c87e8f-a7e6-4bf6-a752-8faba67a3200", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Billy Wilder", + "text": "Trust your own instinct. Your mistakes might as well be your own, instead of someone elses." + }, + { + "id": "8deca7da-fcf4-4285-a986-440354fde02d", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bishop Desmond Tutu", + "text": "We must not allow ourselves to become like the system we oppose." + }, + { + "id": "1c6a5abe-a816-475a-9976-9fbc96754670", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Blaise Pascal", + "text": "The heart has its reasons which reason knows not of." + }, + { + "id": "5af31c5c-711b-4178-b608-10469e646c9a", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Blaise Pascal", + "text": "Kind words do not cost much. Yet they accomplish much." + }, + { + "id": "0acf07d6-418c-4ab4-8fee-6e77d668aa7f", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Blaise Pascal", + "text": "Man is equally incapable of seeing the nothingness from which he emerges and the infinity in which he is engulfed." + }, + { + "id": "658c9bb0-364e-49a3-980b-95b25e45e0c1", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Blaise Pascal", + "text": "Imagination disposes of everything; it creates beauty, justice, and happiness, which are everything in this world." + }, + { + "id": "4fd89955-d73d-4849-a0a1-21d85e37fe24", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Blaise Pascal", + "text": "The least movement is of importance to all nature. The entire ocean is affected by a pebble." + }, + { + "id": "57d6213d-07f9-4fd7-960d-f9eafec0cb27", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Blaise Pascal", + "text": "We are all something, but none of us are everything." + }, + { + "id": "39cd0dc2-3b3e-4aff-8f7f-95ba7d00fd51", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Blaise Pascal", + "text": "We know the truth, not only by the reason, but by the heart." + }, + { + "id": "4e57d21f-ae26-47da-b8a6-4ee8b2ba7acf", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Blaise Pascal", + "text": "We must learn our limits. We are all something, but none of us are everything." + }, + { + "id": "21112e2b-6291-4e60-bd6e-b3405253b994", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bo Jackson", + "text": "Set your goals high, and don't stop till you get there." + }, + { + "id": "e0988018-51d8-4dc3-871c-bd7946ad20e6", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bob Newhart", + "text": "All I can say about life is, Oh God, enjoy it!" + }, + { + "id": "e7471e63-fb06-42a9-b873-8cc30b17c798", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bodhidharma", + "text": "All know the way; few actually walk it." + }, + { + "id": "5ab76118-7b50-4d0e-bf88-1f74ce918ce8", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Booker Washington", + "text": "Excellence is to do a common thing in an uncommon way." + }, + { + "id": "a82c9b36-4a84-4cb3-a427-ea763d1d07d2", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Booker Washington", + "text": "The world cares very little about what a man or woman knows; it is what a man or woman is able to do that counts." + }, + { + "id": "ab880cf7-cef3-4cab-a734-a1755b8770b2", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Brendan Francis", + "text": "No yesterdays are ever wasted for those who give themselves to today." + }, + { + "id": "270b392a-5c76-4907-ad8f-6a54dc7266e6", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Brian Tracy", + "text": "Goals are the fuel in the furnace of achievement." + }, + { + "id": "8a0dfa43-ae69-4fdc-ae97-5fd7e80a3e21", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Brian Tracy", + "text": "Whatever we expect with confidence becomes our own self-fulfilling prophecy." + }, + { + "id": "119695b8-ecb8-423b-a70d-2b25a7903e8b", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Brian Tracy", + "text": "You can only grow if you're willing to feel awkward and uncomfortable when you try something new." + }, + { + "id": "bdc4f487-35cf-42df-bbce-0dd2724bceb4", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Brian Tracy", + "text": "There is never enough time to do everything, but there is always enough time to do the most important thing." + }, + { + "id": "58f98908-d7f6-489b-bb69-c6d1592eaff0", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": ["future", "inner power"], + "source": "https://www.goodreads.com/quotes/28134", + "author": "Brian Tracy", + "text": "You have within you, right now, everything you need to deal with whatever the world can throw at you." + }, + { + "id": "3f18e85e-684b-4ef1-a603-8bba36812056", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": ["creativity", "creative", "perfect", "waiting", "ordinary"], + "source": "https://www.google.com/search?q=Bruce+Garrabrandt+Creativity+doesn%27t+wait", + "author": "Bruce Garrabrandt", + "text": "Creativity doesn't wait for that perfect moment. It fashions its own perfect moments out of ordinary ones." + }, + { + "id": "23a0490a-7161-4d70-93fd-6f8725ffbf0c", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "If you spend too much time thinking about a thing, you'll never get it done." + }, + { + "id": "0f19f801-6c84-44c1-b04d-3ee7c0ffcce8", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "A wise man can learn more from a foolish question than a fool can learn from a wise answer." + }, + { + "id": "419c18cd-f75a-4a07-8ee3-1de451183d96", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "Notice that the stiffest tree is most easily cracked, while the bamboo or willow survives by bending with the wind." + }, + { + "id": "7f187fe6-8ae8-4904-a2f8-17a2f7b8f585", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "Always be yourself, express yourself, have faith in yourself, do not go out and look for a successful personality and duplicate it." + }, + { + "id": "c285467a-9fcf-430d-bf49-93aaf6c26640", + "isDeleted": false, + "createdAt": 1613993133671, + "updatedAt": 1613993133671, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "Take no thought of who is right or wrong or who is better than. Be not for or against." + }, + { + "id": "e6c49180-aec5-4168-bd3c-ad4eed222401", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "Take things as they are. Punch when you have to punch. Kick when you have to kick." + }, + { + "id": "60cf0853-cd4b-4043-a6d1-11a4cc1b75d5", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "I'm not in this world to live up to your expectations and you're not in this world to live up to mine." + }, + { + "id": "f0e8d05f-8b8c-42e8-a603-179baf9506da", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "To know oneself is to study oneself in action with another person." + }, + { + "id": "049b9f56-8cba-43fb-b2cd-029310c5c696", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "As you think, so shall you become." + }, + { + "id": "c8f142bd-4cb2-45f2-81e3-2af57a0af759", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "Mistakes are always forgivable, if one has the courage to admit them." + }, + { + "id": "10fce7d1-4c9b-484d-8de0-448e6998248e", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "If you love life, don't waste time, for time is what life is made up of." + }, + { + "id": "bfff9a4c-201a-4b67-bf29-96118575b7f2", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "All fixed set patterns are incapable of adaptability or pliability. The truth is outside of all fixed patterns." + }, + { + "id": "fb0d3f55-fd2e-48ba-8307-26b043322f1b", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "The less effort, the faster and more powerful you will be." + }, + { + "id": "f57f51f6-7694-4b6e-af5c-0042a44f84a0", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "To hell with circumstances; I create opportunities." + }, + { + "id": "319fe7fe-b1f3-4d49-af00-eaa8f463e8c0", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Bruce Lee", + "text": "Im not in this world to live up to your expectations and you're not in this world to live up to mine." + }, + { + "id": "be1395c3-947a-4f44-9411-0bb9eae1d6af", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": ["knowledge", "action"], + "source": "https://www.goodreads.com/quotes/302319", + "author": "Bruce Lee", + "text": "Knowing is not enough, we must apply. Willing is not enough, we must do." + }, + { + "id": "b698c107-f1d3-4cc0-81b1-ff2e8d0ec8c5", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buckminster Fuller", + "text": "There is nothing in a caterpillar that tells you it's going to be a butterfly." + }, + { + "id": "43fef6b5-b747-4259-9ec7-3de2a51c3320", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": ["future", "progress", "reality", "new"], + "source": "https://www.goodreads.com/quotes/13119", + "author": "Buckminster Fuller", + "text": "You never change things by fighting the existing reality. To change something, build a new model that makes the existing model obsolete" + }, + { + "id": "1e48c5d2-bac4-4c4f-8be0-1c74945b8801", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Peace comes from within. Do not seek it without." + }, + { + "id": "049f8c5f-39c6-4c96-9249-6c40011b2e0a", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Work out your own salvation. Do not depend on others." + }, + { + "id": "bca9aa55-470b-4afc-b530-1b1050d7b5d4", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "He is able who thinks he is able." + }, + { + "id": "9f434a37-c398-4bca-8f0a-ed8559047634", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Those who are free of resentful thoughts surely find peace." + }, + { + "id": "4882c4f1-02b3-4f70-ad30-25c1de4c3988", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "What we think, we become." + }, + { + "id": "c6b21e79-a1d3-4636-8a13-745d1fcebe6d", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "It is better to travel well than to arrive." + }, + { + "id": "3eb9f155-de46-44da-8214-0e13a1389cc0", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "The mind is everything. What you think you become." + }, + { + "id": "e4bf1c20-76c2-4169-88f4-5c70fd41ab66", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "In separateness lies the world's great misery, in compassion lies the world's true strength." + }, + { + "id": "53b8930d-9f5b-4f8c-a468-1cb452295890", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Happiness comes when your work and words are of benefit to yourself and others." + }, + { + "id": "354b191d-e21f-4e76-88d7-693da2ba8cac", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Just as a candle cannot burn without fire, men cannot live without a spiritual life." + }, + { + "id": "bb086172-157c-450f-ab75-d83f7c62eefa", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "If you light a lamp for somebody, it will also brighten your path." + }, + { + "id": "a0713661-1cbb-45f9-b4f0-bfe263f6290b", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Your worst enemy cannot harm you as much as your own unguarded thoughts." + }, + { + "id": "7e17143a-1727-4756-8da8-ab8116bda196", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "The way is not in the sky. The way is in the heart." + }, + { + "id": "48155162-0825-49fe-a652-e97d0c0fb7ec", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Three things cannot be long hidden: the sun, the moon, and the truth." + }, + { + "id": "0266beae-941f-40b6-acff-5c2a3957c735", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "You, yourself, as much as anybody in the entire universe, deserve your love and affection." + }, + { + "id": "f5adbcc7-18a8-445e-b213-9d8c478171c7", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "You will not be punished for your anger, you will be punished by your anger." + }, + { + "id": "a365570f-ad8b-4c3b-8c13-c1f91dab9970", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "The thought manifests as the word. The word manifests as the deed. The deed develops into habit. And the habit hardens into character." + }, + { + "id": "804f2aaf-43b4-4ab0-be2a-e1ded5540835", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "In a controversy the instant we feel anger we have already ceased striving for the truth, and have begun striving for ourselves." + }, + { + "id": "b69cecba-6098-4b48-a14d-2a8929eabf9f", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Do not overrate what you have received, nor envy others. He who envies others does not obtain peace of mind." + }, + { + "id": "40c2459d-d104-4163-98e0-aeb89b13a9a6", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "To keep the body in good health is a duty... otherwise we shall not be able to keep our mind strong and clear." + }, + { + "id": "f3f98d07-4b32-4f77-9117-aa64a7640520", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "There are only two mistakes one can make along the road to truth; not going all the way, and not starting." + }, + { + "id": "5698325a-667b-4885-a0e7-0bd78d540155", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "To live a pure unselfish life, one must count nothing as ones own in the midst of abundance." + }, + { + "id": "0f47fcfc-e641-4133-9d57-f33e52cd5822", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Do not dwell in the past, do not dream of the future, concentrate the mind on the present moment." + }, + { + "id": "170c8cc7-dc87-41f5-80d8-1c42f54ce070", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "We are what we think. All that we are arises with our thoughts. With our thoughts, we make the world." + }, + { + "id": "b02947e0-4d88-45bb-a837-ea4210c413d4", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Your work is to discover your world and then with all your heart give yourself to it." + }, + { + "id": "45d0fcaf-83fe-47da-b64b-4911bfdb7b48", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "All that we are is the result of what we have thought. The mind is everything. What we think we become." + }, + { + "id": "f7f020b5-d1ac-4caa-8c60-77ef4a44386c", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "The foot feels the foot when it feels the ground." + }, + { + "id": "6b53a0c1-952b-4e49-b2a7-d91e1f0fd1d5", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "No one saves us but ourselves. No one can and no one may. We ourselves must walk the path." + }, + { + "id": "499f5b1f-49ee-4b9f-aeef-bf4f484a1f69", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "When you realize how perfect everything is you will tilt your head back and laugh at the sky." + }, + { + "id": "a8f6b42c-b315-4295-bfa9-34e4c9d51c47", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Thousands of candles can be lighted from a single candle, and the life of the candle will not be shortened. Happiness never decreases by being shared." + }, + { + "id": "e68dbf13-8b01-459a-9efa-1fcd818bdca7", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "He who experiences the unity of life sees his own Self in all beings, and all beings in his own Self, and looks on everything with an impartial eye." + }, + { + "id": "477aac76-ee69-4858-a6d7-bafe1dd4cdcc", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "In the sky, there is no distinction of east and west; people create distinctions out of their own minds and then believe them to be true." + }, + { + "id": "404abf03-3085-4eb7-bb3a-20ed5bd62f71", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Thousands of candles can be lit from a single, and the life of the candle will not be shortened. Happiness never decreases by being shared." + }, + { + "id": "24714c89-e81e-4be6-a729-2f5ada03ecee", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Always be mindful of the kindness and not the faults of others." + }, + { + "id": "49abee07-8102-4708-8f43-e0ddb0398188", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Better than a thousand hollow words, is one word that brings peace." + }, + { + "id": "1a75c799-7a01-4dc3-ab53-c51255332fe4", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "A jug fills drop by drop." + }, + { + "id": "9f2fd96e-e03b-461a-aafa-6e6575e79a88", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "You only lose what you cling to." + }, + { + "id": "ebda3fe8-cf17-4146-a928-9017e87fe5b7", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Every human being is the author of his own health or disease." + }, + { + "id": "ade3fcf1-a72a-47d2-8739-3704c979abbb", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Your body is precious. It is our vehicle for awakening. Treat it with care." + }, + { + "id": "ce2b00f4-c9a0-40d0-8a46-fa1eb7a62f53", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Chaos is inherent in all compounded things. Strive on with diligence." + }, + { + "id": "6aff0f33-1dcf-48c4-be07-82d21ed4740e", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "No matter how hard the past, you can always begin again." + }, + { + "id": "9c115cfc-15b0-4a84-8089-e8803a7f7c15", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Your work is to discover your work and then with all your heart to give yourself to it." + }, + { + "id": "c50bc742-a955-4149-be11-18024a34c3da", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "If we could see the miracle of a single flower clearly, our whole life would change." + }, + { + "id": "3c3b8823-b6a8-4d15-89d0-e12f1063396d", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "You cannot travel the path until you have become the path itself." + }, + { + "id": "4ed4769d-50ee-4f2d-adb6-e6c189312453", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "We are shaped by our thoughts; we become what we think. When the mind is pure, joy follows like a shadow that never leaves." + }, + { + "id": "edef01bc-b8af-466d-84d7-640b00547a5c", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Holding on to anger is like grasping a hot coal with the intent of throwing it at someone else; you are the one who gets burned." + }, + { + "id": "815cda89-6d6e-404d-8070-ab65c96e7744", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "I do not believe in a fate that falls on men however they act; but I do believe in a fate that falls on them unless they act." + }, + { + "id": "62ba51e4-e5df-49f3-bca0-c0ce293a2bb4", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Remembering a wrong is like carrying a burden on the mind." + }, + { + "id": "6476de96-4549-473b-bb1f-27a92c9d96ab", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "The only real failure in life is not to be true to the best one knows." + }, + { + "id": "88ec4265-62f8-4aef-bb56-1962ab910c81", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "However many holy words you read, However many you speak, What good will they do you If you do not act on upon them?" + }, + { + "id": "e209979b-0a91-4f36-aa11-d144ed5344e1", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Meditation brings wisdom; lack of mediation leaves ignorance. Know well what leads you forward and what hold you back, and choose the path that leads to wisdom." + }, + { + "id": "1cd2068c-c8c0-415b-98fd-0751a1cd97b0", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "If you propose to speak, always ask yourself, is it true, is it necessary, is it kind." + }, + { + "id": "68178bf4-9857-499d-8f4a-74e265817cef", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "An idea that is developed and put into action is more important than an idea that exists only as an idea." + }, + { + "id": "9328407c-76b8-486b-a865-d93c43cdd7c3", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "However many holy words you read, however many you speak, what good will they do you if you do not act on upon them?" + }, + { + "id": "f2858589-ba8c-4774-ad1c-2c00c9ffb029", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "Better than a thousand hollow words is one word that brings peace." + }, + { + "id": "4ced6099-726b-440b-bd51-7a28866390c4", + "isDeleted": false, + "createdAt": 1613993133672, + "updatedAt": 1613993133672, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "What you are is what you have been. What you will be is what you do now." + }, + { + "id": "b4a0b447-6e65-4569-99b1-555c04ff2628", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Buddha", + "text": "What you are is what you have been. What you'll be is what you do now." + }, + { + "id": "9dfbe797-ad5a-4987-9480-ccc89107bceb", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Fate is in your hands and no one elses" + }, + { + "id": "85d334ca-e775-4aa6-bfc7-b4c19f91b402", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "What you give is what you get." + }, + { + "id": "322cc0b9-01f3-415a-b452-1ea684189471", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "The best teacher is experience learned from failures." + }, + { + "id": "7c136d75-618a-4fdf-8cff-143b197d894a", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "What you fear is that which requires action to overcome." + }, + { + "id": "e40e9b20-c56f-46d2-a4e4-e093d4ff0fe1", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "If you cannot be silent be brilliant and thoughtful." + }, + { + "id": "a984cc9f-e274-44d2-87d5-4107bb6c2506", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Someone is special only if you tell them." + }, + { + "id": "27ec486c-0d55-48df-866f-70cf6af072f9", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Give thanks for the rain of life that propels us to reach new horizons." + }, + { + "id": "ac859201-68a9-490c-8935-e2ca3e80642c", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Transformation doesn't take place with a vacuum; instead, it occurs when we are indirectly and directly connected to all those around us." + }, + { + "id": "c065bfb3-114a-42cd-8aac-343c2716f0da", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Your destiny isn't just fate; it is how you use your own developed abilities to get what you want." + }, + { + "id": "5b26e869-23f8-4e10-b4c7-13b5367ec528", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Everyone can taste success when the going is easy, but few know how to taste victory when times get tough." + }, + { + "id": "22d2b60f-7115-45ed-8369-d524a2722005", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Patience is a virtue but you will never ever accomplish anything if you don't exercise action over patience." + }, + { + "id": "039a5e83-88b1-4a5c-9ce0-00bb7231450c", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Many people think of prosperity that concerns money only to forget that true prosperity is of the mind." + }, + { + "id": "84ccdcff-2f3c-4a2e-9a06-f680cefb91b1", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Today, give a stranger a smile without waiting for it may be the joy they need to have a great day." + }, + { + "id": "a2a951c1-1411-4f47-acf2-e78b1da9f94f", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Sadness may be part of life but there is no need to let it dominate your entire life." + }, + { + "id": "0577f877-cf80-495e-9154-2e9bf7053f10", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "To give hope to someone occurs when you teach them how to use the tools to do it for themselves." + }, + { + "id": "0f3caf5a-bbdd-4651-b083-28a04667af18", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "You can be what you want to be. You have the power within and we will help you always." + }, + { + "id": "052ff3c8-bd87-47d9-b3f9-0756f03071fd", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Courage is not about taking risks unknowingly but putting your own being in front of challenges that others may not be able to." + }, + { + "id": "f0992407-fb80-4ab0-add0-f22f2bc56f1b", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Responsibility is not inherited, it is a choice that everyone needs to make at some point in their life." + }, + { + "id": "6f27d6c3-aeb7-4c29-8822-a6e813fb875d", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "You can't create in a vacuum. Life gives you the material and dreams can propel new beginnings." + }, + { + "id": "62006dc2-cbef-4a56-8a0a-c26170bf100d", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "You can't trust without risk but neither can you live in a cocoon." + }, + { + "id": "5c873eaa-2de4-4a90-8cf5-39d5056f8d09", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Look forward to spring as a time when you can start to see what nature has to offer once again." + }, + { + "id": "dd3af531-7837-46fe-8c23-8e71acb7de9c", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Fear of failure is one attitude that will keep you at the same point in your life." + }, + { + "id": "3e2ed9ea-a71d-4cef-92c1-68dafad7f963", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "To be thoughtful and kind only takes a few seconds compared to the timeless hurt caused by one rude gesture." + }, + { + "id": "208ee929-0e6a-4d63-adc8-d9139d8070a8", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "If you have no respect for your own values how can you be worthy of respect from others." + }, + { + "id": "27b00a49-3b68-434e-bea0-db8ace722d35", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Wishes can be your best avenue of getting what you want when you turn wishes into action. Action moves your wish to the forefront from thought to reality." + }, + { + "id": "886dad6f-22c2-4140-afc8-2d257b0a0a2d", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Adversity isn't set against you to fail; adversity is a way to build your character so that you can succeed over and over again through perseverance." + }, + { + "id": "2b223616-f31e-4c2f-9253-b77552e21f71", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Truth isn't all about what actually happens but more about how what has happened is interpreted." + }, + { + "id": "263a2a37-814c-4b69-9276-db25712b2967", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Passion creates the desire for more and action fuelled by passion creates a future." + }, + { + "id": "aec8ffe1-75c9-45fd-a3bf-cfcb33dc686a", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Experience can only be gained by doing not by thinking or dreaming." + }, + { + "id": "73e16c03-8b4d-4910-be37-4cfb1dbfa1a4", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "It can't be spring if your heart is filled with past failures." + }, + { + "id": "73ef39db-729e-497b-81c5-442f942302fd", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "I may not know everything, but everything is not known yet anyway." + }, + { + "id": "fa689126-5a0c-4b11-9730-e393d73d6fc5", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Transformation does not start with some one else changing you; transformation is an inner self reworking of what you are now to what you will be." + }, + { + "id": "7221a611-febc-4b6c-9ddb-54de01aedfd4", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Time is not a measure the length of a day or month or year but more a measure of what you have accomplished." + }, + { + "id": "9aebaca3-bdb2-42f4-97d7-8711a2e27f7e", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Complaining doesn't change a thing only taking action does." + }, + { + "id": "34dc7a76-3103-4e8f-abb6-19b22656e723", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Strength to carry on despite the odds means you have faith in your own abilities and know how." + }, + { + "id": "0950e690-1572-4237-bbfe-a54c963c5ed0", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Spring is a time for rebirth and the fulfilment of new life." + }, + { + "id": "c6bd6ef1-169b-4493-84b1-927cd8b492ee", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Respect is not something that you can ask for, buy or borrow. Respect is what you earn from each person no matter their background or status." + }, + { + "id": "a055574b-7509-42ff-9b6d-ce19ca75609e", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Bold is not the act of foolishness but the attribute and inner strength to act when others will not so as to move forward not backward." + }, + { + "id": "d50ff5fe-371e-44f4-9e91-964c4bba550a", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Staying in one place is the best path to be taken over and surpassed by many." + }, + { + "id": "4863c579-c94e-47d8-88bb-bbd871bc0840", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "To know your purpose is to live a life of direction, and in that direction is found peace and tranquillity." + }, + { + "id": "f5c9fe55-bcf8-4d2d-81e3-7d6e7022af87", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Pulsifer", + "text": "Into each life rain must fall but rain can be the giver of life and it is all in your attitude that makes rain produce sunshine." + }, + { + "id": "ed4404e3-83be-4dce-ae33-b168231bb976", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Byron Roberts", + "text": "It is not the mistake that has the most power, instead, it is learning from the mistake to advance your own attributes." + }, + { + "id": "7315f1d3-a71c-4fae-bd51-9b5bb24c153f", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "C. Pulsifer", + "text": "When anger use your energy to do something productive." + }, + { + "id": "d6b2f6a2-c351-4e11-b552-58bcd578b276", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cadet Maxim", + "text": "Risk more than others think is safe. Care more than others think is wise. Dream more than others think is practical.Expect more than others think is possible." + }, + { + "id": "cf79b274-a65b-43d9-bc96-b83f738a3161", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Calvin Coolidge", + "text": "We cannot do everything at once, but we can do something at once." + }, + { + "id": "1070d22a-2436-4d31-8e51-3f1149f08e9b", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Calvin Coolidge", + "text": "I have never been hurt by anything I didn't say." + }, + { + "id": "245b1efa-e56d-4103-8fef-ab5257559479", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cardinal Retz", + "text": "A man who doesn't trust himself can never really trust anyone else." + }, + { + "id": "b806fa93-f091-4209-9cbd-0b2ec6312c50", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Bard", + "text": "Though no one can go back and make a brand new start, anyone can start from not and make a brand new ending." + }, + { + "id": "c08973b3-e1ce-448c-a2c8-931b4fbcff81", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "Who looks outside, dreams; who looks inside, awakes." + }, + { + "id": "86d1e06a-5425-4b53-a84a-4e1e425d141c", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "You are what you do, not what you say you do." + }, + { + "id": "233670a2-e8ad-45da-9a02-1040c9a5f15f", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "The shoe that fits one person pinches another; there is no recipe for living that suits all cases." + }, + { + "id": "0d7e7bc7-22a8-4001-8186-6a44a8d77323", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "Everything that irritates us about others can lead us to an understanding about ourselves." + }, + { + "id": "a31d4567-c7e7-40ec-aac7-4ba9af17d431", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "Your vision will become clear only when you look into your heart. Who looks outside, dreams. Who looks inside, awakens." + }, + { + "id": "85169685-1b62-4b97-b1ec-1b78ba0ea647", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "Everything that irritates us about others can lead us to an understanding of ourselves." + }, + { + "id": "012b6331-c4c0-4336-b1e4-bf644d7bfd3e", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "In all chaos there is a cosmos, in all disorder a secret order." + }, + { + "id": "b1431156-e736-4fea-ba51-71c24ef446cd", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "Without this playing with fantasy no creative work has ever yet come to birth. The debt we owe to the play of the imagination is incalculable." + }, + { + "id": "76de3493-162d-4054-9f4f-9d776f0de442", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "Through pride we are ever deceiving ourselves. But deep down below the surface of the average conscience a still, small voice says to us, Something is out of tune." + }, + { + "id": "02420ecb-4252-4be8-96e9-a44183272499", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "Knowledge rests not upon truth alone, but upon error also." + }, + { + "id": "044648c1-e615-440d-a2ef-9f1b27fe1cf0", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "The least of things with a meaning is worth more in life than the greatest of things without it." + }, + { + "id": "e8929e43-a50e-493c-8b62-c6db2ad53f54", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "Knowing your own darkness is the best method for dealing with the darknesses of other people." + }, + { + "id": "dc9a8215-e6d4-4792-bd26-2d5f6bc82a25", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "It all depends on how we look at things, and not how they are in themselves." + }, + { + "id": "803ceb0e-c111-4107-98e7-e4e5c9875363", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "Everything that irritates us about others can lead us to a better understanding of ourselves." + }, + { + "id": "b1e1cb37-d5ef-4702-a32f-a5a0d10ddaf1", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Jung", + "text": "Your vision will become clear only when you can look into your own heart. Who looks outside, dreams; who looks inside, awakes." + }, + { + "id": "f6c88e83-aac4-413f-8615-d13c0517be69", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Sagan", + "text": "Imagination will often carry us to worlds that never were. But without it we go nowhere." + }, + { + "id": "22fdb9a5-bf71-4233-8648-af2a18bd7ab3", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carl Sandburg", + "text": "Nothing happens unless first we dream." + }, + { + "id": "6a4ac87f-0838-4690-a6bf-362aa3c0b356", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carla Gordon", + "text": "If someone in your life talked to you the way you talk to yourself, you would have left them long ago." + }, + { + "id": "79ddb8f5-25ae-47bb-8583-c34f5c948074", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carlos Castaneda", + "text": "The trick is in what one emphasizes. We either make ourselves miserable, or we make ourselves happy. The amount of work is the same." + }, + { + "id": "d3d65385-03e6-4d8f-8432-bbe14aff372f", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Carlyle", + "text": "Silence is deep as Eternity, Speech is shallow as Time." + }, + { + "id": "4d25d890-16e5-4539-8ba1-e500c33d20e3", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Caroline Myss", + "text": "You cannot change anything in your life with intention alone, which can become a watered-down, occasional hope that you'll get to tomorrow. Intention without action is useless." + }, + { + "id": "e4f9ba28-381a-4c42-b362-5dddbc33f681", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Catherine Pulsifer", + "text": "You can adopt the attitude there is nothing you can do, or you can see the challenge as your call to action." + }, + { + "id": "7b367a2d-027f-49cd-9800-0fd2a8b4a669", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Catherine Pulsifer", + "text": "Being angry never solves anything." + }, + { + "id": "b6d37186-1c2b-4c12-896b-477e44b3d87e", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Catherine Pulsifer", + "text": "Rather than wishing for change, you first must be prepared to change." + }, + { + "id": "4a012773-32f7-45ed-bd4c-2dc0caa8dbe3", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Catherine Pulsifer", + "text": "Our ability to achieve happiness and success depends on the strength of our wings." + }, + { + "id": "df4307ad-9bbe-4999-9d8d-c8be68ffbadb", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cathy Pulsifer", + "text": "You are special, you are unique, you are the best!" + }, + { + "id": "4a6af66d-918c-4728-a8f1-75da41fa56b2", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cavour", + "text": "The man who trusts men will make fewer mistakes than he who distrusts them." + }, + { + "id": "2336a7c1-84a2-4375-8ee8-6f57e53d2e3f", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cecil B. DeMille", + "text": "The person who makes a success of living is the one who see his goal steadily and aims for it unswervingly. That is dedication." + }, + { + "id": "0d550564-bae4-4c29-b603-66c979dd1860", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cervantes", + "text": "Those who will play with cats must expect to be scratched." + }, + { + "id": "2e29d923-d414-430f-9f04-cf95002b3279", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cervantes", + "text": "Be slow of tongue and quick of eye." + }, + { + "id": "eed98d21-7aba-4ca0-9fae-fb344cfb4527", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chalmers", + "text": "The grand essentials of happiness are: something to do, something to love, and something to hope for." + }, + { + "id": "900cdf50-7315-4a29-8733-f0798f34428b", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chanakya", + "text": "A man is great by deeds, not by birth." + }, + { + "id": "f983fb9c-872e-4ba5-a9d2-06f589a0a20a", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Channing", + "text": "Error is discipline through which we advance." + }, + { + "id": "ea7ae6b4-fe2f-4cbc-b90c-001f2ce126d8", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Channing", + "text": "Every man is a volume if you know how to read him." + }, + { + "id": "0762297d-bba8-468b-95bc-acb6f0bc07b1", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles A. Lindbergh", + "text": "Life a culmination of the past, an awareness of the present, an indication of the future beyond knowledge, the quality that gives a touch of divinity to matter." + }, + { + "id": "e0567a44-55b0-40a9-820c-13355158f84f", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles Chesnutt", + "text": "Impossibilities are merely things which we have not yet learned." + }, + { + "id": "530ad4bd-1cea-45c3-83cf-4b0463ae92b3", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles Darwin", + "text": "The highest stage in moral ure at which we can arrive is when we recognize that we ought to control our thoughts." + }, + { + "id": "d6256a3f-8d9a-49ab-8cef-1f60d2bad6a2", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles DeLint", + "text": "The road leading to a goal does not separate you from the destination; it is essentially a part of it." + }, + { + "id": "8bce1301-a14f-468c-bbe0-e181b86ca3fd", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles Dickens", + "text": "Don't leave a stone unturned. It's always something, to know you have done the most you could." + }, + { + "id": "e7a040b4-db97-4d19-b0f0-2b7267ffb20c", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles Dubois", + "text": "The important thing is this: to be able at any moment to sacrifice what we are for what we could become." + }, + { + "id": "89d163fa-56de-4ffe-b679-0613639f27f3", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles Kettering", + "text": "One fails forward toward success." + }, + { + "id": "e8dc6a1e-f868-4007-8964-98239a079e9b", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles Lamb", + "text": "The greatest pleasure I know is to do a good action by stealth, and to have it found out by accident." + }, + { + "id": "07a3af5d-7031-4eb2-b462-622c14b7024c", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles Perkhurst", + "text": "The heart has eyes which the brain knows nothing of." + }, + { + "id": "cd6437bd-17de-49b3-b534-ee10191a1791", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles R. Swindoll", + "text": "We are all faced with a series of great opportunities brilliantly disguised as impossible situations." + }, + { + "id": "87ada1b0-397b-49fc-bd6a-b3c7c4b14e79", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles Schwab", + "text": "Keeping a little ahead of conditions is one of the secrets of business, the trailer seldom goes far." + }, + { + "id": "64006f46-0914-4aec-a782-fec529e8b605", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charles Swindoll", + "text": "Life is 10% what happens to you and 90% how you react to it." + }, + { + "id": "d70ffc4a-76ae-46dc-8442-efe5eff47a7e", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charlotte Bronte", + "text": "Life is so constructed that an event does not, cannot, will not, match the expectation." + }, + { + "id": "d5a2942b-b5a7-4480-8bfc-dc29ae987c62", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charlotte Gilman", + "text": "Let us revere, let us worship, but erect and open-eyed, the highest, not the lowest; the future, not the past!" + }, + { + "id": "f8a6aaa4-1d1c-4c4c-996f-6e57a8a87884", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charlotte Perkins Gilman", + "text": "The first duty of a human being is to assume the right functional relationship to society more briefly, to find your real job, and do it." + }, + { + "id": "cadefea5-dbe9-4a52-bac2-cb7b66145b4a", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Charlotte Perkins Gilman", + "text": "The first duty of a human being is to assume the right functional relationship to society - more briefly, to find your real job, and do it." + }, + { + "id": "f436b5c7-a3b5-4801-836f-0b8b4b00cb45", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cheng Yen", + "text": "Happiness does not come from having much, but from being attached to little." + }, + { + "id": "ea6a5a42-9668-424b-81c2-5a090227752f", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chinese proverb", + "text": "Learning is a treasure that will follow its owner everywhere" + }, + { + "id": "ed33fe44-01f7-4a04-aaec-6e59fb37f14d", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chinese proverb", + "text": "Talk doesn't cook rice." + }, + { + "id": "a5845914-456a-4e1c-90ed-9fdf58e261f6", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chinese proverb", + "text": "Tension is who you think you should be. Relaxation is who you are." + }, + { + "id": "e5645015-de0d-42d2-a9c0-63c73fb776a2", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chinese proverb", + "text": "If you are patient in one moment of anger, you will escape one hundred days of sorrow." + }, + { + "id": "5a5f5bcb-db8d-4660-b79c-373ded7956ed", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chinese proverb", + "text": "People who say it cannot be done should not interrupt those who are doing it." + }, + { + "id": "81f9d29f-9574-43bf-835a-eae18a011b0b", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chinese proverb", + "text": "A gem cannot be polished without friction, nor a man perfected without trials." + }, + { + "id": "ab4c829d-3969-401f-845e-09d92130abd4", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chinese proverb", + "text": "He who deliberates fully before taking a step will spend his entire life on one leg." + }, + { + "id": "efd7c922-9353-4798-907f-d968fe27bf00", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chinese proverb", + "text": "A single conversation across the table with a wise person is worth a months study of books." + }, + { + "id": "35d08cce-f612-49dc-9533-9c8e896ad896", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Christian Bovee", + "text": "Example has more followers than reason." + }, + { + "id": "a90652c5-65b4-403e-a4bb-8c242e47576b", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Christopher Morley", + "text": "There is only one success to be able to spend your life in your own way." + }, + { + "id": "86d4e701-636c-4074-8eee-2cf043b71abf", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Christopher Morley", + "text": "There is only one success - to be able to spend your life in your own way." + }, + { + "id": "87fc4152-7c42-4714-8315-7449082a5529", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Christopher Reeve", + "text": "Once you choose hope, anythings possible." + }, + { + "id": "77f84dce-2474-40fd-98c4-006f426e778f", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chuang Tzu", + "text": "When deeds and words are in accord, the whole world is transformed." + }, + { + "id": "fd96e126-475e-4838-b9bc-81c4df04965b", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chuang Tzu", + "text": "Flow with whatever is happening and let your mind be free. Stay centred by accepting whatever you are doing. This is the ultimate." + }, + { + "id": "4f6e0624-b4fe-4da8-9dec-0a880c2cfe68", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chuck Norris", + "text": "A lot of times people look at the negative side of what they feel they can't do. I always look on the positive side of what I can do." + }, + { + "id": "f201416b-3447-4de2-9ccc-d70592fd8948", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Chuck Norris", + "text": "A lot of people give up just before theyre about to make it. You know you never know when that next obstacle is going to be the last one." + }, + { + "id": "68e30896-4bed-4e43-8e7f-43684eb538bd", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cicero", + "text": "We must not say every mistake is a foolish one." + }, + { + "id": "977dd911-65e4-4132-aeea-639bd556900d", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cicero", + "text": "Gratitude is not only the greatest of virtues, but the paren't of all the others." + }, + { + "id": "ad321819-0d9f-42c4-bd38-be9dd86b8b81", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Claire Charmont", + "text": "The one who always loses, is the only person who gets the reward." + }, + { + "id": "8857fc03-eeb0-48c5-97c2-4ea1de785ca4", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Coco Chanel", + "text": "There are people who have money and people who are rich." + }, + { + "id": "47d58ad6-bead-4dc3-a7b2-d075938fa6a5", + "isDeleted": false, + "createdAt": 1613993133673, + "updatedAt": 1613993133673, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Coco Chanel", + "text": "How many cares one loses when one decides not to be something but to be someone." + }, + { + "id": "f0a399e8-7a8c-4dbe-8f66-124e1e7375c9", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Colette", + "text": "I love my past. I love my present. I'm not ashamed of what Ive had, and I'm not sad because I have it no longer." + }, + { + "id": "428848ca-af06-4af5-b2ae-97499a641269", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Colette", + "text": "I love my past. I love my present. Im not ashamed of what Ive had, and Im not sad because I have it no longer." + }, + { + "id": "86196ba5-95f5-4bd1-bcad-641695a9a02f", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Colin Powell", + "text": "If you are going to achieve excellence in big things, you develop the habit in little matters. Excellence is not an exception, it is a prevailing attitude." + }, + { + "id": "df15d07a-42ad-4e70-a42f-7d2d9ff64d2c", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Study the past, if you would divine the future." + }, + { + "id": "23d6324e-51d9-437a-9e16-ae11e638f1da", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Silence is a true friend who never betrays." + }, + { + "id": "8226c637-944e-4f2e-a4be-c99716cada71", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": ["future", "tomorrow", "past"], + "source": "https://www.goodreads.com/quotes/961585", + "author": "Confucius", + "text": "Think of tomorrow, the past can't be mended." + }, + { + "id": "fff6367e-241a-45c5-9a8a-8b581d9ac784", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Wherever you go, go with all your heart." + }, + { + "id": "f825c87d-8e1a-4ca8-aae8-7a7ec7072a6f", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "The more you know yourself, the more you forgive yourself." + }, + { + "id": "9f9ff30f-907c-4b13-8473-6a6bee99efd3", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "To be wrong is nothing unless you continue to remember it." + }, + { + "id": "db13a7c9-d9d9-46ab-b6ab-abd06e9e816f", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "The cautious seldom err." + }, + { + "id": "9b57e709-4b8f-4c85-a300-74889afd82bc", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "What you do not want done to yourself, do not do to others." + }, + { + "id": "b3e4a564-104d-47f8-9583-6d6d830f77f1", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Reviewing what you have learned and learning anew, you are fit to be a teacher." + }, + { + "id": "3fecfa6c-42c6-4372-9348-8ec978508be9", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "The superior man is satisfied and composed; the mean man is always full of distress." + }, + { + "id": "42aea8ca-0583-4adc-acf4-1feeb02ddfe2", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "It does not matter how slowly you go as long as you do not stop." + }, + { + "id": "60f4bc41-8026-4993-89df-70c9077ab201", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "To study and not think is a waste. To think and not study is dangerous." + }, + { + "id": "fb82ce0c-3bf3-4718-875c-af8c578eaa37", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "I will not be concerned at other men is not knowing me;I will be concerned at my own want of ability." + }, + { + "id": "179b82d1-0dd4-426f-853d-74086438646d", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Choose a job you love, and you will never have to work a day in your life." + }, + { + "id": "d67688be-97a8-4dc4-a47b-b51d2fda31b0", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "When you see a man of worth, think of how you may emulate him. When you see one who is unworthy, examine yourself." + }, + { + "id": "478d06a8-209c-4d09-94d2-371ffc9887b7", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Being in humaneness is good. If we select other goodness and thus are far apart from humaneness, how can we be the wise?" + }, + { + "id": "08c3d025-544b-4025-a986-4eb611c2eb90", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "When it is obvious that the goals cannot be reached, don't adjust the goals, adjust the action steps." + }, + { + "id": "9a7612c7-ae41-4803-a89b-56e799db23f9", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "I am not bothered by the fact that I am unknown. I am bothered when I do not know others." + }, + { + "id": "44c863d2-5774-4159-9f3e-6a2aad737afb", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "The superior man is modest in his speech, but exceeds in his actions." + }, + { + "id": "a94b4369-f537-4180-891f-43d92b1baf40", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Silence is the true friend that never betrays." + }, + { + "id": "cbd07198-9d63-4980-a0cb-4c6fb0528062", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "To be wronged is nothing unless you continue to remember it." + }, + { + "id": "4403103d-be29-488e-a46a-dcab69de11d8", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "They must often change, who would be constant in happiness or wisdom." + }, + { + "id": "448c4cb1-afca-4c9a-aaad-0a01b92242f9", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "When you see a good person, think of becoming like him. When you see someone not so good, reflect on your own weak points." + }, + { + "id": "3b094349-15a8-43cb-b3c7-6cf8b71c19a5", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "When you meet someone better than yourself, turn your thoughts to becoming his equal. When you meet someone not as good as you are, look within and examine your own self." + }, + { + "id": "4529210e-64ac-45c1-95cf-78f48665f0ab", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Everything has beauty, but not everyone sees it." + }, + { + "id": "be46fa02-525c-4bb7-bc3c-61c33b165baa", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "I want you to be everything that's you, deep at the center of your being." + }, + { + "id": "f7fd7d87-fcd6-48fd-bd1f-dc5062954fcf", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "The Superior Man is aware of Righteousness, the inferior man is aware of advantage." + }, + { + "id": "2f06ff5e-44cb-4601-af04-52729ce8c234", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Fine words and an insinuating appearance are seldom associated with true virtue" + }, + { + "id": "a15ac23e-4a31-4bb3-9458-73cd0ff9b64a", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Our greatest glory is not in never falling, but in rising every time we fall." + }, + { + "id": "0ff1fd22-f18c-4542-876f-999f3e60369e", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "I hear and I forget. I see and I remember. I do and I understand." + }, + { + "id": "466c2f38-4950-43d4-be3a-f61e723a008b", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Ability will never catch up with the demand for it." + }, + { + "id": "8b67aad4-f103-4fb0-873a-412c95e2b3a4", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "The superior man acts before he speaks, and afterwards speaks according to his action." + }, + { + "id": "c0a31bf2-4aa3-44ad-a64c-686b483f7c24", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Learning without reflection is a waste, reflection without learning is dangerous." + }, + { + "id": "afcd55eb-90bc-418f-974c-fcf8815382e6", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "If you look into your own heart, and you find nothing wrong there, what is there to worry about? What is there to fear?" + }, + { + "id": "6334daf9-29ce-4fa5-ba81-22b038a50e7b", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Sincerity is the way of Heaven. The attainment of sincerity is the way of men." + }, + { + "id": "9a2bc9c7-ade9-4db2-bb1d-1adf419f9ee2", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "To give ones self earnestly to the duties due to men, and, while respecting spiritual beings, to keep aloof from them, may be called wisdom." + }, + { + "id": "2654b080-f6fd-4207-948a-a0292c820ded", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "He who wishes to secure the good of others, has already secured his own." + }, + { + "id": "db218c33-de6f-49b8-926c-cf02bc0bf984", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Confucius", + "text": "Life is really simple, but we insist on making it complicated." + }, + { + "id": "9901f6c1-d36f-4d69-a8b5-13664565c967", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Corita Kent", + "text": "Life is a succession of moments. To live each one is to succeed." + }, + { + "id": "96c71d94-22ad-454b-81a8-215033baf73c", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cullen Hightower", + "text": "When performance exceeds ambition, the overlap is called success." + }, + { + "id": "2840b43a-8f2a-42ee-b447-de7bc7d22da1", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Cynthia Ozick", + "text": "To want to be what one can be is purpose in life." + }, + { + "id": "714a703b-c42d-4a94-8dc6-c9679af99f0b", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Daisaku Ikeda", + "text": "What matters is the value we've created in our lives, the people we've made happy and how much we've grown as people." + }, + { + "id": "e1fadc0d-9196-49ec-abaa-5bb951688dfa", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Daisaku Ikeda", + "text": "The person who lives life fully, glowing with life's energy, is the person who lives a successful life." + }, + { + "id": "f09a29bf-490a-4822-81b2-276e97b2043e", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Daisaku Ikeda", + "text": "True happiness means forging a strong spirit that is undefeated, no matter how trying our circumstances." + }, + { + "id": "e48e2068-95ba-4475-b0b2-37d8453e655b", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Daisaku Ikeda", + "text": "Genuine sincerity opens people's hearts, while manipulation causes them to close." + }, + { + "id": "c4904108-fe82-4a8e-8b3c-f964ca8dae91", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Daisaku Ikeda", + "text": "If we look at the world with a love of life, the world will reveal its beauty to us." + }, + { + "id": "d70ea54d-e6b6-42dd-bf4e-5c348c42e6d5", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Daisaku Ikeda", + "text": "If you lose today, win tomorrow. In this never-ending spirit of challenge is the heart of a victor." + }, + { + "id": "135a0ce6-35cb-4c9e-afaf-3e0cbd655810", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "Be kind whenever possible. It is always possible." + }, + { + "id": "9165eb17-d056-49f5-9ead-99ba7415ed53", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "I believe that we are fundamentally the same and have the same basic potential." + }, + { + "id": "209121a9-5a21-4ddc-9176-046a962d36dc", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "Love and compassion open our own inner life, reducing stress, distrust and loneliness." + }, + { + "id": "d35d4213-8996-4999-a1b8-3d6b9b7e138b", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "More often than not, anger is actually an indication of weakness rather than of strength." + }, + { + "id": "26935cf4-a80e-4c30-9760-e298c253a518", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "By going beyond your own problems and taking care of others, you gain inner strength, self-confidence, courage, and a greater sense of calm." + }, + { + "id": "f8e8155f-f1b1-4d82-aeca-408348172d65", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "If we have a positive mental attitude, then even when surrounded by hostility, we shall not lack inner peace." + }, + { + "id": "15f97936-d5d1-45b3-aa28-4abaf7b5cc35", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "Genuine love should first be directed at oneself if we do not love ourselves, how can we love others?" + }, + { + "id": "c1a011f5-a48d-4ffa-8b9c-df0be9e42553", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "With the realization of ones own potential and self-confidence in ones ability, one can build a better world." + }, + { + "id": "0b4399f8-6c15-46dc-917e-8b36f5e96ec1", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "The key to transforming our hearts and minds is to have an understanding of how our thoughts and emotions work." + }, + { + "id": "78d2383f-f73d-40d2-9130-3453eef4c4d5", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "I find hope in the darkest of days, and focus in the brightest. I do not judge the universe." + }, + { + "id": "15b061d9-5ecb-4ecc-995d-d880a18ad74f", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "People take different roads seeking fulfilment and happiness. Just because theyre not on your road doesn't mean they've gotten lost." + }, + { + "id": "931e2ac7-8a91-464d-af77-c9724700dfbe", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "With realization of ones own potential and self-confidence in ones ability, one can build a better world." + }, + { + "id": "7f62ae96-8265-41cd-a083-109853de3f53", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "Happiness is not something ready made. It comes from your own actions." + }, + { + "id": "92993b3f-4e69-411d-b200-f2f83a8b6d3c", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "Remember that sometimes not getting what you want is a wonderful stroke of luck." + }, + { + "id": "93e4bf49-e9db-453e-8fd0-485ccac305f7", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "Consider that not only do negative thoughts and emotions destroy our experience of peace, they also undermine our health." + }, + { + "id": "5d5df1d4-5f80-4a95-a8f4-90a502d2f4e0", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "The greatest antidote to insecurity and the sense of fear is compassion it brings one back to the basis of one's inner strength" + }, + { + "id": "610c79d6-74e4-49db-8d0e-5d6ccd1f96a0", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "There is no need for temples, no need for complicated philosophies. My brain and my heart are my temples; my philosophy is kindness." + }, + { + "id": "351dc0de-a154-427c-bda8-873a4b0a70db", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "Happiness mainly comes from our own attitude, rather than from external factors." + }, + { + "id": "51e250d2-be4e-4fcd-a4be-7424c0195df7", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "It is difficult to achieve a spirit of genuine cooperation as long as people remain indifferent to the feelings and happiness of others." + }, + { + "id": "bc48434f-d99a-4cbb-a198-4b691ebe52f8", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "The most important thing is transforming our minds, for a new way of thinking, a new outlook: we should strive to develop a new inner world." + }, + { + "id": "53b4cf5d-3e36-4aa3-a41f-d93db11da301", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "Compassion and happiness are not a sign of weakness but a sign of strength." + }, + { + "id": "a3fcc3ea-3547-4b91-8b37-209586c11069", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "See the positive side, the potential, and make an effort." + }, + { + "id": "d8e2a65d-61b5-4ddb-b4aa-5beb04b16305", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "Happiness does not come about only due to external circumstances; it mainly derives from inner attitudes." + }, + { + "id": "6e665ec1-dd12-4d6a-bc99-b3a7780ee820", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "Genuine love should first be directed at oneself - if we do not love ourselves, how can we love others?" + }, + { + "id": "1e9b59e4-d856-44e3-b066-5fd4beb118cb", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dalai Lama", + "text": "The greatest antidote to insecurity and the sense of fear is compassion - it brings one back to the basis of one's inner strength" + }, + { + "id": "5fd63d86-134e-4d52-9be6-726ffb1e0fc0", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dale Carnegie", + "text": "Most of the important things in the world have been accomplished by people who have kept on trying when there seemed to be no hope at all." + }, + { + "id": "9895f878-4cac-4593-bb0d-d0d9564e57b6", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dale Carnegie", + "text": "When fate hands us a lemon, lets try to make lemonade." + }, + { + "id": "91a301b2-55e0-455f-b9f8-ecffe7289f42", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dale Carnegie", + "text": "Success is getting what you want. Happiness is wanting what you get." + }, + { + "id": "8921c129-188a-45ad-ae3d-a682defe3362", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dale Earnhardt", + "text": "The winner ain't the one with the fastest car it's the one who refuses to lose." + }, + { + "id": "e759e071-9ab7-4e91-8dd0-68683bcccf30", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Danielle Ingrum", + "text": "Give it all you've got because you never know if there's going to be a next time." + }, + { + "id": "3ab24afa-1390-4ab8-b3f2-083eec3923f4", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Danilo Dolci", + "text": "It's important to know that words don't move mountains. Work, exacting work moves mountains." + }, + { + "id": "6d940af0-f763-4445-a8ce-3fb726f2bad8", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dave Weinbaum", + "text": "The secret to a rich life is to have more beginnings than endings." + }, + { + "id": "ab379d43-a715-4c83-85f7-2786cdc33ed0", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "David Bader", + "text": "Be here now. Be someplace else later. Is that so complicated?" + }, + { + "id": "2cece9b7-888a-46cb-ab8b-52a6dfd1c62f", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": ["future", "life", "listen"], + "source": "https://www.goodreads.com/quotes/462535", + "author": "David Bowie", + "text": "Tomorrow belongs to those who can hear it coming" + }, + { + "id": "f302bb6a-9903-495d-b390-16054e2e6221", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "David Brinkley", + "text": "A successful person is one who can lay a firm foundation with the bricks that others throw at him or her." + }, + { + "id": "8cc374d1-b946-4d25-a741-824c343ac54f", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "David Eddings", + "text": "No day in which you learn something is a complete loss." + }, + { + "id": "55b1db76-5b36-4e03-802a-a0a84fb682c1", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "David Jordan", + "text": "Wisdom is knowing what to do next; Skill is knowing how ot do it, and Virtue is doing it." + }, + { + "id": "f033c013-169c-4380-9822-ad52e4b3d840", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "David McCullough", + "text": "Real success is finding your lifework in the work that you love." + }, + { + "id": "6e455a6e-60f8-4b7a-8084-8fad095cfd9c", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "David Rockefeller", + "text": "Success in business requires training and discipline and hard work. But if you're not frightened by these things, the opportunities are just as great today as they ever were." + }, + { + "id": "6f3b2aa2-d89a-4eaf-ab24-9bb74940dd51", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "David Seamans", + "text": "We cannot change our memories, but we can change their meaning and the power they have over us." + }, + { + "id": "b5a51a0a-9771-427d-919e-b7613d53f38b", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": ["future", "choice", "decision", "change"], + "source": "https://www.goodreads.com/quotes/381641", + "author": "Deepak Chopra", + "text": "When you make a choice, you change the future." + }, + { + "id": "11fa6146-acd8-42e4-85e0-33b13c7a6f2f", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Demosthenes", + "text": "Small opportunities are often the beginning of great enterprises." + }, + { + "id": "207fd507-7d11-42eb-818f-4c3d5a040b08", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Denis Waitley", + "text": "There are two primary choices in life: to accept conditions as they exist, or accept the responsibility for changing them." + }, + { + "id": "645147dc-abde-4f40-a436-eb885b0d9be9", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Denis Waitley", + "text": "There are two primary choices in life: to accept conditions as they exist, or accept responsibility for changing them." + }, + { + "id": "d39df5a3-6de5-4aef-b6a4-76e99bdcfb68", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Denis Waitley", + "text": "You must welcome change as the rule but not as your ruler." + }, + { + "id": "9e146a2a-f138-4de0-a04e-15946c4d92f7", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Denis Waitley", + "text": "Happiness cannot be travelled to, owned, earned, worn or consumed. Happiness is the spiritual experience of living every minute with love, grace and gratitude." + }, + { + "id": "de823637-f467-4942-82a4-a3f98cdd78da", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Denis Waitley", + "text": "A dream is your creative vision for your life in the future. You must break out of your current comfort zone and become comfortable with the unfamiliar and the unknown." + }, + { + "id": "241f66b7-c51e-4798-bf28-fcdef52bb9b4", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Denis Waitley", + "text": "The only person who never makes mistakes is the person who never does anything." + }, + { + "id": "0c47b98e-210a-4f85-8d72-bc4f2a9c7538", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dennis Kimbro", + "text": "We see things not as they are, but as we are. Our perception is shaped by our previous experiences." + }, + { + "id": "156e8571-5b67-4f96-baf3-8708a1c09706", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Desiderius Erasmus", + "text": "The fox has many tricks. The hedgehog has but one. But that is the best of all." + }, + { + "id": "4cec6d8f-7928-4f6f-9f3c-5ca2e143de36", + "isDeleted": false, + "createdAt": 1613993133674, + "updatedAt": 1613993133674, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dhammapada", + "text": "Just as a flower, which seems beautiful has color but no perfume, so are the fruitless words of a man who speaks them but does them not." + }, + { + "id": "fd9ed224-170c-4f68-8646-0877d3ceffd2", + "isDeleted": false, + "createdAt": 1613993133675, + "updatedAt": 1613993133675, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dhammapada", + "text": "Do not give your attention to what others do or fail to do; give it to what you do or fail to do." + }, + { + "id": "c7b9af23-1298-4d7c-89b0-5acd43b09ad1", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": ["creative", "creativity", "soul"], + "source": "https://www.goodreads.com/quotes/8070701", + "author": "Dieter F. Uchtdorf", + "text": "The desire to create is one of the deepest yearnings of the human soul." + }, + { + "id": "82b9f6e8-ff22-468f-aa17-0e95997db4c7", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Donald Kircher", + "text": "A man of ability and the desire to accomplish something can do anything." + }, + { + "id": "ba2d8512-967b-4595-b28b-b90ec9248843", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Donald Trump", + "text": "Everything in life is luck." + }, + { + "id": "7e896a96-e32f-41ea-be56-333d899512ab", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Donald Trump", + "text": "Money was never a big motivation for me, except as a way to keep score. The real excitement is playing the game." + }, + { + "id": "79913833-9721-4150-be6a-cb20729ad605", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Donald Trump", + "text": "As long as your going to be thinking anyway, think big." + }, + { + "id": "a6ff1ada-a65d-477b-9913-47f7590f87c4", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Donald Trump", + "text": "You have to think anyway, so why not think big?" + }, + { + "id": "a4c2a74b-3cd8-455a-ba33-1749d3beb930", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Donald Trump", + "text": "What separates the winners from the losers is how a person reacts to each new twist of fate." + }, + { + "id": "64ea8246-f389-4c6b-930c-03a814ed1ac3", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Donald Trump", + "text": "Sometimes by losing a battle you find a new way to win the war." + }, + { + "id": "0c62ae9b-813f-4d6a-88a3-f37199db92ad", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Doris Day", + "text": "Gratitude is riches. Complaint is poverty." + }, + { + "id": "cf33ea51-3b47-4b44-a895-d5fe25c7b7b7", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Doris Mortman", + "text": "Until you make peace with who you are, you will never be content with what you have." + }, + { + "id": "86b0c8c9-c53e-4f2a-9ceb-dfeaf9200e9f", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Doris Mortman", + "text": "Until you make peace with who you are, you'll never be content with what you have." + }, + { + "id": "3b10f1fa-f3f4-42b5-8a75-402e711e491a", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dorothy Thompson", + "text": "Fear grows in darkness; if you think theres a bogeyman around, turn on the light." + }, + { + "id": "b2387a01-a861-4940-ba5a-cf700dce67e8", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dorothy Thompson", + "text": "Only when we are no longer afraid do we begin to live." + }, + { + "id": "31f97276-ba1f-41dd-b3eb-4b6c2ad9a459", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Doug Horton", + "text": "Be your own hero, it's cheaper than a movie ticket." + }, + { + "id": "e6cffa83-4229-4583-b7de-7d1834c51e55", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Doug Larson", + "text": "Wisdom is the reward you get for a lifetime of listening when you'd have preferred to talk." + }, + { + "id": "cfa288a8-c9b0-45f1-94fb-c46b833aaf5e", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Douglas Adams", + "text": "Human beings, who are almost unique in having the ability to learn from the experience of others, are also remarkable for their apparent disinclination to do so." + }, + { + "id": "81596609-e0b9-41ab-bfd8-3aebee3c0501", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dr. David M. Burns", + "text": "Aim for success, not perfection. Never give up your right to be wrong, because then you will lose the ability to learn new things and move forward with your life." + }, + { + "id": "9acdb971-b7da-45e3-9ddb-1483e1bd6745", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Dr. Seuss", + "text": "Don't cry because it's over. Smile because it happened." + }, + { + "id": "3f588980-b39e-4175-a733-2da7e443947f", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "E. E. Cummings", + "text": "It takes courage to grow up and become who you really are." + }, + { + "id": "5a15881e-5f38-4357-8d98-63478cd2cf31", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "E. M. Forster", + "text": "One must be fond of people and trust them if one is not to make a mess of life." + }, + { + "id": "c59b54f1-d2ad-48f7-962d-9174ccb8cc96", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eckhart Tolle", + "text": "It is not uncommon for people to spend their whole life waiting to start living." + }, + { + "id": "7b9f30ad-406a-4cc3-9b1e-c7cbf56a8ecb", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eckhart Tolle", + "text": "You cannot find yourself by going into the past. You can find yourself by coming into the present." + }, + { + "id": "0720c085-5f56-414e-9251-1ab76b4a3e37", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eckhart Tolle", + "text": "The past has no power to stop you from being present now. Only your grievance about the past can do that." + }, + { + "id": "a672f703-e267-4ace-adee-56f9abd2ee08", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eckhart Tolle", + "text": "Whenever something negative happens to you, there is a deep lesson concealed within it." + }, + { + "id": "9264dae9-35ed-4a3e-9291-a18f2f7bc92c", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eckhart Tolle", + "text": "You do not become good by trying to be good, but by finding the goodness that is already within you." + }, + { + "id": "09e59c7e-c64e-48ff-9902-ffcf3f8c4d46", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eckhart Tolle", + "text": "The greater part of human pain is unnecessary. It is self-created as long as the unobserved mind runs your life." + }, + { + "id": "c0a9ba26-2920-44ff-8f99-fb4dfb1628f5", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ed Cunningham", + "text": "Friends are those rare people who ask how we are and then wait to hear the answer." + }, + { + "id": "a40fa300-a840-4f5c-b73c-f3a9b1479c96", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eddie Cantor", + "text": "Slow down and enjoy life. It's not only the scenery you miss by going too fast you also miss the sense of where you are going and why." + }, + { + "id": "734a5470-0f8c-4a54-a0c1-e0b245723463", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eddie Cantor", + "text": "Slow down and enjoy life. It's not only the scenery you miss by going too fast - you also miss the sense of where you are going and why." + }, + { + "id": "f2a29c56-fe3e-4d06-bf90-bc0b6a63a0d9", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eden Phillpotts", + "text": "The universe is full of magical things, patiently waiting for our wits to grow sharper." + }, + { + "id": "e245af86-f4d5-4ec0-af51-63d2d93042a5", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edgar Allan Poe", + "text": "Those who dream by day are cognizant of many things which escape those who dream only by night." + }, + { + "id": "782bbe39-b90b-4803-84bd-7c33b2041dd4", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": ["creativity", "fire", "passion"], + "source": "https://www.goodreads.com/quotes/11458", + "author": "Edith Södergran", + "text": "The inner fire is the most important thing mankind possesses." + }, + { + "id": "0042a85c-e7f9-434d-98ec-07eaec1b091a", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edith Wharton", + "text": "If only wed stop trying to be happy wed have a pretty good time." + }, + { + "id": "f6089374-a650-4afd-88ef-217dc2e5a160", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edmond Rostand", + "text": "A man is not old as long as he is seeking something." + }, + { + "id": "958df508-9825-4526-ad1a-83e55bb83df1", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edmund Burke", + "text": "Nobody made a greater mistake than he who did nothing because he could do only a little." + }, + { + "id": "54f92d6a-35fd-4791-a2b1-c85a6fab5173", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edna Millay", + "text": "I am glad that I paid so little attention to good advice; had I abided by it I might have been saved from some of my most valuable mistakes." + }, + { + "id": "c8a68aba-0377-4ddf-be76-da77aa984d81", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edward Ericson", + "text": "The cosmos is neither moral or immoral; only people are. He who would move the world must first move himself." + }, + { + "id": "cd415112-6cd5-4e0a-8f23-113273bfa17f", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edward Gibbon", + "text": "The winds and waves are always on the side of the ablest navigators." + }, + { + "id": "5118543e-64e5-4ff4-97f2-34ac52e02591", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edward Young", + "text": "On every thorn, delightful wisdom grows, In every rill a sweet instruction flows." + }, + { + "id": "db6ada52-f289-4c7d-bf05-b5678799ebe6", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edward de Bono", + "text": "It is better to have enough ideas for some of them to be wrong, than to be always right by having no ideas at all." + }, + { + "id": "1ae860a7-d9a0-4041-b06d-2e0464f9f301", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edwin Chapin", + "text": "Every action of our lives touches on some chord that will vibrate in eternity." + }, + { + "id": "a33f6936-4331-4291-9f23-52a834478d67", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Edwin Markham", + "text": "We have committed the Golden Rule to memory; let us now commit it to life." + }, + { + "id": "af9b6016-e7a5-4c9a-b36e-4d5e43f9e114", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eknath Easwaran", + "text": "Through meditation and by giving full attention to one thing at a time, we can learn to direct attention where we choose." + }, + { + "id": "07ee0493-d713-44ba-b385-070d3ebee7e9", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elbert Hubbard", + "text": "There is no failure except in no longer trying." + }, + { + "id": "d5e5309f-4ad9-49de-a03e-19cc78dc0151", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elbert Hubbard", + "text": "To avoid criticism, do nothing, say nothing, be nothing." + }, + { + "id": "23a2ae8e-6a5e-4791-b1f2-98517e228a22", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elbert Hubbard", + "text": "A little more persistence, a little more effort, and what seemed hopeless failure may turn to glorious success." + }, + { + "id": "a3725d8f-277a-4f20-98b1-d7b79c8a9d79", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elbert Hubbard", + "text": "A failure is a man who has blundered but is not capable of cashing in on the experience." + }, + { + "id": "d2f15efc-2f4b-4c66-b277-ea356ce1bc89", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elbert Hubbard", + "text": "The final proof of greatness lies in being able to endure criticism without resentment." + }, + { + "id": "ebb58ea3-ecf6-4bf5-a700-bef57d58391a", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elbert Hubbard", + "text": "The greatest mistake you can make in life is to be continually fearing you will make one." + }, + { + "id": "66712891-c64f-4608-88c5-219adb1c4d03", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eleanor Roosevelt", + "text": "No one can make you feel inferior without your consent." + }, + { + "id": "09425b21-7192-47df-aeca-099693ff55f9", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eleanor Roosevelt", + "text": "Do one thing every day that scares you." + }, + { + "id": "b3caa14f-b469-483b-90ef-aad7508542f6", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eleanor Roosevelt", + "text": "The future belongs to those who believe in the beauty of their dreams." + }, + { + "id": "23ae9467-2e0d-4cb5-8bf8-6ad97809e3e9", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eleanor Roosevelt", + "text": "I think somehow we learn who we really are and then live with that decision." + }, + { + "id": "001d4279-0597-498b-89ec-9ac8971fe97f", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eleanor Roosevelt", + "text": "Friendship with oneself is all important because without it one cannot be friends with anybody else in the world." + }, + { + "id": "732da6fe-6a9c-4361-94ed-3b510209fd6c", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eleanor Roosevelt", + "text": "Remember always that you not only have the right to be an individual, you have an obligation to be one." + }, + { + "id": "523367af-9a36-47a2-91c4-b96f0208fa9c", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eleanor Roosevelt", + "text": "People grow through experience if they meet life honestly and courageously. This is how character is built." + }, + { + "id": "4d2d94da-4f5a-4533-937d-3f3f4985faee", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eleanor Roosevelt", + "text": "It is not fair to ask of others what you are unwilling to do yourself." + }, + { + "id": "b81db584-38f7-4f50-9862-897fa4059a7f", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eleanor Roosevelt", + "text": "You must do the things you think you cannot do." + }, + { + "id": "6549efc3-ac2a-48e7-8ac4-d4a2eb232050", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elisabeth Kubler-Ross", + "text": "I believe that we are solely responsible for our choices, and we have to accept the consequences of every deed, word, and thought throughout our lifetime." + }, + { + "id": "36fa0e79-0aa6-48a2-9b29-c6fc58ebaefa", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elizabeth Arden", + "text": "I'm not interested in age. People who tell me their age are silly. You're as old as you feel." + }, + { + "id": "c44cc68e-a7a4-43f4-a199-4c43ea2d3978", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elizabeth Browning", + "text": "Light tomorrow with today!" + }, + { + "id": "7524047e-3fd8-4a90-af3a-e236d6ca625c", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elizabeth Browning", + "text": "Love doesn't make the world go round, love is what makes the ride worthwhile." + }, + { + "id": "ffcc6931-dd7a-4df2-a5cd-c7b07d86aa29", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elizabeth Browning", + "text": "Whoso loves, believes the impossible." + }, + { + "id": "2430517f-3ae1-4ebe-8acb-7df8bc87e8bf", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elizabeth Kenny", + "text": "He who angers you conquers you." + }, + { + "id": "155084b1-a30d-49a3-a070-7e291dd80647", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Elizabeth Montagu", + "text": "I endeavour to be wise when I cannot be merry, easy when I cannot be glad, content with what cannot be mended and patient when there is no redress." + }, + { + "id": "969f042c-a397-47a7-a46b-60610cd6b9bf", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ella Fitzgerald", + "text": "It isn't where you come from, it's where you're going that counts." + }, + { + "id": "ac03ed2b-cf40-4401-a683-47fc5cd98bdc", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ella Wilcox", + "text": "The truest greatness lies in being kind, the truest wisdom in a happy mind." + }, + { + "id": "1e23872d-25d0-41d6-bfe7-d7d3e38e6ea7", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ella Williams", + "text": "Bite off more than you can chew, then chew it." + }, + { + "id": "d38b35d0-bca3-4cb6-8e81-2ab8c5f8283b", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ellen Gilchrist", + "text": "Don't ruin the present with the ruined past." + }, + { + "id": "b614a67b-2c40-436e-8453-c9e7143a347c", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ellen Parr", + "text": "The cure for boredom is curiosity. There is no cure for curiosity." + }, + { + "id": "35e2b680-f0b8-46af-a997-42a3ac323e50", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "English proverb", + "text": "Take heed: you do not find what you do not seek." + }, + { + "id": "75619ddd-0861-4f39-9dc5-c49e61c5b845", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "Freedom is the right to live as we wish." + }, + { + "id": "6bfb5451-5aca-4197-b5d5-4c11699a014c", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "Difficulties are things that show a person what they are." + }, + { + "id": "067eb789-9cca-4b7a-97a7-cd831942116e", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "If you wish to be a writer, write." + }, + { + "id": "ced1680c-1fac-4903-94e0-625423f8154b", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "Practice yourself, for heavens sake in little things, and then proceed to greater." + }, + { + "id": "1632afe0-b552-41df-8e4e-460aaed5267d", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "Make the best use of what is in your power, and take the rest as it happens." + }, + { + "id": "e3c92388-720a-4e1b-ad53-095db6e32463", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "Nature gave us one tongue and two ears so we could hear twice as much as we speak." + }, + { + "id": "3d777cb0-c22e-4b3f-9734-76f42ec61fd4", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "He is a wise man who does not grieve for the things which he has not, but rejoices for those which he has." + }, + { + "id": "efed4c1f-ff16-42d9-8de9-a53d8739d3d5", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "There is only one way to happiness and that is to cease worrying about things which are beyond the power of our will." + }, + { + "id": "0505b4c2-209e-40a8-9ddb-8153203804ed", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "If you seek truth you will not seek victory by dishonourable means, and if you find truth you will become invincible." + }, + { + "id": "c77e0f46-5033-43d7-ac4d-ce062982e8de", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "When you are offended at any man's fault, turn to yourself and study your own failings. Then you will forget your anger." + }, + { + "id": "91e6bdbf-f770-473d-8e38-bf28f3f31eb5", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "Know, first, who you are, and then adorn yourself accordingly." + }, + { + "id": "49085131-f3a3-45ca-ac36-e2dc501dccd9", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "Men are disturbed not by things, but by the view which they take of them." + }, + { + "id": "0a35f4b7-692c-43ff-a5a1-96513af31eb5", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "We have two ears and one mouth so that we can listen twice as much as we speak." + }, + { + "id": "33836f6b-c7a8-407f-82f0-473ffde3db89", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "Not every difficult and dangerous thing is suitable for training, but only that which is conducive to success in achieving the object of our effort." + }, + { + "id": "9484fd9a-6719-4136-82b6-f9dfa3a31377", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "No man is free who is not master of himself." + }, + { + "id": "b30e6c3c-a954-4d78-8c6c-a365e5f46c9c", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "It's not what happens to you, but how you react to it that matters." + }, + { + "id": "42383919-c374-4eff-90cc-04009e43d4fd", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "The world turns aside to let any man pass who knows where he is going." + }, + { + "id": "b6bc2d6c-9778-4998-8360-e37dad5655aa", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "First say to yourself what you would be; and then do what you have to do." + }, + { + "id": "41d71556-9e53-4fd7-9f15-fd4b6570cb10", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "Keep silence for the most part, and speak only when you must, and then briefly." + }, + { + "id": "964f8399-22d0-4a8e-84db-9008e1c9804c", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "It is impossible for a man to learn what he thinks he already knows." + }, + { + "id": "0cc1a63d-c56f-4c89-8b71-ff29ab6055f9", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Epictetus", + "text": "One that desires to excel should endeavour in those things that are in themselves most excellent." + }, + { + "id": "ac36580f-6f8f-4ffc-9bd5-b541c18a2a28", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Eriksson", + "text": "The greatest barrier to success is the fear of failure." + }, + { + "id": "84afc79a-249a-4106-a0e0-6f4e60f0096d", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": ["listen", "learn", "learning"], + "source": "https://www.goodreads.com/quotes/353013", + "author": "Ernest Hemingway", + "text": "I like to listen. I have learned a great deal from listening carefully. Most people never listen." + }, + { + "id": "1a953688-66ff-48e3-8bf2-8c0558fa2659", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": ["action", "motion", "mistake"], + "source": "https://www.goodreads.com/quotes/392801", + "author": "Ernest Hemingway", + "text": "Never mistake motion for action." + }, + { + "id": "799fa3e0-483e-43ef-ac8a-6bf2764843a3", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Etty Hillesum", + "text": "Sometimes the most important thing in a whole day is the rest we take between two deep breaths." + }, + { + "id": "4f28f19d-6b1a-496b-96d5-adf74a808aef", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Euripides", + "text": "The wisest men follow their own direction." + }, + { + "id": "54b3dd77-692a-464b-9ae0-f4bb94fc14f7", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Everett Dirksen", + "text": "I am a man of fixed and unbending principles, the first of which is to be flexible at all times." + }, + { + "id": "dedd0717-aaa2-4f07-8c33-eb7c41e88cce", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Fannie Hamer", + "text": "There is one thing you have got to learn about our movement. Three people are better than no people." + }, + { + "id": "ed2b2d22-65da-418c-b4d6-b709c651e71b", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Felix Adler", + "text": "The truth which has made us free will in the end make us glad also." + }, + { + "id": "061af699-11e0-488e-bb12-b22b689e0d39", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Flora Whittemore", + "text": "The doors we open and close each day decide the lives we live." + }, + { + "id": "c51635a1-f7e8-432a-888b-9bbba73d62ba", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": ["excuse", "excuses", "success"], + "source": "https://www.goodreads.com/quotes/161358", + "author": "Florence Nightingale", + "text": "I attribute my success to this: I never gave or took an excuse." + }, + { + "id": "3bf8990b-5ea6-4c72-a3cd-f60a823b7465", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Forrest Church", + "text": "Do what you can. Want what you have. Be who you are." + }, + { + "id": "97f2df68-6d52-4d87-b6a6-fff2cae064d4", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": ["fictional", "movie", "life"], + "source": "https://www.rottentomatoes.com/m/forrest_gump/quotes", + "author": "Forrest Gump", + "text": "My mama always said: life is like a box of chocolate, you never know what you gonna get." + }, + { + "id": "1f1c7664-de42-47c3-9e89-888e78434bd7", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Fran Watson", + "text": "As we risk ourselves, we grow. Each new experience is a risk." + }, + { + "id": "92566e42-032d-420e-a6d0-860288908fd4", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frances de Sales", + "text": "Nothing is so strong as gentleness. Nothing is so gentle as real strength." + }, + { + "id": "8c81cfa8-b69d-4e63-b87b-c06698a37a9f", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Francis Bacon", + "text": "A prudent question is one half of wisdom." + }, + { + "id": "83600139-e1d9-4a7a-b99e-706a36b779bd", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Francis Bacon", + "text": "A wise man will make more opportunities than he finds." + }, + { + "id": "d51fad40-babc-4e98-97be-93e5b90d22fa", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Francois de La Rochefoucauld", + "text": "A true friend is the most precious of all possessions and the one we take the least thought about acquiring." + }, + { + "id": "b8bd5907-3161-4229-86e0-156cc2d74d4c", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Francoise de Motteville", + "text": "The true way to render ourselves happy is to love our work and find in it our pleasure." + }, + { + "id": "62cf79be-fc32-4598-85ef-2e9c33664fa1", + "isDeleted": false, + "createdAt": 1613993133676, + "updatedAt": 1613993133676, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frank Crane", + "text": "You may be deceived if you trust too much, but you will live in torment if you don't trust enough." + }, + { + "id": "6fd03dc2-3e21-4680-a51d-a22bb4b6a337", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frank Herbert", + "text": "The beginning of knowledge is the discovery of something we do not understand." + }, + { + "id": "5c3b121f-4a73-4e39-9bfe-1215adbfb0ef", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frank Tyger", + "text": "Your future depends on many things, but mostly on you." + }, + { + "id": "5c70183a-67c5-4984-b979-ddac5e7525bb", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frank Tyger", + "text": "Learn to listen. Opportunity could be knocking at your door very softly." + }, + { + "id": "bdeba27c-055b-470e-a767-38a90c06478c", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frank Tyger", + "text": "Be a good listener. Your ears will never get you in trouble." + }, + { + "id": "6a4fd6d0-3436-4ef5-b03d-d0308ff9c759", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frank Wright", + "text": "The thing always happens that you really believe in; and the belief in a thing makes it happen." + }, + { + "id": "af7bb294-629a-46ef-9402-27a15fa7d8df", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frank Wright", + "text": "Respect should be earned by actions, and not acquired by years." + }, + { + "id": "7ac7e0a9-c697-4dba-8b92-a70664901334", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Franklin D. Roosevelt", + "text": "It is common sense to take a method and try it. If it fails, admit it frankly and try another. But above all, try something." + }, + { + "id": "13d03376-ed53-450f-ad97-57cea05ad3c4", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Franklin Roosevelt", + "text": "The only limit to our realization of tomorrow will be our doubts of today." + }, + { + "id": "851bab0c-e1bb-49f2-b0d1-9f457704a6d7", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Franklin Roosevelt", + "text": "Happiness is not in the mere possession of money; it lies in the joy of achievement, in the thrill of creative effort." + }, + { + "id": "f9b8bdcf-9351-4ba0-a5d3-6958e32a606c", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Franklin Roosevelt", + "text": "When you come to the end of your rope, tie a knot and hang on." + }, + { + "id": "64c52f5b-d9ca-4804-abe9-b3da5946818c", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Franz Liszt", + "text": "Beware of missing chances; otherwise it may be altogether too late some day." + }, + { + "id": "a216d245-50c8-4194-a01d-0eba3bce3d26", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frederick Douglass", + "text": "If there is no struggle, there is no progress." + }, + { + "id": "46f0e3a8-cbd2-4f94-ba2b-41f8f069e1b6", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frederick Douglass", + "text": "I prefer to be true to myself, even at the hazard of incurring the ridicule of others, rather than to be false, and to incur my own abhorrence." + }, + { + "id": "4945f170-226b-40f2-9c81-a383ccadec11", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Frederick Wilcox", + "text": "Progress always involves risks. You can't steal second base and keep your foot on first." + }, + { + "id": "4ee42316-623b-46c3-9c95-f3ea8a471921", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Friedrich von Schiller", + "text": "Keep true to the dreams of thy youth." + }, + { + "id": "72af37e5-7290-4c9b-b675-891897b992b9", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Friedrich von Schiller", + "text": "If you want to study yourself look into the hearts of other people. If you want to study other people look into your own heart." + }, + { + "id": "31f3d897-b4d0-48d8-b240-14d27ece9cb7", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Friedrich von Schiller", + "text": "If you want to study yourself, look into the hearts of other people. If you want to study other people, look into your own heart." + }, + { + "id": "a15444cf-fbec-4b7b-a7ff-e09b9214b566", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "G. K. Chesterton", + "text": "I would maintain that thanks are the highest form of thought, and that gratitude is happiness doubled by wonder." + }, + { + "id": "1734f053-f7e3-49c4-b20e-e0658134e09a", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "G. K. Chesterton", + "text": "I do not believe in a fate that falls on men however they act; but I do believe in a fate that falls on man unless they act." + }, + { + "id": "396b00e4-e247-40ca-b35d-105558483800", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Gail Sheehy", + "text": "To be tested is good. The challenged life may be the best therapist." + }, + { + "id": "45b0642a-123a-4b19-b10b-04bf9a5a48fe", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Galileo Galilei", + "text": "All truths are easy to understand once they are discovered; the point is to discover them." + }, + { + "id": "0473fadb-ad6d-4a07-b6af-77f9b305c15e", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "General Douglas MacArthur", + "text": "It is fatal to enter any war without the will to win it." + }, + { + "id": "a15a5357-a493-4b8d-96c9-458f648cf371", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Geoffrey F. Abert", + "text": "Prosperity depends more on wanting what you have than having what you want." + }, + { + "id": "73dff073-551b-47d6-84d6-422ae982aca1", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Georg Lichtenberg", + "text": "Everyone is a genius at least once a year. A real genius has his original ideas closer together." + }, + { + "id": "6a1d6c39-86d3-4156-b502-5a737ba57616", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Georg Lichtenberg", + "text": "I cannot say whether things will get better if we change; what I can say is they must change if they are to get better." + }, + { + "id": "2e1d71f2-a545-4ee5-9147-0431019152f1", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Allen", + "text": "People of mediocre ability sometimes achieve outstanding success because they don't know when to quit. Most men succeed because they are determined to." + }, + { + "id": "ed732439-cb86-4a6a-a4a2-5457fb2b5bbe", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Bernard Shaw", + "text": "A life spent making mistakes is not only more honourable, but more useful than a life spent doing nothing." + }, + { + "id": "e251c321-971f-47bb-afa6-68048d6ee608", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Bernard Shaw", + "text": "The possibilities are numerous once we decide to act and not react." + }, + { + "id": "9e25225a-bba4-4675-8379-a1bc2c78b53d", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Eliot", + "text": "It is never too late to be what you might have been." + }, + { + "id": "a5d4bf4b-df28-481b-8b1b-bb0511a65203", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Eliot", + "text": "What do we live for, if it is not to make life less difficult for each other?" + }, + { + "id": "a80e9874-b986-4b07-95e9-e964a6e62019", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Matthew Adams", + "text": "Each day can be one of triumph if you keep up your interests." + }, + { + "id": "9f7f019e-aea8-44ab-82d1-ff71c6097505", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Orwell", + "text": "Myths which are believed in tend to become true." + }, + { + "id": "24c3e358-2802-4bc5-a539-f1c50c2717d9", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Patton", + "text": "If a man does his best, what else is there?" + }, + { + "id": "72951260-22d8-4c3b-a49d-153a3452e811", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Patton", + "text": "Accept challenges, so that you may feel the exhilaration of victory." + }, + { + "id": "6ee1178e-2f15-4244-966a-51ebdacb0afc", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Sand", + "text": "There is only one happiness in life, to love and be loved." + }, + { + "id": "18278c87-9b5a-4c57-9d02-ab8b3cdbb5c3", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Santayan", + "text": "Those who cannot learn from history are doomed to repeat it." + }, + { + "id": "37a4ead6-587c-4b0d-b801-95402d4185f6", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Shaw", + "text": "My reputation grows with every failure." + }, + { + "id": "78626c5b-9b2b-4a36-a064-815f0672ea14", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Shaw", + "text": "The reasonable man adapts himself to the world; the unreasonable man persists in trying to adapt the world to himself. Therefore, all progress depends on the unreasonable man." + }, + { + "id": "dc6b93ca-0cb6-4bda-b339-cac216021274", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "George Sheehan", + "text": "Success means having the courage, the determination, and the will to become the person you believe you were meant to be." + }, + { + "id": "1f2c64be-0ab9-4f4b-8735-7bab5ea95ef3", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "German proverb", + "text": "Silence is a fence around wisdom." + }, + { + "id": "455ca67e-2326-4938-8892-554a310de360", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "German proverb", + "text": "Begin to weave and God will give you the thread." + }, + { + "id": "e5193bf1-78cb-4264-8eb8-107d6f34dfbf", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Gloria Steinem", + "text": "If the shoe doesn't fit, must we change the foot?" + }, + { + "id": "33ad55f6-dc2a-4754-9d22-d7ea4cb5421c", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Gloria Steinem", + "text": "Without leaps of imagination, or dreaming, we lose the excitement of possibilities. Dreaming, after all, is a form of planning." + }, + { + "id": "682e8f9c-f29c-4844-8283-927e271812c6", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Goethe", + "text": "A man sees in the world what he carries in his heart." + }, + { + "id": "452faf73-d35a-4cc7-a6a0-171b8d93fe21", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Goethe", + "text": "What is not started today is never finished tomorrow." + }, + { + "id": "a9edabee-d030-4480-9b88-56bcd368941b", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Goethe", + "text": "Just trust yourself, then you will know how to live." + }, + { + "id": "7e58c78f-db00-4c07-b576-69bbf22459ec", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": ["time", "effectiveness"], + "source": "https://www.goodreads.com/quotes/6774650", + "author": "Goethe", + "text": "If I know how you spend your time, then I know what might become of you." + }, + { + "id": "298e06c5-3afb-491e-80f7-ad492f8b17d8", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Gordon Hinckley", + "text": "Our kindness may be the most persuasive argument for that which we believe." + }, + { + "id": "2e41d53f-897b-4fac-8bec-80c0d8892bd2", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Gordon Hinckley", + "text": "Our lives are the only meaningful expression of what we believe and in Whom we believe. And the only real wealth, for any of us, lies in our faith." + }, + { + "id": "f91f5011-8699-49b8-a819-080064ff2aeb", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Grandma Moses", + "text": "Life is what you make of it. Always has been, always will be." + }, + { + "id": "ccc15f02-976e-495e-90ff-4fecb2f3ca37", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Gustave Flaubert", + "text": "Reality does not conform to the ideal, but confirms it." + }, + { + "id": "bbab9313-7245-44c7-a84a-03c14d7d59ba", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "H. Bertram Lewis", + "text": "The happy and efficient people in this world are those who accept trouble as a normal detail of human life and resolve to capitalize it when it comes along." + }, + { + "id": "cb51e70b-fed3-482f-a335-f87d0e3ed929", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "H. Jackson Browne", + "text": "Don't be afraid to go out on a limb. That's where the fruit is." + }, + { + "id": "65dbf479-3102-411b-9c83-4b509a182c29", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "H. W. Arnold", + "text": "The worst bankrupt in the world is the person who has lost his enthusiasm." + }, + { + "id": "4c1e42f9-c498-49f0-8c29-280ceed527cc", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Haddon Robinson", + "text": "What worries you masters you." + }, + { + "id": "664afdf3-1b0f-434e-a075-6c287fbb7d32", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Hannah Arendt", + "text": "Promises are the uniquely human way of ordering the future, making it predictable and reliable to the extent that this is humanly possible." + }, + { + "id": "d59859a0-5892-4a65-a188-dfa48f4a23fb", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Hannah More", + "text": "It is not so important to know everything as to appreciate what we learn." + }, + { + "id": "d790dd7e-fc00-4458-8227-41ce0f69c008", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Hannah More", + "text": "Obstacles are those things you see when you take your eyes off the goal." + }, + { + "id": "242d0edf-d784-4761-af03-81e2a6a4c0d9", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Hannah Senesh", + "text": "One needs something to believe in, something for which one can have whole-hearted enthusiasm. One needs to feel that ones life has meaning, that one is needed in this world." + }, + { + "id": "8dc8f9c3-c03d-43d9-8631-6127f6bf29f0", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Harold Nicolson", + "text": "We are all inclined to judge ourselves by our ideals; others, by their acts." + }, + { + "id": "e7972185-41da-4a42-ab46-252c942a3922", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Harriet Beecher Stowe", + "text": "All serious daring starts from within." + }, + { + "id": "4521dcac-2d45-4b62-9f18-54908bce02bb", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Harriet Lerner", + "text": "Only through our connectedness to others can we really know and enhance the self. And only through working on the self can we begin to enhance our connectedness to others." + }, + { + "id": "b82c5902-2bf0-40e7-a7e4-473d334f29da", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Harriet Tubman", + "text": "Every great dream begins with a dreamer. Always remember, you have within you the strength, the patience, and the passion to reach for the stars to change the world." + }, + { + "id": "ef7cf38e-ecd8-4ee6-aa9b-c032cc5287b6", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Harriet Woods", + "text": "You can stand tall without standing on someone. You can be a victor without having victims." + }, + { + "id": "0bb00e89-776f-4a3b-add3-a11793fca5b9", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Harry Banks", + "text": "For success, attitude is equally as important as ability." + }, + { + "id": "f7a839ea-81b1-4a05-900d-1a34ae477575", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Harry Burchell Mathews", + "text": "Translation is the paradigm, the exemplar of all writing. It is translation that demonstrates most vividly the yearning for transformation that underlies every act involving speech, that supremely human gift." + }, + { + "id": "a59ee1cb-648e-48d5-899b-d24ae3fd7af1", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Harry Kemp", + "text": "The poor man is not he who is without a cent, but he who is without a dream." + }, + { + "id": "699d4afc-f015-4d9b-8d5a-7ac679670c9e", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Hasidic saying", + "text": "Everyone should carefully observe which way his heart draws him, and then choose that way with all his strength." + }, + { + "id": "bfdd4d59-8fb1-4609-a62a-8736a48db972", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Hausa", + "text": "Give thanks for a little and you will find a lot." + }, + { + "id": "99808dd6-8de6-47c5-b7c8-b6bacaea350e", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Havelock Ellis", + "text": "It is on our failures that we base a new and different and better success." + }, + { + "id": "3edec9cd-1db6-4cea-bc19-290b213fcfe1", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Haynes Bayly", + "text": "Absence makes the heart grow fonder." + }, + { + "id": "940787d4-b0a7-4a24-8cad-b8033e46524b", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Helen Keller", + "text": "Keep yourself to the sunshine and you cannot see the shadow." + }, + { + "id": "c5de4e08-21ae-4570-873b-964ab7f11a01", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Helen Keller", + "text": "Never bend your head. Always hold it high. Look the world right in the eye." + }, + { + "id": "3e5e358a-160f-4b34-96fc-93642139ea30", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Helen Keller", + "text": "The most beautiful things in the world cannot be seen or even touched. They must be felt with the heart." + }, + { + "id": "ace95a8a-00f0-4d00-8be0-49f4d91f1b65", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Helen Keller", + "text": "We could never learn to be brave and patient if there were only joy in the world." + }, + { + "id": "65c74513-64c7-4be9-a675-bce5ce65a142", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Helen Keller", + "text": "Face your deficiencies and acknowledge them; but do not let them master you. Let them teach you patience, sweetness, insight." + }, + { + "id": "8d56e853-48dd-420e-a13b-3fdc3c8cbd44", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Helen Keller", + "text": "No pessimist ever discovered the secrets of the stars, or sailed to an uncharted land, or opened a new heaven to the human spirit." + }, + { + "id": "91546b03-41a9-4bca-89d5-fef8bc9472f8", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Helen Keller", + "text": "Character cannot be developed in ease and quiet. Only through experience of trial and suffering can the soul be strengthened, vision cleared, ambition inspired, and success achieved." + }, + { + "id": "828bd203-ce49-4f18-83bf-747b5cbc79f4", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Helen Keller", + "text": "The best and most beautiful things in the world cannot be seen, nor touched... but are felt in the heart." + }, + { + "id": "3ae3e136-0e2f-4a4f-8472-008d31584f86", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Helen Keller", + "text": "When one door of happiness closes, another opens; but often we look so long at the closed door that we do not see the one which has been opened for us." + }, + { + "id": "320b3610-0d35-4f5d-8535-6217d07c3ffa", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henri Amiel", + "text": "Almost everything comes from nothing." + }, + { + "id": "9b2212ee-868f-483b-8ffd-351950756f1b", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henri Bergson", + "text": "To exist is to change, to change is to mature, to mature is to go on creating oneself endlessly." + }, + { + "id": "f7e85471-401e-4c21-af4b-4a322337e1de", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henri Bergson", + "text": "The eye sees only what the mind is prepared to comprehend." + }, + { + "id": "fe00edfd-30de-4031-8bff-c341c8fbe21a", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henri L. Bergson", + "text": "Think like a man of action; act like a man of thought." + }, + { + "id": "38f2e96b-af24-4b7a-bce7-959bea0fa8a1", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": ["creativity", "courage"], + "source": "https://www.goodreads.com/quotes/21433", + "author": "Henri Matisse", + "text": "Creativity takes courage." + }, + { + "id": "dd0ce217-8922-47a4-a286-9377c5dc1125", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henri-Frederic Amiel", + "text": "So long as a person is capable of self-renewal they are a living being." + }, + { + "id": "e4292535-06ea-4054-8c9c-d2d4aa8ef0db", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henri-Frederic Amiel", + "text": "Work while you have the light. You are responsible for the talent that has been entrusted to you." + }, + { + "id": "057a06ab-7b42-4d36-b9e8-0e94e48cd8e8", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Beecher", + "text": "Gratitude is the fairest blossom which springs from the soul." + }, + { + "id": "f6531aa9-aa36-459a-bfe3-96774ede5c98", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry David Thoreau", + "text": "I cannot make my days longer so I strive to make them better." + }, + { + "id": "c0460f1e-e8f0-4902-b7ea-84d52360e32a", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry David Thoreau", + "text": "If one advances confidently in the direction of his dream, and endeavours to live the life which he had imagines, he will meet with a success unexpected in common hours." + }, + { + "id": "98f7c831-60bf-4a1f-8d43-d4aeb7b3061e", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": ["price", "priorities", "life"], + "source": "https://www.brainyquote.com/quotes/henry_david_thoreau_106427", + "author": "Henry David Thoreau", + "text": "The price of anything is the amount of life you exchange for it." + }, + { + "id": "1e57703e-2afd-4529-adf9-ae37bcbacf7a", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Ford", + "text": "If you think you can, you can. And if you think you can't, you're right." + }, + { + "id": "d78a7325-476e-4c07-a940-fc83f19ad508", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Ford", + "text": "Quality means doing it right when no one is looking." + }, + { + "id": "07527b02-f92a-4dd8-aa12-471e9a3cd19c", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Ford", + "text": "Obstacles are those frightful things you see when you take your eyes off your goal." + }, + { + "id": "e8514b67-a1a1-456c-a2f6-67bbd561e3d1", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry J. Kaiser", + "text": "Trouble is only opportunity in work clothes." + }, + { + "id": "442ab3d6-81da-4de3-9818-197f11b27968", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry James", + "text": "Three things in human life are important. The first is to be kind. The second is to be kind. The third is to be kind." + }, + { + "id": "c8a5192b-a528-41e1-a4ea-97f50459a1e7", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Longfellow", + "text": "He that respects himself is safe from others; he wears a coat of mail that none can pierce." + }, + { + "id": "2e187348-166a-4d09-bacd-c342c9bacf21", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Longfellow", + "text": "Perseverance is a great element of success. If you only knock long enough and loud enough at the gate, you are sure to wake up somebody." + }, + { + "id": "448fef6d-ccf7-4157-bd99-e5d3dc92bbc9", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Miller", + "text": "The moment one gives close attention to anything, even a blade of grass, it becomes a mysterious, awesome, indescribably magnificent world in itself." + }, + { + "id": "2bbd0715-ce78-415d-a296-d7c35ff72497", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Miller", + "text": "The moment one gives close attention to anything, it becomes a mysterious, awesome, indescribably magnificent world in itself." + }, + { + "id": "7c6c3523-43a2-4922-8b3e-254a63a914a6", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Moore", + "text": "There is no retirement for an artist, it's your way of living so there is no end to it." + }, + { + "id": "6ca66f6c-f85f-4747-9741-97d98b8be906", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Reed", + "text": "Intuition is the very force or activity of the soul in its experience through whatever has been the experience of the soul itself." + }, + { + "id": "585f2953-8ab8-49d9-a06e-f8168da03773", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Thoreau", + "text": "The only way to tell the truth is to speak with kindness. Only the words of a loving man can be heard." + }, + { + "id": "e3276665-4f25-49d0-bbad-3bad5de6012a", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Thoreau", + "text": "Things do not change, we change." + }, + { + "id": "36f70ea2-562a-4231-9dd9-26ddcb5a3d1a", + "isDeleted": false, + "createdAt": 1613993133677, + "updatedAt": 1613993133677, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Thoreau", + "text": "The world is but a canvas to the imagination." + }, + { + "id": "a0d9e28f-2ba2-443a-b276-b9e8f32100b5", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Thoreau", + "text": "Things do not change; we change." + }, + { + "id": "f2d13a1e-b1ba-4af9-af44-e74190dee081", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Van Dyke", + "text": "Be glad of life because it gives you the chance to love, to work, to play, and to look up at the stars." + }, + { + "id": "8bd74f1b-883f-4119-9619-76dabd115563", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Henry Ward Beecher", + "text": "Every artist dips his brush in his own soul, and paints his own nature into his pictures." + }, + { + "id": "15c98281-46ce-4b70-96e1-d211ab867def", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Heraclitus", + "text": "All is flux; nothing stays still." + }, + { + "id": "027edf15-f7e5-43e4-bee5-dab73d0d4fa6", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Heraclitus", + "text": "You cannot step twice into the same river, for other waters are continually flowing in." + }, + { + "id": "9d2dee14-7cb4-4551-9ce7-ec2530090386", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Herbert Swope", + "text": "I cannot give you the formula for success, but I can give you the formula for failure: which is: Try to please everybody." + }, + { + "id": "b1a4d373-d564-4f8a-8456-21aa183df599", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Hermann Hesse", + "text": "If I know what love is, it is because of you." + }, + { + "id": "d16ae12d-6f8c-4a29-aa61-7f019446b4b5", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Holmes", + "text": "Fame usually comes to those who are thinking about something else." + }, + { + "id": "911641c4-9096-489a-b6dd-d4cd158d10fb", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Honore de Balzac", + "text": "When you doubt your power, you give power to your doubt." + }, + { + "id": "aceecc12-ed01-4680-bd63-88f6d4eedd0d", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Honore de Balzac", + "text": "The smallest flower is a thought, a life answering to some feature of the Great Whole, of whom they have a persistent intuition." + }, + { + "id": "5ada7c75-1421-4b42-8ddd-7aec8ec1900e", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Horace", + "text": "Adversity has the effect of eliciting talents, which in prosperous circumstances would have lain dormant." + }, + { + "id": "8dba1cf9-1b2e-4d26-a047-9c8e5b27b126", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Horace", + "text": "Begin, be bold, and venture to be wise." + }, + { + "id": "b486b2a0-7dc3-4e53-b1a2-1708fcc4d133", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Horace Friess", + "text": "All seasons are beautiful for the person who carries happiness within." + }, + { + "id": "385787bb-1ea8-48be-8d74-a22ddf2db740", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Hugh Miller", + "text": "Problems are only opportunities with thorns on them." + }, + { + "id": "fabb75a3-e958-4677-a348-3781b5559aef", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Immanuel Kant", + "text": "Science is organized knowledge. Wisdom is organized life." + }, + { + "id": "240a19ec-d25b-42fa-a7f9-97938aa10d3d", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Immanuel Kant", + "text": "All our knowledge begins with the senses, proceeds then to the understanding, and ends with reason. There is nothing higher than reason." + }, + { + "id": "f6e85c91-249f-4592-9c87-28aa4eadd3b7", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Indira Gandhi", + "text": "You can't shake hands with a clenched fist." + }, + { + "id": "e4bd3ab2-bf04-45c1-9f0a-39851a9e7dee", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ingrid Bergman", + "text": "You must train your intuition you must trust the small voice inside you which tells you exactly what to say, what to decide." + }, + { + "id": "b5191114-fcd1-4015-a008-4adb21e93aed", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ingrid Bergman", + "text": "You must train your intuition, you must trust the small voice inside you which tells you exactly what to say, what to decide." + }, + { + "id": "4019a544-9c4a-48d2-b1d4-26cbeed4d78a", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Iris Murdoch", + "text": "We can only learn to love by loving." + }, + { + "id": "15749f57-fcbe-4fc5-83b0-61020e95e14a", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Isaac Asimov", + "text": "A subtle thought that is in error may yet give rise to fruitful inquiry that can establish truths of great value." + }, + { + "id": "152c7b77-a73e-42b6-bf05-e952dec600b6", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Isocrates", + "text": "The noblest worship is to make yourself as good and as just as you can." + }, + { + "id": "d47a7725-c279-4976-8c32-3c294eb8858b", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ivy Baker Priest", + "text": "The world is round and the place which may seem like the end may also be the beginning." + }, + { + "id": "dc0b929c-53dc-4666-92c4-80b5cd2e3689", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "J. Willard Marriott", + "text": "Good timber does not grow with ease; the stronger the wind, the stronger the trees." + }, + { + "id": "0fcfe2ed-cf12-4933-b5f0-50ec28eaa9ad", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": ["future", "adversity", "failure", "life", "foundation"], + "source": "https://www.goodreads.com/quotes/396385", + "author": "J.K. Rowling", + "text": "Rock bottom became the solid foundation on which I rebuilt my life." + }, + { + "id": "4cdd4bef-4cbd-470d-b6c3-d95ca5bc41a6", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jack Buck", + "text": "Things turn out best for those who make the best of the way things turn out." + }, + { + "id": "6495b142-97cb-4c6d-86a4-60f263235886", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": ["overcome", "action", "try", "persevere"], + "source": "https://www.goodreads.com/quotes/495741", + "author": "Jack Canfield", + "text": "Everything you want is on the other side of fear." + }, + { + "id": "0d19b347-a9cc-4f96-9355-589835f8afde", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jack Dixon", + "text": "If you focus on results, you will never change. If you focus on change, you will get results." + }, + { + "id": "9f12c016-38a6-4483-b1f9-85c72827df85", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jacob Braude", + "text": "Consider how hard it is to change yourself and you'll understand what little chance you have in trying to change others." + }, + { + "id": "dc0b6236-e1df-47c9-a3d0-889e2967165c", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "James Barrie", + "text": "We never understand how little we need in this world until we know the loss of it." + }, + { + "id": "4ddc4a44-0584-42ef-be37-6b47754b8a2f", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "James Faust", + "text": "If you take each challenge one step at a time, with faith in every footstep, your strength and understanding will increase." + }, + { + "id": "f4a3c002-7543-4c1b-9529-f57bbb85d5e8", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "James Freeman Clarke", + "text": "We are either progressing or retrograding all the while. There is no such thing as remaining stationary in this life." + }, + { + "id": "12b00529-5e83-4af2-88b4-e203b34459d6", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "James Lowell", + "text": "A weed is no more than a flower in disguise." + }, + { + "id": "a9c0a21a-de30-436f-9e43-1683624e632d", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "James Openheim", + "text": "The foolish man seeks happiness in the distance; the wise grows it under his feet." + }, + { + "id": "1aadc3f4-a285-4af6-b8f8-63f4d9fec993", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "James Oppenheim", + "text": "The foolish man seeks happiness in the distance, the wise grows it under his feet." + }, + { + "id": "1c3d13e2-ef09-47e7-8fbf-d6cb92f59e7b", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "James Pence", + "text": "Success is determined by those whom prove the impossible, possible." + }, + { + "id": "2daed396-28f0-49c5-bb6f-2547e89b8452", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "James Yorke", + "text": "The most successful people are those who are good at plan B." + }, + { + "id": "b7c85084-e7b5-4230-a0be-defabfcb8916", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jamie Paolinetti", + "text": "Limitations live only in our minds. But if we use our imaginations, our possibilities become limitless." + }, + { + "id": "ee6b2a47-3a4b-4d20-8fb4-9ee3444af4c8", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jane Addams", + "text": "Our doubts are traitors and make us lose the good we often might win, by fearing to attempt." + }, + { + "id": "dac5eee4-1c55-4b94-918d-4c9d7e2b3f2b", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jane Addams", + "text": "Nothing could be worse than the fear that one had given up too soon, and left one unexpended effort that might have saved the world." + }, + { + "id": "4049d817-ebb7-4cc7-912d-6236ca9657b2", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jane Roberts", + "text": "By accepting yourself and being fully what you are, your presence can make others happy." + }, + { + "id": "878cc2e4-d313-4715-b710-e4c18f455219", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Janis Joplin", + "text": "Don't compromise yourself. You are all you've got." + }, + { + "id": "2514b0e4-462f-43a0-b49a-186ff523aab7", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Japanese proverb", + "text": "The day you decide to do it is your lucky day." + }, + { + "id": "41cd6a43-4389-401a-a82f-f3ad8a2e7352", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Japanese proverb", + "text": "Vision without action is a daydream. Action without vision is a nightmare." + }, + { + "id": "7ad8a9d0-cc57-4367-9be4-e8839328f755", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jason Fried", + "text": "No is easier to do. Yes is easier to say." + }, + { + "id": "defca23f-1620-4e43-80cd-a0be6f9d9b66", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jawaharlal Nehru", + "text": "A leader or a man of action in a crisis almost always acts subconsciously and then thinks of the reasons for his action." + }, + { + "id": "3aca9d81-1bf6-4f1b-b06a-aebe16fd18c9", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jean Lacordaire", + "text": "We are the leaves of one branch, the drops of one sea, the flowers of one garden." + }, + { + "id": "41bc051d-74a8-4c2b-b70a-58a2727a0750", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jean Lacordaire", + "text": "Neither genius, fame, nor love show the greatness of the soul. Only kindness can do that." + }, + { + "id": "55b9aaa4-9b4f-4471-94ae-5b63b82a6f8f", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": ["time", "complain"], + "source": "https://www.brainyquote.com/quotes/jean_de_la_bruyere_104446", + "author": "Jean de la Bruyere", + "text": "Those who make the worse use of their time are the first to complain of its shortness" + }, + { + "id": "9f8749e1-7a21-43f3-b976-5154274729a3", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jean de la Fontaine", + "text": "Sadness flies away on the wings of time." + }, + { + "id": "57e5b6e7-defb-4f5f-8622-8e2af1027b21", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jean-Paul Sartre", + "text": "Man is not sum of what he has already, but rather the sum of what he does not yet have, of what he could have." + }, + { + "id": "06363047-2df2-4630-8c2a-259b25b3deda", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jean-Paul Sartre", + "text": "Freedom is what you do with what's been done to you." + }, + { + "id": "ff44e3c7-9378-425c-b39f-d0130d467a71", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jessamyn West", + "text": "It is very easy to forgive others their mistakes; it takes more grit to forgive them for having witnessed your own." + }, + { + "id": "c67e07ff-5f5f-46e7-9b61-0de2f6c7587e", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jim Beggs", + "text": "Before you put on a frown, make absolutely sure there are no smiles available." + }, + { + "id": "2cd82604-5526-4cd2-98f1-f7b9fc21e06c", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jim Bishop", + "text": "The future is an opaque mirror. Anyone who tries to look into it sees nothing but the dim outlines of an old and worried face." + }, + { + "id": "e3a50d28-0772-401f-8493-095ebd8a160a", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jim Rohn", + "text": "Either you run the day or the day runs you." + }, + { + "id": "a9b12f78-b6f8-481f-a2b9-aea11f527214", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jim Rohn", + "text": "Give whatever you are doing and whoever you are with the gift of your attention." + }, + { + "id": "3c510e82-a202-4651-9702-a2f0ff311899", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jim Rohn", + "text": "The more you care, the stronger you can be." + }, + { + "id": "662dc910-9f1a-4315-87a6-7f646478b942", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jim Rohn", + "text": "If you don't design your own life plan, chances are you'll fall into someone else's plan. And guess what they have planned for you? Not much." + }, + { + "id": "e8b7ed7e-f91b-419f-a7a4-7816c3d3995a", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jimmy Dean", + "text": "I can't change the direction of the wind, but I can adjust my sails to always reach my destination." + }, + { + "id": "b249b683-55c7-49a6-b81b-fe690dcff940", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Joan Didion", + "text": "To free us from the expectations of others, to give us back to ourselves there lies the great, singular power of self-respect." + }, + { + "id": "2d02298e-6731-4249-8163-a921fb459cd9", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Joan Didion", + "text": "To free us from the expectations of others, to give us back to ourselves - there lies the great, singular power of self-respect." + }, + { + "id": "f1e902ab-5a2a-4ff1-b327-5cf7ba65851d", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Joe Namath", + "text": "If you aren't going all the way, why go at all?" + }, + { + "id": "66e7d6d4-c47a-4b12-8b9b-0224d64ab503", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Joe Paterno", + "text": "Believe deep down in your heart that you're destined to do great things." + }, + { + "id": "b6975ba5-105a-4846-9ace-984d45e777f9", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "Difficulties increase the nearer we get to the goal." + }, + { + "id": "e78d57b6-26c3-47d8-8073-75c83c8a4a1e", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "Great talent finds happiness in execution." + }, + { + "id": "bf1bc90b-b297-44d0-bcd8-f9a8dd09450c", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "Character develops itself in the stream of life." + }, + { + "id": "befc34fc-55ee-42a4-956a-1e62b072ff6c", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "A really great talent finds its happiness in execution." + }, + { + "id": "5426ceab-8ffe-44ba-93f4-58c53c6bce7f", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "Mountains cannot be surmounted except by winding paths." + }, + { + "id": "4e3773a3-8db9-4747-85aa-517fea71e2c9", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "Knowing is not enough; we must apply!" + }, + { + "id": "83273477-911d-4d10-a86e-fac8e1830f34", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "In the end we retain from our studies only that which we practically apply." + }, + { + "id": "a0f13504-57ae-4109-a5b4-baebb0ba2e5d", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "The person born with a talent they are meant to use will find their greatest happiness in using it." + }, + { + "id": "459d41d7-1036-471e-9974-119fb1b6b24d", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "People are so constituted that everybody would rather undertake what they see others do, whether they have an aptitude for it or not." + }, + { + "id": "03b5afbb-34f5-4d4c-a59c-867d83e3abef", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "If you must tell me your opinions, tell me what you believe in. I have plenty of douts of my own." + }, + { + "id": "ee49a985-c0d9-4895-a60b-bc7f775b77a5", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "Treat people as if they were what they ought to be and you help them to become what they are capable of being." + }, + { + "id": "c4289e2a-2fd0-47d5-85a1-f14794c15b30", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "Correction does much, but encouragement does more." + }, + { + "id": "06bcacb1-8cb1-4674-bb8d-5c1ff30d5bfd", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "Kindness is the golden chain by which society is bound together." + }, + { + "id": "3e456179-84b6-455f-bfa4-44a77a1a0014", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "Wherever a man may happen to turn, whatever a man may undertake, he will always end up by returning to the path which nature has marked out for him." + }, + { + "id": "bff2be75-7eac-4545-b1c8-9902a3b1fa8e", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "The really unhappy person is the one who leaves undone what they can do, and starts doing what they don't understand; no wonder they come to grief." + }, + { + "id": "3b314bf4-7f50-4128-8988-4c494c777e09", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johann Wolfgang von Goethe", + "text": "Sometimes our fate resembles a fruit tree in winter. Who would think that those branches would turn green again and blossom, but we hope it, we know it." + }, + { + "id": "132b7c4f-bd45-4285-8ba6-d577ae9040d9", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Johannes Gaertner", + "text": "To speak gratitude is courteous and pleasant, to enact gratitude is generous and noble, but to live gratitude is to touch Heaven." + }, + { + "id": "dc198517-e945-4203-8d3d-4992166bd751", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Acosta", + "text": "You cannot have what you do not want." + }, + { + "id": "e71ff5b0-5213-4ba9-b4ff-aed1542b82f4", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Adams", + "text": "Patience and perseverance have a magical effect before which difficulties disappear and obstacles vanish." + }, + { + "id": "99721176-fa60-4d5f-81f0-d2c0b6c138fe", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Astin", + "text": "There are things so deep and complex that only intuition can reach it in our stage of development as human beings." + }, + { + "id": "be55a07b-2ef2-40e4-8adf-6853d57ddc4f", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Barrymore", + "text": "Happiness often sneaks in through a door you didn't know you left open." + }, + { + "id": "5ea0291a-9610-49c6-b16a-fa22e1e2980b", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Berry", + "text": "The bird of paradise alights only upon the hand that does not grasp." + }, + { + "id": "ade390c3-e2e5-4222-ae41-40a010809eae", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": ["urgent", "important", "trivial", "thinking"], + "source": "https://www.goodreads.com/quotes/548576", + "author": "John Cleese", + "text": "It's easier to do trivial things that are urgent than it is to do important things that are not, like thinking. And it's also easier to do little things we know we can do than to start on big things that we’re not so sure about." + }, + { + "id": "d4dda027-6a1a-42d1-b884-d3db76f3c641", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John De Paola", + "text": "Slow down and everything you are chasing will come around and catch you." + }, + { + "id": "75c2f532-d58d-49ed-be6d-28b692e3cde2", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Dewey", + "text": "Without some goals and some efforts to reach it, no man can live." + }, + { + "id": "b94f03c2-fff0-46fc-afc4-ef1e11fd6c86", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Dewey", + "text": "Conflict is the gadfly of thought. It stirs us to observation and memory. It instigates to invention. It shocks us out of sheeplike passivity, and sets us at noting and contriving." + }, + { + "id": "93d12cf6-83f9-4d15-9a8e-cf524ed9d2a4", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Dewey", + "text": "Arriving at one point is the starting point to another." + }, + { + "id": "46ba572b-ce7c-45fd-b60c-9a8ad783a090", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Dewey", + "text": "Every great advance in science has issued from a new audacity of the imagination." + }, + { + "id": "4d2fecf5-5014-424e-aef8-e39a587001fc", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Dewey", + "text": "The self is not something ready-made, but something in continuous formation through choice of action." + }, + { + "id": "dec8869d-ec0d-4089-b0b2-bf00de43f815", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Dryden", + "text": "Fortune befriends the bold." + }, + { + "id": "8f40ca36-29f4-4a79-a035-906185407bee", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Dryden", + "text": "A thing well said will be wit in all languages." + }, + { + "id": "7e78a2e8-3c6e-4475-945d-e1368db9264a", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Eliot", + "text": "All the great performers I have worked with are fuelled by a personal dream." + }, + { + "id": "ffd78b3b-860c-4ed7-9612-e92d08e04ff8", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John F. Kennedy", + "text": "As we express our gratitude, we must never forget that the highest appreciation is not to utter words, but to live by them." + }, + { + "id": "18237989-f8b1-4674-a483-02726af176f4", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Holmes", + "text": "Never tell a young person that anything cannot be done. God may have been waiting centuries for someone ignorant enough of the impossible to do that very thing." + }, + { + "id": "582ea68f-12b4-43f8-94d5-c078a2b03331", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Junor", + "text": "An ounce of emotion is equal to a ton of facts." + }, + { + "id": "5380c8aa-898c-43cd-ab19-4a739ba5557a", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Kennedy", + "text": "Change is the law of life. And those who look only to the past or present are certain to miss the future." + }, + { + "id": "e4492736-b338-48de-8691-12ef0048b4ed", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Kennedy", + "text": "Let us resolve to be masters, not the victims, of our history, controlling our own destiny without giving way to blind suspicions and emotions." + }, + { + "id": "94bb6fd9-f1be-4aa7-a1a4-e7ed9c156351", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lennon", + "text": "Love is the flower you've got to let grow." + }, + { + "id": "3be35d15-fab3-4f81-927f-965faa1dbec4", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lennon", + "text": "Reality leaves a lot to the imagination." + }, + { + "id": "67d78a53-e42b-42a3-acd3-fdbe7e2845c9", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lennon", + "text": "Time you enjoy wasting, was not wasted." + }, + { + "id": "2936be87-1dc8-4e3d-9b36-df0392b85d6e", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lennon", + "text": "Yeah we all shine on, like the moon, and the stars, and the sun." + }, + { + "id": "b962d305-b658-4f54-abe2-dde44908e011", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lennon", + "text": "You may say I'm a dreamer, but I'm not the only one, I hope someday you will join us, and the world will live as one." + }, + { + "id": "10aa53e9-ff28-40ac-affb-2404d5d70a40", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lennon", + "text": "Life is what happens while you are making other plans." + }, + { + "id": "ae1e6bf9-ca1f-4641-b513-d7f3ba999c56", + "isDeleted": false, + "createdAt": 1613993133678, + "updatedAt": 1613993133678, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lennon", + "text": "Time you enjoyed wasting was not wasted." + }, + { + "id": "20407af2-4216-43d3-bb08-9d64fc67dd1d", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lennon", + "text": "Life is what happens to you while you're busy making other plans." + }, + { + "id": "5be1e893-552b-4bcc-80c0-b43f3f47e112", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lennon", + "text": "You may say Im a dreamer, but Im not the only one, I hope someday you will join us, and the world will live as one." + }, + { + "id": "89ba1e27-b19f-4b1c-8d0f-74fe3a419491", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Locke", + "text": "I have always thought the actions of men the best interpreters of their thoughts." + }, + { + "id": "18ff4080-dfd4-45a9-81df-567b924a6088", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lubbock", + "text": "A day of worry is more exhausting than a day of work." + }, + { + "id": "4415ae23-ed65-4c7a-bf8e-9d80649ac26b", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Lubbock", + "text": "What we see depends mainly on what we look for." + }, + { + "id": "7d3bbcf4-c6a6-4c4d-816a-6965e10a0f95", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Marshall", + "text": "To listen well is as powerful a means of communication and influence as to talk well." + }, + { + "id": "7a4268ce-2252-42c8-8104-b59e77dd4285", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Muir", + "text": "When one tugs at a single thing in nature, he finds it attached to the rest of the world." + }, + { + "id": "b127bd05-734b-4048-bfe2-5c785d4af665", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Petit-Senn", + "text": "Not what we have but what we enjoy constitutes our abundance." + }, + { + "id": "ec2c6ec0-e334-47da-93a9-ea7f89fc1558", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Pierrakos", + "text": "Life is movement-we breathe, we eat, we walk, we move!" + }, + { + "id": "aa169bf9-b232-4e38-a461-b8b1ba0e43b2", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Powell", + "text": "The only real mistake is the one from which we learn nothing." + }, + { + "id": "faf36176-87a2-45bf-b0d2-2e07a1a34f0c", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Quincy Adams", + "text": "If your actions inspire others to dream more, learn more, do more and become more, you are a leader." + }, + { + "id": "dc9c7451-a265-47be-a267-e87f8b26cf55", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Ruskin", + "text": "Quality is never an accident; it is always the result of intelligent effort." + }, + { + "id": "be1a4612-86b9-45d6-97f7-4bc40f7b13d9", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Ruskin", + "text": "Sunshine is delicious, rain is refreshing, wind braces us up, snow is exhilarating; there is really no such thing as bad weather, only different kinds of good weather." + }, + { + "id": "32174ee0-c41a-47b8-a4e9-1a16cd96a56e", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Simone", + "text": "If you're in a bad situation, don't worry it'll change. If you're in a good situation, don't worry it'll change." + }, + { + "id": "2c7c323e-b0dd-4237-a757-41e92e31d7bc", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Steinbeck", + "text": "If we could learn to like ourselves, even a little, maybe our cruelties and angers might melt away." + }, + { + "id": "b74d018f-4427-49ba-b498-906749274dd5", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Updike", + "text": "Dreams come true. Without that possibility, nature would not incite us to have them." + }, + { + "id": "c334d82a-2feb-4d9b-ad13-ee454b24145c", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Wooden", + "text": "Never mistake activity for achievement." + }, + { + "id": "4020f864-818f-4671-b72b-3bc9ebe449fa", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "John Wooden", + "text": "You can't let praise or criticism get to you. It's a weakness to get caught up in either one." + }, + { + "id": "478b57c6-ba83-4bd8-8647-a16ba967dd5a", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jon Kabat-Zinn", + "text": "You can't stop the waves, but you can learn to surf." + }, + { + "id": "69104185-13ff-4b33-8586-f086bb3c88a3", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jonas Salk", + "text": "Intuition will tell the thinking mind where to look next." + }, + { + "id": "ca5e4ad8-7dfa-4c2e-aede-95fb3034cf4b", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jonathan Kozol", + "text": "Pick battles big enough to matter, small enough to win." + }, + { + "id": "c3afbb59-1a56-4075-a246-029db7c6ee85", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jonathan Swift", + "text": "Discovery consists of seeing what everybody has seen and thinking what nobody else has thought." + }, + { + "id": "e8bb00ae-23ef-448b-909c-e269deabcab1", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Joseph Campbell", + "text": "When we quit thinking primarily about ourselves and our own self-preservation, we undergo a truly heroic transformation of consciousness." + }, + { + "id": "bd624445-0c63-458d-9ed5-f2ca58192546", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Joseph Campbell", + "text": "Your sacred space is where you can find yourself again and again." + }, + { + "id": "c2c303ff-aa6f-471d-a788-f3767e9e71b9", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags":[ "creativity", "life", "fear"], + "source": "https://www.goodreads.com/quotes/30290", + "author": "Joseph Chilton Pearce", + "text": "To live a creative life, we must lose our fear of being wrong." + }, + { + "id": "ab0aae9b-c3c5-4af0-a4cf-e6df78b80153", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Joseph Joubert", + "text": "He who has imagination without learning has wings but no feet." + }, + { + "id": "98c7c3d8-bc93-4868-a9bf-bb876be651a8", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Joseph Roux", + "text": "A fine quotation is a diamond on the finger of a man of wit, and a pebble in the hand of a fool." + }, + { + "id": "a101ed57-c0bf-470c-9ee7-62cc85089f2b", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Joseph Stalin", + "text": "I believe in one thing only, the power of human will." + }, + { + "id": "fcc3f424-a9e1-46f9-a950-ef76df4b23b1", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Joyce Brothers", + "text": "Trust your hunches. They're usually based on facts filed away just below the conscious level." + }, + { + "id": "bb97f9e7-0842-43c7-a685-72b298035def", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Jules Poincare", + "text": "It is through science that we prove, but through intuition that we discover." + }, + { + "id": "534f3d95-d1b6-42bf-b4ca-230ec388c49a", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Julie Morgenstern", + "text": "Some people thrive on huge, dramatic change. Some people prefer the slow and steady route. Do what's right for you." + }, + { + "id": "2228b86d-ccfb-485f-b4a7-54554946a73b", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Julius Charles Hare", + "text": "Be what you are. This is the first step toward becoming better than you are." + }, + { + "id": "0620f64f-3f97-4f86-9776-1e32feef733f", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Kahlil Gibran", + "text": "A little knowledge that acts is worth infinitely more than much knowledge that is idle." + }, + { + "id": "d3ed7f4f-d87a-4baa-a165-83658e53ddfc", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Kahlil Gibran", + "text": "To understand the heart and mind of a person, look not at what he has already achieved, but at what he aspires to do." + }, + { + "id": "3f523b93-44b4-4d72-9177-dd789258efc5", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Kahlil Gibran", + "text": "Beauty is not in the face; beauty is a light in the heart." + }, + { + "id": "c755411d-170f-404f-8934-ce5665c15581", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Kahlil Gibran", + "text": "We choose our joys and sorrows long before we experience them." + }, + { + "id": "800bc4c7-0bde-4788-890e-3d299f81ef81", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Kahlil Gibran", + "text": "Be like the flower, turn your face to the sun." + }, + { + "id": "b1dc1ad9-dba5-42be-8597-b3e461f09196", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Karen Clark", + "text": "Life is change. Growth is optional. Choose wisely." + }, + { + "id": "9af503af-d68a-438c-9e8c-ba98e3443494", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Katherine Mansfield", + "text": "Make it a rule of life never to regret and never to look back. Regret is an appalling waste of energy; you can't build on it; it's only for wallowing in." + }, + { + "id": "7662bdf2-4df5-4c4c-abe1-7a2bbbad0523", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Kathleen Norris", + "text": "All that is necessary is to accept the impossible, do without the indispensable, and bear the intolerable." + }, + { + "id": "61ca50da-528e-4516-8978-f7673c2c304f", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": ["creative", "creativity", "original", "originality", "wrong", "mistakes"], + "source": "https://www.ted.com/talks/sir_ken_robinson_do_schools_kill_creativity", + "author": "Ken Robinson", + "text": "If you're not prepared to be wrong, you'll never come up with anything original." + }, + { + "id": "d5681638-ba48-4491-aecf-1c869e99a73e", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ken S. Keyes", + "text": "To be upset over what you don't have is to waste what you do have." + }, + { + "id": "2f3cf26b-c5a2-46bd-9a16-63723d9e3bdb", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Kenji Miyazawa", + "text": "We must embrace pain and burn it as fuel for our journey." + }, + { + "id": "bbe7f511-8fad-4206-b0f5-d439b892c9d0", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Kenneth Patton", + "text": "We learn what we have said from those who listen to our speaking." + }, + { + "id": "aabebd4f-b6e9-4ab0-bbaf-71201a72815d", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Keshavan Nair", + "text": "With courage you will dare to take risks, have the strength to be compassionate, and the wisdom to be humble. Courage is the foundation of integrity." + }, + { + "id": "f884254c-47f9-411a-a11a-152433b69d19", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Kin Hubbard", + "text": "You won't skid if you stay in a rut." + }, + { + "id": "b1f49432-1f60-4149-8cf0-11788083748d", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Korean proverb", + "text": "If you kick a stone in anger, you'll hurt your own foot." + }, + { + "id": "99a44472-8bfa-4443-ae02-31679f24512c", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lama Yeshe", + "text": "Be gentle first with yourself if you wish to be gentle with others." + }, + { + "id": "7d60d833-9670-47e4-9921-a37c87658283", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lama Yeshe", + "text": "It is never too late. Even if you are going to die tomorrow, keep yourself straight and clear and be a happy human being today." + }, + { + "id": "6a5a5633-5c44-4377-8a16-7f14c4b2295b", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "Be the chief but never the lord." + }, + { + "id": "4a1cc7b4-aec9-43fb-9e89-80e9ce545c04", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "To lead people walk behind them." + }, + { + "id": "16132729-dd42-4a42-ab56-19282189d2d4", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "Doing nothing is better than being busy doing nothing." + }, + { + "id": "51deb30f-83c8-470a-be1e-e88c04420aed", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "Anticipate the difficult by managing the easy." + }, + { + "id": "4ab329c5-e560-4eaf-86e6-01ca9fa8bff2", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "He who talks more is sooner exhausted." + }, + { + "id": "207a9685-f326-42fa-892c-276475af6fcd", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "He who is contented is rich." + }, + { + "id": "bc502f2b-e13a-425a-99f0-691f8f181cd2", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "The journey of a thousand miles begins with one step." + }, + { + "id": "a2987c3d-e601-4a03-979d-e020b0c50d55", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "An ant on the move does more than a dozing ox" + }, + { + "id": "b9c1d7a3-175f-4894-9cc6-b2b853ab8465", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "If you correct your mind, the rest of your life will fall into place." + }, + { + "id": "cec5f674-cff0-4bb3-bd93-1ae411d8c3ec", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "If you would take, you must first give, this is the beginning of intelligence." + }, + { + "id": "09679da4-2987-4943-ae99-2c52c8b91de1", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "The wise man does not lay up his own treasures. The more he gives to others, the more he has for his own." + }, + { + "id": "bcc67c8b-719f-4377-b1a5-30ac2ad81163", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "Great indeed is the sublimity of the Creative, to which all beings owe their beginning and which permeates all heaven." + }, + { + "id": "47ef12a9-399c-4273-bdbb-be49dd49ceb1", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "At the center of your being you have the answer; you know who you are and you know what you want." + }, + { + "id": "f792aef8-ed49-49d1-8923-8a8af4487512", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "When you are content to be simply yourself and don't compare or compete, everybody will respect you." + }, + { + "id": "774dd0ac-efec-4834-9602-39ebd29bc78a", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "All difficult things have their origin in that which is easy, and great things in that which is small." + }, + { + "id": "3f66fc2d-a838-45a2-a5fa-ecd8fc66ae16", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "I have just three things to teach: simplicity, patience, compassion. These three are your greatest treasures." + }, + { + "id": "6e243853-7544-47cd-a021-0f04ea1d7432", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "When you realize there is nothing lacking, the whole world belongs to you." + }, + { + "id": "31c45201-aadb-4614-b918-58ef0fcf3fb6", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "By letting it go it all gets done. The world is won by those who let it go. But when you try and try. The world is beyond the winning." + }, + { + "id": "c9ebc3ac-239d-4486-9f11-1f6d1d2e6cd4", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "He who conquers others is strong; He who conquers himself is mighty." + }, + { + "id": "d7204a9c-c653-4ca9-83d6-c25b060f3307", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "He who obtains has little. He who scatters has much." + }, + { + "id": "44bc32f8-b046-4c1b-9d07-d64501e3774d", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "Silence is a source of great strength." + }, + { + "id": "ed69b5ea-0097-4684-af18-96f4c239bc44", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "If you do not change direction, you may end up where you are heading." + }, + { + "id": "5c652c26-5920-40f5-8894-b18531d3d9df", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "From wonder into wonder existence opens." + }, + { + "id": "d18c1c9f-ae80-487a-ab97-fc5d85172273", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "He who knows himself is enlightened." + }, + { + "id": "7351b329-165d-4566-b00d-5343bc2cbf36", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "Great acts are made up of small deeds." + }, + { + "id": "b2532210-c8e4-4756-8347-71e8c6acba59", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "Nothing is softer or more flexible than water, yet nothing can resist it." + }, + { + "id": "40b5e396-936c-420d-bdcb-c2c7a303f143", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "When I let go of what I am, I become what I might be." + }, + { + "id": "e684207a-4d45-4e57-90d8-d1d8d10fa8e6", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "He who controls others may be powerful, but he who has mastered himself is mightier still." + }, + { + "id": "330d110b-e8c5-4108-a5f3-faf8e7a43745", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "To see things in the seed, that is genius." + }, + { + "id": "0d1023f2-8881-497e-a1fb-6ecdce4fe3ca", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "The key to growth is the introduction of higher dimensions of consciousness into our awareness." + }, + { + "id": "c0ba5528-5f13-4f8f-97b4-61d5ab87c1d8", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "He who knows, does not speak. He who speaks, does not know." + }, + { + "id": "4459b4de-b1e2-4d10-af57-426071bcb9d3", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "Kindness in words creates confidence. Kindness in thinking creates profoundness. Kindness in giving creates love." + }, + { + "id": "877c9a43-fa29-41fd-ac28-f7caace3a07f", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "A leader is best when people barely know he exists, when his work is done, his aim fulfilled, they will say: we did it ourselves." + }, + { + "id": "571e2368-adb9-4c3f-97ae-6ad172f0e68b", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "He who knows others is wise. He who knows himself is enlightened." + }, + { + "id": "2d8148c5-eeeb-4add-a9b7-f9d33b2a71ab", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "One who is too insistent on his own views, finds few to agree with him." + }, + { + "id": "23676e8c-9afa-48a5-aeb6-3b6c29b4b5c7", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "Give a man a fish and you feed him for a day. Teach him how to fish and you feed him for a lifetime." + }, + { + "id": "dd664fce-5e7c-4e1a-83b1-cd1f25fa5d9b", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "He who knows that enough is enough will always have enough." + }, + { + "id": "9e12fc61-6e51-4e42-bd74-17fe3bb30557", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao Tzu", + "text": "Music in the soul can be heard by the universe." + }, + { + "id": "1ba5df96-e6bf-4ebd-bffe-a4481a112d52", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lao-Tzu", + "text": "All difficult things have their origin in that which is easy, and great things in that which is small." + }, + { + "id": "2d64c17d-8f94-4f27-a88e-7c8b5e221772", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Laozi", + "text": "When you are content to be simply yourself and don't compare or compete, everybody will respect you." + }, + { + "id": "71adf974-70ee-45b1-9a8f-cc634713313b", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Laozi", + "text": "The power of intuitive understanding will protect you from harm until the end of your days." + }, + { + "id": "8a06a7ef-b882-4210-88e4-e8ad35c47661", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Larry Elder", + "text": "A goal without a plan is just a wish." + }, + { + "id": "633c9b51-b48b-461e-a521-9b91af57fb6f", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Laura Teresa Marquez", + "text": "Arrogance and rudeness are training wheels on the bicycle of life for weak people who cannot keep their balance without them." + }, + { + "id": "ad67c6d9-a2a4-4964-b82c-5ebb72ba08af", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lauren Bacall", + "text": "Imagination is the highest kite one can fly." + }, + { + "id": "7e1e5225-1a29-437a-a152-bd7df6a4b0dc", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lauren Raffo", + "text": "Sometimes the biggest act of courage is a small one." + }, + { + "id": "68ad7a30-c55c-4d32-ae86-4c872dc557e5", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Laurence J. Peter", + "text": "There are two kinds of failures: those who thought and never did, and those who did and never thought." + }, + { + "id": "b96b2ca0-a7c6-4a9f-a6a1-73fc6acbf9aa", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lawrence Peter", + "text": "If you don't know where you are going, you will probably end up somewhere else." + }, + { + "id": "ebd53af3-2568-4b9b-9477-ec6ce077552c", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lazurus Long", + "text": "Great is the art of beginning, but greater is the art of ending." + }, + { + "id": "61b8e110-887c-43f8-bf12-f75f5ce6e251", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lee Mildon", + "text": "People seldom notice old clothes if you wear a big smile." + }, + { + "id": "6ffc9bd7-4d34-4b1b-95e3-4a331a6f01cf", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lee Womack", + "text": "I think you can have moderate success by copying something else, but if you really want to knock it out of the park, you have to do something different and take chances." + }, + { + "id": "0e7a61f7-b697-4ee3-9af3-99936fce33a3", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lena Horne", + "text": "Always be smarter than the people who hire you." + }, + { + "id": "3380932c-1543-45e6-bcac-7b4f12be0ee2", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leo Aikman", + "text": "Blessed is the person who is too busy to worry in the daytime, and too sleepy to worry at night." + }, + { + "id": "5ee93b17-7d6b-405a-9cb5-ac644a7ec801", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leo Buscaglia", + "text": "Never idealize others. They will never live up to your expectations." + }, + { + "id": "5f926542-4cc7-4639-8ee4-7078f4c34efe", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leo F. Buscaglia", + "text": "Don't smother each other. No one can grow in the shade." + }, + { + "id": "ae53373e-d8ec-4ee7-9c4d-5f02b3269082", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leo Tolstoy", + "text": "The two most powerful warriors are patience and time." + }, + { + "id": "2fdc3951-972c-4e3f-963a-370391f27ebf", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leo Tolstoy", + "text": "Everyone thinks of changing the world, but no one thinks of changing himself." + }, + { + "id": "52cdb601-c57b-4f2c-be13-a95ca350f517", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leo Tolstoy", + "text": "We lost because we told ourselves we lost." + }, + { + "id": "2262f673-50c7-4908-a847-7746f7b941f7", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leon Blum", + "text": "The free man is he who does not fear to go to the end of his thought." + }, + { + "id": "37b2b767-a8bc-48f0-be15-d3148e91fd14", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leonardo Ruiz", + "text": "The only difference between your abilities and others is the ability to put yourself in their shoes and actually try." + }, + { + "id": "20f32a2c-44a5-4e8d-b014-7127c1d9bb74", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leonardo da Vinci", + "text": "Who sows virtue reaps honour." + }, + { + "id": "61362b4d-0291-4d32-9ecd-509b0fb81fc1", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leonardo da Vinci", + "text": "All our knowledge has its origins in our perceptions." + }, + { + "id": "adee5f99-24c2-4eaf-9c77-3dda37ed4660", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leonardo da Vinci", + "text": "Nothing strengthens authority so much as silence." + }, + { + "id": "b54db530-826b-4e6f-9b16-f78ec515c13e", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leonardo da Vinci", + "text": "Iron rusts from disuse; water loses its purity from stagnation... even so does inaction sap the vigour of the mind." + }, + { + "id": "b62ccbc6-b51b-49d0-a523-91520fd34461", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leonardo da Vinci", + "text": "He who is fixed to a star does not change his mind." + }, + { + "id": "a4a66814-ab42-4965-844d-9f404b8eb0f0", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leonardo da Vinci", + "text": "Time stays long enough for anyone who will use it." + }, + { + "id": "108789fd-025d-4cba-9f1d-dcf5f81fd97a", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leonardo da Vinci", + "text": "In rivers, the water that you touch is the last of what has passed and the first of that which comes; so with present time." + }, + { + "id": "d17d67e0-cd1e-43ff-9122-66bcef3cbcad", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Leonardo da Vinci", + "text": "I have been impressed with the urgency of doing. Knowing is not enough; we must apply. Being willing is not enough; we must do." + }, + { + "id": "c26943b9-7455-430f-a039-235e21a6d9d3", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Les Brown", + "text": "Shoot for the moon. Even if you miss, you'll land among the stars." + }, + { + "id": "0aead319-bc83-45d9-8045-3415e47f29ef", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lewis B. Smedes", + "text": "To forgive is to set a prisoner free and realize that prisoner was you." + }, + { + "id": "5bcd59c8-76cf-4f5c-b45b-af544b9ac1cc", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lewis Cass", + "text": "People may doubt what you say, but they will believe what you do." + }, + { + "id": "ea8868d9-72f9-44d0-a908-e0e89e1d2fad", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Liberace", + "text": "Nobody will believe in you unless you believe in yourself." + }, + { + "id": "1b96272b-8e00-4fd1-aaaa-5fcfa034c2cc", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lily Tomlin", + "text": "I always wanted to be somebody, but I should have been more specific." + }, + { + "id": "27711f00-d4d6-4ef6-9834-849d252302ca", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lin-yutang", + "text": "I have done my best: that is about all the philosophy of living one needs." + }, + { + "id": "de4a3690-81cb-465b-83ee-5095a6c0361f", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Linda Hogan", + "text": "There is a way that nature speaks, that land speaks. Most of the time we are simply not patient enough, quiet enough, to pay attention to the story." + }, + { + "id": "f8a9d0e9-87a7-45bd-b935-ae87f4c1c830", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lisa Alther", + "text": "Thats the risk you take if you change: that people you've been involved with won't like the new you. But other people who do will come along." + }, + { + "id": "f0cab37a-f112-4d6a-8ad7-d5d6101795f7", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lloyd Jones", + "text": "Those who try to do something and fail are infinitely better than those who try nothing and succeed." + }, + { + "id": "66f1b972-5b13-4aa6-a005-3636800c56f1", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lord Herbert", + "text": "The shortest answer is doing." + }, + { + "id": "95c14da1-2115-40bc-8b65-93a65e8d1ed4", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lou Holtz", + "text": "You were not born a winner, and you were not born a loser. You are what you make yourself be." + }, + { + "id": "4d6424cc-e691-48e1-b9e4-a480497b180a", + "isDeleted": false, + "createdAt": 1613993133679, + "updatedAt": 1613993133679, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lou Holtz", + "text": "Ability is what you're capable of doing. Motivation determines what you do.Attitude determines how well you do it." + }, + { + "id": "bab8bbcc-74d6-49b4-9961-480ebdda7deb", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lou Holtz", + "text": "I can't believe that God put us on this earth to be ordinary." + }, + { + "id": "055500df-98c0-4b02-939b-f99843f0796d", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": ["creativity", "prepared", "preparedness"], + "source": "https://www.goodreads.com/quotes/9178", + "author": "Louis Pasteur", + "text": "Chance favors the prepared mind." + }, + { + "id": "d3f07004-2009-4bb9-a1ed-a5593dfeacac", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Louis Pasteur", + "text": "Let me tell you the secret that has led me to my goal: my strength lies solely in my tenacity." + }, + { + "id": "f661db68-c3f6-4bb7-b2a1-5cbb49d980ea", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Louisa Alcott", + "text": "I'm not afraid of storms, for I'm learning how to sail my ship." + }, + { + "id": "699cd328-2898-425a-a580-ad3497e2c398", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Louisa Alcott", + "text": "I'm not afraid of storms, for Im learning how to sail my ship." + }, + { + "id": "7a9a561c-1791-4abf-ae29-35ae0f503d3e", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Louise Hay", + "text": "The thoughts we choose to think are the tools we use to paint the canvas of our lives." + }, + { + "id": "23b249b8-0a60-4c89-99a4-18cedeb898a2", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lucille Ball", + "text": "Id rather regret the things that I have done than the things that I have not done." + }, + { + "id": "61aa9a71-8955-447c-9c42-835ac89e5166", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lucille Ball", + "text": "I have an everyday religion that works for me. Love yourself first, and everything else falls into line." + }, + { + "id": "d9344b00-98e9-4111-b401-35f3864ad19b", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Luisa Sigea", + "text": "Blaze with the fire that is never extinguished." + }, + { + "id": "66cb02d9-84fd-45fc-9a24-d6eb5f02fc6a", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Lululemon", + "text": "Your outlook on life is a direct reflection on how much you like yourself." + }, + { + "id": "cf5f1784-5ec7-4965-9f92-ab2463f2e735", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "M. Scott Peck", + "text": "Until you value yourself, you won't value your time. Until you value your time, you won't do anything with it." + }, + { + "id": "21f5fb84-8f99-4de6-bde4-878baae27aa1", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mabel Newcomber", + "text": "It is more important to know where you are going than to get there quickly. Do not mistake activity for achievement." + }, + { + "id": "33b49cb9-b11b-443f-aa8c-afdce24d40d6", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Madame de Stael", + "text": "Society develops wit, but its contemplation alone forms genius." + }, + { + "id": "1e9f50ae-c6e2-421a-b722-d8dae4466cf3", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Madame de Stael", + "text": "Wit lies in recognizing the resemblance among things which differ and the difference between things which are alike." + }, + { + "id": "671cc7a4-b415-4490-aac1-f566df881de4", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mahatma Gandhi", + "text": "We must become the change we want to see." + }, + { + "id": "7f3ffe44-66fd-412c-bcd1-0888e8607e5d", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": ["action", "change", "world", "present", "future", "today"], + "source": "https://www.goodreads.com/quotes/16418", + "author": "Mahatma Gandhi", + "text": "The future depends on what you do today." + }, + { + "id": "856c1d02-6ec5-4446-9e24-79d2e206bba5", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mahatma Gandhi", + "text": "Live as if you were to die tomorrow. Learn as if you were to live forever." + }, + { + "id": "d4fc9371-32dc-45c7-99c9-448c543b91ef", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mahatma Gandhi", + "text": "Strength does not come from physical capacity. It comes from an indomitable will." + }, + { + "id": "eb129caa-8fbf-4feb-97bd-29c10262debb", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mahatma Gandhi", + "text": "It is the quality of our work which will please God, not the quantity." + }, + { + "id": "a260d039-d12e-47d2-8f24-a2ff424794ea", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mahatma Gandhi", + "text": "Our greatness lies not so much in being able to remake the world as being able to remake ourselves." + }, + { + "id": "67d67bfb-3d59-47a1-8be8-e97d94dd0aea", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mahummad Ali", + "text": "To be able to give away riches is mandatory if you wish to possess them. This is the only way that you will be truly rich." + }, + { + "id": "9da18f53-36fe-49ce-976f-341da6d8d28f", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mal Pancoast", + "text": "The odds of hitting your target go up dramatically when you aim at it." + }, + { + "id": "1be9ff70-b046-4542-9d3f-56aafe2b1052", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": ["education", "future", "tomorrow", "today"], + "source": "https://www.goodreads.com/quotes/788", + "author": "Malcolm X", + "text": "Education is our passport to the future, for tomorrow belongs to the people who prepare for it today." + }, + { + "id": "c494f4ba-faee-4e69-ac7d-4c04babf44bc", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Man Ray", + "text": "It has never been my object to record my dreams, just to realize them." + }, + { + "id": "2e8aeba8-9a28-4d84-b34a-a1b9bb39759c", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Manuel Puig", + "text": "I allow my intuition to lead my path." + }, + { + "id": "623d75ee-69ff-4fd7-9901-24b8e646055f", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maori proverb", + "text": "Turn your face toward the sun and the shadows will fall behind you." + }, + { + "id": "1792ab77-9d2d-475b-a083-5133caf15123", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcel Proust", + "text": "Let us be grateful to people who make us happy; they are the charming gardeners who make our souls blossom." + }, + { + "id": "d7e9d93b-bd78-45f9-a846-90eaa91506fe", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "Each day provides its own gifts." + }, + { + "id": "5043a5bd-9ffc-4e3d-9982-3cbd7b5c6939", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "Loss is nothing else but change,and change is Natures delight." + }, + { + "id": "dc1b6659-eb4b-4bd4-bfc1-20e5e799b047", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "Everything that happens happens as it should, and if you observe carefully, you will find this to be so." + }, + { + "id": "89cab1a4-b680-47f4-8584-96159323c8bc", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "Very little is needed to make a happy life; it is all within yourself, in your way of thinking." + }, + { + "id": "372f1641-e1eb-4aa0-a1ff-c77cf3e8a07e", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "If it is not right do not do it; if it is not true do not say it." + }, + { + "id": "dcd0ad28-4093-49d3-96d8-01f96d27e929", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "You have power over your mind not outside events. Realize this, and you will find strength." + }, + { + "id": "0a04c4a2-ff24-49c3-9d94-2141ac2e22c5", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "He who lives in harmony with himself lives in harmony with the universe." + }, + { + "id": "a8dd9f73-2cb0-440f-b077-89b2e8674643", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "The universe is transformation; our life is what our thoughts make it." + }, + { + "id": "b7fc9a8c-65af-4b2e-8978-c4fd0d570e7a", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "Look back over the past, with its changing empires that rose and fell, and you can foresee the future, too." + }, + { + "id": "4491f5a3-f436-4b60-bc7a-083de91c5d8b", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "When you arise in the morning, think of what a precious privilege it is to be alive to breathe, to think, to enjoy, to love." + }, + { + "id": "f6a5606d-a61a-48aa-9eff-43be0bd63fe3", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "Accept the things to which fate binds you, and love the people with whom fate brings you together, but do so with all your heart." + }, + { + "id": "7c0aa0c1-0aca-4fb7-a83f-ba24eed19a21", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "Everything that exists is in a manner the seed of that which will be." + }, + { + "id": "4f8cfa94-51f5-4cb0-b3c2-00654239e2bf", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "He who lives in harmony with himself lives in harmony with the world." + }, + { + "id": "607acdfb-5197-4f19-8b51-cd6a0c6f38f6", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "Waste no more time arguing about what a good man should be. Be one." + }, + { + "id": "96f1b55f-8c04-455f-8dd8-252bd9242e83", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "There is nothing happens to any person but what was in his power to go through with." + }, + { + "id": "24c79fdc-b40f-4264-889b-edcfe72b227d", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "Everything we hear is an opinion, not a fact. Everything we see is a perspective, not the truth." + }, + { + "id": "7ef9edeb-c58c-43ba-aacb-f7a554450f51", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "You have power over your mind, not outside events. Realize this, and you will find strength." + }, + { + "id": "5cecfb99-61b2-4e1e-aaad-1f30637c739f", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marcus Aurelius", + "text": "When you arise in the morning, think of what a precious privilege it is to be alive, to breathe, to think, to enjoy, to love." + }, + { + "id": "8fe8255a-db47-46a2-bf8f-a0486c56dc57", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Margaret Bonnano", + "text": "It is only possible to live happily ever after on a day to day basis." + }, + { + "id": "57ecc6ce-1b18-42ef-9171-c976b5ffdc93", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Margaret Cousins", + "text": "Appreciation can make a day, even change a life. Your willingness to put it into words is all that is necessary." + }, + { + "id": "74214b96-43b8-443f-bf90-d4abd883fbef", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Margaret Fuller", + "text": "If you have knowledge, let others light their candles in it." + }, + { + "id": "41816dda-854d-4e9b-bb43-80e47c00e02f", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Margaret Laurence", + "text": "Know that although in the eternal scheme of things you are small, you are also unique and irreplaceable, as are all your fellow humans everywhere in the world." + }, + { + "id": "730bc69f-0b4f-4dd0-aed4-012be3ec66ec", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Margaret Mead", + "text": "Never doubt that a small group of thoughtful, committed people can change the world. Indeed. It is the only thing that ever has." + }, + { + "id": "2c9945ee-a0e8-46cb-adac-d4318b5920c3", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Margaret Runbeck", + "text": "Silences make the real conversations between friends. Not the saying but the never needing to say is what counts." + }, + { + "id": "fa00b250-60bf-4f80-9d3f-d5b1169f0e26", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Margaret Sangster", + "text": "Self-complacency is fatal to progress." + }, + { + "id": "ca28c293-2c29-4caf-b9be-5b86b740e205", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Margaret Smith", + "text": "The right way is not always the popular and easy way. Standing for right when it is unpopular is a true test of moral character." + }, + { + "id": "41b7aa39-5a98-41db-9206-e1b148ccda49", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Margaret Wheatley", + "text": "We know from science that nothing in the universe exists as an isolated or independent entity." + }, + { + "id": "c84b7580-21a7-40d2-a88f-d523c5f76903", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marian Edelman", + "text": "You're not obligated to win. You're obligated to keep trying to do the best you can every day." + }, + { + "id": "2e94935b-08cd-4237-b15a-f299d976d681", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marian Edelman", + "text": "You really can change the world if you care enough." + }, + { + "id": "c0392fe5-6cb3-4c7b-a547-a11880b4c8d9", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marianne Williamson", + "text": "Joy is what happens to us when we allow ourselves to recognize how good things really are." + }, + { + "id": "3e1bf355-898e-4357-8f9c-39d3d25f4c98", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marie Curie", + "text": "I never see what has been done; I only see what remains to be done." + }, + { + "id": "782cd9e3-8d3c-4be6-9991-495b5f8cfa73", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marie Curie", + "text": "Nothing in life is to be feared. It is only to be understood." + }, + { + "id": "2d6a4686-55bf-49bf-9db2-60f6d1bab53d", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marie Curie", + "text": "Nothing in life is to be feared, it is only to be understood. Now is the time to understand more, so that we may fear less." + }, + { + "id": "8857fc86-d84b-435d-b8e9-30cdad19e4f1", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marie Curie", + "text": "Be less curious about people and more curious about ideas." + }, + { + "id": "78d94e9a-5461-4b5a-bc7b-efe4087242ab", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "A thing long expected takes the form of the unexpected when at last it comes." + }, + { + "id": "76f73fdb-c6fd-4127-8383-5dd35ec657c8", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "Happiness is a Swedish sunset it is there for all, but most of us look the other way and lose it." + }, + { + "id": "b79fb149-bcbb-4872-9a9c-53a84c3ceb5d", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "Always tell the truth. That way, you don't have to remember what you said." + }, + { + "id": "aa86231e-91b0-419c-a733-c3cfbe7d0f3e", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "When in doubt, tell the truth." + }, + { + "id": "aa3c0284-e468-49a4-bb0a-6dfd22a993f4", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "Whoever is happy will make others happy, too." + }, + { + "id": "76d38996-6aaf-4553-b806-f3fecd94a1ac", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "The exercise of an extraordinary gift is the supremest pleasure in life." + }, + { + "id": "48f0d612-6ee0-4fe4-abcf-c6f79b993796", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "Kindness is the language which the deaf can hear and the blind can see." + }, + { + "id": "3372f6fd-e2a3-419c-9f3f-cbf6cbe94074", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "There are basically two types of people. People who accomplish things, and people who claim to have accomplished things. The first group is less crowded." + }, + { + "id": "27dc3d34-1be8-42e3-89d2-65ad478c801a", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "Wrinkles should merely indicate where smiles have been." + }, + { + "id": "a8b271c5-79a2-4321-8254-dfdd3be5b196", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "To get the full value of joy you must have someone to divide it with." + }, + { + "id": "26941d05-6afc-41ce-92c5-483248736f20", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mark Twain", + "text": "Happiness is a sunset - it is there for all, but most of us look the other way and lose it." + }, + { + "id": "43329511-583f-4aac-a602-debf3a3962b6", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marquis Vauvenargues", + "text": "Wicked people are always surprised to find ability in those that are good." + }, + { + "id": "89596ff4-a6c7-442b-9c82-fa8cf4777306", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Marsha Petrie Sue", + "text": "Stay away from what might have been and look at what will be." + }, + { + "id": "04c1c52b-ac8d-4f6c-9078-2b1109a22532", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Martha Washington", + "text": "The greatest part of our happiness depends on our dispositions, not our circumstances." + }, + { + "id": "1163d93a-04f8-48da-937d-48160b1a4b6e", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Martin Fischer", + "text": "Knowledge is a process of piling up facts; wisdom lies in their simplification." + }, + { + "id": "4e04f72f-6c61-46ae-bf20-51a4545f0e24", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Martin Luther King, Jr.", + "text": "Love is the only force capable of transforming an enemy into friend." + }, + { + "id": "3e784be2-f0a4-4a43-9128-9b864e8ea37d", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mary Almanac", + "text": "Who we are never changes. Who we think we are does." + }, + { + "id": "bf24c5e8-c4b5-4629-aa47-ee2769da5578", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mary Bethune", + "text": "Without faith, nothing is possible. With it, nothing is impossible." + }, + { + "id": "c02bfaf9-04fe-4bb9-8d39-b0551b7a4dec", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mary Kay Ash", + "text": "Aerodynamically the bumblebee shouldn't be able to fly, but the bumblebee doesn't know that so it goes on flying anyway." + }, + { + "id": "82b5cac0-5e79-4e0e-9b16-d6134de8118e", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mary Kay Ash", + "text": "Those who are blessed with the most talent don't necessarily outperform everyone else. It's the people with follow-through who excel." + }, + { + "id": "db323fad-ec42-4b81-82bf-402c4e6361f6", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mary Kay Ash", + "text": "For every failure, there's an alternative course of action. You just have to find it. When you come to a roadblock, take a detour." + }, + { + "id": "5eeb0204-a32a-4133-b048-625f50455cf5", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mary Morrissey", + "text": "You block your dream when you allow your fear to grow bigger than your faith." + }, + { + "id": "0679cf09-08e9-4dce-bd3d-b8749e46d8a7", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mary Parrish", + "text": "Love vanquishes time. To lovers, a moment can be eternity, eternity can be the tick of a clock." + }, + { + "id": "063de845-7cf8-4620-bd70-8cd4a447bfc8", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mary Pickford", + "text": "If you have made mistakes, there is always another chance for you. You may have a fresh start any moment you choose." + }, + { + "id": "5510f0c8-107c-4dd2-8ddf-fbc08d2d5229", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mary Wollstonecraft", + "text": "The beginning is always today." + }, + { + "id": "6da4dc6b-eeed-486e-aac2-490a23595a24", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Matt Zotti", + "text": "Live through feeling and you will live through love. For feeling is the language of the soul, and feeling is truth." + }, + { + "id": "3cd54390-3b88-41e3-9178-f440af4fb912", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maureen Dowd", + "text": "The minute you settle for less than you deserve, you get even less than you settled for." + }, + { + "id": "d1bb9df5-e36f-4a86-927b-d4a7eb779002", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Max Planck", + "text": "It is not the possession of truth, but the success which attends the seeking after it, that enriches the seeker and brings happiness to him." + }, + { + "id": "a6b3e7b3-97bc-4d42-9275-5c1fc99a600c", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "May Sarton", + "text": "A garden is always a series of losses set against a few triumphs, like life itself." + }, + { + "id": "112b3eaa-2ddb-4ce0-9530-f9b73c061e57", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maya Angelou", + "text": "I believe that every person is born with talent." + }, + { + "id": "df701ec2-78f4-47f6-881f-bf93b3a52dd3", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maya Angelou", + "text": "If you don't like something, change it. If you can't change it, change your attitude." + }, + { + "id": "3113d7c8-8539-48a7-ad31-95d391e86f23", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maya Angelou", + "text": "If one is lucky, a solitary fantasy can totally transform one million realities." + }, + { + "id": "9fc7ae27-6a06-4401-8af4-e449a83d3f41", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maya Angelou", + "text": "When you learn, teach. When you get, give." + }, + { + "id": "07e54cee-400e-4728-9cd8-d0a37498280b", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maya Angelou", + "text": "All great achievements require time." + }, + { + "id": "edff856a-0847-47db-a2e5-5e8cb1ff806f", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maya Angelou", + "text": "We may encounter many defeats but we must not be defeated." + }, + { + "id": "af16dcde-9b89-4292-8f9a-3a02f197b1b7", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maya Angelou", + "text": "Prejudice is a burden that confuses the past, threatens the future and renders the present inaccessible." + }, + { + "id": "b24538d3-21c5-4382-938d-c47aa5043d25", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maya Angelou", + "text": "Nothing will work unless you do." + }, + { + "id": "5f241032-ee25-494d-b8dd-fde3d78cd85e", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": ["curiosity", "limitless"], + "source": "https://www.goodreads.com/quotes/153929", + "author": "Maya Angelou", + "text": "You can't use up creativity. The more you use, the more you have." + }, + { + "id": "077a8ffd-a742-4d2e-bdba-1c380a6bde70", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Maya Lin", + "text": "To fly, we have to have resistance." + }, + { + "id": "d4a41207-4924-4c1a-963a-e1388c3eb3dd", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Melody Beattie", + "text": "Gratitude makes sense of our past, brings peace for today, and creates a vision for tomorrow." + }, + { + "id": "994dce3a-6de0-4e4a-b9c9-2aeae950179d", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Michael Burke", + "text": "Good instincts usually tell you what to do long before your head has figured it out." + }, + { + "id": "101968bd-5704-4817-8ac4-ec77fe4f3f83", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Michael Jordan", + "text": "If you accept the expectations of others, especially negative ones, then you never will change the outcome." + }, + { + "id": "5d7af012-38b4-48d4-999e-3e28ae1cf7c0", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Michael Korda", + "text": "To succeed, we must first believe that we can." + }, + { + "id": "c873a5fc-6bf2-4d5a-aa37-3c6c10f7721f", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Michael Vance", + "text": "Life is not measured by the breaths you take, but by its breathtaking moments." + }, + { + "id": "4993a811-5596-486b-b551-9efee38b5c5d", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Michel de Montaigne", + "text": "I care not so much what I am to others as what I am to myself. I will be rich by myself, and not by borrowing." + }, + { + "id": "f26ede17-ead7-4cbd-8fe1-6a1c1b513d47", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Michelangelo", + "text": "Faith in oneself is the best and safest course." + }, + { + "id": "fb09c660-b16e-4b2b-8442-b1604f528409", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Michelangelo", + "text": "There is no greater harm than that of time wasted." + }, + { + "id": "eeaaacb6-4bf9-418b-a860-aa37a51af0f3", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Michelangelo", + "text": "The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it." + }, + { + "id": "4319cbdd-6a4a-47ed-9c41-cec08efad9e1", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": ["time", "waste"], + "source": "https://www.brainyquote.com/quotes/michelangelo_183580", + "author": "Michelangelo", + "text": "There is no greater harm than that of time wasted." + }, + { + "id": "6d112c1a-2519-49e5-9b0d-c35655aac4e2", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mike Ditka", + "text": "You're never a loser until you quit trying." + }, + { + "id": "33ea4c9a-667f-4344-8a06-e97926d8692b", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mohandas Gandhi", + "text": "Happiness is when what you think, what you say, and what you do are in harmony." + }, + { + "id": "ca6ac332-18b0-47e4-b3e1-a8e4947ab5f4", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mohandas Gandhi", + "text": "The weak can never forgive. Forgiveness is the attribute of the strong." + }, + { + "id": "ac4ca9d3-bff7-4b80-9d25-c43dac71da16", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mohandas Gandhi", + "text": "Freedom is not worth having if it does not connote freedom to err." + }, + { + "id": "977765d6-8642-47fb-9df6-b3337231ca9c", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mohandas Gandhi", + "text": "Forgiveness is choosing to love. It is the first skill of self-giving love." + }, + { + "id": "a086fcc2-d97c-4a84-93d3-dbdfabb3a630", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mohandas Gandhi", + "text": "The difference between what we do and what we are capable of doing would suffice to solve most of the worlds problems." + }, + { + "id": "981a00a6-9b8b-4230-99a6-c7f8fc0e62e5", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mohandas Gandhi", + "text": "Be the change that you want to see in the world." + }, + { + "id": "8dff6f0e-2ed7-4b15-87fe-0fdf9e7ebe96", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Moliere", + "text": "It is not only for what we do that we are held responsible, but also for what we do not do." + }, + { + "id": "7b2e577f-1c49-429c-b01f-6bd3467be572", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Moncure Conway", + "text": "The best thing in every noble dream is the dreamer..." + }, + { + "id": "b7af09d7-7b95-4e87-955a-5d7256d30062", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Morris West", + "text": "If you spend your whole life waiting for the storm, you'll never enjoy the sunshine." + }, + { + "id": "bf3a15ab-0db2-4a40-a33e-88b348f86589", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mortimer Adler", + "text": "The purpose of learning is growth, and our minds, unlike our bodies, can continue growing as we continue to live." + }, + { + "id": "f8b0fcbe-818d-4537-96a2-9f57bff82169", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mother Teresa", + "text": "Every time you smile at someone, it is an action of love, a gift to that person, a beautiful thing." + }, + { + "id": "3fbb776d-ce48-483a-a6c3-808be00fc76c", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mother Teresa", + "text": "Be faithful in small things because it is in them that your strength lies." + }, + { + "id": "68fbec05-18f7-4fe7-88ba-ee7e0673a616", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mother Teresa", + "text": "Let us always meet each other with smile, for the smile is the beginning of love." + }, + { + "id": "77054ede-142f-4f99-af35-a11f256aeb54", + "isDeleted": false, + "createdAt": 1613993133680, + "updatedAt": 1613993133680, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mother Teresa", + "text": "We shall never know all the good that a simple smile can do." + }, + { + "id": "d4ddbc0c-9752-4106-ab87-cd37cb7b426b", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mother Teresa", + "text": "If you can't feed a hundred people, then feed just one." + }, + { + "id": "0f5dbd4a-9cea-4d8a-becb-0b8d7209e8c5", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mother Teresa", + "text": "Peace begins with a smile." + }, + { + "id": "727a7279-e2b4-4d9c-a0d5-7b4c6c6d14ad", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mother Teresa", + "text": "Kind words can be short and easy to speak but their echoes are truly endless." + }, + { + "id": "05e908ba-4a59-48fb-9dcf-08cd9b1594b6", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mother Teresa", + "text": "We can do no great things, only small things with great love." + }, + { + "id": "2355085e-19a7-4a48-8a8d-ccf2d8a2bf50", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mother Teresa", + "text": "Do not wait for leaders; do it alone, person to person." + }, + { + "id": "74ccc664-3f2f-49cd-8456-31d990b70495", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Mother Teresa", + "text": "Kind words can be short and easy to speak, but their echoes are truly endless." + }, + { + "id": "eaf27b3b-2050-481e-81f5-97ccc0081877", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Muriel Rukeyser", + "text": "The universe is made of stories, not atoms." + }, + { + "id": "e8a4aed5-56ab-4e1e-b24b-dd216bfd7fc6", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Murray Gell-Mann", + "text": "Think how hard physics would be if particles could think." + }, + { + "id": "06b1fb04-16e5-49a4-af83-4ad124039859", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Naguib Mahfouz", + "text": "You can tell whether a man is clever by his answers. You can tell whether a man is wise by his questions." + }, + { + "id": "3c833f66-1878-44dd-a277-3f7e75c08400", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Naomi Williams", + "text": "It is impossible to feel grateful and depressed in the same moment." + }, + { + "id": "8c5d7e7a-98e3-4786-b0f1-31d299e96215", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Bonaparte", + "text": "Victory belongs to the most persevering." + }, + { + "id": "d382417a-39da-4a3c-9cbf-d80f8874dd96", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Bonaparte", + "text": "The truest wisdom is a resolute determination." + }, + { + "id": "d720e006-8e95-446c-9340-737fcf2783e2", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Bonaparte", + "text": "Imagination rules the world." + }, + { + "id": "8ee3c566-d376-4027-a2bf-33404663e47d", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Bonaparte", + "text": "Take time to deliberate, but when the time for action has arrived, stop thinking and go in." + }, + { + "id": "72880b9d-51ef-4f86-a3f4-21f5935c1b37", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Bonaparte", + "text": "To do all that one is able to do, is to be a man; to do all that one would like to do, is to be a god." + }, + { + "id": "46c4c0c8-1b16-46da-b7f9-08390ff56726", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Bonaparte", + "text": "He who fears being conquered is sure of defeat." + }, + { + "id": "6ebe8645-95b5-44dc-895f-1fe4a6a1f558", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Bonaparte", + "text": "If you want a thing done well, do it yourself." + }, + { + "id": "cb603c1e-6849-4ca3-a08a-4150acf43d22", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Bonaparte", + "text": "The best cure for the body is a quiet mind." + }, + { + "id": "d4fff909-2360-45d3-817e-2f55d17589ea", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Ideas are the beginning points of all fortunes." + }, + { + "id": "e2afba73-e902-4ce9-9bde-3c27a83861c5", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Don't wait. The time will never be just right." + }, + { + "id": "69e19c5b-6504-411d-af17-5ba34a741809", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "You give before you get." + }, + { + "id": "6e363154-fc7b-458e-bfe6-9b987fc71218", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "A goal is a dream with a deadline." + }, + { + "id": "939e7067-b8e4-40ed-ba73-f2cb4ebbf51a", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "You can do it if you believe you can!" + }, + { + "id": "672f2219-7e55-406b-baaa-06610080d041", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "No alibi will save you from accepting the responsibility." + }, + { + "id": "1e47c9b9-bfb3-46a4-b4f2-fcd455159c5c", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Happiness is found in doing, not merely possessing." + }, + { + "id": "913883f9-eb0d-459f-9fef-e5fb5ee6e8fc", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Fears are nothing more than a state of mind." + }, + { + "id": "e8bf0588-c2b5-45e5-a3c9-3bca92dbc82d", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Most great people have attained their greatest success just one step beyond their greatest failure." + }, + { + "id": "eeec5a54-3359-45e8-928a-ba681ca2cd47", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "When your desires are strong enough you will appear to possess superhuman powers to achieve." + }, + { + "id": "2b23f294-ad55-4812-90aa-b269f0988b21", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "No man can succeed in a line of endeavor which he does not like." + }, + { + "id": "b391b192-8d53-4ae7-ac8c-8127e7beca10", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "If you cannot do great things, do small things in a great way." + }, + { + "id": "95a2f117-c7b7-4259-9c2e-c9162bf52243", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Cherish your visions and your dreams as they are the children of your soul, the blueprints of your ultimate achievements." + }, + { + "id": "20928b72-4541-48eb-b336-f4042f9e66c3", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Cherish your visions and your dreams as they are the children of your soul; the blueprints of your ultimate achievements." + }, + { + "id": "c24ff92e-850c-4bd7-9eda-e5c2b607328c", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Edison failed 10,000 times before he made the electric light. Do not be discouraged if you fail a few times." + }, + { + "id": "e21bcdf4-7a2f-467c-a5f8-316e5d635cb0", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Every adversity, every failure, every heartache carries with it the seed of an equal or greater benefit." + }, + { + "id": "3909ea8d-6cbf-4e1f-9d67-09757f8c338c", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "All achievements, all earned riches, have their beginning in an idea." + }, + { + "id": "fedd54f1-1d10-499c-951d-7bdeacb068f0", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "You might well remember that nothing can bring you success but yourself." + }, + { + "id": "eccdd401-b5bc-4780-8638-bac2195fadd8", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Your big opportunity may be right where you are now." + }, + { + "id": "993a68e7-163c-43cc-aeef-b1e5e6cae3f7", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Opportunity often comes disguised in the form of misfortune, or temporary defeat." + }, + { + "id": "0d2d7ace-3aaa-4bd0-b80e-5b26c64b612f", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "The ladder of success is never crowded at the top." + }, + { + "id": "8f0ff627-6fed-4d33-8a56-796f0dd3fded", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "The world has the habit of making room for the man whose actions show that he knows where he is going." + }, + { + "id": "3f333ecd-39ed-4b59-98df-edbc2ececd6c", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "First comes thought; then organization of that thought, into ideas and plans; then transformation of those plans into reality. The beginning, as you will observe, is in your imagination." + }, + { + "id": "85100b2b-4523-4a76-90f5-8ea0ea14594f", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "There are no limitations to the mind except those we acknowledge." + }, + { + "id": "374663d3-790d-48af-8d73-a8b3a61657df", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Napoleon Hill", + "text": "Here is one quality that one must possess to win, and that is definiteness of purpose, the knowledge of what one wants, and a burning desire to possess it." + }, + { + "id": "0dba4290-6f14-4df7-8600-4823a25801cc", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Nathaniel Hawthorne", + "text": "Happiness is as a butterfly which, when pursued, is always beyond our grasp, but which if you will sit down quietly, may alight upon you." + }, + { + "id": "9ea8570f-c208-44e3-81b8-e0c56e16096d", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Nelson Mandela", + "text": "There is nothing like returning to a place that remains unchanged to find the ways in which you yourself have altered." + }, + { + "id": "f56021ea-ccc5-4296-ac0b-a13d5cf4511a", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Nelson Mandela", + "text": "As we are liberated from our own fear, our presence automatically liberates others." + }, + { + "id": "c2bc4cb0-a797-4fdc-9075-f3c154213815", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Nelson Mandela", + "text": "And as we let our own light shine, we unconsciously give other people permission to do the same." + }, + { + "id": "d65fc6b1-f388-449b-9b9b-99b71c061a2d", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Niccolo Machiavelli", + "text": "Men in general judge more from appearances than from reality. All men have eyes, but few have the gift of penetration." + }, + { + "id": "0df951f1-53a2-482e-a34b-ed7583e9a589", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Niels Bohr", + "text": "How wonderful that we have met with a paradox. Now we have some hope of making progress." + }, + { + "id": "3224efc8-441b-4c4b-9bd7-1b19bc17ef4e", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Nietzsche", + "text": "You need chaos in your soul to give birth to a dancing star." + }, + { + "id": "d3d469b5-0fa4-4ad6-9f51-30c296b3c389", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Nikola Tesla", + "text": "Our virtues and our failings are inseparable, like force and matter. When they separate, man is no more." + }, + { + "id": "ca2b7e5d-c253-4579-b417-0b321e97862e", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Nikola Tesla", + "text": "Let the future tell the truth, and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I have really worked, is mine." + }, + { + "id": "94f8b6ef-340b-40d4-bcbb-37a1705be21a", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Nikos Kazantzakis", + "text": "By believing passionately in something that does not yet exist, we create it." + }, + { + "id": "7afc4574-01b9-4835-99d0-767733b375b9", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Nora Roberts", + "text": "If you don't go after what you want, you'll never have it. If you don't ask, the answer is always no. If you don't step forward, you're always in the same place." + }, + { + "id": "ce043e0a-fa52-46f6-af2b-b67cb42e34ab", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Norman Cousins", + "text": "Never deny a diagnosis, but do deny the negative verdict that may go with it." + }, + { + "id": "67ce3c50-1482-41ac-a049-9f7487f9471b", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Norman Peale", + "text": "If you want things to be different, perhaps the answer is to become different yourself." + }, + { + "id": "1e67a58d-68e6-4f75-bb09-524e7b532c51", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Norman Schwarzkopf", + "text": "The truth of the matter is that you always know the right thing to do. The hard part is doing it." + }, + { + "id": "e8441cd7-06f1-4e4d-ae55-145d05588fe0", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Og Mandino", + "text": "Each misfortune you encounter will carry in it the seed of tomorrows good luck." + }, + { + "id": "78322cd1-306f-4e4a-9913-b4a216870a4e", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Og Mandino", + "text": "I will love the light for it shows me the way, yet I will endure the darkness because it shows me the stars." + }, + { + "id": "8ad73f81-2926-4550-bc90-97b92f84a0fd", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Og Mandino", + "text": "I seek constantly to improve my manners and graces, for they are the sugar to which all are attracted." + }, + { + "id": "8516529b-802b-4bfc-8a99-f16e72d0ca38", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Og Mandino", + "text": "Always do your best. What you plant now, you will harvest later." + }, + { + "id": "c502283a-69c0-4843-964a-e24148dfff77", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Og Mandino", + "text": "Always seek out the seed of triumph in every adversity." + }, + { + "id": "a6a1bdf0-58e6-4bf0-8631-75aa24fa609c", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Og Mandino", + "text": "Failure will never overtake me if my determination to succeed is strong enough." + }, + { + "id": "abb64199-2d75-434c-b156-9d10eafbadee", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Old German proverb", + "text": "You have to take it as it happens, but you should try to make it happen the way you want to take it." + }, + { + "id": "f2cf0ad8-999c-48e6-ae91-03812fbc088e", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oliver Holmes", + "text": "What lies behind us and what lies before us are small matters compared to what lies within us." + }, + { + "id": "bf0d2190-7279-4f8b-8643-38191e0a2ea7", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oliver Holmes", + "text": "A man may fulfil the object of his existence by asking a question he cannot answer, and attempting a task he cannot achieve." + }, + { + "id": "903b74f5-4c15-457f-adbd-bc5965c170b1", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oliver Holmes", + "text": "We do not quit playing because we grow old, we grow old because we quit playing." + }, + { + "id": "e60db9db-ed96-4962-9895-eb437b70e683", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oliver Holmes", + "text": "Love is the master key that opens the gates of happiness." + }, + { + "id": "b09ee851-fdca-43df-8f47-39daf7995f7e", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oprah Winfrey", + "text": "Follow your instincts. That is where true wisdom manifests itself." + }, + { + "id": "9467d150-d175-446b-b1a2-f923ac3600a1", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oprah Winfrey", + "text": "I don't believe in failure. It is not failure if you enjoyed the process." + }, + { + "id": "41419b10-812f-42a1-954b-35f31e809c42", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oprah Winfrey", + "text": "If you want your life to be more rewarding, you have to change the way you think." + }, + { + "id": "3316dcdf-334f-4144-9fc4-f3024a14da2f", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oprah Winfrey", + "text": "The biggest adventure you can ever take is to live the life of your dreams." + }, + { + "id": "c6caba4c-ac52-4304-ad7f-0132c78cfa45", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oprah Winfrey", + "text": "Although there may be tragedy in your life, there's always a possibility to triumph. It doesn't matter who you are, where you come from. The ability to triumph begins with you. Always." + }, + { + "id": "1e97f092-a606-410d-ba95-ab404f015634", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oprah Winfrey", + "text": "With every experience, you alone are painting your own canvas, thought by thought, choice by choice." + }, + { + "id": "7d2143ca-bed9-4943-9616-1ecb00cc9d56", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oprah Winfrey", + "text": "I don't believe in failure. It's not failure if you enjoyed the process." + }, + { + "id": "e5e19cf8-c2dc-4e14-a8bb-38612d9b5ba9", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oprah Winfrey", + "text": "Lots of people want to ride with you in the limo, but what you want is someone who will take the bus with you when the limo breaks down." + }, + { + "id": "63817dac-c3c2-4a44-8269-19ae6bd13287", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oprah Winfrey", + "text": "Don't settle for a relationship that won't let you be yourself." + }, + { + "id": "167f8068-0461-4918-898b-e0fb5172e240", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Orison Marden", + "text": "The Creator has not given you a longing to do that which you have no ability to do." + }, + { + "id": "04bd2837-d9ce-4cd3-be87-3032ed93d35b", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Orison Marden", + "text": "Most of our obstacles would melt away if, instead of cowering before them, we should make up our minds to walk boldly through them." + }, + { + "id": "e0a08e96-c609-40d6-be2f-fafb98708a04", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Orison Marden", + "text": "All men who have achieved great things have been great dreamers." + }, + { + "id": "f920497b-e605-4600-a25e-716df8238656", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oscar Wilde", + "text": "Experience is simply the name we give our mistakes." + }, + { + "id": "c0169169-4016-45f6-a72a-b8fa8d25ffff", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oscar Wilde", + "text": "The only thing to do with good advice is to pass it on. It is never of any use to oneself." + }, + { + "id": "483f0518-b748-4ffa-b745-58f1a204b37f", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oscar Wilde", + "text": "The aim of life is self-development. To realize ones nature perfectly that is what each of us is here for." + }, + { + "id": "743b87dd-830e-4e31-b3d5-f89ed276183a", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oscar Wilde", + "text": "The smallest act of kindness is worth more than the grandest intention." + }, + { + "id": "2db8623c-b627-4202-9c6c-479455a59797", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oscar Wilde", + "text": "Anybody can make history. Only a great man can write it." + }, + { + "id": "149feb49-c8f1-4618-a80c-f4d70468e308", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Oscar Wilde", + "text": "Be yourself; everyone else is already taken." + }, + { + "id": "4a3db76d-060f-485d-83d4-e456066f989a", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ovid", + "text": "The cause is hidden. The effect is visible to all." + }, + { + "id": "d1106bc8-6bfe-4779-834b-1335229d83d9", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ovid", + "text": "All things change; nothing perishes." + }, + { + "id": "a1417ae1-befa-4499-9c21-c02e7f5cfa62", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ovid", + "text": "Chance is always powerful. Let your hook be always cast; in the pool where you least expect it, there will be a fish." + }, + { + "id": "cab8a76e-ce9e-4cdf-9da1-2c30d6402342", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ovid", + "text": "Let your hook always be cast; in the pool where you least expect it, there will be a fish." + }, + { + "id": "4bbd9e07-2f3e-4678-87fa-f728c062d500", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ovid", + "text": "Take rest; a field that has rested gives a bountiful crop." + }, + { + "id": "78f3da16-1192-4954-8499-aa3c23d4e2b9", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Paavo Nurmi", + "text": "Mind is everything: muscle, pieces of rubber. All that I am, I am because of my mind." + }, + { + "id": "dab9635b-5565-4596-b81b-19a37566b71a", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pablo Picasso", + "text": "Everything you can imagine is real." + }, + { + "id": "56979933-e797-4a73-9d37-981a727b3093", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pablo Picasso", + "text": "Inspiration exists, but it has to find us working." + }, + { + "id": "6ba99faa-c672-47eb-8355-526f40a4f7b4", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pablo Picasso", + "text": "He can who thinks he can, and he can't who thinks he can't. This is an inexorable, indisputable law." + }, + { + "id": "cc5cb8f0-227d-4e5b-89df-61e6791c1c5c", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pablo Picasso", + "text": "I am always doing that which I cannot do, in order that I may learn how to do it." + }, + { + "id": "e841b85e-0279-41ae-818b-d9c5c9148457", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pablo Picasso", + "text": "I am always doing that which I can not do, in order that I may learn how to do it." + }, + { + "id": "9d42d207-fe42-40d6-9f47-95b2ba07e465", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pablo Picasso", + "text": "Action is the foundational key to all success." + }, + { + "id": "88712e8d-2472-4d54-bd74-4fa734a4dd58", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pablo Picasso", + "text": "I begin with an idea and then it becomes something else." + }, + { + "id": "eec2a5a0-94f8-4ad9-9aae-d22b3c1dd9b3", + "isDeleted": false, + "createdAt": 1613993133681, + "updatedAt": 1613993133681, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pablo Picasso", + "text": "All children are artists. The problem is how to remain an artist once he grows up." + }, + { + "id": "d3d61553-0c6f-4c14-a495-99b190d9e94d", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pat Riley", + "text": "Courage is not the absence of fear, but simply moving on with dignity despite that fear." + }, + { + "id": "e525c509-ae7d-410b-8b86-8e980d708cdb", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Paul Boese", + "text": "Forgiveness does not change the past, but it does enlarge the future." + }, + { + "id": "d48e43c4-8ae4-493c-b69a-79cf76a86ecb", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Paul Cezanne", + "text": "The awareness of our own strength makes us modest." + }, + { + "id": "d8d42504-2888-4ef5-9a7e-bbe6c51171d5", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Paul Graham", + "text": "The most dangerous way to lose time is not to spend it having fun, but to spend it doing fake work. When you spend time having fun, you know you're being self-indulgent." + }, + { + "id": "dc596c95-251a-4a37-be28-59240df54a03", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Paul Tillich", + "text": "Decision is a risk rooted in the courage of being free." + }, + { + "id": "2ce76423-f153-4319-9853-1276a0cbbe1c", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Paulo Coelho", + "text": "Write your plans in pencil and give God the eraser." + }, + { + "id": "6b034628-0295-43cb-8876-35f695937dd7", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pearl Buck", + "text": "One faces the future with ones past." + }, + { + "id": "f64b4210-62be-474f-93ba-9df4c6c751ae", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pearl Buck", + "text": "Growth itself contains the germ of happiness." + }, + { + "id": "c90ca914-4197-4b23-b94f-3704afabb6c0", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pearl Buck", + "text": "Every great mistake has a halfway moment, a split second when it can be recalled and perhaps remedied." + }, + { + "id": "f5a9217e-4177-4050-a1a4-59faea45b75a", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pearl Buck", + "text": "You cannot make yourself feel something you do not feel, but you can make yourself do right in spite of your feelings." + }, + { + "id": "8ff17d57-7a19-4974-a236-df557df4c2f0", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pearl Buck", + "text": "The truth is always exciting. Speak it, then. Life is dull without it." + }, + { + "id": "893c692e-d698-48fb-a465-b5e4c08e8af7", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pearl Buck", + "text": "The secret of joy in work is contained in one word excellence. To know how to do something well is to enjoy it." + }, + { + "id": "424a4d16-47dc-4e77-b780-a9c53fa8c6e6", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pearl Buck", + "text": "The secret of joy in work is contained in one word: excellence. To know how to do something well is to enjoy it." + }, + { + "id": "54693ef8-bf82-4452-8c46-b397a70aedd2", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pema Chodron", + "text": "The truth you believe and cling to makes you unavailable to hear anything new." + }, + { + "id": "b9161c84-149a-48dd-8aba-08ccfff4d583", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pema Chodron", + "text": "When you begin to touch your heart or let your heart be touched, you begin to discover that it's bottomless." + }, + { + "id": "140810cd-6cc9-4829-a3d2-16b53a229ada", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pema Chodron", + "text": "If we learn to open our hearts, anyone, including the people who drive us crazy, can be our teacher." + }, + { + "id": "1c7f9ea2-d1ba-4bf2-a0b3-ea6a01aff599", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pema Chodron", + "text": "Nothing ever goes away until it has taught us what we need to know." + }, + { + "id": "edc72cf0-1881-45c1-a00d-916df76f96f0", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pema Chodron", + "text": "The greatest obstacle to connecting with our joy is resentment." + }, + { + "id": "8b4c81e8-0f5f-415e-b2c0-7cd19067a9ca", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pema Chodron", + "text": "The future is completely open, and we are writing it moment to moment." + }, + { + "id": "e0abb69d-a3f8-4304-ad47-802f2eabdfb0", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pema Chodron", + "text": "To be fully alive, fully human, and completely awake is to be continually thrown out of the nest." + }, + { + "id": "fdd7cba8-13f5-4a62-be8d-80112fc7e636", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pema Chodron", + "text": "It isn't what happens to us that causes us to suffer; it's what we say to ourselves about what happens." + }, + { + "id": "c38ab64b-6891-45d8-817d-4b4f94a5769d", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Percy Shelley", + "text": "Fear not for the future, weep not for the past." + }, + { + "id": "63b3354c-561b-4a61-ac3b-c4022ec32eef", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pericles", + "text": "Time is the wisest counsellor of all." + }, + { + "id": "915ba548-544e-427b-9035-86ff354bd752", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Peter Drucker", + "text": "Efficiency is doing things right; effectiveness is doing the right things." + }, + { + "id": "cb97db6f-b08a-45e0-8d61-471dbdb8d37e", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Peter Drucker", + "text": "Follow effective action with quiet reflection. From the quiet reflection will come even more effective action." + }, + { + "id": "1dfda57c-7eaf-4af2-abbb-ee328fd2daa1", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Peter Drucker", + "text": "There is nothing so useless as doing efficiently that which should not be done at all." + }, + { + "id": "930b7bdd-a356-4245-849d-3172d1d087dd", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Peter Drucker", + "text": "The best way to predict your future is to create it." + }, + { + "id": "bc1a66e4-94b0-44d5-ad47-c3a3051f0aa5", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": ["time", "management"], + "source": "https://www.goodreads.com/quotes/784267", + "author": "Peter Drucker", + "text": "Until we can manage time, we can manage nothing else." + }, + { + "id": "4a133db9-6c06-467f-81ac-ff8fa1b22b5a", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Peter Elbow", + "text": "Meaning is not what you start with but what you end up with." + }, + { + "id": "7edc7a7a-480d-40bc-bd8f-0e6e5e716d3d", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Philip Breedveld", + "text": "Moments of complete apathy are the best for new creations." + }, + { + "id": "5bb9762a-42e5-4fac-b6db-281dbcdbe079", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Philip Sidney", + "text": "Either I will find a way, or I will make one." + }, + { + "id": "1d14774f-0ea2-45b4-8c16-020811327f12", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pierre Abelard", + "text": "The beginning of wisdom is found in doubting; by doubting we come to the question, and by seeking we may come upon the truth." + }, + { + "id": "da357ee1-806b-4ba3-b82a-2877f4fe79bb", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Pierre Auguste Renoir", + "text": "The pain passes, but the beauty remains." + }, + { + "id": "2d3d0cf7-b129-492b-a9fd-14a91a29ab04", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Plato", + "text": "A good decision is based on knowledge and not on numbers." + }, + { + "id": "47bed0ce-58c0-4488-88db-2c284eba44d2", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Plato", + "text": "Bodily exercise, when compulsory, does no harm to the body; but knowledge which is acquired under compulsion obtains no hold on the mind." + }, + { + "id": "10903c11-723b-4457-b29f-b4e56a2c4afb", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Plato", + "text": "Good actions give strength to ourselves and inspire good actions in others." + }, + { + "id": "ded582a5-8176-4e0d-b192-addea65dc023", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Plato", + "text": "Wise men talk because they have something to say; fools, because they have to say something." + }, + { + "id": "8ef958a6-21f6-4e1e-b4db-fa21d2a88340", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Plotinus", + "text": "Knowledge has three degrees opinion, science, illumination. The means or instrument of the first is sense; of the second, dialectic; of the third, intuition." + }, + { + "id": "e4bb448c-5d33-4fe1-8351-e43331ce1461", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Plutarch", + "text": "What we achieve inwardly will change outer reality." + }, + { + "id": "dcf04700-3767-43c8-8209-bb4b2eb285bc", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Plutarch", + "text": "Know how to listen, and you will profit even from those who talk badly." + }, + { + "id": "f93bce50-cdba-47ac-b16e-9d19ad774fcb", + "isDeleted": false, + "createdAt": 1613993133682, + "updatedAt": 1613993133682, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Plutarch", + "text": "To make no mistakes is not in the power of man; but from their errors and mistakes the wise and good learn wisdom for the future." + }, + { + "id": "f09b43a2-1b39-4fe4-add0-da19f63d70f8", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Princess Diana", + "text": "Only do what your heart tells you." + }, + { + "id": "06e18797-d79c-4461-a94b-51126c823256", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Publilius Syrus", + "text": "A rolling stone gathers no moss." + }, + { + "id": "3681aeac-18ef-45d6-93f1-d144d159f9ca", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Publilius Syrus", + "text": "While we stop to think, we often miss our opportunity." + }, + { + "id": "1d872a9e-7f48-4ff5-aae5-c09026e2773b", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Publilius Syrus", + "text": "Better be ignorant of a matter than half know it." + }, + { + "id": "d280c735-4af6-4c7e-8f1d-0fb9cfe0d40c", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Publilius Syrus", + "text": "I have often regretted my speech, never my silence." + }, + { + "id": "5921e1d1-a280-4163-842c-d85a7ea4bee9", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Publilius Syrus", + "text": "Do not turn back when you are just at the goal." + }, + { + "id": "c6f376dd-2240-45f5-8a79-d4ff280b9b1e", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Publilius Syrus", + "text": "Never promise more than you can perform." + }, + { + "id": "14dc262c-85fb-4fff-ad08-4d00644b5f65", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rabbi Hillel", + "text": "If I am not for myself, who will be for me? If I am not for others, what am I? And if not now, when?" + }, + { + "id": "461da438-c95e-4ef7-a4c5-491a4014b386", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rabindranath Tagore", + "text": "We read the world wrong and say that it deceives us." + }, + { + "id": "bd7f6f6a-327b-40b6-8d6c-0a5ed9ee00c7", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rachel Carson", + "text": "If facts are the seeds that later produce knowledge and wisdom, then the emotions and the impressions of the senses are the fertile soil in which the seeds must grow." + }, + { + "id": "26dd8717-7c5c-43c7-a1d6-b789a8c66526", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Blum", + "text": "Nothing is predestined: The obstacles of your past can become the gateways that lead to new beginnings." + }, + { + "id": "bb1c54dc-0f6d-4046-9884-1979ce5e37b8", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Skill to do comes of doing." + }, + { + "id": "839d5aa8-e34e-47f5-95ce-87ea8c0b8b72", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "The years teach much which the days never know." + }, + { + "id": "44e907c3-917b-4f36-b6f8-e887afbd271c", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Our distrust is very expensive." + }, + { + "id": "558fea60-164a-4161-8f4e-b59ce051fb9b", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Good luck is another name for tenacity of purpose." + }, + { + "id": "eb8ddbf8-fc2d-4c1d-9ee2-e54db2d0234c", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Life is a progress, and not a station." + }, + { + "id": "98261d2e-a734-4ff4-9d27-31fb65884d00", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "The world makes way for the man who knows where he is going." + }, + { + "id": "390f6ddb-d45d-4002-a97f-b2b5ae7bcaf0", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Life is a succession of lessons, which must be lived to be understood." + }, + { + "id": "742b05c0-33c7-476a-98f3-a5188cd8582b", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Great are they who see that spiritual is stronger than any material force, that thoughts rule the world." + }, + { + "id": "19562ec6-23f7-42df-8b66-1cd2da876b0a", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Do not waste yourself in rejection, nor bark against the bad, but chant the beauty of the good." + }, + { + "id": "3128d88d-fcc0-47be-8e11-792b46106091", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "If the single man plant himself indomitably on his instincts, and there abide, the huge world will come round to him." + }, + { + "id": "299b9bc9-cc9f-47f4-88b5-5f886c15330b", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "It is one of the blessings of old friends that you can afford to be stupid with them." + }, + { + "id": "691955ff-e328-4522-ac5f-79f2674beaab", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "If the stars should appear but one night every thousand years how man would marvel and adore." + }, + { + "id": "85726869-057d-4a63-a859-d32805334dbc", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Do not be too timid and squeamish about your reactions. All life is an experiment. The more experiments you make the better." + }, + { + "id": "574dc2ff-5505-4f51-88a7-0edc563d70b6", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Do not go where the path may lead, go instead where there is no path and leave a trail." + }, + { + "id": "4da52b13-3996-4192-afc7-08e9536c5cce", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Self-trust is the first secret of success." + }, + { + "id": "cd25aeb8-e62a-4bb1-b41d-da2c016b78aa", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Go put your creed into the deed. Nor speak with double tongue." + }, + { + "id": "dfde5455-2163-4600-8077-c8801892617e", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "We aim above the mark to hit the mark." + }, + { + "id": "591b92cd-4ebe-42de-9b71-a8cf028ebf25", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Nature is a mutable cloud which is always and never the same." + }, + { + "id": "f34eef30-2427-4b50-a1ef-bac0a89ebdfd", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Build a better mousetrap and the world will beat a path to your door." + }, + { + "id": "7a51f47e-e1f2-4f84-a13b-78113986b953", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Nothing is at last sacred but the integrity of your own mind." + }, + { + "id": "fa130518-bc98-43bb-9cb7-7863f51f2800", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Nothing great was ever achieved without enthusiasm." + }, + { + "id": "63b4ed18-df63-4517-80a9-44c58a100a92", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Each man has his own vocation; his talent is his call. There is one direction in which all space is open to him." + }, + { + "id": "32ce9b09-b62d-4331-9817-368f7ae7771d", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Truth, and goodness, and beauty are but different faces of the same all." + }, + { + "id": "1eb65dc0-a2b5-43f3-afa2-452e309ef398", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "To be great is to be misunderstood." + }, + { + "id": "fbde69f5-3562-4d35-af1f-92715b1ba0a7", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Make the most of yourself, for that is all there is of you." + }, + { + "id": "a58e7da5-74af-4342-ab1b-30ef96bc3cf6", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Everything in the universe goes by indirection. There are no straight lines." + }, + { + "id": "c562d56b-9104-4750-8e45-ae5d1ad34bed", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Make the most of yourself for that is all there is of you." + }, + { + "id": "9ce7f0bc-7284-4574-b442-9a164c1bf187", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Thought is the blossom; language the bud; action the fruit behind it." + }, + { + "id": "a1b2794b-624e-4929-9486-cadade80d8c3", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "We must be as courteous to a man as we are to a picture, which we are willing to give the advantage of a good light." + }, + { + "id": "540fb567-cfd5-4817-a5e3-73dbf37d52b5", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "What is a weed? A plant whose virtues have not yet been discovered." + }, + { + "id": "fed1829f-6122-4f32-bbd5-08b4afd1b674", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Belief consists in accepting the affirmations of the soul; Unbelief, in denying them." + }, + { + "id": "20dc38c4-b71a-497d-9879-2d5d7adcc1f8", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Good thoughts are no better than good dreams, unless they be executed." + }, + { + "id": "c87caf9d-914e-4307-bd11-1d8aa8c73439", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "In skating over thin ice our safety is in our speed." + }, + { + "id": "c8b49259-c3df-415c-b98c-46b736599910", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "So is cheerfulness, or a good temper, the more it is spent, the more remains." + }, + { + "id": "60a35bbb-4477-4a76-bc95-af6b9730ac72", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "Bad times have a scientific value. These are occasions a good learner would not miss." + }, + { + "id": "5737b5b7-1860-4140-8bc7-6d78777124df", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Emerson", + "text": "The only way to have a friend is to be one." + }, + { + "id": "aaad2c18-b3fd-4952-b7c2-2ee5807a16d3", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Marston", + "text": "Excellence is not a skill. It is an attitude." + }, + { + "id": "603f1d0f-6c85-4242-bd03-9204029d3126", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Marston", + "text": "Let go of your attachment to being right, and suddenly your mind is more open. You're able to benefit from the unique viewpoints of others, without being crippled by your own judgement." + }, + { + "id": "2616e202-f413-4075-8d97-152e53018b8c", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Waldo Emerson", + "text": "Our strength grows out of our weaknesses." + }, + { + "id": "db216231-8ddc-4e9a-b839-8f917fe208d1", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Waldo Emerson", + "text": "It is only when the mind and character slumber that the dress can be seen." + }, + { + "id": "7b841745-771a-4195-b557-5332b39a2f59", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Waldo Emerson", + "text": "Happiness is a perfume you cannot pour on others without getting a few drops on yourself." + }, + { + "id": "ab82ecf2-3a5e-4c55-ae06-999c39ec5b4b", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Waldo Emerson", + "text": "A hero is no braver than an ordinary man, but he is braver five minutes longer." + }, + { + "id": "7ecab7a6-ad97-4f10-bc02-e2757ee1ee41", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Waldo Emerson", + "text": "Imagination is not a talent of some men but is the health of every man." + }, + { + "id": "c6a5d6e4-4091-4332-92ca-4f6923bd7479", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Waldo Emerson", + "text": "Most of the shadows of life are caused by standing in our own sunshine." + }, + { + "id": "a8f7e1cc-f7c6-4788-b99b-0ad91f0be034", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ralph Waldo Emerson", + "text": "Do not follow where the path may lead. Go, instead, where there is no path and leave a trail." + }, + { + "id": "174c1cf2-209a-437c-9bd0-17b139d1ef8f", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ray Bradbury", + "text": "Living at risk is jumping off the cliff and building your wings on the way down." + }, + { + "id": "696a196d-ef03-43a8-bbb7-554a1c93f7e7", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Remez Sasson", + "text": "You get peace of mind not by thinking about it or imagining it, but by quietening and relaxing the restless mind." + }, + { + "id": "953553dc-b213-4bf4-a908-b6c8979efee6", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rene Descartes", + "text": "It is not enough to have a good mind; the main thing is to use it well." + }, + { + "id": "a3e64250-a8ca-432d-aee0-e50a633be94a", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rene Descartes", + "text": "The greatest minds are capable of the greatest vices as well as of the greatest virtues." + }, + { + "id": "578372b8-3680-4e35-b3b0-73be369f0371", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rene Descartes", + "text": "Divide each difficulty into as many parts as is feasible and necessary to resolve it." + }, + { + "id": "44984e3b-3146-458c-bdd2-e111ffb3de5f", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Argue for your limitations, and sure enough theyre yours." + }, + { + "id": "2c28c69e-aa82-467f-b593-c1fcb5c0d92c", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "In order to win, you must expect to win." + }, + { + "id": "f325ecf3-404b-40c5-aa16-e48b8fb4eec9", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "The simplest things are often the truest." + }, + { + "id": "e4c81db2-d739-48fa-a4af-cb47fa6fc5c6", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "To bring anything into your life, imagine that it's already there." + }, + { + "id": "fe4d28e1-a2a6-47e1-81fb-98fce431809d", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Strong beliefs win strong men, and then make them stronger." + }, + { + "id": "f5be37e8-03fe-4454-b66f-9d925c42c8ab", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Every problem has a gift for you in its hands." + }, + { + "id": "ce3f3134-4bdf-4a3d-a075-cbf271b85118", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "The best way to pay for a lovely moment is to enjoy it." + }, + { + "id": "054771e7-17a0-4d15-bee4-c404605cb694", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "In order to live free and happily you must sacrifice boredom. It is not always an easy sacrifice." + }, + { + "id": "affa341f-c8a8-4fb5-aa0d-06b5fbd2c9c2", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "You are always free to change your mind and choose a different future, or a different past." + }, + { + "id": "3f61f7c7-5e42-4602-bf8f-30f8a101411c", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Your friends will know you better in the first minute you meet than your acquaintances will know you in a thousand years." + }, + { + "id": "046aefff-1313-46fa-8fd0-092daedb0a47", + "isDeleted": false, + "createdAt": 1613993133683, + "updatedAt": 1613993133683, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "If you love someone, set them free. If they come back they're yours; if they don't they never were." + }, + { + "id": "bdc9c050-5877-46c4-af94-9af7b4a3e0e2", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Bad things are not the worst things that can happen to us. Nothing is the worst thing that can happen to us!" + }, + { + "id": "71bdfcde-6389-483f-b052-426fb4d35b77", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Can miles truly separate you from friends... If you want to be with someone you love, aren't you already there?" + }, + { + "id": "523ece64-9b36-4954-b145-7c07bcb553c0", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Don't turn away from possible futures before you're certain you don't have anything to learn from them." + }, + { + "id": "0e0c9215-82cd-40c9-afa8-858878059630", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Don't believe what your eyes are telling you. All they show is limitation. Look with your understanding, find out what you already know, and you'll see the way to fly." + }, + { + "id": "597b7386-814d-4051-a8e3-e1ed580158db", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Sooner or later, those who win are those who think they can." + }, + { + "id": "34583592-1b5f-4aae-b9e6-f953d6df4307", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Happiness is the reward we get for living to the highest right we know." + }, + { + "id": "7ff9b0b5-c7fd-46bb-8b73-df772288a4c5", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Every gift from a friend is a wish for your happiness." + }, + { + "id": "3abb788c-3e6e-4a94-9842-2a853cd363ba", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Learning is finding out what you already know." + }, + { + "id": "59a6d6ab-3b0a-411d-ad6a-e70229f123a5", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Ask yourself the secret of your success. Listen to your answer, and practice it." + }, + { + "id": "639cdec6-df55-41de-b140-3f0937b5ebf4", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "The meaning I picked, the one that changed my life: Overcome fear, behold wonder." + }, + { + "id": "76cf11b7-5541-4687-9454-036c4d586ded", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Every person, all the events of your life are there because you have drawn them there. What you choose to do with them is up to you." + }, + { + "id": "8e6993a0-9c6d-42ed-9ad5-27d649482d46", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "To fly as fast as thought, you must begin by knowing that you have already arrived." + }, + { + "id": "b51802d9-1fe4-4995-ba77-a62f9f8bfea2", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Allow the world to live as it chooses, and allow yourself to live as you choose." + }, + { + "id": "370fddee-c521-48d0-9beb-6743c37295c6", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "I gave my life to become the person I am right now. Was it worth it?" + }, + { + "id": "53463a5e-193c-4593-81ca-197742a47abb", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "The mark of your ignorance is the depth of your belief in injustice and tragedy. What the caterpillar calls the end of the world, the Master calls the butterfly." + }, + { + "id": "15550b3f-bc0d-461d-9eec-f08e011ff065", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Listen to what you know instead of what you fear." + }, + { + "id": "d32be762-f35d-4a3f-9f53-256ec0b9d13f", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "What the caterpillar calls the end of the world, the master calls a butterfly." + }, + { + "id": "7e3a5458-b4cd-4a7f-8148-efc09d0cae5a", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "You teach best what you most need to learn." + }, + { + "id": "7886b8f0-865e-46b6-a2a3-83359bc97d1d", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Don't be dismayed by good-byes. A farewell is necessary before you can meet again. And meeting again, after moments or lifetimes, is certain for those who are friends." + }, + { + "id": "68da9340-fb45-4b5e-8d57-d899d9d842a1", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "You are never given a wish without also being given the power to make it come true. You may have to work for it, however." + }, + { + "id": "3abdd832-5f0c-4370-8f52-cbc371b81b0f", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Bach", + "text": "Argue for your limitations, and sure enough they're yours." + }, + { + "id": "9f6048aa-d727-4bef-b940-2050aa78272e", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Braunstein", + "text": "He who obtains has little. He who scatters has much." + }, + { + "id": "c2538d56-69f0-4bd2-ad22-5e2d07f068d3", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Evans", + "text": "The undertaking of a new action brings new strength." + }, + { + "id": "1de9da6f-62d1-4923-92e9-92e55f9f5992", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": ["create", "creation", "understand", "understanding"], + "source": "https://simple.wikiquote.org/wiki/Richard_Feynman", + "author": "Richard Feynman", + "text": "What I cannot create, I do not understand." + }, + { + "id": "17041c4c-880e-43e1-ae69-b3a96d7eceba", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Garriott", + "text": "Chaos and Order are not enemies, only opposites." + }, + { + "id": "c62d2104-35a3-410d-98d8-46d8520df881", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Needham", + "text": "Strong people make as many mistakes as weak people. Difference is that strong people admit their mistakes, laugh at them, learn from them. That is how they become strong." + }, + { + "id": "25dd58a5-a39d-4675-96d6-cb88ae1b0ab3", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Richard Whately", + "text": "Lose an hour in the morning, and you will spend all day looking for it." + }, + { + "id": "e546c065-192f-4187-8330-c612685eb378", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rita Mae Brown", + "text": "Creativity comes from trust. Trust your instincts. And never hope more than you work." + }, + { + "id": "e54ec156-5537-4cda-bdb3-e133c3400f5b", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Anthony", + "text": "Forget about all the reasons why something may not work. You only need to find one good reason why it will." + }, + { + "id": "fb702b63-194b-49a6-95fe-40000b89ae44", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Brault", + "text": "Enjoy the little things, for one day you may look back and realize they were the big things." + }, + { + "id": "9d673b7d-119e-400a-8f7f-3a1dcaa3e5b4", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert C. Solomon", + "text": "Spirituality can be severed from both vicious sectarianism and thoughtless banalities. Spirituality, I have come to see, is nothing less than the thoughtful love of life." + }, + { + "id": "98a78d81-9942-4a70-baae-2ad74ab2c4b6", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Frost", + "text": "The best way out is always through." + }, + { + "id": "141c4944-e16a-4a1c-bb09-068836334924", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Frost", + "text": "In three words I can sum up everything Ive learned about life: it goes on." + }, + { + "id": "2394d917-44b7-45dc-b078-f4415f299d06", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Fulghum", + "text": "Peace is not something you wish for. It's something you make, something you do, something you are, and something you give away." + }, + { + "id": "22fa229e-3502-4e70-9d54-46a7530a0531", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Fulghum", + "text": "If you break your neck, if you have nothing to eat, if your house is on fire, then you got a problem. Everything else is inconvenience." + }, + { + "id": "fa6197f5-0a92-44d9-bc20-fc5444d18154", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Graves", + "text": "Intuition is the supra-logic that cuts out all the routine processes of thought and leaps straight from the problem to the answer." + }, + { + "id": "ee33b37a-ea5e-4826-83ee-80220c984b4c", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Heller", + "text": "Never ignore a gut feeling, but never believe that it's enough." + }, + { + "id": "e26fd595-dfed-43bc-8af5-fafded3c81df", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Kennedy", + "text": "Only those who dare to fail greatly can ever achieve greatly." + }, + { + "id": "8f6c33eb-273f-453a-82cd-84de133d92b9", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Louis Stevenson", + "text": "There is no duty we so underrate as the duty of being happy. By being happy we sow anonymous benefits upon the world." + }, + { + "id": "dc574e33-dc6c-4cfe-a4d8-b8347166ccbc", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Lynd", + "text": "Any of us can achieve virtue, if by virtue we merely mean the avoidance of the vices that do not attract us." + }, + { + "id": "65ad3050-ea16-4c46-b826-670048ca65bb", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert M. Pirsig", + "text": "The place to improve the world is first in one's own heart and head and hands." + }, + { + "id": "27a42039-6d13-438d-aca7-efde7c8a156d", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert McKain", + "text": "The reason most goals are not achieved is that we spend our time doing second things first." + }, + { + "id": "e83a2269-80ff-4852-84fd-0325b5373a23", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Orben", + "text": "Don't think of it as failure. Think of it as time-released success." + }, + { + "id": "19200a05-00a0-4720-97b2-40cc58be80e2", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Pirsig", + "text": "The only Zen you find on the tops of mountains is the Zen you bring up there." + }, + { + "id": "87aa9c93-06b0-4cbb-acd6-a3ec2f38b9bf", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Schuller", + "text": "As we grow as unique persons, we learn to respect the uniqueness of others." + }, + { + "id": "15704544-cb0c-4f22-8d88-94db9458fe3f", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Schuller", + "text": "Failure doesn't mean you are a failure it just means you haven't succeeded yet." + }, + { + "id": "a144022e-d5cb-490f-aaa4-a05ca925da64", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Southey", + "text": "It is with words as with sunbeams. The more they are condensed, the deeper they burn." + }, + { + "id": "d40f60f1-2302-40a4-b063-7716f9460117", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Stevenson", + "text": "Don't judge each day by the harvest you reap but by the seeds you plant." + }, + { + "id": "7b425007-a5d3-4e6e-997f-261231cb0f73", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Stevenson", + "text": "To be what we are, and to become what we are capable of becoming, is the only end of life." + }, + { + "id": "79c363fa-63b1-49b4-a157-17a6782be181", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Robert Stevenson", + "text": "Don't judge each day by the harvest you reap but by the seeds that you plant." + }, + { + "id": "0125fd9b-91ec-4bc3-b206-566ea3307a6b", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rodin", + "text": "Nothing is a waste of time if you use the experience wisely." + }, + { + "id": "615fd681-958d-46a1-b928-f499b9eb489a", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rudolf Arnheim", + "text": "All perceiving is also thinking, all reasoning is also intuition, all observation is also invention." + }, + { + "id": "20d4f201-4436-47ae-83dd-18b7375678e0", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rumi", + "text": "Something opens our wings. Something makes boredom and hurt disappear. Someone fills the cup in front of us: We taste only sacredness." + }, + { + "id": "582a23a1-6110-4bd0-869f-97832b5ee3d4", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rumi", + "text": "Everyone has been made for some particular work, and the desire for that work has been put in every heart." + }, + { + "id": "8eda2946-9a1c-4aa6-a533-f4c89a86dafd", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rumi", + "text": "Let the beauty of what you love be what you do." + }, + { + "id": "2d9b2b79-b47e-4c01-adc2-796b39483b41", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Rumi", + "text": "Let yourself be silently drawn by the stronger pull of what you really love." + }, + { + "id": "91428ccf-49a9-4cf1-a26e-f420e667fc26", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sai Baba", + "text": "What is new in the world? Nothing. What is old in the world? Nothing. Everything has always been and will always be." + }, + { + "id": "93f1c419-3bed-4bc1-81c9-094f899b2cbd", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sai Baba", + "text": "All action results from thought, so it is thoughts that matter." + }, + { + "id": "e09e88c1-c298-4a76-b948-9d606291dc11", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Saint Augustine", + "text": "Patience is the companion of wisdom." + }, + { + "id": "75ad2654-f1d4-4f99-a4a8-2edb6812fb92", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sam Keen", + "text": "We come to love not by finding a perfect person, but by learning to see an imperfect person perfectly." + }, + { + "id": "1aa02240-5de9-49c2-a5e9-9faa69401d30", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sam Levenson", + "text": "It's so simple to be wise. Just think of something stupid to say and then don't say it." + }, + { + "id": "f69edd31-dc2c-4f3e-9772-7bed74a512c5", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sam Rayburn", + "text": "No one has a finer command of language than the person who keeps his mouth shut." + }, + { + "id": "54030c66-2122-4475-b536-edb1265bf7f5", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Samuel Johnson", + "text": "Memory is the mother of all wisdom." + }, + { + "id": "ca3a5ad5-1804-4bb6-99b8-c31531182ffb", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Samuel Taylor Coleridge", + "text": "Imagination is the living power and prime agent of all human perception." + }, + { + "id": "748f649a-7e12-4f0e-a295-d68c1290b3ab", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sarah Breathnach", + "text": "Our deepest wishes are whispers of our authentic selves. We must learn to respect them. We must learn to listen." + }, + { + "id": "de477d3b-945c-49a9-bccf-1bb0be6ac1bf", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Satchel Paige", + "text": "Don't look back. Something might be gaining on you." + }, + { + "id": "381625a4-ffb9-4af2-a2d4-75612b5867e2", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Saul Alinsky", + "text": "As an organizer I start from where the world is, as it is, not as I would like it to be." + }, + { + "id": "61e95da9-7668-4ebb-89b0-c356888fb2df", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Seneca", + "text": "Luck is what happens when preparation meets opportunity." + }, + { + "id": "f61a358e-f6e9-420a-84d4-ae6621cfe6cd", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Seneca", + "text": "No man was ever wise by chance." + }, + { + "id": "d7e2933b-5426-4909-af11-3308150395e9", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Seneca", + "text": "The greatest remedy for anger is delay." + }, + { + "id": "b6496de8-f113-4d8c-b17a-104a67354d5c", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Seneca", + "text": "The mind unlearns with difficulty what it has long learned." + }, + { + "id": "066e395a-a438-4c49-995f-a03ee791020f", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Seneca", + "text": "Begin at once to live and count each separate day as a separate life." + }, + { + "id": "53d5354b-6d59-4c55-99ff-b5323c0f0884", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Seneca", + "text": "If one does not know to which port is sailing, no wind is favorable." + }, + { + "id": "e1a3ccfc-f6eb-4b20-9b02-e5851da6e354", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Seneca", + "text": "The conditions of conquest are always easy. We have but to toil awhile, endure awhile, believe always, and never turn back." + }, + { + "id": "2cbc8ad9-4f54-40df-8b69-639ab478e505", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Seneca", + "text": "There is no great genius without some touch of madness." + }, + { + "id": "cea2341d-8f20-4ee6-90da-3dcb44fb4cb2", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Seneca", + "text": "Most powerful is he who has himself in his own power." + }, + { + "id": "4138b5b8-3d70-4052-9508-4dafe759d1f4", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Seneca", + "text": "Things that were hard to bear are sweet to remember." + }, + { + "id": "5eb9cb23-d26c-4a23-bb99-c04d0a81be1e", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Shakti Gawain", + "text": "The more light you allow within you, the brighter the world you live in will be." + }, + { + "id": "a44837e3-32b6-42bd-85dc-b5af8a7739d6", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": ["choices", "courage", "decisions", "questions", "avoid", "avoiding", "avoidance", "procrastination"], + "source": "https://www.goodreads.com/quotes/736095", + "author": "Shannon L. Alder", + "text": "Courage doesn’t happen when you have all the answers. It happens when you are ready to face the questions you have been avoiding your whole life." + }, + { + "id": "74df36b1-66e1-4bfb-bfd6-2dc09665a0e2", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sheldon Kopp", + "text": "In the long run we get no more than we have been willing to risk giving." + }, + { + "id": "23c73988-79f2-497e-93f1-ca37ed6faaac", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Shunryu Suzuki", + "text": "The most important point is to accept yourself and stand on your two feet." + }, + { + "id": "9c48a8fc-abeb-45d1-a67d-4a42de9c17fd", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sigmund Freud", + "text": "From error to error one discovers the entire truth." + }, + { + "id": "248955e8-26bc-40cb-8d37-f6f80587b71c", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sigmund Freud", + "text": "The most complicated achievements of thought are possible without the assistance of consciousness." + }, + { + "id": "4a0bbb74-dbfd-4231-824c-efc7ca523388", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Simone Weil", + "text": "Liberty, taking the word in its concrete sense, consists in the ability to choose." + }, + { + "id": "606b6699-8adc-4206-be23-ed85471903fd", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sinvyest Tan", + "text": "Don't frown because you never know who is falling in love with your smile." + }, + { + "id": "6a9f140c-9bf2-4cde-987f-00ef87fa562e", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Socrates", + "text": "Be as you wish to seem." + }, + { + "id": "7224182e-f99a-4f02-ab4a-7789e70547d5", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Socrates", + "text": "Wisdom begins in wonder." + }, + { + "id": "e4db53d7-53aa-434f-a9f1-5c865b7e99a8", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Socrates", + "text": "The greatest way to live with honor in this world is to be what we pretend to be." + }, + { + "id": "894fec2b-a8e2-46d9-8aa5-1f57766dc5a7", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Socrates", + "text": "The greatest way to live with honour in this world is to be what we pretend to be." + }, + { + "id": "9c59e27b-3c00-420d-9b69-55b12bc6123f", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sogyal Rinpoche", + "text": "We must never forget that it is through our actions, words, and thoughts that we have a choice." + }, + { + "id": "05caf783-48ee-4c3a-b360-a11a6c8f3518", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sojourner Truth", + "text": "Truth is powerful and it prevails." + }, + { + "id": "dc2b3ebc-bb03-4dd9-9eec-fb03dd5183ff", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": ["creativity", "youth", "age", "mind"], + "source": "https://www.goodreads.com/quotes/8746", + "author": "Sophia Loren", + "text": "There is a fountain of youth: it is your mind, your talents, the creativity you bring to your life and the lives of people you love. When you learn to tap this source, you will truly have defeated age." + }, + { + "id": "7da49aa8-64ea-4107-87e6-331edd39bdaa", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sophocles", + "text": "Wisdom is the supreme part of happiness." + }, + { + "id": "be2f08fa-a9e5-4b58-95d1-f57f10991b43", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sophocles", + "text": "A short saying often contains much wisdom." + }, + { + "id": "92a3650d-3c6f-440b-ba91-60c858ea4495", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sophocles", + "text": "A short saying oft contains much wisdom." + }, + { + "id": "1ca5bc21-fa02-417d-86bb-18ef845464ec", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sophocles", + "text": "Men of perverse opinion do not know the excellence of what is in their hands, till some one dash it from them." + }, + { + "id": "ea87d27c-5247-4edf-bd57-6363cf18b5ed", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sophocles", + "text": "Ignorant men don't know what good they hold in their hands until they've flung it away." + }, + { + "id": "94a845ec-785e-49f8-a690-f3461404a454", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sophocles", + "text": "Much wisdom often goes with fewer words." + }, + { + "id": "2771c00c-2ad5-4920-97a5-cf5deee3445a", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sophocles", + "text": "Numberless are the worlds wonders, but none more wonderful than man." + }, + { + "id": "d431e281-9867-4dab-a4d9-b6e3a0c6f7d5", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sri Chinmoy", + "text": "Judge nothing, you will be happy. Forgive everything, you will be happier. Love everything, you will be happiest." + }, + { + "id": "a14c323e-7979-4901-a70f-67803ad8b9dd", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "St. Augustine", + "text": "Better to have loved and lost, than to have never loved at all." + }, + { + "id": "3aaf3958-602f-4fdc-af08-9e192fbf6d48", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Stephen Covey", + "text": "We are not animals. We are not a product of what has happened to us in our past. We have the power of choice." + }, + { + "id": "095cd53e-61a4-48ed-b7ec-e4a76c247666", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Stephen Kaggwa", + "text": "Try and fail, but don't fail to try." + }, + { + "id": "13416737-6024-49d5-a6a9-e3e3425d942a", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Stephen Sigmund", + "text": "Learn wisdom from the ways of a seedling. A seedling which is never hardened off through stressful situations will never become a strong productive plant." + }, + { + "id": "2b05e930-2498-4ddf-b619-99998dd08f98", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sue Patton Thoele", + "text": "Deep listening is miraculous for both listener and speaker.When someone receives us with open-hearted, non-judging, intensely interested listening, our spirits expand." + }, + { + "id": "9da6cb3c-d93c-4f08-b4de-71d0bb79826f", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sun Tzu", + "text": "You have to believe in yourself." + }, + { + "id": "c7e4d17c-07c4-47ba-9439-a058d1960089", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sun Tzu", + "text": "Can you imagine what I would do if I could do all I can?" + }, + { + "id": "0edb2cd0-a03c-42de-94ff-9912ccd064ea", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Swedish proverb", + "text": "Worry often gives a small thing a big shadow." + }, + { + "id": "e8ccc457-6822-402c-b397-71fcd501793e", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sydney Smith", + "text": "It is the greatest of all mistakes to do nothing because you can only do little do what you can." + }, + { + "id": "5a06cefb-f906-4f95-bcea-6cb2f236d709", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sydney Smith", + "text": "It is the greatest of all mistakes to do nothing because you can only do little - do what you can." + }, + { + "id": "cc027f87-8dcb-41c3-8979-8fa37082da15", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": ["creativity", "confidence", "self-doubt", "enemy"], + "source": "https://www.goodreads.com/quotes/358562", + "author": "Sylvia Plath", + "text": "The worst enemy to creativity is self-doubt." + }, + { + "id": "2eadf19c-da10-499b-bb82-d5a6d3983d14", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Sylvia Voirol", + "text": "Rainbows apologize for angry skies." + }, + { + "id": "66bf3742-5aea-471b-b17c-e18649bfb039", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": ["fictional", "movie", "do", "try", "star wars"], + "source": "https://www.goodreads.com/quotes/6812", + "author": "Søren Kierkegaard", + "text": "Life can only be understood backwards; but it must be lived forwards." + }, + { + "id": "89b2941c-ad1b-4806-bac7-3fc1a5eb80c6", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Søren Kierkegaard", + "text": "To dare is to lose ones footing momentarily. To not dare is to lose oneself." + }, + { + "id": "1f2751bb-88b4-4bbb-9835-d1d5211bf26c", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tehyi Hsieh", + "text": "Action will remove the doubts that theory cannot solve." + }, + { + "id": "b8e4d233-4671-44f8-ae87-4718d7ca2748", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tenzin Gyatso", + "text": "To be aware of a single shortcoming in oneself is more useful than to be aware of a thousand in someone else." + }, + { + "id": "eb0a9fd9-07e7-4cce-adf9-ec607d8440ba", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tenzin Gyatso", + "text": "When we feel love and kindness toward others, it not only makes others feel loved and cared for, but it helps us also to develop inner happiness and peace." + }, + { + "id": "c5ec031c-f37f-40f0-a84f-834a776b8eed", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": ["creative", "creativity"], + "source": "https://www.goodreads.com/quotes/784313", + "author": "Terry Tempest Williams", + "text": "Creativity involves breaking out of expected patterns in order to look at things in a different way." + }, + { + "id": "3a72b6ee-69bd-4271-bddf-39f555c1db94", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Theodore H. White", + "text": "To go against the dominant thinking of your friends, of most of the people you see every day, is perhaps the most difficult act of heroism you can perform." + }, + { + "id": "a109cee2-e724-4b53-85a8-5547437fbf92", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Theodore Roosevelt", + "text": "Keep your eyes on the stars and your feet on the ground." + }, + { + "id": "42f45c89-d60f-4b74-9f97-f18e8f528410", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Theodore Rubin", + "text": "Kindness is more important than wisdom, and the recognition of this is the beginning of wisdom." + }, + { + "id": "db9ac72e-4c9d-46a8-8007-ab469e7e16dc", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Theophrastus", + "text": "Time is the most valuable thing a man can spend." + }, + { + "id": "0071e463-8580-4260-bc76-76f5f9c9ee45", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "Smile, breathe, and go slowly." + }, + { + "id": "6aa21342-6ac2-449a-9d75-cb84b949adca", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "There is no way to happiness, happiness is the way." + }, + { + "id": "44ce9876-9bb4-47ea-bce7-8f0a2aa07f6b", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "May our hearts garden of awakening bloom with hundreds of flowers." + }, + { + "id": "ebc019bd-3e19-47d7-a0b2-537582d81320", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "To be beautiful means to be yourself. You do not need to be accepted by others. You need to accept yourself." + }, + { + "id": "dd4a252d-db2d-4d42-a0b4-43086b15241b", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "The most precious gift we can offer anyone is our attention. When mindfulness embraces those we love, they will bloom like flowers." + }, + { + "id": "60aae5f5-4398-4e82-9a96-dd1709d23ee5", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "Sometimes your joy is the source of your smile, but sometimes your smile can be the source of your joy." + }, + { + "id": "8e436a1a-9fe8-4940-b486-fe9663c87d4f", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "By living deeply in the present moment we can understand the past better and we can prepare for a better future." + }, + { + "id": "602d33c9-6c3f-43ac-9002-65889d709864", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "The amount of happiness that you have depends on the amount of freedom you have in your heart." + }, + { + "id": "a42f27d9-cd54-4b29-90e5-fbcd84bff5dd", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "Smile, breathe and go slowly." + }, + { + "id": "bb7ada0e-21e7-442a-a807-9693f2176b4d", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "If we are not fully ourselves, truly in the present moment, we miss everything." + }, + { + "id": "afb1ca07-4090-4e24-aaee-a588f38163cb", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thich Nhat Hanh", + "text": "To be beautiful means to be yourself. You don't need to be accepted by others. You need to accept yourself." + }, + { + "id": "568b7204-ffbf-4ca8-bc97-f9f058b97803", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Carlyle", + "text": "By nature man hates change; seldom will he quit his old home till it has actually fallen around his ears." + }, + { + "id": "26dc3d37-317f-409a-b6a0-6a7c63c80002", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Carlyle", + "text": "This world, after all our science and sciences, is still a miracle; wonderful, inscrutable, magical and more, to whosoever will think of it." + }, + { + "id": "4699aeee-7176-42e7-a8e2-596d8fe865f3", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Carlyle", + "text": "Do not be embarrassed by your mistakes. Nothing can teach us better than our understanding of them. This is one of the best ways of self-education." + }, + { + "id": "e9b73ca0-a304-4012-94f3-22571e163ddb", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Carlyle", + "text": "Instead of saying that man is the creature of circumstance, it would be nearer the mark to say that man is the architect of circumstance." + }, + { + "id": "5d274197-af6b-470a-b0d0-40127454b18a", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Dewar", + "text": "Minds are like parachutes. They only function when open." + }, + { + "id": "9b8ae525-5f3d-4cfb-8a0c-88ecec7bb684", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Edison", + "text": "Genius is one percent inspiration and ninety-nine percent perspiration." + }, + { + "id": "daa2bb16-27a8-4c77-bc87-032da9c6cf6d", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Edison", + "text": "If we did the things we are capable of, we would astound ourselves." + }, + { + "id": "e6d893fc-d957-44ee-a3e3-2a7785ec5f8b", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Edison", + "text": "Opportunity is missed by most because it is dressed in overalls and looks like work." + }, + { + "id": "2133b659-f71b-408e-ba62-16d090c33757", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Edison", + "text": "Many of life's failures are people who did not realize how close they were to success when they gave up." + }, + { + "id": "d396d36a-4bc5-4bd8-b13c-b029fdfea27c", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Edison", + "text": "The first requisite for success is the ability to apply your physical and mental energies to one problem incessantly without growing weary." + }, + { + "id": "be943ce8-2eee-402a-89e2-ad6dc0cc0254", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Fuller", + "text": "No garden is without its weeds." + }, + { + "id": "e90ad92e-cd3a-4d88-850f-14287aefba3d", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Fuller", + "text": "An invincible determination can accomplish almost anything and in this lies the great distinction between great men and little men." + }, + { + "id": "692f7c60-eb92-4ec7-863f-7133a05f350a", + "isDeleted": false, + "createdAt": 1613993133684, + "updatedAt": 1613993133684, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Hardy", + "text": "Time changes everything except something within us which is always surprised by change." + }, + { + "id": "b4ed8d4b-509a-4d29-868f-b3f11fb8038b", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Jefferson", + "text": "Never put off till tomorrow what you can do today." + }, + { + "id": "8d125b2d-f12e-4d6d-bb81-26f78df99fcf", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Jefferson", + "text": "Do you want to know who you are? Don't ask. Act! Action will delineate and define you." + }, + { + "id": "d369d597-f9f1-45c2-90bf-4eeefaab2110", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Jefferson", + "text": "I'm a great believer in luck and I find the harder I work, the more I have of it." + }, + { + "id": "f6fe5b26-b92a-4b49-874f-25bc0f39009e", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Jefferson", + "text": "Don't talk about what you have done or what you are going to do." + }, + { + "id": "8734e154-5630-45c4-b230-55fccc5045b6", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Jefferson", + "text": "Reason and free inquiry are the only effectual agents against error." + }, + { + "id": "7d961476-3a94-489d-a944-2adb28fdd87e", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Kempis", + "text": "Be not angry that you cannot make others as you wish them to be, since you cannot make yourself as you wish to be." + }, + { + "id": "0cd43230-dbda-4640-81d5-9c628cc6414e", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Thomas Paine", + "text": "The most formidable weapon against errors of every kind is reason." + }, + { + "id": "4c9294f7-33d9-432f-b7b7-4b26466e9037", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tom Jackson", + "text": "Sometimes the cards we are dealt are not always fair. However you must keep smiling and moving on." + }, + { + "id": "93fa1140-a725-4abe-bbe2-5068ee37a91a", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tom Krause", + "text": "There are no failures. Just experiences and your reactions to them." + }, + { + "id": "35af0a18-10c7-4361-8c63-e9c8c8c2ed97", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tom Krause", + "text": "There are no failures, just experiences and your reactions to them." + }, + { + "id": "12b6e27c-2ec2-4549-8b24-7e251273ddf6", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tom Lehrer", + "text": "Life is like a sewer. What you get out of it depends on what you put into it." + }, + { + "id": "48ae9e21-4f7d-4bdc-88dc-cb0a903ba87d", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tom Peters", + "text": "Formula for success: under promise and over deliver." + }, + { + "id": "3c14b191-ac9b-4864-b932-777e94d8b230", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tomas Eliot", + "text": "Do not expect the world to look bright, if you habitually wear gray-brown glasses." + }, + { + "id": "25d69f04-1369-452d-bd65-18a4e20abf95", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Toni Morrison", + "text": "If you surrender to the wind, you can ride it." + }, + { + "id": "9fc3cae2-a190-4730-9e34-c3c7022b3cf0", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Blair", + "text": "Sometimes it is better to lose and do the right thing than to win and do the wrong thing." + }, + { + "id": "cd304a2a-5b48-439e-887f-ae3db9cb2df0", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "Whatever happens, take responsibility." + }, + { + "id": "a1671b0a-2685-4113-ab9f-a647f3ef7c4b", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "The path to success is to take massive, determined action." + }, + { + "id": "19e01cb0-5e22-4ce5-9e52-cd5a6f47e80c", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "Successful people ask better questions, and as a result, they get better answers." + }, + { + "id": "7bb3d1bf-64a0-4587-90f0-e161d14237f9", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "It is in your moments of decision that your destiny is shaped." + }, + { + "id": "63c6e61d-bd77-4872-9951-9916131f5d4c", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "The way we communicate with others and with ourselves ultimately determines the quality of our lives." + }, + { + "id": "825525cc-f3d0-4504-811d-092bf8dcd075", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "The only limit to your impact is your imagination and commitment." + }, + { + "id": "42f348d7-2c88-4e20-b6ce-94809e069c5d", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "You always succeed in producing a result." + }, + { + "id": "0f3df1bd-5eaa-412a-a567-89e08fb9e9d5", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "Stay committed to your decisions, but stay flexible in your approach." + }, + { + "id": "f822f60f-5332-452b-9cd8-d15052d5ee38", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "People are not lazy. They simply have impotent goals that is, goals that do not inspire them." + }, + { + "id": "50864334-0221-4260-a3e4-19ce06417634", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "Setting goals is the first step in turning the invisible into the visible." + }, + { + "id": "1dca556b-6213-4f84-a7f1-bd48895ec169", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "We can change our lives. We can do, have, and be exactly what we wish." + }, + { + "id": "bfa41ca3-d925-4590-9498-fbecc4c510db", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "When people are like each other they tend to like each other." + }, + { + "id": "2b6e92af-dae7-49d5-a541-d628732eba2f", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "If you do what you've always done, you'll get what youve always gotten." + }, + { + "id": "1a2cf06a-d033-4546-95ef-c44c518225e4", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "Using the power of decision gives you the capacity to get past any excuse to change any and every part of your life in an instant." + }, + { + "id": "c3fae716-d1bd-49d4-9057-ac5d1a82b3e5", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tony Robbins", + "text": "People are not lazy. They simply have impotent goals - that is, goals that do not inspire them." + }, + { + "id": "5f04ae79-998a-44c1-96d6-ebcb619c85e2", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Tryon Edwards", + "text": "He that never changes his opinions, never corrects his mistakes, and will never be wiser on the morrow than he is today." + }, + { + "id": "60897695-b067-42eb-aa26-1fe91db08d2b", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Turkish proverb", + "text": "Kind words will unlock an iron door." + }, + { + "id": "e85ffa16-9e78-4830-830b-71d81bb13eb7", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": ["creative", "creativity", "child"], + "source": "https://www.goodreads.com/quotes/1260096", + "author": "Ursula Leguin", + "text": "The creative adult is the child who survived." + }, + { + "id": "2c56b76a-8aba-45d9-bb1e-78e5dcb065aa", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Usman Asif", + "text": "Fear is a darkroom where negatives develop." + }, + { + "id": "318c4721-5912-4eb0-800d-d195d2e318cb", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Uta Hagen", + "text": "We must overcome the notion that we must be regular. It robs you of the chance to be extraordinary and leads you to the mediocre." + }, + { + "id": "04c1ba13-8225-420b-9032-fe7cbf0ce714", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "V. Naipaul", + "text": "The world is always in movement." + }, + { + "id": "69ab0939-1d13-44f1-a477-5ec12fa55b40", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Vaclav Havel", + "text": "Work for something because it is good, not just because it stands a chance to succeed." + }, + { + "id": "2b56f5d5-7324-4080-8429-a64ab920da60", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Vernon Cooper", + "text": "These days people seek knowledge, not wisdom. Knowledge is of the past, wisdom is of the future." + }, + { + "id": "1e55a293-c0f0-4dd1-ba31-4bc2e032e549", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Victor Frankl", + "text": "Everything can be taken from a man but ... the last of the human freedoms to choose ones attitude in any given set of circumstances, to choose ones own way." + }, + { + "id": "b0f79c22-966b-451b-bbbb-70c9eef7e5db", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Victor Frankl", + "text": "Everything can be taken from a man but ... the last of the human freedoms - to choose ones attitude in any given set of circumstances, to choose ones own way." + }, + { + "id": "a73e4461-c47c-4314-85fb-e9ee1da86296", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Victor Hugo", + "text": "Life is the flower for which love is the honey." + }, + { + "id": "bf58ea89-f428-45b7-a9c9-9e6314eb01ad", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Victor Hugo", + "text": "An invasion of armies can be resisted, but not an idea whose time has come." + }, + { + "id": "c013dbcd-18b6-4d73-8726-db1a08ce8869", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Victoria Holt", + "text": "Never regret. If it's good, it's wonderful. If it's bad, it's experience." + }, + { + "id": "95703ba5-9183-49da-b486-af3ef35c4801", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Vince Lombardi", + "text": "If you'll not settle for anything less than your best, you will be amazed at what you can accomplish in your lives." + }, + { + "id": "a0a75557-4e88-4711-b0b9-b253df196dc8", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Vince Lombardi", + "text": "Leaders aren't born they are made. And they are made just like anything else, through hard work. And that's the price well have to pay to achieve that goal, or any goal." + }, + { + "id": "35d2fc52-b8b7-4699-816c-68158e75957c", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Vincent Lombardi", + "text": "The spirit, the will to win, and the will to excel, are the things that endure. These qualities are so much more important than the events that occur." + }, + { + "id": "5896e997-1e07-47ad-bb6c-b762ae6a41d3", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Virgil", + "text": "Fortune favours the brave." + }, + { + "id": "be0ddb6b-b47d-48a3-bcb1-454a13aec4f6", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Virgil", + "text": "They can do all because they think they can." + }, + { + "id": "dc091182-b6f1-4545-a777-3f3f5bbeb1be", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Virgil", + "text": "They can conquer who believe they can." + }, + { + "id": "157b3798-c690-4053-8d7d-78e3cd165948", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Vista Kelly", + "text": "Snowflakes are one of natures most fragile things, but just look what they can do when they stick together." + }, + { + "id": "b72dfca4-c758-48ec-be33-390a9d03fd3a", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Voltaire", + "text": "No snowflake in an avalanche ever feels responsible." + }, + { + "id": "2042d8be-8caa-4af3-9b19-2597b65a3b81", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Voltaire", + "text": "To enjoy life, we must touch much of it lightly." + }, + { + "id": "08ce398e-8bbd-4902-b30f-ceb5aaf76a75", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Voltaire", + "text": "Think for yourselves and let others enjoy the privilege to do so too." + }, + { + "id": "0976f4dd-6b89-42fc-adb5-7a47d75fc547", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Voltaire", + "text": "The longer we dwell on our misfortunes, the greater is their power to harm us." + }, + { + "id": "e9e35223-d4a1-4591-a58d-1464576a048a", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Voltaire", + "text": "We never live; we are always in the expectation of living." + }, + { + "id": "f982701d-d69d-4b55-8e67-6cc97028ee53", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Voltaire", + "text": "Meditation is the dissolution of thoughts in eternal awareness or Pure consciousness without objectification, knowing without thinking, merging finitude in infinity." + }, + { + "id": "276cbaea-4425-44ad-8b78-00d13691552b", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "W. Clement Stone", + "text": "No matter how carefully you plan your goals they will never be more that pipe dreams unless you pursue them with gusto." + }, + { + "id": "98240b98-706a-492b-8b6e-99addce96503", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "W. Clement Stone", + "text": "When you discover your mission, you will feel its demand. It will fill you with enthusiasm and a burning desire to get to work on it." + }, + { + "id": "d8725009-ca3d-4344-98ee-e48a8dd7f56a", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "W. H. Auden", + "text": "To choose what is difficult all ones days, as if it were easy, that is faith." + }, + { + "id": "17ee6608-dbc5-4e02-8094-f53438082a2e", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Walt Disney", + "text": "If you can dream it, you can do it." + }, + { + "id": "0e73f1fd-b8b7-431e-9fbc-a883fa4633a4", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Walt Disney", + "text": "Weve got to have a dream if we are going to make a dream come true." + }, + { + "id": "a8c90640-5e98-4d43-a399-62262ad2970b", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Walt Emerson", + "text": "What lies behind us and what lies before us are tiny matters compared to what lies within us." + }, + { + "id": "30604ec1-9fd2-416b-a9e9-c191e2d2a1b7", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Walter Anderson", + "text": "Nothing diminishes anxiety faster than action." + }, + { + "id": "3823a89e-ada3-4128-870c-0240de4720f4", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Walter Benjamin", + "text": "To be happy is to be able to become aware of oneself without fright." + }, + { + "id": "c99f87e4-3a91-4519-a557-ac235b831e5e", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Walter Cronkite", + "text": "I can't imagine a person becoming a success who doesn't give this game of life everything hes got." + }, + { + "id": "42fe7845-1536-4e83-a3b6-78430ba02920", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Walter Linn", + "text": "It is surprising what a man can do when he has to, and how little most men will do when they don't have to." + }, + { + "id": "893f41d7-12c0-47f2-abf8-4cadaa567d6e", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Walter Lippmann", + "text": "Ideals are an imaginative understanding of that which is desirable in that which is possible." + }, + { + "id": "f399bdf6-844c-4158-adff-e452310695bb", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Walter Lippmann", + "text": "Where all think alike, no one thinks very much." + }, + { + "id": "b2d557df-b191-4e36-bb2e-f75eadfd7f54", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Washington Irving", + "text": "Love is never lost. If not reciprocated, it will flow back and soften and purify the heart." + }, + { + "id": "13be7a63-e2bd-4484-89f3-0d7c328261c7", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "You'll see it when you believe it." + }, + { + "id": "c05e0da0-67ae-4b98-8775-48736dd64bd2", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Real magic in relationships means an absence of judgement of others." + }, + { + "id": "1dc3c34d-9587-43cc-bb51-649c2b6796f5", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Our intention creates our reality." + }, + { + "id": "15d406cb-7df3-413b-8934-372d42dba2e9", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "I think and that is all that I am." + }, + { + "id": "6848566a-ac8c-4296-b618-cfb4912384d2", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "There is no way to prosperity, prosperity is the way." + }, + { + "id": "c4c8908c-4bd6-4711-996e-cca535a0e432", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Everything is perfect in the universe even your desire to improve it." + }, + { + "id": "cb81a860-0b10-44ff-b9ac-d4e6e5111514", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Be miserable. Or motivate yourself. Whatever has to be done, it's always your choice." + }, + { + "id": "319d7c21-f6e1-429f-b65b-63fd3f371325", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "If you change the way you look at things, the things you look at change." + }, + { + "id": "598f0f6c-4530-4e81-be9c-153639642b96", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "You are important enough to ask and you are blessed enough to receive back." + }, + { + "id": "2fae6646-ba04-46f3-b2ac-705dd27b16e5", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "What we think determines what happens to us, so if we want to change our lives, we need to stretch our minds." + }, + { + "id": "14f4450a-65f1-499c-996b-52e06c1329e2", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "I cannot always control what goes on outside. But I can always control what goes on inside." + }, + { + "id": "c87e91c0-0fd0-4778-b88f-0aa36e99136d", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Our lives are a sum total of the choices we have made." + }, + { + "id": "f0d25a97-248c-40b5-ae95-0f9209f3483f", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "When you dance, your purpose is not to get to a certain place on the floor. It's to enjoy each step along the way." + }, + { + "id": "68f910ef-b440-4626-8a33-9ff73d57675a", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Anything you really want, you can attain, if you really go after it." + }, + { + "id": "6d192607-5615-4737-b96f-1e02ed4630f2", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Doing what you love is the cornerstone of having abundance in your life." + }, + { + "id": "4ac80367-e030-4ca5-b628-5a0e9f87e239", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Everything you are against weakens you. Everything you are for empowers you." + }, + { + "id": "f98bc581-148d-467e-8f20-1fd3cf10841c", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "You can't choose up sides on a round world." + }, + { + "id": "30828efd-75e1-48c2-8ec6-57bce170d906", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "There is no scarcity of opportunity to make a living at what you love; theres only scarcity of resolve to make it happen." + }, + { + "id": "28f9f2f4-d31b-4d61-8057-cc3ec0599816", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "We are Divine enough to ask and we are important enough to receive." + }, + { + "id": "93c67a58-5a30-40fc-8f07-724274d8e1ad", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Maxim for life: You get treated in life the way you teach people to treat you." + }, + { + "id": "8e2f578f-7832-48d8-a4b8-234e7d631e38", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "You cannot be lonely if you like the person you're alone with." + }, + { + "id": "762b7285-a169-4116-8ee4-60c5b482f366", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Go for it now. The future is promised to no one." + }, + { + "id": "d404ba2d-e7ee-42b6-a15c-0904b05ad731", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Miracles come in moments. Be ready and willing." + }, + { + "id": "51117b04-cb38-458a-9d45-fc3cc369ee46", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "When you judge another, you do not define them, you define yourself." + }, + { + "id": "051d0a03-597b-4257-91fc-620f802e685d", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Simply put, you believer that things or people make you unhappy, but this is not accurate. You make yourself unhappy." + }, + { + "id": "26d24812-bc5e-438a-a992-748eb330dc46", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wayne Dyer", + "text": "Everything is perfect in the universe - even your desire to improve it." + }, + { + "id": "7e9fa1e1-8116-4a51-8bb3-d5791434ac95", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Whoopi Goldberg", + "text": "Were here for a reason. I believe a bit of the reason is to throw little torches out to lead people through the dark." + }, + { + "id": "29ded520-aaaf-4ac6-a183-9e84a51c68fd", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Will Durant", + "text": "The trouble with most people is that they think with their hopes or fears or wishes rather than with their minds." + }, + { + "id": "88bbac0e-41c2-494f-b7c7-bf715cd04ca5", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Will Rogers", + "text": "If you find yourself in a hole, the first thing to do is stop digging." + }, + { + "id": "3a675afd-daee-48cb-ba54-8791c980beea", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Willa Cather", + "text": "Where there is great love, there are always miracles." + }, + { + "id": "97524857-d373-48f7-8f33-6fb30c8ffec6", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Arthur Ward", + "text": "Do more than dream: work." + }, + { + "id": "053d4fa6-df10-4e58-9355-c50da09a1927", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Arthur Ward", + "text": "Four steps to achievement: Plan purposefully. Prepare prayerfully. Proceed positively. Pursue persistently." + }, + { + "id": "06363723-12d7-4b45-b4c1-c6f2433d3e58", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Blake", + "text": "In seed time learn, in harvest teach, in winter enjoy." + }, + { + "id": "f8677a3b-783f-4f3d-bfeb-8ae62b41c4a0", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Blake", + "text": "For everything that lives is holy, life delights in life." + }, + { + "id": "dadf26da-190b-4b4c-9b3b-12efc4d1ea78", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Burroughs", + "text": "Your mind will answer most questions if you learn to relax and wait for the answer." + }, + { + "id": "1bff7eaa-a676-4ac1-8ce6-03815577cc02", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Channing", + "text": "Difficulties are meant to rouse, not discourage. The human spirit is to grow strong by conflict." + }, + { + "id": "99a51871-46c4-4edd-b908-bfb4f0f5ad58", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Hazlitt", + "text": "Just as much as we see in others we have in ourselves." + }, + { + "id": "c88025bc-6651-4c57-b804-682089add8de", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William James", + "text": "The greatest discovery of our generation is that human beings can alter their lives by altering their attitudes of mind. As you think, so shall you be." + }, + { + "id": "6dea8eb9-4ec8-4a8e-8a3b-c87d5fd8446c", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William James", + "text": "Act as if what you do makes a difference. It does." + }, + { + "id": "e2e8e5fb-fd1a-4b4b-bd7e-494329156b9c", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William James", + "text": "To change ones life, start immediately, do it flamboyantly, no exceptions." + }, + { + "id": "4ef17400-12b8-477c-a0ed-63a09a828775", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William James", + "text": "The deepest craving of human nature is the need to be appreciated." + }, + { + "id": "e79666d7-42d7-4d2f-9fb1-f9f487fa1707", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Londen", + "text": "To ensure good health: eat lightly, breathe deeply, live moderately, cultivate cheerfulness, and maintain an interest in life." + }, + { + "id": "ed75ebd0-9015-46c5-ade3-6e5b3852a905", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Lyon Phelps", + "text": "This is the final test of a gentleman: his respect for those who can be of no possible value to him." + }, + { + "id": "748f5ea2-ed58-4ed6-82f1-48d60bde7601", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Menninger", + "text": "Six essential qualities that are the key to success: Sincerity, personal integrity, humility, courtesy, wisdom, charity." + }, + { + "id": "3af8de50-5dfa-4444-a60a-713cf3bbcff7", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Penn", + "text": "True silence is the rest of the mind; it is to the spirit what sleep is to the body, nourishment and refreshment." + }, + { + "id": "de2e49cd-c324-4dd0-945d-4cd546234bba", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William R. Inge", + "text": "Nature takes away any faculty that is not used." + }, + { + "id": "75aed4b6-2b23-4345-86fe-f08e2ccbae12", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Saroyan", + "text": "Good people are good because they've come to wisdom through failure. We get very little wisdom from success, you know." + }, + { + "id": "b6387c15-92fc-467a-adcc-8cd8a5414593", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Scolavino", + "text": "The height of your accomplishments will equal the depth of your convictions." + }, + { + "id": "09813c77-a21d-4d2b-a643-bcffce3be616", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "Having nothing, nothing can he lose." + }, + { + "id": "7128c675-fa6a-4497-a919-1d4dfe2f02d6", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "Love all, trust a few, do wrong to none." + }, + { + "id": "6814f1ed-fe90-42dd-9715-1ad6c1c349fe", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "He that is giddy thinks the world turns round." + }, + { + "id": "08633437-22ae-4055-8fd1-ad4da5e16ac7", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "Speak low, if you speak love." + }, + { + "id": "37c5dbdf-2007-41fa-999d-bca1974f29fd", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "Be great in act, as you have been in thought." + }, + { + "id": "1f5612b6-7454-4d14-85e4-a943a029462c", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "Be not afraid of greatness: some are born great, some achieve greatness, and some have greatness thrust upon them." + }, + { + "id": "cb02e23a-d95d-44fa-a10a-1ee4fe5021ac", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "How far that little candle throws its beams! So shines a good deed in a naughty world." + }, + { + "id": "fcf2ce9b-55b3-437c-b2b6-2c9919c9c6d9", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "God has given you one face, and you make yourself another." + }, + { + "id": "38f08150-d521-4d09-91e9-06ea784eae8a", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "Go to your bosom: Knock there, and ask your heart what it doth know." + }, + { + "id": "84956742-b701-47b3-99c0-8dd865f4ed41", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "We know what we are, but know not what we may be." + }, + { + "id": "b3054ea2-dfd6-494f-b4f9-317f375b5862", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "All the world is a stage, And all the men and women merely players.They have their exits and entrances; Each man in his time plays many parts." + }, + { + "id": "cebf96d3-a3f4-4025-9656-b56503eaa623", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "To climb steep hills requires a slow pace at first." + }, + { + "id": "5f29b686-5764-4c68-a97b-3aa4d7ba0b1a", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Shakespeare", + "text": "It is not in the stars to hold our destiny but in ourselves." + }, + { + "id": "ed6cdadd-8afe-4205-838c-550f9d5bb332", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Sloane Coffin", + "text": "Hope arouses, as nothing else can arouse, a passion for the possible." + }, + { + "id": "bf86b4ab-c2b5-4bfc-a717-20a0e49348d0", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Ward", + "text": "When we seek to discover the best in others, we somehow bring out the best in ourselves." + }, + { + "id": "97a2ea21-d117-401c-b623-96d977d54afd", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Ward", + "text": "Adversity causes some men to break, others to break records." + }, + { + "id": "e14e59d4-2144-49ef-935c-884aa1d66911", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William White", + "text": "I am not afraid of tomorrow, for I have seen yesterday and I love today." + }, + { + "id": "795bba27-a602-43ef-b002-3c9296d8f16f", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "William Yeats", + "text": "Think as a wise man but communicate in the language of the people." + }, + { + "id": "07b75d86-7f60-4f36-9780-ebc1397a7c10", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winifred Holtby", + "text": "The things that one most wants to do are the things that are probably most worth doing." + }, + { + "id": "1a70abaf-5fc1-4f39-97ae-2a8935c8e3d8", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "Courage is going from failure to failure without losing enthusiasm." + }, + { + "id": "03a65c6a-e866-4e8e-9e22-55a8b07a1dd3", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "Short words are best and the old words when short are best of all." + }, + { + "id": "43615e23-68fe-43c3-b3be-68bdfcabb1db", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "You have enemies? Good. That means you've stood up for something, sometime in your life." + }, + { + "id": "39372a33-5714-431f-af70-b8489b830484", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "Courage is what it takes to stand up and speak; courage is also what it takes to sit down and listen." + }, + { + "id": "18e141f1-d485-49e8-b819-c3e5fbd00c21", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "History will be kind to me for I intend to write it." + }, + { + "id": "8739359f-a64c-4ffa-ad4e-650d7cc7582e", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "Before you can inspire with emotion, you must be swamped with it yourself. Before you can move their tears, your own must flow. To convince them, you must yourself believe." + }, + { + "id": "f85038e0-7b33-4528-a370-b9e88354c383", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "The price of greatness is responsibility." + }, + { + "id": "25de647b-f466-4dc2-b1af-ead8859d0725", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "The pessimist sees difficulty in every opportunity. The optimist sees the opportunity in every difficulty." + }, + { + "id": "8c56a338-0ad8-4e8d-a8eb-b1e55f0472fe", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "I never worry about action, but only inaction." + }, + { + "id": "5ffeaf15-073f-4287-af8e-734e1b57ed6c", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "Never, never, never give up." + }, + { + "id": "168e0c01-e8b7-4a1d-872f-4eb6cb594d5b", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "We make a living by what we get, but we make a life by what we give." + }, + { + "id": "711ae08f-7b30-4f15-a104-401467868a2f", + "isDeleted": false, + "createdAt": 1613993133685, + "updatedAt": 1613993133685, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "Continuous effort, not strength or intelligence is the key to unlocking our potential." + }, + { + "id": "1ef5808a-967e-44c6-b40c-1946b1a3c6a2", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Winston Churchill", + "text": "Continuous effort - not strength or intelligence - is the key to unlocking our potential." + }, + { + "id": "1eda3e79-a017-4fac-b11b-dbc74a6c8771", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wit", + "text": "We choose our destiny in the way we treat others." + }, + { + "id": "152a8f0e-5d5a-422b-aed4-6a7d48bcaa30", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Wolfgang Amadeus Mozart", + "text": "Neither a lofty degree of intelligence nor imagination nor both together go to the making of genius. Love, love, love, that is the soul of genius." + }, + { + "id": "2003e828-e750-4d5c-be34-d2042044b511", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Woody Guthrie", + "text": "Take it easy, but take it." + }, + { + "id": "5c5805c9-fde6-4a83-8669-c0527df2c014", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Woody Guthrie", + "text": "Take it easy but take it." + }, + { + "id": "f6c37796-8f22-45d6-a165-60a53be086f7", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Woody Guthrie", + "text": "Take it easy - but take it." + }, + { + "id": "995004a4-8c18-48ee-911d-cb4496bb1466", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ymber Delecto", + "text": "The time you think you're missing, misses you too." + }, + { + "id": "3e9a94ef-a239-411b-81c7-88d3b8eace8a", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Yoda", + "text": "Do, or do not. There is no try." + }, + { + "id": "547eb815-7310-418e-bb60-0ae86c1ac5ed", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Yogi Berra", + "text": "You can observe a lot just by watching." + }, + { + "id": "e7194032-bbda-4ebc-bf00-bfcb7594bd04", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Yogi Berra", + "text": "Life is a learning experience, only if you learn." + }, + { + "id": "6d341f8c-75fb-420f-82c5-9f10443778e6", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Yogi Berra", + "text": "You got to be careful if you don't know where you're going, because you might not get there." + }, + { + "id": "e35501b0-9426-4c0d-a029-4e993a6e3238", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Zadok Rabinowitz", + "text": "A man's dreams are an index to his greatness." + }, + { + "id": "3443483d-3d30-420d-840d-771b3933e9e2", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Zig Ziglar", + "text": "Positive thinking will let you do everything better than negative thinking will." + }, + { + "id": "0b49a940-92bf-4058-80fc-156a3ec70b82", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Zig Ziglar", + "text": "You are the only person on Earth who can use your ability." + }, + { + "id": "4fd84b0d-5f25-4786-b3f4-59b60225b4b7", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Zig Ziglar", + "text": "You are the only person on earth who can use your ability." + }, + { + "id": "87d3b7e8-8104-4e45-b275-7293fc7839de", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Zig Ziglar", + "text": "Your attitude, not your aptitude, will determine your altitude." + }, + { + "id": "c19907cc-c1f7-4921-b43d-b38e291543af", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Zig Ziglar", + "text": "Remember that failure is an event, not a person." + }, + { + "id": "ea01d8a4-46d4-477f-8a32-c681a346993c", + "isDeleted": false, + "createdAt": 1613993133686, + "updatedAt": 1613993133686, + "createdBy": "Quote app", + "tags": [], + "source": "quotesy", + "author": "Ziggy", + "text": "You can complain because roses have thorns, or you can rejoice because thorns have roses." + } +] diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 49be361..a07d456 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -6,15 +6,20 @@ import { Logger } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; +import * as compression from 'compression'; + import { AppModule } from './app/app.module'; async function bootstrap() { - const app = await NestFactory.create(AppModule); - const globalPrefix = 'api'; + const globalPrefix = ''; // TODO: add a global prefix when app will be an API + const port = process.env.PORT || 3000; + + const app = await NestFactory.create(AppModule, { cors: true }); app.setGlobalPrefix(globalPrefix); - const port = process.env.PORT || 3333; + app.use(compression()); + await app.listen(port, () => { - Logger.log('Listening at http://localhost:' + port + '/' + globalPrefix); + Logger.log(`Listening at http://localhost:${ port }/${ globalPrefix }`); }); } diff --git a/apps/api/tsconfig.app.json b/apps/api/tsconfig.app.json index 0a067b3..6dd57eb 100644 --- a/apps/api/tsconfig.app.json +++ b/apps/api/tsconfig.app.json @@ -5,8 +5,11 @@ "module": "commonjs", "types": ["node"], "emitDecoratorMetadata": true, - "target": "es2015" + "target": "es2017" }, "exclude": ["**/*.spec.ts"], - "include": ["**/*.ts"] + "include": ["**/*.ts"], + "files": [ + "./src/" + ] } diff --git a/apps/quotes/.eslintrc.json b/apps/quotes/.eslintrc.json index d8aa558..940506b 100644 --- a/apps/quotes/.eslintrc.json +++ b/apps/quotes/.eslintrc.json @@ -1,29 +1,408 @@ { "extends": ["../../.eslintrc.json"], "ignorePatterns": ["!**/*"], + "env": { + "browser": true, + "es6": true, + "node": true + }, + "plugins": [ + "@angular-eslint/eslint-plugin", + "@angular-eslint/template", + "eslint-plugin-import", + "eslint-plugin-jsdoc", + "eslint-plugin-prefer-arrow", + "@typescript-eslint", + "simple-import-sort" + ], "overrides": [ { - "files": ["*.ts"], + "files": [ + "src/**/*.ts", + "*.ts" + ], "extends": [ + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", "plugin:@nrwl/nx/angular", "plugin:@angular-eslint/template/process-inline-templates" ], - "parserOptions": { "project": ["apps/quotes/tsconfig.*?.json"] }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": [ + "apps/quotes/tsconfig.*?.json" + ], + "sourceType": "module" + }, "rules": { + "@angular-eslint/contextual-decorator": "error", + "@angular-eslint/directive-class-suffix": "error", "@angular-eslint/directive-selector": [ "error", - { "type": "attribute", "prefix": "quotes", "style": "camelCase" } + { + "type": "attribute", + "prefix": "app", + "style": "camelCase" + } ], + "@angular-eslint/component-class-suffix": "error", "@angular-eslint/component-selector": [ "error", - { "type": "element", "prefix": "quotes", "style": "kebab-case" } + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ], + "@angular-eslint/no-host-metadata-property": "error", + "@angular-eslint/no-input-rename": "error", + "@angular-eslint/no-inputs-metadata-property": "error", + "@angular-eslint/no-output-on-prefix": "error", + "@angular-eslint/no-output-rename": "error", + "@angular-eslint/no-outputs-metadata-property": "error", + "@angular-eslint/use-lifecycle-interface": "error", + "@angular-eslint/use-pipe-transform-interface": "error", + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/array-type": [ + "error", + { + "default": "array" + } + ], + "@typescript-eslint/ban-ts-comment": [ + "error", + { + "ts-ignore": false + } + ], + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/dot-notation": "off", + "@typescript-eslint/explicit-member-accessibility": [ + "off", + { + "accessibility": "explicit" + } + ], + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/indent": [ + "error", + 2 + ], + "@typescript-eslint/naming-convention": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-extra-semi": "error", + "@typescript-eslint/no-floating-promises": "off", + "@typescript-eslint/no-inferrable-types": [ + "error", + { + "ignoreParameters": true + } + ], + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "@typescript-eslint/no-parameter-properties": "off", + "@typescript-eslint/no-unnecessary-type-assertion": "off", + "@typescript-eslint/no-unsafe-call": "off", + "@typescript-eslint/no-unused-expressions": [ + "error", + { + "allowTernary": true + } + ], + "@typescript-eslint/no-unused-vars": [ + "error", + { + "args": "none" + } + ], + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/no-unsafe-return": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/prefer-regexp-exec": "off", + "@typescript-eslint/quotes": [ + "error", + "single" + ], + "@typescript-eslint/restrict-plus-operands": "off", + "@typescript-eslint/restrict-template-expressions": "off", + "@typescript-eslint/triple-slash-reference": [ + "error", + { + "path": "always", + "types": "prefer-import", + "lib": "always" + } + ], + "@typescript-eslint/type-annotation-spacing": "off", + "@typescript-eslint/typedef": [ + "error", + { + "parameter": true + } + ], + "@typescript-eslint/unbound-method": "off", + "@typescript-eslint/unified-signatures": "error", + "@typescript-eslint/no-misused-promises": [ + "error", + { + "checksVoidReturn": false, + "checksConditionals": false + } + ], + "array-bracket-spacing": [ + "error", + "always" + ], + "arrow-body-style": "off", + "arrow-parens": [ + "error", + "as-needed" + ], + "arrow-spacing": "error", + "brace-style": [ + "error", + "1tbs" + ], + "comma-dangle": [ + "error", + "always-multiline" + ], + "comma-spacing": [ + "error", + { + "before": false, + "after": true + } + ], + "complexity": "off", + "constructor-super": "error", + "curly": "error", + "eol-last": "error", + "eqeqeq": [ + "error", + "smart" + ], + "guard-for-in": "error", + "id-blacklist": "off", + "id-match": "error", + "import/no-deprecated": "warn", + "jsdoc/check-alignment": "error", + "jsdoc/check-indentation": "off", + "jsdoc/newline-after-description": "off", + "jsdoc/no-types": "off", + "keyword-spacing": [ + "error", + { + "before": true + } + ], + "max-classes-per-file": "off", + "max-len": [ + "error", + { + "code": 140, + "ignoreTemplateLiterals": true, + "ignoreStrings": true, + "ignoreComments": true + } + ], + "new-parens": "error", + "no-bitwise": "error", + "no-caller": "error", + "no-cond-assign": "error", + "no-console": [ + "error", + { + "allow": [ + "info", + "warn", + "dir", + "timeLog", + "assert", + "clear", + "count", + "countReset", + "group", + "groupEnd", + "table", + "dirxml", + "error", + "groupCollapsed", + "Console", + "profile", + "profileEnd", + "timeStamp", + "context" + ] + } + ], + "no-debugger": "error", + "no-duplicate-imports": "error", + "no-empty": "off", + "no-eval": "error", + "no-fallthrough": "error", + "no-invalid-this": "off", + "no-multiple-empty-lines": [ + "error", + { + "max": 2 + } + ], + "no-multi-spaces": "error", + "no-new-wrappers": "error", + "no-restricted-imports": [ + "error", + "rxjs/Rx" + ], + "no-shadow": "off", + "no-sparse-arrays": "error", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-underscore-dangle": "off", + "no-unsafe-finally": "error", + "no-unused-labels": "error", + "no-unused-vars": "off", + "no-var": "error", + "object-curly-spacing": [ + "error", + "always" + ], + "object-shorthand": "off", + "one-var": [ + "error", + "never" + ], + "padding-line-between-statements": [ + "error", + { + "blankLine": "always", + "prev": "*", + "next": "return" + } + ], + "prefer-arrow/prefer-arrow-functions": "off", + "prefer-const": [ + "error", + { + "destructuring": "all" + } + ], + "prefer-object-spread": "error", + "prefer-template": "error", + "quote-props": "off", + "radix": "error", + "rest-spread-spacing": "error", + "semi": [ + "error", + "always" + ], + "semi-spacing": "error", + "simple-import-sort/imports": [ + "error", + { + "groups": [ + [ + "^@angular/*" + ], + [ + "^@ngrx/*" + ], + [ + "^[a-z]" + ], + [ + "^@lodash.*" + ], + [ + "^@env.*" + ], + [ + "^@api/*" + ], + [ + "^@models*" + ], + [ + "^@app.*" + ], + [ + "^@[a-z]" + ], + [ + "^[.]./*" + ] + ] + } + ], + "space-in-parens": [ + "error", + "never" + ], + "spaced-comment": [ + "error", + "always", + { + "exceptions": [ + "*", + "/" + ] + } + ], + "use-isnan": "error", + "valid-typeof": "off", + "sort-imports": [ + "error", + { + "ignoreCase": true, + "ignoreDeclarationSort": true, + "ignoreMemberSort": false + } + ], + "space-infix-ops": "error", + "space-before-blocks": [ + "error", + { + "functions": "always", + "keywords": "always", + "classes": "always" + } ] } }, { - "files": ["*.html"], - "extends": ["plugin:@nrwl/nx/angular-template"], - "rules": {} + "files": [ + "*.component.html" + ], + "extends": [ + "plugin:@angular-eslint/template/recommended", + "plugin:@nrwl/nx/angular-template" + ], + "parser": "@angular-eslint/template-parser", + "rules": { + "@angular-eslint/template/no-negated-async": "off", + "@angular-eslint/template/accessibility-alt-text": "error", + "@angular-eslint/template/accessibility-valid-aria": "error", + "@angular-eslint/template/accessibility-table-scope": "error", + "@angular-eslint/template/accessibility-label-for": "off", + "@angular-eslint/template/accessibility-elements-content": "off", + "@angular-eslint/template/no-positive-tabindex": "error", + "@angular-eslint/template/no-distracting-elements": "error", + "@angular-eslint/template/no-call-expression": "off", + "@angular-eslint/template/no-autofocus": "error", + "@angular-eslint/template/no-any": "off", + "@angular-eslint/template/mouse-events-have-key-events": "error", + "@angular-eslint/template/conditional-complexity": "error" + } } ] } diff --git a/apps/quotes/.npmrc b/apps/quotes/.npmrc new file mode 100644 index 0000000..5deb95f --- /dev/null +++ b/apps/quotes/.npmrc @@ -0,0 +1 @@ +prefix = ../../ diff --git a/apps/quotes/.versionrc b/apps/quotes/.versionrc new file mode 100644 index 0000000..8dc9144 --- /dev/null +++ b/apps/quotes/.versionrc @@ -0,0 +1,5 @@ +{ + "path": ".", + "tag-prefix": "quotes-v", + "releaseCommitMessageFormat": "chore(release): quotes@{{currentTag}}" +} diff --git a/apps/quotes/README.md b/apps/quotes/README.md new file mode 100644 index 0000000..baf241d --- /dev/null +++ b/apps/quotes/README.md @@ -0,0 +1,38 @@ +# Quotes App + +[comment]: <> ([![DeepScan grade](https://deepscan.io/api/teams/7984/projects/10118/branches/135987/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=7984&pid=10118&bid=135987)) + +[comment]: <> ([![Known Vulnerabilities](https://snyk.io/test/github/boale/ngQuote/badge.svg?targetFile=package.json)](https://snyk.io/test/github/boale/ngQuote?targetFile=package.json)) + +[comment]: <> ([![Maintainability](https://api.codeclimate.com/v1/badges/28cd30bed8aafba2330d/maintainability)](https://codeclimate.com/github/boale/ngQuote/maintainability)) + +[comment]: <> ([![Test Coverage](https://api.codeclimate.com/v1/badges/28cd30bed8aafba2330d/test_coverage)](https://codeclimate.com/github/boale/ngQuote/test_coverage)) + +Angular-based Quote generator with all necessary CI/CD configurations and integrations. + +[comment]: <> (Also it has basic integrations with Ngrx or Ngxs stores (see `feature/ngrxStore` or `feature/ngxsStore` respectively).) + +## Development server + +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. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +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 or `npm run build:prod` command. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +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). diff --git a/apps/quotes/jest.config.js b/apps/quotes/jest.config.js index 5359005..4072f81 100644 --- a/apps/quotes/jest.config.js +++ b/apps/quotes/jest.config.js @@ -1,10 +1,16 @@ -module.exports = { +const baseJestConfig = { displayName: 'quotes', - preset: '../../jest.preset.js', + preset: 'jest-preset-angular', // "jest-preset-angular", setupFilesAfterEnv: ['/src/test-setup.ts'], + testPathIgnorePatterns: [ + '/environments/', + "/node_modules/" + ], globals: { 'ts-jest': { tsConfig: '/tsconfig.spec.json', + diagnostics: true, + ignoreCodes: [151001], stringifyContentPathRegex: '\\.(html|svg)$', astTransformers: { before: [ @@ -15,9 +21,56 @@ module.exports = { }, }, coverageDirectory: '../../coverage/apps/quotes', + coverageThreshold: { + global: { + branches: 80, + functions: 80, + lines: 80, + statements: 80, + }, + }, + collectCoverageFrom: ["**/*.ts"], + coveragePathIgnorePatterns: [ + ".*\\.mock.ts$", + ".*\\.module.ts$", + ".*\\.config.ts$", + ".*\\.models.ts$", + ".*\\.directive.ts$", + ".*\\.font.ts$", + ".*\\.worker.ts$", + "utag.service.ts", + "index.ts", + "/store/", + "/environments/", + "/utils/", + "/assets/", + "/text/", + ], snapshotSerializers: [ 'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js', 'jest-preset-angular/build/AngularSnapshotSerializer.js', 'jest-preset-angular/build/HTMLCommentSerializer.js', ], }; + +const ciSpecificConfig = { + collectCoverage: true, + coverageReporters: ["lcovonly", "text-summary"], +}; + +/** + * By default collecting the coverage is disable for development. + * In order to enable it we use jest CLI option `--coverage` + */ +const devSpecificConfig = { + coverageReporters: ["lcov", "text-summary"], +}; + +const jestDevCiSpecificConfig = process.env.TEST_ENV_CI + ? ciSpecificConfig + : devSpecificConfig; + +module.exports = { + ...baseJestConfig, + ...jestDevCiSpecificConfig, +} diff --git a/apps/quotes/package.json b/apps/quotes/package.json new file mode 100644 index 0000000..03da83f --- /dev/null +++ b/apps/quotes/package.json @@ -0,0 +1,17 @@ +{ + "name": "quotes", + "version": "0.0.0", + "description": "", + "keywords": [], + "homepage": "https://github.com/boale/quotes/tree/main/apps/quotes#readme", + "bugs": { + "url": "https://github.com/boale/quotes/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/boale/quotes", + "directory": "apps/quotes" + }, + "license": "MIT", + "author": "Oleksandr Bondarenko" +} diff --git a/apps/quotes/proxy.conf.json b/apps/quotes/proxy.conf.json index 62a1e7b..63dd627 100644 --- a/apps/quotes/proxy.conf.json +++ b/apps/quotes/proxy.conf.json @@ -1,6 +1,6 @@ { "/api": { - "target": "http://localhost:3333", + "target": "http://localhost:3000", "secure": false } } diff --git a/apps/quotes/src/app/api-services/auth-api.service.mock.ts b/apps/quotes/src/app/api-services/auth-api.service.mock.ts new file mode 100644 index 0000000..20eeacc --- /dev/null +++ b/apps/quotes/src/app/api-services/auth-api.service.mock.ts @@ -0,0 +1,18 @@ +import { Observable, of } from 'rxjs'; + +import { AuthApiService } from './auth-api.service'; + +export class MockAuthApiService { + login(): Observable { + return of(); + } + + logout(): Observable { + return of(); + } +} + +export const mockAuthApiServiceProvider = { + provide: AuthApiService, + useClass: MockAuthApiService, +}; diff --git a/apps/quotes/src/app/api-services/auth-api.service.ts b/apps/quotes/src/app/api-services/auth-api.service.ts new file mode 100644 index 0000000..1c4bd0e --- /dev/null +++ b/apps/quotes/src/app/api-services/auth-api.service.ts @@ -0,0 +1,32 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; + +import { Observable } from 'rxjs'; + +import { environment } from '../../environments/environment'; +import { User } from '../auth/models/auth.model'; +import { ApiResponse, AuthData } from '../models'; + +@Injectable({ + providedIn: 'root', +}) +export class AuthApiService { + private apiBase: string = environment.apiUrls.auth; + + constructor( + private http: HttpClient, + ) { + } + + login(user: User): Observable> { + const url = `${ this.apiBase }/login`; + + return this.http.post>(url, user); + } + + logout(): Observable> { + const url = `${ this.apiBase }/logout`; + + return this.http.get>(url); + } +} diff --git a/apps/quotes/src/app/api-services/index.ts b/apps/quotes/src/app/api-services/index.ts new file mode 100644 index 0000000..d920469 --- /dev/null +++ b/apps/quotes/src/app/api-services/index.ts @@ -0,0 +1 @@ +export * from './quote-api.service'; diff --git a/apps/quotes/src/app/api-services/quote-api.service.mock.ts b/apps/quotes/src/app/api-services/quote-api.service.mock.ts new file mode 100644 index 0000000..ecd9f1e --- /dev/null +++ b/apps/quotes/src/app/api-services/quote-api.service.mock.ts @@ -0,0 +1,46 @@ +import { Observable, of } from 'rxjs'; + +import { Quote } from '../models'; +import { QuoteApiService } from './quote-api.service'; + +export class MockQuoteApiService { + + getAll(): Observable { + return of([]); + } + + share(): Observable { + return of({}); + } + + getRandom(): Observable { + return of(); + } + + edit(): Observable { + return of(); + } + + create(): Observable { + return of(); + } + + delete(): Observable { + return of(); + } + + getById(): Observable { + return of(); + } + + + getRandomByTag(tag: string): Observable { + return of(); + } + +} + +export const mockQuoteApiServiceProvider = { + provide: QuoteApiService, + useClass: MockQuoteApiService, +}; diff --git a/apps/quotes/src/app/api-services/quote-api.service.spec.ts b/apps/quotes/src/app/api-services/quote-api.service.spec.ts new file mode 100644 index 0000000..9cf24a7 --- /dev/null +++ b/apps/quotes/src/app/api-services/quote-api.service.spec.ts @@ -0,0 +1,168 @@ +import { HttpParams } from '@angular/common/http'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; + +import { environment } from '../../environments/environment'; +import { Quote } from '../models'; +import { QuoteApiService } from './quote-api.service'; + +describe('QuoteApiService', () => { + let service: QuoteApiService; + let httpMock; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ HttpClientTestingModule ], + }); + + service = TestBed.inject(QuoteApiService); + httpMock = TestBed.inject(HttpTestingController); + }); + + it('should be created', () => { + expect(service).toBeDefined(); + }); + + describe('API interactions', () => { + const mockQuote: Quote = { id: '', text: 'text', author: 'test' }; + + afterEach(() => { + httpMock.verify(); + }); + + it('should getAll quotes', () => { + const url = `${ environment.apiUrls.quote }/quotes`; + const response = { + data: [ + { ...mockQuote }, + ], + }; + const expectedResult = [ { ...mockQuote } ]; + + service.getAll().subscribe(data => { + expect(data).toEqual(expectedResult); + }); + + const mockReq = httpMock.expectOne(url); + + mockReq.flush(response); + + expect(mockReq.request.method).toBe('GET'); + expect(mockReq.request.url).toEqual(url); + }); + + it('should getRandom quote', () => { + const url = `${ environment.apiUrls.quote }/quotes/random`; + const response = { + data: { + ...mockQuote, + }, + }; + const expectedResult = { ...mockQuote }; + + service.getRandom().subscribe(data => { + expect(data).toEqual(expectedResult); + }); + + const mockReq = httpMock.expectOne(url); + + mockReq.flush(response); + + expect(mockReq.request.method).toBe('GET'); + expect(mockReq.request.url).toEqual(url); + }); + + it('should getRandom quote by tag', () => { + const url = `${ environment.apiUrls.quote }/quotes/random-by-tag`; + const response: Quote = mockQuote; + const testTag = 'tag'; + + service.getRandomByTag(testTag).subscribe(data => { + expect(data).toEqual(response); + }); + + const mockReq = httpMock.expectOne(`${ url }?tag=${ testTag }`); + + mockReq.flush(response); + + expect(mockReq.request.method).toBe('GET'); + expect(mockReq.request.url).toEqual(url); + expect(mockReq.request.params).toEqual(new HttpParams({ fromObject: { tag: testTag } })); + }); + + it('should share quote', () => { + const url = `${ environment.apiUrls.share }/share`; + const response = {}; + + service.share(mockQuote).subscribe(data => { + expect(data).toEqual(response); + }); + + const mockReq = httpMock.expectOne(url); + + mockReq.flush(response); + + expect(mockReq.request.method).toBe('POST'); + expect(mockReq.request.url).toEqual(url); + expect(mockReq.request.body).toEqual({ + quote: { + ...mockQuote, + }, + }); + }); + + it('should create quote', () => { + const url = `${ environment.apiUrls.quote }/quotes`; + const response = {}; + + service.create(mockQuote).subscribe(data => { + expect(data).toEqual(response); + }); + + const mockReq = httpMock.expectOne(url); + + mockReq.flush(response); + + expect(mockReq.request.method).toBe('POST'); + expect(mockReq.request.url).toEqual(url); + expect(mockReq.request.body).toEqual({ + quote: { + ...mockQuote, + }, + }); + }); + + it('should delete quote', () => { + const url = `${ environment.apiUrls.quote }/quotes/`; + const response = {}; + + service.delete(mockQuote.id).subscribe(data => { + expect(data).toEqual(response); + }); + + const mockReq = httpMock.expectOne(url); + + mockReq.flush(response); + + expect(mockReq.request.method).toBe('DELETE'); + expect(mockReq.request.url).toEqual(url); + }); + + it('should edit quote', () => { + const url = `${ environment.apiUrls.quote }/quotes/`; + const response = {}; + + service.edit(mockQuote).subscribe(data => { + expect(data).toEqual(response); + }); + + const mockReq = httpMock.expectOne(url); + + mockReq.flush(response); + + expect(mockReq.request.method).toBe('PUT'); + expect(mockReq.request.url).toEqual(url); + expect(mockReq.request.body).toEqual({ ...mockQuote }); + }); + }); +}); diff --git a/apps/quotes/src/app/api-services/quote-api.service.ts b/apps/quotes/src/app/api-services/quote-api.service.ts new file mode 100644 index 0000000..9f1c288 --- /dev/null +++ b/apps/quotes/src/app/api-services/quote-api.service.ts @@ -0,0 +1,85 @@ +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Injectable } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { environment } from '../../environments/environment'; +import { ContactData, Quote } from '../models'; + +@Injectable({ providedIn: 'root' }) +export class QuoteApiService { + private apiBase: string = environment.apiUrls.quote; + private shareApiBase: string = environment.apiUrls.share; + + constructor( + private http: HttpClient, + ) {} + + /** + * + * @returns {Observable} + */ + getAll(): Observable { + const url = `${ this.apiBase }/quotes`; + + return this.http.get(url).pipe( + map((res: any) => res.data), + ); + } + + getById(id: string): Observable { + const url = `${ this.apiBase }/quotes/${ id }`; + + return this.http.get(url).pipe( + map((res: any) => res.data), + ); + } + + /** + * @returns {Observable} + */ + getRandom(): Observable { + const url = `${ this.apiBase }/quotes/random`; + + return this.http.get(url).pipe( + map((res: any) => res.data), + ); + } + + /** + * @param {string} tag + * @returns {Observable} + */ + getRandomByTag(tag: string): Observable { + const url = `${ this.apiBase }/quotes/random-by-tag`; + const params = new HttpParams({ fromObject: { tag } }); + + return this.http.get(url, { params }); + } + + share(quote: Quote, contactDetails?: ContactData): Observable { + const url = `${ this.shareApiBase }/share`; + + return this.http.post(url, { quote, ...contactDetails }); + } + + create(quote: Quote): Observable { + const url = `${ this.apiBase }/quotes`; + + return this.http.post(url, { quote }); + } + + delete(quoteId: string): Observable { + const url = `${ this.apiBase }/quotes/${ quoteId }`; + + return this.http.delete(url); + } + + edit(quote: Quote): Observable { + const url = `${ this.apiBase }/quotes/${ quote.id }`; + + return this.http.put(url, quote); + } + +} diff --git a/apps/quotes/src/app/app-navigation.config.ts b/apps/quotes/src/app/app-navigation.config.ts new file mode 100644 index 0000000..ae45006 --- /dev/null +++ b/apps/quotes/src/app/app-navigation.config.ts @@ -0,0 +1,19 @@ +import { environment } from '../environments/environment'; +import { RoutesPaths } from './app-routing.config'; +import { NavigationItem } from './core/components/navigation/navigation.models'; + +export const APP_NAVIGATION_CONFIG: NavigationItem[] = [ + { + label: 'Home', + path: [ RoutesPaths.root ], + }, + { + label: 'Quotes list', + path: [ RoutesPaths.quotes ], + }, + { + label: 'Add quote', + path: [ RoutesPaths.quotes, RoutesPaths.new ], + isDisabled: !environment.apiUrls.quote, + }, +]; diff --git a/apps/quotes/src/app/app-routing.config.ts b/apps/quotes/src/app/app-routing.config.ts new file mode 100644 index 0000000..00068a4 --- /dev/null +++ b/apps/quotes/src/app/app-routing.config.ts @@ -0,0 +1,7 @@ +export enum RoutesPaths { + root = '/', + quotes = 'quotes', + auth = 'auth', + new = 'new', + edit = 'edit', +} diff --git a/apps/quotes/src/app/app-routing.module.ts b/apps/quotes/src/app/app-routing.module.ts new file mode 100644 index 0000000..88c388f --- /dev/null +++ b/apps/quotes/src/app/app-routing.module.ts @@ -0,0 +1,67 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { AppComponent } from './app.component'; +import { RoutesPaths } from './app-routing.config'; +import { AuthGuard } from './auth/guards'; +import { LoginPageGuard } from './auth/guards/login-page.guard'; +import { AuthLayoutComponent, PrivateLayoutComponent } from './core/components'; + +const routes: Routes = [ + { + path: '', + component: AppComponent, + children: [ + { + path: '', + canActivate: [ AuthGuard ], + component: PrivateLayoutComponent, + children: [ + { + path: '', + loadChildren: () => import('./quote/quote.module').then(m => m.QuoteModule), + }, + { + path: RoutesPaths.quotes, + children: [ + { + path: '', + loadChildren: () => import('./quotes-list/quotes-list.module').then(m => m.QuotesListModule), + }, + { + path: '', + loadChildren: () => import('./quote-edit/quote-edit.module').then(m => m.QuoteEditModule), + }, + { + path: '', + loadChildren: () => import('./quote-new/quote-new.module').then(m => m.QuoteNewModule), + }, + ], + + }, + ], + }, + { + path: RoutesPaths.auth, + component: AuthLayoutComponent, + canActivate: [ LoginPageGuard ], + children: [ + { + path: '', + loadChildren: () => import('./auth/auth.module').then(m => m.AuthModule), + }, + ], + }, + { + path: '**', + redirectTo: '', + }, + ], + }, +]; + +@NgModule({ + imports: [ RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' }) ], + exports: [ RouterModule ], +}) +export class AppRoutingModule { } diff --git a/apps/quotes/src/app/app.component.html b/apps/quotes/src/app/app.component.html index 68719a4..0680b43 100644 --- a/apps/quotes/src/app/app.component.html +++ b/apps/quotes/src/app/app.component.html @@ -1,8 +1 @@ -
-

Welcome to quotes!

- -
-
Message: {{ hello$ | async | json }}
+ diff --git a/apps/quotes/src/app/app.component.scss b/apps/quotes/src/app/app.component.scss index f222adf..b050fb2 100644 --- a/apps/quotes/src/app/app.component.scss +++ b/apps/quotes/src/app/app.component.scss @@ -1,133 +1,7 @@ -/* - * Remove template code below - */ -:host { - display: block; - font-family: sans-serif; - min-width: 300px; - max-width: 600px; - margin: 50px auto; -} - -.gutter-left { - margin-left: 9px; -} - -.col-span-2 { - grid-column: span 2; -} - -.flex { - display: flex; - align-items: center; - justify-content: center; -} - -header { - background-color: #143055; - color: white; - padding: 5px; - border-radius: 3px; -} - -main { - padding: 0 36px; -} - -p { - text-align: center; -} - -h1 { - text-align: center; - margin-left: 18px; - font-size: 24px; -} - -h2 { - text-align: center; - font-size: 20px; - margin: 40px 0 10px 0; -} - -.resources { - text-align: center; - list-style: none; - padding: 0; - display: grid; - grid-gap: 9px; - grid-template-columns: 1fr 1fr; -} - -.resource { - color: #0094ba; - height: 36px; - background-color: rgba(0, 0, 0, 0); - border: 1px solid rgba(0, 0, 0, 0.12); - border-radius: 4px; - padding: 3px 9px; - text-decoration: none; -} - -.resource:hover { - background-color: rgba(68, 138, 255, 0.04); -} - -pre { - padding: 9px; - border-radius: 4px; - background-color: black; - color: #eee; -} - -details { - border-radius: 4px; - color: #333; - background-color: rgba(0, 0, 0, 0); - border: 1px solid rgba(0, 0, 0, 0.12); - padding: 3px 9px; - margin-bottom: 9px; -} - -summary { - cursor: pointer; - outline: none; - height: 36px; - line-height: 36px; -} - -.github-star-container { - margin-top: 12px; - line-height: 20px; -} - -.github-star-container a { - display: flex; - align-items: center; - text-decoration: none; - color: #333; -} +@import '~scss/variables'; -.github-star-badge { - color: #24292e; +:host { display: flex; - align-items: center; - font-size: 12px; - padding: 3px 10px; - border: 1px solid rgba(27, 31, 35, 0.2); - border-radius: 3px; - background-image: linear-gradient(-180deg, #fafbfc, #eff3f6 90%); - margin-left: 4px; - font-weight: 600; -} - -.github-star-badge:hover { - background-image: linear-gradient(-180deg, #f0f3f6, #e6ebf1 90%); - border-color: rgba(27, 31, 35, 0.35); - background-position: -0.5em; -} -.github-star-badge .material-icons { - height: 16px; - width: 16px; - margin-right: 4px; + flex-grow: 1; + min-width: 0; } diff --git a/apps/quotes/src/app/app.component.spec.ts b/apps/quotes/src/app/app.component.spec.ts index 5729e41..810f35b 100644 --- a/apps/quotes/src/app/app.component.spec.ts +++ b/apps/quotes/src/app/app.component.spec.ts @@ -1,19 +1,30 @@ -import { Component } from '@angular/core'; -import { TestBed, async } from '@angular/core/testing'; -import { HttpClientModule } from '@angular/common/http'; +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + import { AppComponent } from './app.component'; describe('AppComponent', () => { - beforeEach(async(() => { + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [AppComponent], - imports: [HttpClientModule], + imports: [ + RouterTestingModule, + ], + declarations: [ + AppComponent, + ], }).compileComponents(); })); it('should create the app', () => { const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; + const app = fixture.componentInstance; expect(app).toBeTruthy(); }); + + it('should have as title \'quoteApp\'', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('quoteApp'); + }); + }); diff --git a/apps/quotes/src/app/app.component.ts b/apps/quotes/src/app/app.component.ts index 9fa4929..2638c29 100644 --- a/apps/quotes/src/app/app.component.ts +++ b/apps/quotes/src/app/app.component.ts @@ -1,13 +1,11 @@ -import { Component } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Message } from '@quotes/api-interfaces'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; @Component({ - selector: 'quotes-root', + selector: 'app-root', templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'], + styleUrls: [ './app.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppComponent { - hello$ = this.http.get('/api/hello'); - constructor(private http: HttpClient) {} + title = 'quoteApp'; } diff --git a/apps/quotes/src/app/app.module.ts b/apps/quotes/src/app/app.module.ts index 22671a9..0d5db84 100644 --- a/apps/quotes/src/app/app.module.ts +++ b/apps/quotes/src/app/app.module.ts @@ -1,13 +1,31 @@ +import { HttpClientModule } from '@angular/common/http'; import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + +import { NgxSmartModalModule } from 'ngx-smart-modal'; +import { ToastrModule } from 'ngx-toastr'; import { AppComponent } from './app.component'; -import { HttpClientModule } from '@angular/common/http'; +import { AppRoutingModule } from './app-routing.module'; +import { CoreModule } from './core/core.module'; +import { SharedModule } from './shared/shared.module'; @NgModule({ - declarations: [AppComponent], - imports: [BrowserModule, HttpClientModule], + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule, + BrowserAnimationsModule, + CoreModule, + HttpClientModule, + AppRoutingModule, + SharedModule, + NgxSmartModalModule.forRoot(), + ToastrModule.forRoot(), + ], providers: [], - bootstrap: [AppComponent], + bootstrap: [ AppComponent ], }) -export class AppModule {} +export class AppModule { } diff --git a/apps/quotes/src/app/auth/auth-routing.module.ts b/apps/quotes/src/app/auth/auth-routing.module.ts new file mode 100644 index 0000000..e892ab1 --- /dev/null +++ b/apps/quotes/src/app/auth/auth-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { LoginComponent } from './components'; + +const routes: Routes = [ + { + path: 'login', + component: LoginComponent, + }, +]; + +@NgModule({ + imports: [ RouterModule.forChild(routes) ], + exports: [ RouterModule ], +}) +export class AuthRoutingModule { } diff --git a/apps/quotes/src/app/auth/auth.module.ts b/apps/quotes/src/app/auth/auth.module.ts new file mode 100644 index 0000000..715de75 --- /dev/null +++ b/apps/quotes/src/app/auth/auth.module.ts @@ -0,0 +1,23 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../shared/shared.module'; +import { AuthRoutingModule } from './auth-routing.module'; +import { LoginComponent, LoginFormComponent } from './components'; + +const COMPONENTS = [ + LoginComponent, + LoginFormComponent, +]; + +@NgModule({ + declarations: [ + ...COMPONENTS, + ], + imports: [ + CommonModule, + SharedModule, + AuthRoutingModule, + ], +}) +export class AuthModule { } diff --git a/apps/quotes/src/app/auth/components/index.ts b/apps/quotes/src/app/auth/components/index.ts new file mode 100644 index 0000000..b61eec2 --- /dev/null +++ b/apps/quotes/src/app/auth/components/index.ts @@ -0,0 +1,2 @@ +export * from './login/login.component'; +export * from './login-form/login-form.component'; diff --git a/apps/quotes/src/app/auth/components/login-form/login-form.component.html b/apps/quotes/src/app/auth/components/login-form/login-form.component.html new file mode 100644 index 0000000..95526d9 --- /dev/null +++ b/apps/quotes/src/app/auth/components/login-form/login-form.component.html @@ -0,0 +1,26 @@ + + + + + diff --git a/apps/quotes/src/app/auth/components/login-form/login-form.component.scss b/apps/quotes/src/app/auth/components/login-form/login-form.component.scss new file mode 100644 index 0000000..c117f86 --- /dev/null +++ b/apps/quotes/src/app/auth/components/login-form/login-form.component.scss @@ -0,0 +1,18 @@ +@import "~scss/variables"; + +:host { + display: flex; + min-height: 100vh; + height: 100%; + padding: 20px; + + .login-form-wrapper { + max-width: 400px; + width: 100%; + padding: 20px; + margin: auto; + + border: $border__size solid #fff; + border-radius: $border__radius; + } +} diff --git a/apps/quotes/src/app/auth/components/login-form/login-form.component.spec.ts b/apps/quotes/src/app/auth/components/login-form/login-form.component.spec.ts new file mode 100644 index 0000000..24d6843 --- /dev/null +++ b/apps/quotes/src/app/auth/components/login-form/login-form.component.spec.ts @@ -0,0 +1,64 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, inject, TestBed } from '@angular/core/testing'; +import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { of } from 'rxjs'; + +import { ButtonComponent, InputComponent, LoaderComponent } from '../../../shared/components'; +import { AuthService } from '../../services'; +import { mockAuthServiceProvider } from '../../services/auth.service.mock'; +import { LoginFormComponent } from './login-form.component'; + +describe('LoginFormComponent', () => { + let component: LoginFormComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + ReactiveFormsModule, + HttpClientTestingModule, + RouterTestingModule, + ], + providers: [ + mockAuthServiceProvider, + ], + declarations: [ + LoginFormComponent, + InputComponent, + ButtonComponent, + LoaderComponent, + ], + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('onSubmit', () => { + it('should login user', inject([ AuthService ], authService => { + const spy = spyOn(authService, 'login').and.returnValue(of({})); + + component.loginForm = new FormBuilder().group({ + username: 'test', + password: '123456', + }); + const expectedParams = { + username: 'test', + password: '123456', + }; + component.onSubmit(); + + expect(spy).toHaveBeenCalledWith(expectedParams); + })); + }); +}); diff --git a/apps/quotes/src/app/auth/components/login-form/login-form.component.ts b/apps/quotes/src/app/auth/components/login-form/login-form.component.ts new file mode 100644 index 0000000..d069d02 --- /dev/null +++ b/apps/quotes/src/app/auth/components/login-form/login-form.component.ts @@ -0,0 +1,49 @@ +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +import { take, tap } from 'rxjs/operators'; + +import { AuthService } from '../../services'; + +@Component({ + selector: 'app-login-form', + templateUrl: './login-form.component.html', + styleUrls: [ './login-form.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class LoginFormComponent implements OnInit { + loginForm: FormGroup; + isLoading$ = this.authService.isLoading$; + + private returnUrl: string; + + constructor( + private fb: FormBuilder, + private authService: AuthService, + private activatedRoute: ActivatedRoute, + private router: Router, + ) { + if (this.authService.authDataValue) { + this.router.navigate([ '/' ]); + } + } + + ngOnInit(): void { + this.loginForm = this.fb.group({ + 'username': new FormControl('', Validators.required), + 'password': new FormControl('', [ Validators.required, Validators.minLength(6) ]), + }); + + this.returnUrl = this.activatedRoute.snapshot.queryParams[ 'returnUrl' ] || '/'; + } + + onSubmit(): void { + const userData = this.loginForm.value; + + this.authService.login(userData).pipe( + take(1), + tap(() => this.router.navigate([ this.returnUrl ])), + ).subscribe(); + } +} diff --git a/apps/quotes/src/app/auth/components/login/login.component.html b/apps/quotes/src/app/auth/components/login/login.component.html new file mode 100644 index 0000000..312e2b9 --- /dev/null +++ b/apps/quotes/src/app/auth/components/login/login.component.html @@ -0,0 +1 @@ + diff --git a/apps/quotes/src/app/auth/components/login/login.component.scss b/apps/quotes/src/app/auth/components/login/login.component.scss new file mode 100644 index 0000000..b9bc65e --- /dev/null +++ b/apps/quotes/src/app/auth/components/login/login.component.scss @@ -0,0 +1,3 @@ +:host { + width: 100%; +} diff --git a/apps/quotes/src/app/auth/components/login/login.component.spec.ts b/apps/quotes/src/app/auth/components/login/login.component.spec.ts new file mode 100644 index 0000000..a530011 --- /dev/null +++ b/apps/quotes/src/app/auth/components/login/login.component.spec.ts @@ -0,0 +1,41 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ReactiveFormsModule } from '@angular/forms'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { ButtonComponent, InputComponent, LoaderComponent } from '../../../shared/components'; +import { LoginFormComponent } from '../login-form/login-form.component'; +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + ReactiveFormsModule, + HttpClientTestingModule, + RouterTestingModule, + ], + declarations: [ + LoginComponent, + LoginFormComponent, + InputComponent, + ButtonComponent, + LoaderComponent, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/auth/components/login/login.component.ts b/apps/quotes/src/app/auth/components/login/login.component.ts new file mode 100644 index 0000000..cd8c20c --- /dev/null +++ b/apps/quotes/src/app/auth/components/login/login.component.ts @@ -0,0 +1,9 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: [ './login.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class LoginComponent {} diff --git a/apps/quotes/src/app/auth/guards/auth.guard.spec.ts b/apps/quotes/src/app/auth/guards/auth.guard.spec.ts new file mode 100644 index 0000000..411a9d7 --- /dev/null +++ b/apps/quotes/src/app/auth/guards/auth.guard.spec.ts @@ -0,0 +1,52 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { inject, TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { environment } from '../../../environments/environment'; +import { AuthLayoutComponent } from '../../core/components'; +import { AuthService } from '../services'; +import { mockAuthServiceProvider } from '../services/auth.service.mock'; +import { AuthGuard } from './auth.guard'; + +describe('AuthGuard', () => { + let guard: AuthGuard; + const mockAuthData = { + token_type: 'Basic', + access_token: 'test', + }; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule.withRoutes([ + { path: 'auth/login', component: AuthLayoutComponent }, + ]), + HttpClientTestingModule, + ], + declarations: [ + AuthLayoutComponent, + ], + providers: [ + AuthGuard, + mockAuthServiceProvider, + ], + }); + + guard = TestBed.inject(AuthGuard); + }); + + it('should be created', () => { + expect(guard).toBeTruthy(); + }); + + it('should allow navigation', inject([ AuthService ], authService => { + environment.isAuthorizationEnabled = true; + authService.authData$$.next(mockAuthData); + expect(guard.canActivate({ url: [] } as any, { url: '' } as any)).toBeTruthy(); + })); + + it('should not allow navigation', inject([ AuthService ], authService => { + authService.authData$$.next(null); + expect(guard.canActivate({ url: [] } as any, { url: '' } as any)).toBeFalsy(); + })); +}); diff --git a/apps/quotes/src/app/auth/guards/auth.guard.ts b/apps/quotes/src/app/auth/guards/auth.guard.ts new file mode 100644 index 0000000..d8414fb --- /dev/null +++ b/apps/quotes/src/app/auth/guards/auth.guard.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; + +import { environment } from '../../../environments/environment'; +import { AuthService } from '../services'; + + +@Injectable({ providedIn: 'root' }) +export class AuthGuard implements CanActivate { + constructor( + private router: Router, + private authService: AuthService, + ) { } + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + if (!environment.isAuthorizationEnabled) { + return true; + } + + const user = this.authService.authDataValue; + if (user) { + // logged in so return true + return true; + } + + // not logged in so redirect to login page with the return url + this.router.navigate([ 'auth', 'login' ], { queryParams: { returnUrl: state.url } }); + + return false; + } +} diff --git a/apps/quotes/src/app/auth/guards/index.ts b/apps/quotes/src/app/auth/guards/index.ts new file mode 100644 index 0000000..b41e34a --- /dev/null +++ b/apps/quotes/src/app/auth/guards/index.ts @@ -0,0 +1 @@ +export * from './auth.guard'; diff --git a/apps/quotes/src/app/auth/guards/login-page.guard.ts b/apps/quotes/src/app/auth/guards/login-page.guard.ts new file mode 100644 index 0000000..58bea8f --- /dev/null +++ b/apps/quotes/src/app/auth/guards/login-page.guard.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; + +import { environment } from '../../../environments/environment'; + + +@Injectable({ providedIn: 'root' }) +export class LoginPageGuard implements CanActivate { + constructor( + private router: Router, + ) { } + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + if (!environment.isAuthorizationEnabled) { + this.router.navigate([ '/' ]); + + return false; + } + + return true; + } +} diff --git a/apps/quotes/src/app/auth/models/auth.model.ts b/apps/quotes/src/app/auth/models/auth.model.ts new file mode 100644 index 0000000..307a12c --- /dev/null +++ b/apps/quotes/src/app/auth/models/auth.model.ts @@ -0,0 +1,4 @@ +export interface User { + username: string; + password: string; +} diff --git a/apps/quotes/src/app/auth/services/auth.service.mock.ts b/apps/quotes/src/app/auth/services/auth.service.mock.ts new file mode 100644 index 0000000..9580beb --- /dev/null +++ b/apps/quotes/src/app/auth/services/auth.service.mock.ts @@ -0,0 +1,30 @@ +import { BehaviorSubject, Observable, of } from 'rxjs'; + +import { AuthData } from '../../models'; +import { AuthService } from './auth.service'; + +const mockAuthData = { + token_type: 'Basic', + access_token: 'test', +}; + +export class MockAuthService { + authData$$ = new BehaviorSubject(mockAuthData); + + get authDataValue(): AuthData { + return this.authData$$.value; + } + + login(): Observable { + return of({}); + } + + logout(): Observable { + return of({}); + } +} + +export const mockAuthServiceProvider = { + provide: AuthService, + useClass: MockAuthService, +}; diff --git a/apps/quotes/src/app/auth/services/auth.service.spec.ts b/apps/quotes/src/app/auth/services/auth.service.spec.ts new file mode 100644 index 0000000..74da89f --- /dev/null +++ b/apps/quotes/src/app/auth/services/auth.service.spec.ts @@ -0,0 +1,78 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { inject, TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { of, throwError } from 'rxjs'; + +import { AuthApiService } from '../../api-services/auth-api.service'; +import { mockAuthApiServiceProvider } from '../../api-services/auth-api.service.mock'; +import { mockLocalStorage } from '../../stub/local-storage.mock'; +import { AuthService } from './auth.service'; + +describe('AuthService', () => { + let service: AuthService; + + const mockAuthData = { + token_type: 'Basic', + access_token: 'test', + }; + const mockUserData = { + username: 'test', + password: '123456', + }; + const mockError = { + error: { + message: 'error message', + status: 404, + }, + }; + + const mockStorage = mockLocalStorage(); + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule, + RouterTestingModule, + ], + providers: [ + mockAuthApiServiceProvider, + ], + }); + service = TestBed.inject(AuthService); + + Object.defineProperty(window, 'localStorage', { + value: mockStorage, + }); + + localStorage.setItem('authData', JSON.stringify(mockAuthData)); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + describe('login', () => { + it('should set auth data into storage', inject([ AuthApiService ], authApiService => { + spyOn(authApiService, 'login').and.returnValue(of({ + data: { + ...mockAuthData, + }, + })); + + service.login(mockUserData).subscribe(data => { + expect(data).toEqual({ ...mockAuthData }); + }); + })); + + it('should emit error', inject([ AuthApiService ], authApiService => { + spyOn(authApiService, 'login').and.returnValue(throwError(mockError)); + service.login(mockUserData).subscribe( + () => {}, + err => { + expect(err).toEqual(mockError); + }, + ); + })); + }); +}); diff --git a/apps/quotes/src/app/auth/services/auth.service.ts b/apps/quotes/src/app/auth/services/auth.service.ts new file mode 100644 index 0000000..8b57959 --- /dev/null +++ b/apps/quotes/src/app/auth/services/auth.service.ts @@ -0,0 +1,62 @@ +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; + +import { BehaviorSubject, Observable, throwError } from 'rxjs'; +import { catchError, map, tap } from 'rxjs/operators'; + +import { AuthApiService } from '../../api-services/auth-api.service'; +import { ApiResponse, AuthData } from '../../models'; +import { User } from '../models/auth.model'; + +@Injectable({ providedIn: 'root' }) +export class AuthService { + authData$: Observable; + isLoading$: Observable; + private authData$$: BehaviorSubject; + private isLoading$$: BehaviorSubject; + + constructor( + private authApiService: AuthApiService, + private router: Router, + ) { + const authData = localStorage.getItem('authData'); + + this.authData$$ = new BehaviorSubject(authData ? JSON.parse(authData) : null); + this.authData$ = this.authData$$.asObservable(); + + this.isLoading$$ = new BehaviorSubject(false); + this.isLoading$ = this.isLoading$$.asObservable(); + } + + get authDataValue(): AuthData { + return this.authData$$.value; + } + + login(user: User): Observable { + this.isLoading$$.next(true); + + return this.authApiService.login(user) + .pipe( + map(({ data }: ApiResponse) => { + localStorage.setItem('authData', JSON.stringify(data)); + this.authData$$.next(data); + + return data; + }), + tap(() => this.isLoading$$.next(false)), + catchError((err: any) => { + this.isLoading$$.next(false); + + return throwError(err); + }), + ); + } + + logout(): void { + // remove user from local storage to log user out + localStorage.removeItem('authData'); + this.authData$$.next(null); + + this.router.navigate([ 'auth', 'login' ]); + } +} diff --git a/apps/quotes/src/app/auth/services/index.ts b/apps/quotes/src/app/auth/services/index.ts new file mode 100644 index 0000000..2a719d1 --- /dev/null +++ b/apps/quotes/src/app/auth/services/index.ts @@ -0,0 +1 @@ +export * from './auth.service'; diff --git a/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.html b/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.html new file mode 100644 index 0000000..0680b43 --- /dev/null +++ b/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.html @@ -0,0 +1 @@ + diff --git a/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.scss b/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.scss new file mode 100644 index 0000000..072345f --- /dev/null +++ b/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.scss @@ -0,0 +1,4 @@ +:host { + display: flex; + flex-grow: 1; +} diff --git a/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.spec.ts b/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.spec.ts new file mode 100644 index 0000000..da3f35e --- /dev/null +++ b/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.spec.ts @@ -0,0 +1,27 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { AuthLayoutComponent } from './auth-layout.component'; + +describe('AuthLayoutComponent', () => { + let component: AuthLayoutComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ RouterTestingModule ], + declarations: [ AuthLayoutComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AuthLayoutComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.ts b/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.ts new file mode 100644 index 0000000..79f9c30 --- /dev/null +++ b/apps/quotes/src/app/core/components/auth-layout/auth-layout.component.ts @@ -0,0 +1,10 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'app-auth-layout', + templateUrl: './auth-layout.component.html', + styleUrls: [ './auth-layout.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AuthLayoutComponent { +} diff --git a/apps/quotes/src/app/core/components/index.ts b/apps/quotes/src/app/core/components/index.ts new file mode 100644 index 0000000..9ed34e3 --- /dev/null +++ b/apps/quotes/src/app/core/components/index.ts @@ -0,0 +1,3 @@ +export * from './private-layout/private-layout.component'; +export * from './auth-layout/auth-layout.component'; +export * from './navigation/navigation.component'; diff --git a/apps/quotes/src/app/core/components/navigation/navigation.component.html b/apps/quotes/src/app/core/components/navigation/navigation.component.html new file mode 100644 index 0000000..9c64b54 --- /dev/null +++ b/apps/quotes/src/app/core/components/navigation/navigation.component.html @@ -0,0 +1,16 @@ + diff --git a/apps/quotes/src/app/core/components/navigation/navigation.component.scss b/apps/quotes/src/app/core/components/navigation/navigation.component.scss new file mode 100644 index 0000000..9925c81 --- /dev/null +++ b/apps/quotes/src/app/core/components/navigation/navigation.component.scss @@ -0,0 +1,50 @@ +@import "~scss/variables"; + +:host { + display: block; + width: 100%; + + ul { + display: flex; + width: 100%; + padding: 20px; + + li { + ::ng-deep { + a { + margin-right: 20px; + } + + button { + padding: 0; + margin: 0; + } + + button, a { + position: relative; + background: transparent; + color: $color__white; + font-family: $font__primary; + font-weight: bold; + font-size: 18px; + + &:hover { + &:after { + position: absolute; + content: ''; + width: 100%; + bottom: -5px; + left: 0; + height: 3px; + background-color: $color__blue; + } + } + } + } + + &.logout { + margin-left: auto; + } + } + } +} diff --git a/apps/quotes/src/app/core/components/navigation/navigation.component.spec.ts b/apps/quotes/src/app/core/components/navigation/navigation.component.spec.ts new file mode 100644 index 0000000..760bc04 --- /dev/null +++ b/apps/quotes/src/app/core/components/navigation/navigation.component.spec.ts @@ -0,0 +1,35 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { ButtonComponent } from '../../../shared/components'; +import { NavigationComponent } from './navigation.component'; + +describe('NavigationComponent', () => { + let component: NavigationComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule, + RouterTestingModule, + ], + declarations: [ + NavigationComponent, + ButtonComponent, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NavigationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/core/components/navigation/navigation.component.ts b/apps/quotes/src/app/core/components/navigation/navigation.component.ts new file mode 100644 index 0000000..6167cbf --- /dev/null +++ b/apps/quotes/src/app/core/components/navigation/navigation.component.ts @@ -0,0 +1,26 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +import { environment } from '../../../../environments/environment'; +import { APP_NAVIGATION_CONFIG } from '../../../app-navigation.config'; +import { AuthService } from '../../../auth/services'; + +@Component({ + selector: 'app-navigation', + templateUrl: './navigation.component.html', + styleUrls: [ './navigation.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class NavigationComponent { + navigationItems = APP_NAVIGATION_CONFIG; + isAuthenticated = !!this.authService.authDataValue; + isAuthorizationEnable = environment.isAuthorizationEnabled; + + constructor( + private authService: AuthService, + ) {} + + logout(): void { + this.authService.logout(); + } + +} diff --git a/apps/quotes/src/app/core/components/navigation/navigation.models.ts b/apps/quotes/src/app/core/components/navigation/navigation.models.ts new file mode 100644 index 0000000..9933987 --- /dev/null +++ b/apps/quotes/src/app/core/components/navigation/navigation.models.ts @@ -0,0 +1,5 @@ +export interface NavigationItem { + label: string; + path: string[]; + isDisabled?: boolean; +} diff --git a/apps/quotes/src/app/core/components/private-layout/private-layout.component.html b/apps/quotes/src/app/core/components/private-layout/private-layout.component.html new file mode 100644 index 0000000..9ef46da --- /dev/null +++ b/apps/quotes/src/app/core/components/private-layout/private-layout.component.html @@ -0,0 +1,22 @@ + + + + + + +
+
+

+ + +
+
+ +
+
+
diff --git a/apps/quotes/src/app/core/components/private-layout/private-layout.component.scss b/apps/quotes/src/app/core/components/private-layout/private-layout.component.scss new file mode 100644 index 0000000..a1e20d8 --- /dev/null +++ b/apps/quotes/src/app/core/components/private-layout/private-layout.component.scss @@ -0,0 +1,117 @@ +@import '~scss/variables'; +@import '~scss/mixins'; + +:host { + display: flex; + flex-direction: column; + width: 100%; + + header { + width: 100%; + height: 60px; + display: flex; + align-items: center; + position: sticky; + padding-left: 20px; + top: 0; + background: $color__blue_dark; + box-shadow: $shadow; + -webkit-box-shadow: $shadow; + -moz-box-shadow: $shadow; + + app-navigation { + display: flex; + } + + app-burger-button { + display: none; + } + + .logo { + font-family: $font__icons; + font-size: 57px; + position: relative; + color: $color__light_gray; + + &:before { + position: relative; + content: '\e800'; + } + } + + @include md { + app-navigation { + display: none; + } + + app-burger-button { + display: block; + margin-left: auto; + margin-right: 20px; + } + } + } + + main { + display: flex; + flex-grow: 1; + } +} + +::ng-deep { + ng-sidebar { + .ng-sidebar { + width: 320px; + background-color: $color__blue_light_dark; + + @include sm_l { + width: 100%; + } + } + + app-navigation { + ul { + display: flex; + flex-direction: column; + + li { + margin-left: 0 !important; + margin-bottom: 20px; + } + } + } + + .close-sidebar { + width: 40px; + height: 40px; + background-color: $color__white; + position: relative; + + &:before, + &:after { + content: ''; + position: absolute; + top: 50%; + left: 5%; + width: 90%; + height: 2px; + background-color: $color__blue_light_dark; + } + + &:before { + transform: rotateZ(45deg); + } + + &:after { + transform: rotateZ(135deg); + } + } + } + + .ng-sidebar__content, + div[ng-sidebar-content] { + display: flex; + flex-direction: column; + flex-grow: 1; + } +} diff --git a/apps/quotes/src/app/core/components/private-layout/private-layout.component.spec.ts b/apps/quotes/src/app/core/components/private-layout/private-layout.component.spec.ts new file mode 100644 index 0000000..8df9d65 --- /dev/null +++ b/apps/quotes/src/app/core/components/private-layout/private-layout.component.spec.ts @@ -0,0 +1,85 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { Router } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { SidebarModule } from 'ng-sidebar'; + +import { BurgerButtonComponent, ButtonComponent } from '../../../shared/components'; +import { NavigationComponent } from '../navigation/navigation.component'; +import { PrivateLayoutComponent } from './private-layout.component'; + +@Component({ + template: '

Test page

', + selector: 'app-test-component', +}) +class TestHostComponent { + +} + +describe('PrivateLayoutComponent', () => { + let component: PrivateLayoutComponent; + let fixture: ComponentFixture; + let router: Router; + + Object.defineProperty(window, 'getComputedStyle', { + value: () => ({ + getPropertyValue: prop => { + return ''; + }, + }), + }); + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule, + RouterTestingModule.withRoutes([ + { path: 'test', component: TestHostComponent }, + ]), + SidebarModule, + ], + declarations: [ + PrivateLayoutComponent, + NavigationComponent, + BurgerButtonComponent, + ButtonComponent, + TestHostComponent, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PrivateLayoutComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + router = TestBed.get(Router); + + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('toggleSidebar', () => { + it('should toggle sidebar', () => { + expect(component.opened).toBeFalsy(); + component.toggleSidebar(); + expect(component.opened).toBeTruthy(); + component.toggleSidebar(); + expect(component.opened).toBeFalsy(); + }); + }); + + describe('listenOnRouteChange', () => { + it('should close sidebar on router change', done => { + component.opened = true; + router.navigate([ 'test' ]).then(() => { + expect(component.opened).toBeFalsy(); + done(); + }); + }); + }); +}); diff --git a/apps/quotes/src/app/core/components/private-layout/private-layout.component.ts b/apps/quotes/src/app/core/components/private-layout/private-layout.component.ts new file mode 100644 index 0000000..9468e85 --- /dev/null +++ b/apps/quotes/src/app/core/components/private-layout/private-layout.component.ts @@ -0,0 +1,42 @@ +import { AfterViewInit, ChangeDetectionStrategy, Component } from '@angular/core'; +import { NavigationEnd, Router, RouterEvent } from '@angular/router'; + +import { filter, tap } from 'rxjs/operators'; + +import { AuthService } from '../../../auth/services'; + +@Component({ + selector: 'app-private-layout', + templateUrl: './private-layout.component.html', + styleUrls: [ './private-layout.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PrivateLayoutComponent implements AfterViewInit { + opened = false; + isAnimated = false; + + constructor( + private authService: AuthService, + private router: Router, + ) { + this.listenOnRouteChange(); + this.authService.authData$.subscribe(); + } + + ngAfterViewInit(): void { + this.isAnimated = true; + } + + toggleSidebar() { + this.opened = !this.opened; + } + + private listenOnRouteChange() { + this.router.events.pipe( + filter((event: RouterEvent) => event instanceof NavigationEnd), + tap(() => { + this.opened = false; + }), + ).subscribe(); + } +} diff --git a/apps/quotes/src/app/core/core.module.ts b/apps/quotes/src/app/core/core.module.ts new file mode 100644 index 0000000..75c4c82 --- /dev/null +++ b/apps/quotes/src/app/core/core.module.ts @@ -0,0 +1,46 @@ +import { CommonModule } from '@angular/common'; +import { HTTP_INTERCEPTORS } from '@angular/common/http'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { SidebarModule } from 'ng-sidebar'; + +import { SharedModule } from '../shared/shared.module'; +import { AuthLayoutComponent, NavigationComponent, PrivateLayoutComponent } from './components'; +import { BasicAuthInterceptor } from './interceptors/basic-auth.interceptor'; +import { ErrorInterceptor } from './interceptors/error.interceptor'; + +const COMPONENTS = [ + PrivateLayoutComponent, + AuthLayoutComponent, + NavigationComponent, +]; + +@NgModule({ + declarations: [ + ...COMPONENTS, + ], + providers: [ + { + provide: HTTP_INTERCEPTORS, + useClass: BasicAuthInterceptor, + multi: true, + }, + { + provide: HTTP_INTERCEPTORS, + useClass: ErrorInterceptor, + multi: true, + }, + ], + imports: [ + CommonModule, + RouterModule, + SharedModule, + SidebarModule.forRoot(), + ], + exports: [ + ...COMPONENTS, + ], + schemas: [ CUSTOM_ELEMENTS_SCHEMA ], +}) +export class CoreModule { } diff --git a/apps/quotes/src/app/core/interceptors/basic-auth.interceptor.spec.ts b/apps/quotes/src/app/core/interceptors/basic-auth.interceptor.spec.ts new file mode 100644 index 0000000..1371dc3 --- /dev/null +++ b/apps/quotes/src/app/core/interceptors/basic-auth.interceptor.spec.ts @@ -0,0 +1,75 @@ +import { HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { inject, TestBed, waitForAsync } from '@angular/core/testing'; + +import { environment } from '../../../environments/environment'; +import { AuthService } from '../../auth/services'; +import { mockAuthServiceProvider } from '../../auth/services/auth.service.mock'; +import { BasicAuthInterceptor } from './basic-auth.interceptor'; + +describe('BasicAuthInterceptor', () => { + let httpMock: HttpTestingController; + const url = `${environment.apiUrls.quote}/test`; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ HttpClientTestingModule ], + providers: [ + { + provide: HTTP_INTERCEPTORS, + useClass: BasicAuthInterceptor, + multi: true, + }, + mockAuthServiceProvider, + ], + }); + + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + it('should add auth headers to request', waitForAsync(inject([ HttpClient, AuthService ], (http, authService) => { + environment.isAuthorizationEnabled = true; + + http.get(url).subscribe(); + + const expectedTokenHeader = `${ authService.authDataValue.token_type } ${ authService.authDataValue.access_token }`; + + httpMock.expectOne(req => { + expect(req.url).toBe(url); + expect(req.headers.get('Authorization')).toBe(expectedTokenHeader); + + return true; + }); + }))); + + it('should not add auth headers to request', waitForAsync(inject([ HttpClient, AuthService ], (http, authService) => { + authService.authData$$.next(null); + + http.get(url).subscribe(); + + httpMock.expectOne(req => { + expect(req.url).toBe(url); + expect(req.headers.get('Authorization')).toBeNull(); + + return true; + }); + }))); + + it('should not add auth headers to request based on env setting', + waitForAsync(inject([ HttpClient, AuthService ], (http, authService) => { + environment.isAuthorizationEnabled = false; + + http.get(url).subscribe(); + + httpMock.expectOne(req => { + expect(req.url).toBe(url); + expect(req.headers.get('Authorization')).toBeNull(); + + return true; + }); + }))); +}); diff --git a/apps/quotes/src/app/core/interceptors/basic-auth.interceptor.ts b/apps/quotes/src/app/core/interceptors/basic-auth.interceptor.ts new file mode 100644 index 0000000..c2ac558 --- /dev/null +++ b/apps/quotes/src/app/core/interceptors/basic-auth.interceptor.ts @@ -0,0 +1,36 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; +import { Injectable } from '@angular/core'; + +import { Observable } from 'rxjs'; + +import { environment } from '../../../environments/environment'; +import { AuthService } from '../../auth/services'; + +@Injectable() +export class BasicAuthInterceptor implements HttpInterceptor { + private apiBase: string = environment.apiUrls.quote; + private apiShare: string = environment.apiUrls.share; + private isAuthorizationEnable: boolean = environment.isAuthorizationEnabled; + + constructor(private authService: AuthService) { } + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + if (!this.isAuthorizationEnable) { + return next.handle(request); + } + + const authData = this.authService.authDataValue; + const isLoggedIn = authData && authData.access_token; + const isApiUrl = request.url.startsWith(this.apiBase) || request.url.startsWith(this.apiShare); + + if (isLoggedIn && isApiUrl) { + request = request.clone({ + setHeaders: { + Authorization: `Basic ${authData.access_token}`, + }, + }); + } + + return next.handle(request); + } +} diff --git a/apps/quotes/src/app/core/interceptors/error.interceptor.spec.ts b/apps/quotes/src/app/core/interceptors/error.interceptor.spec.ts new file mode 100644 index 0000000..ee38bc9 --- /dev/null +++ b/apps/quotes/src/app/core/interceptors/error.interceptor.spec.ts @@ -0,0 +1,71 @@ +import { HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { inject, TestBed, waitForAsync } from '@angular/core/testing'; + +import { ToastrService } from 'ngx-toastr'; + +import { environment } from '../../../environments/environment'; +import { AuthService } from '../../auth/services'; +import { mockAuthServiceProvider } from '../../auth/services/auth.service.mock'; +import { mockToastrServiceProvider } from '../../stub'; +import { ErrorInterceptor } from './error.interceptor'; + +describe('ErrorInterceptor', () => { + let httpMock: HttpTestingController; + const url = `${ environment.apiUrls.quote }/test`; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ HttpClientTestingModule ], + providers: [ + { + provide: HTTP_INTERCEPTORS, + useClass: ErrorInterceptor, + multi: true, + }, + mockAuthServiceProvider, + mockToastrServiceProvider, + ], + }); + + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + it('should call logout function if 401 error', waitForAsync(inject( + [ HttpClient, AuthService, ToastrService ], (http, authService, toastrService) => { + const logoutSpy = spyOn(authService, 'logout'); + const toastrSpy = spyOn(toastrService, 'error'); + + http.get(url).subscribe(() => { + }, err => { + expect(logoutSpy).toHaveBeenCalled(); + expect(toastrSpy).toHaveBeenCalled(); + }); + + httpMock.expectOne(url).error( + { message: 'error message' } as ErrorEvent, + { status: 401 }, + ); + }))); + + it('should show error notification', waitForAsync(inject( + [ HttpClient, AuthService, ToastrService ], (http, authService, toastrService) => { + const logoutSpy = spyOn(authService, 'logout'); + const toastrSpy = spyOn(toastrService, 'error'); + + http.get(url).subscribe(() => { + }, err => { + expect(logoutSpy).not.toHaveBeenCalled(); + expect(toastrSpy).toHaveBeenCalled(); + }); + + httpMock.expectOne(url).error( + { message: '' } as ErrorEvent, + { status: 404, statusText: 'text' }, + ); + }))); +}); diff --git a/apps/quotes/src/app/core/interceptors/error.interceptor.ts b/apps/quotes/src/app/core/interceptors/error.interceptor.ts new file mode 100644 index 0000000..9bb509e --- /dev/null +++ b/apps/quotes/src/app/core/interceptors/error.interceptor.ts @@ -0,0 +1,33 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; +import { Injectable } from '@angular/core'; + +import { ToastrService } from 'ngx-toastr'; +import { Observable, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; + +import { AuthService } from '../../auth/services'; + +@Injectable() +export class ErrorInterceptor implements HttpInterceptor { + constructor( + private authService: AuthService, + private toastrService: ToastrService, + ) { + } + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + return next.handle(request).pipe( + catchError(err => { + if (err.status === 401) { + // auto logout if 401 response returned from api + this.authService.logout(); + } + const error = err.error.message || err.statusText; + const defaultErrorMessage = 'Sorry, but something went wrong, please try again.'; + + this.toastrService.error(defaultErrorMessage); + + return throwError(error); + })); + } +} diff --git a/apps/quotes/src/app/models/index.ts b/apps/quotes/src/app/models/index.ts new file mode 100644 index 0000000..aabc491 --- /dev/null +++ b/apps/quotes/src/app/models/index.ts @@ -0,0 +1,29 @@ +export interface Quote { + id: string; + author: string; + text: string; + isDeleted?: boolean; + source?: string; + tags?: string; +} + +export interface EmailContact { + email: string; +} + +export interface PhoneContact { + phone: string; +} + +export type ContactData = EmailContact | PhoneContact; + +export interface ApiResponse { + statusCode: number; + data?: T; + message?: string; +} + +export interface AuthData { + token_type: string; + access_token: string; +} diff --git a/apps/quotes/src/app/quote-edit/components/index.ts b/apps/quotes/src/app/quote-edit/components/index.ts new file mode 100644 index 0000000..b345263 --- /dev/null +++ b/apps/quotes/src/app/quote-edit/components/index.ts @@ -0,0 +1 @@ +export * from './quote-edit-container/quote-edit-container.component'; diff --git a/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.html b/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.html new file mode 100644 index 0000000..679dbe5 --- /dev/null +++ b/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.html @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.scss b/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.scss new file mode 100644 index 0000000..072345f --- /dev/null +++ b/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.scss @@ -0,0 +1,4 @@ +:host { + display: flex; + flex-grow: 1; +} diff --git a/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.spec.ts b/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.spec.ts new file mode 100644 index 0000000..4cdc2e7 --- /dev/null +++ b/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.spec.ts @@ -0,0 +1,53 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ReactiveFormsModule } from '@angular/forms'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { + ButtonComponent, + InputComponent, + LoaderComponent, + QuoteEditFormComponent, + QuoteTagComponent, + TextAreaComponent, +} from '../../../shared/components'; +import { mockToastrServiceProvider } from '../../../stub'; +import { QuoteEditContainerComponent } from './quote-edit-container.component'; + +describe('QuoteEditContainerComponent', () => { + let component: QuoteEditContainerComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + ReactiveFormsModule, + HttpClientTestingModule, + ], + declarations: [ + QuoteEditContainerComponent, + QuoteEditFormComponent, + LoaderComponent, + InputComponent, + TextAreaComponent, + QuoteTagComponent, + ButtonComponent, + ], + providers: [ + mockToastrServiceProvider, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QuoteEditContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.ts b/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.ts new file mode 100644 index 0000000..160643e --- /dev/null +++ b/apps/quotes/src/app/quote-edit/components/quote-edit-container/quote-edit-container.component.ts @@ -0,0 +1,51 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; + +import { BehaviorSubject, Observable, throwError } from 'rxjs'; +import { catchError, switchMap, take, tap } from 'rxjs/operators'; + +import { RoutesPaths } from '../../../app-routing.config'; +import { Quote } from '../../../models'; +import { QuoteService } from '../../../services'; + +@Component({ + selector: 'app-quote-edit-container', + templateUrl: './quote-edit-container.component.html', + styleUrls: [ './quote-edit-container.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class QuoteEditContainerComponent { + private quote$$ = new BehaviorSubject(null); + quote$ = this.quote$$.asObservable(); + isLoading$ = this.quoteService.isLoading$; + + constructor( + private activateRouter: ActivatedRoute, + private quoteService: QuoteService, + private router: Router, + ) { + const { id } = activateRouter.snapshot.params; + + this.getQuoteById(id).subscribe(); + } + + onSubmitted(quote: Quote): void { + this.quoteService.edit(quote).pipe( + switchMap(() => this.getQuoteById(quote.id)), + take(1), + ).subscribe(); + } + + private getQuoteById(id: string): Observable { + return this.quoteService.getById(id).pipe( + take(1), + tap((quote: Quote) => this.quote$$.next(quote)), + catchError((err: any) => { + this.router.navigate([ RoutesPaths.quotes ]); + + return throwError(err); + }), + ); + } + +} diff --git a/apps/quotes/src/app/quote-edit/quote-edit-routing.module.ts b/apps/quotes/src/app/quote-edit/quote-edit-routing.module.ts new file mode 100644 index 0000000..f6120c2 --- /dev/null +++ b/apps/quotes/src/app/quote-edit/quote-edit-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { QuoteEditContainerComponent } from './components'; + +const routes: Routes = [ + { + path: 'edit/:id', + component: QuoteEditContainerComponent, + }, +]; + +@NgModule({ + imports: [ RouterModule.forChild(routes) ], + exports: [ RouterModule ], +}) +export class QuoteEditRoutingModule { } diff --git a/apps/quotes/src/app/quote-edit/quote-edit.module.ts b/apps/quotes/src/app/quote-edit/quote-edit.module.ts new file mode 100644 index 0000000..3c8469a --- /dev/null +++ b/apps/quotes/src/app/quote-edit/quote-edit.module.ts @@ -0,0 +1,22 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../shared/shared.module'; +import { QuoteEditContainerComponent } from './components'; +import { QuoteEditRoutingModule } from './quote-edit-routing.module'; + +const COMPONENTS = [ + QuoteEditContainerComponent, +]; + +@NgModule({ + declarations: [ + ...COMPONENTS, + ], + imports: [ + CommonModule, + SharedModule, + QuoteEditRoutingModule, + ], +}) +export class QuoteEditModule { } diff --git a/apps/quotes/src/app/quote-new/components/index.ts b/apps/quotes/src/app/quote-new/components/index.ts new file mode 100644 index 0000000..4b5ecb2 --- /dev/null +++ b/apps/quotes/src/app/quote-new/components/index.ts @@ -0,0 +1 @@ +export * from './quote-new-container/quote-new-container.component'; diff --git a/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.html b/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.html new file mode 100644 index 0000000..c16b35e --- /dev/null +++ b/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.html @@ -0,0 +1,9 @@ + + + + + + diff --git a/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.scss b/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.scss new file mode 100644 index 0000000..072345f --- /dev/null +++ b/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.scss @@ -0,0 +1,4 @@ +:host { + display: flex; + flex-grow: 1; +} diff --git a/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.spec.ts b/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.spec.ts new file mode 100644 index 0000000..7030de6 --- /dev/null +++ b/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.spec.ts @@ -0,0 +1,47 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ReactiveFormsModule } from '@angular/forms'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { ButtonComponent, InputComponent, LoaderComponent, QuoteEditFormComponent, TextAreaComponent } from '../../../shared/components'; +import { QuoteTagComponent } from '../../../shared/components/quote-tag/quote-tag.component'; +import { mockToastrServiceProvider } from '../../../stub'; +import { QuoteNewContainerComponent } from './quote-new-container.component'; + +describe('QuoteNewContainerComponent', () => { + let component: QuoteNewContainerComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ + QuoteNewContainerComponent, + QuoteEditFormComponent, + InputComponent, + TextAreaComponent, + QuoteTagComponent, + ButtonComponent, + LoaderComponent, + ], + imports: [ + HttpClientTestingModule, + RouterTestingModule, + ReactiveFormsModule, + ], + providers: [ + mockToastrServiceProvider, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QuoteNewContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.ts b/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.ts new file mode 100644 index 0000000..dc57dc8 --- /dev/null +++ b/apps/quotes/src/app/quote-new/components/quote-new-container/quote-new-container.component.ts @@ -0,0 +1,31 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { Router } from '@angular/router'; + +import { take, tap } from 'rxjs/operators'; + +import { RoutesPaths } from '../../../app-routing.config'; +import { Quote } from '../../../models'; +import { QuoteService } from '../../../services'; + +@Component({ + selector: 'app-quote-new-container', + templateUrl: './quote-new-container.component.html', + styleUrls: [ './quote-new-container.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class QuoteNewContainerComponent { + isLoading$ = this.quoteService.isLoading$; + + constructor( + private quoteService: QuoteService, + private router: Router, + ) { } + + createQuote(quote: Quote) { + this.quoteService.create(quote).pipe( + take(1), + tap(() => this.router.navigate([ RoutesPaths.quotes ])), + ).subscribe(); + } + +} diff --git a/apps/quotes/src/app/quote-new/quote-new-routing.module.ts b/apps/quotes/src/app/quote-new/quote-new-routing.module.ts new file mode 100644 index 0000000..33831df --- /dev/null +++ b/apps/quotes/src/app/quote-new/quote-new-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { QuoteNewContainerComponent } from './components'; + +const routes: Routes = [ + { + path: 'new', + component: QuoteNewContainerComponent, + }, +]; + +@NgModule({ + imports: [ RouterModule.forChild(routes) ], + exports: [ RouterModule ], +}) +export class QuoteNewRoutingModule { } diff --git a/apps/quotes/src/app/quote-new/quote-new.module.ts b/apps/quotes/src/app/quote-new/quote-new.module.ts new file mode 100644 index 0000000..d7de257 --- /dev/null +++ b/apps/quotes/src/app/quote-new/quote-new.module.ts @@ -0,0 +1,22 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../shared/shared.module'; +import { QuoteNewContainerComponent } from './components'; +import { QuoteNewRoutingModule } from './quote-new-routing.module'; + +const COMPONENTS = [ + QuoteNewContainerComponent, +]; + +@NgModule({ + declarations: [ + ...COMPONENTS, + ], + imports: [ + CommonModule, + SharedModule, + QuoteNewRoutingModule, + ], +}) +export class QuoteNewModule { } diff --git a/apps/quotes/src/app/quote/components/index.ts b/apps/quotes/src/app/quote/components/index.ts new file mode 100644 index 0000000..aece926 --- /dev/null +++ b/apps/quotes/src/app/quote/components/index.ts @@ -0,0 +1,5 @@ +export * from './quote/quote.component'; +export * from './quote-container/quote-container.component'; +export * from './quote-share-modal/quote-share-modal.component'; +export * from './quote-preview/quote-preview.component'; +export * from './share-form/share-form.component'; diff --git a/apps/quotes/src/app/quote/components/quote-container/quote-container.component.html b/apps/quotes/src/app/quote/components/quote-container/quote-container.component.html new file mode 100644 index 0000000..ddce72b --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-container/quote-container.component.html @@ -0,0 +1,26 @@ + + + + +
+ + + +
+
+
+ + + + + + diff --git a/apps/quotes/src/app/quote/components/quote-container/quote-container.component.scss b/apps/quotes/src/app/quote/components/quote-container/quote-container.component.scss new file mode 100644 index 0000000..d733636 --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-container/quote-container.component.scss @@ -0,0 +1,51 @@ +@import "~scss/mixins"; +@import "~scss/variables"; + +$btn-size: 36px; + +:host { + width: 100%; + height: 100%; + margin: 0 auto; + padding: 0 15px; + display: flex; + justify-content: center; + align-items: center; + color: $color__white; +} + +.quote-actions { + position: absolute; + display: flex; + outline: none; + right: 80px; + top: 120px; +} + +.get-quote-btn { + position: relative; + margin: 5px; + top: 0; + width: $btn-size; + height: $btn-size; + background: url('../../../../assets/static/refresh.svg') no-repeat center center; + + @include md_s { + right: 10px; + top: 20px; + } +} + +.share-quote-btn { + position: relative; + margin: 5px; + top: 0; + width: $btn-size; + height: $btn-size; + background: url('../../../../assets/static/share.svg') no-repeat center center; + + @include md_s { + right: 10px; + top: 20px; + } +} diff --git a/apps/quotes/src/app/quote/components/quote-container/quote-container.component.spec.ts b/apps/quotes/src/app/quote/components/quote-container/quote-container.component.spec.ts new file mode 100644 index 0000000..7caccd9 --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-container/quote-container.component.spec.ts @@ -0,0 +1,115 @@ +import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; + +import { Observable, of } from 'rxjs'; + +import { QuoteService } from '../../../services'; +import { mockQuoteServiceProvider } from '../../../services/quote.service.mock'; +import { LoaderComponent } from '../../../shared/components'; +import { mockNgxSmartModalService } from '../../../stub/ngx-smart-modal-service.mock'; +import { MockQuoteComponent } from '../quote/quote.component.mock'; +import { QuoteContainerComponent } from './quote-container.component'; + +describe('QuoteContainerComponent', () => { + let component: QuoteContainerComponent; + let fixture: ComponentFixture; + + const testQuote = { id: '1', text: 'test quote text', author: 'test' }; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ + QuoteContainerComponent, + MockQuoteComponent, + LoaderComponent, + ], + providers: [ + mockQuoteServiceProvider, + mockNgxSmartModalService, + ], + imports: [ NoopAnimationsModule ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QuoteContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('quote$', () => { + + it('should have a quote$ stream from QuoteService', inject([ QuoteService ], quoteService => { + expect(component.quote$).toBeDefined(); + expect(component.quote$).toEqual(jasmine.any(Observable)); + expect(component.quote$).toBe(quoteService.quote$); + })); + + it('should get random quote onInit', inject([ QuoteService ], quoteService => { + const spy = spyOn(quoteService, 'getRandom').and.returnValue(of({})); + + component.ngOnInit(); + + expect(spy).toHaveBeenCalled(); + })); + + }); + + describe('isRefreshBtnClicked$', () => { + it('should have a isRefreshBtnClicked$ stream', () => { + expect(component.isRefreshBtnClicked$).toBeDefined(); + expect(component.isRefreshBtnClicked$).toEqual(jasmine.any(Observable)); + }); + + it('should invoke getRandom method of QuoteService and update status after quote$ has been changes', + waitForAsync(inject([ QuoteService ], quoteService => { + const spy = spyOn(quoteService, 'getRandom').and.returnValue(of(testQuote)); + + component.getRandomQuote(); + + component.isRefreshBtnClicked$.subscribe(isClicked => { + expect(spy).toHaveBeenCalled(); + expect(isClicked).toBe(false); + }); + }), + )); + + it('should stop emitting values on destroy', inject([ QuoteService ], quoteService => { + const spy = spyOn(quoteService, 'getRandom').and.returnValue(of(testQuote)); + component.ngOnDestroy(); + component.getRandomQuote(); + + expect(spy).not.toHaveBeenCalled(); + })); + + }); + + describe('events', () => { + it('should handle dbclick event and invoke getRandomQuote method', () => { + const spy = spyOn(component, 'getRandomQuote'); + + fixture.debugElement.nativeElement.dispatchEvent(new MouseEvent('dblclick', { cancelable: true })); + fixture.debugElement.nativeElement.dispatchEvent(new MouseEvent('click', { cancelable: true })); + + expect(spy).toHaveBeenCalledTimes(1); + }); + + }); + + describe('openShareModal', () => { + it('should open share modal', inject([ QuoteService ], quoteService => { + quoteService.hasShareApiUrl = true; + const spy = spyOn(quoteService, 'share'); + + component.openShareModal(testQuote); + + expect(spy).toHaveBeenCalled(); + })); + }); + +}); diff --git a/apps/quotes/src/app/quote/components/quote-container/quote-container.component.ts b/apps/quotes/src/app/quote/components/quote-container/quote-container.component.ts new file mode 100644 index 0000000..e32f42c --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-container/quote-container.component.ts @@ -0,0 +1,118 @@ +import { animate, state, style, transition, trigger } from '@angular/animations'; +import { ChangeDetectionStrategy, Component, HostListener, OnDestroy, OnInit } from '@angular/core'; + +import { NgxSmartModalComponent, NgxSmartModalService } from 'ngx-smart-modal'; +import { BehaviorSubject, combineLatest, Observable, of, race, Subject } from 'rxjs'; +import { + delay, + filter, + share, + switchMap, + take, + takeUntil, + tap, +} from 'rxjs/operators'; + +import { Quote } from '../../../models'; +import { QuoteService } from '../../../services'; +import { QuoteShareModalComponent } from '../quote-share-modal/quote-share-modal.component'; +import { ModalIds } from '../view.models'; + +@Component({ + selector: 'app-quote-container', + templateUrl: './quote-container.component.html', + styleUrls: [ './quote-container.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, + animations: [ + trigger('isClicked', [ + state('isClicked', style({ transform: 'rotate(360deg)' })), + transition('* => isClicked', animate('300ms ease-out')), + ]), + ], +}) +export class QuoteContainerComponent implements OnInit, OnDestroy { + private destroy$ = new Subject(); + + private isRefreshBtnClicked$$ = new BehaviorSubject(false); + isRefreshBtnClicked$ = this.isRefreshBtnClicked$$.asObservable().pipe(share()); + + quote$: Observable = this.quoteService.quote$; + isLoading$ = this.quoteService.isLoading$; + + @HostListener('dblclick') + handleDoubleClick() { + this.getRandomQuote(); + } + + constructor( + private quoteService: QuoteService, + private modalService: NgxSmartModalService, + ) {} + + ngOnInit(): void { + this.quoteService.getRandom().pipe(take(1)).subscribe(); + + this.quote$.pipe( + takeUntil(this.destroy$), + delay(300), + tap(() => this.isRefreshBtnClicked$$.next(false)), + ).subscribe(); + + this.isRefreshBtnClicked$.pipe( + takeUntil(this.destroy$), + filter(Boolean), + switchMap(() => this.quoteService.getRandom()), + ).subscribe(); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } + + getRandomQuote(): void { + this.isRefreshBtnClicked$$.next(true); + } + + openShareModal(quote: Quote): void { + this.listenToShareModalEvents(this.createAndOpenShareModalWithData(quote)); + } + + private createAndOpenShareModalWithData(quote: Quote): NgxSmartModalComponent { + return this.modalService + .create(ModalIds.quoteShare, QuoteShareModalComponent, { + customClass: 'share-modal', + }) + .setData({ quote }) + .open(); + } + + private listenToShareModalEvents(modal: NgxSmartModalComponent): void { + // Listen to modal result + combineLatest([ + modal.onClose, + modal.onDataAdded, + ]).pipe( + switchMap(([ , data ]: [ any, any ]) => { + if (data) { + const { quote, email, phone } = data; + + return this.quoteService.share(quote, email ? { email } : { phone }); + } + + return of(null); + }), + take(1), + ).subscribe(); + + // Destroy modal after its close/dismiss to not duplicate its instances within modalService + race( + modal.onCloseFinished, + modal.onDismissFinished, + ) + .pipe( + take(1), + tap(() => this.modalService.removeModal(ModalIds.quoteShare)), + ).subscribe(); + } +} diff --git a/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.html b/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.html new file mode 100644 index 0000000..135bf0e --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.html @@ -0,0 +1,4 @@ +
+ {{ quote.text }} +  © {{ quote.author }} +
diff --git a/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.scss b/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.scss new file mode 100644 index 0000000..2472b2e --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.scss @@ -0,0 +1,47 @@ +@import "~scss/variables"; + +:host { + flex-basis: 50%; +} + +blockquote { + padding: 20px; + height: 100%; + background: $color__blue; + color: $color__white; + + strong { + padding: 20px; + font-size: 26px; + text-align: justify; + position: relative; + display: block; + margin-bottom: 20px; + + &:after, + &:before { + position: absolute; + font-family: $font__icons; + } + + &:before { + content: '\275d'; + top: 0; + left: 0; + transform: translate(-50%, -20%); + } + + &:after { + content: '\e800'; + right: 0; + bottom: 0; + transform: translate(50%, 20%); + } + } + + cite { + display: block; + text-align: right; + } + +} diff --git a/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.spec.ts b/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.spec.ts new file mode 100644 index 0000000..acc2890 --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { QuotePreviewComponent } from './quote-preview.component'; + +describe('QuotePreviewComponent', () => { + let component: QuotePreviewComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ QuotePreviewComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QuotePreviewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.ts b/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.ts new file mode 100644 index 0000000..b583d74 --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-preview/quote-preview.component.ts @@ -0,0 +1,13 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +import { Quote } from '../../../models'; + +@Component({ + selector: 'app-quote-preview', + templateUrl: './quote-preview.component.html', + styleUrls: [ './quote-preview.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class QuotePreviewComponent { + @Input() quote: Quote; +} diff --git a/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.html b/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.html new file mode 100644 index 0000000..adb8f16 --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.html @@ -0,0 +1,6 @@ + + + diff --git a/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.scss b/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.scss new file mode 100644 index 0000000..8867587 --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.scss @@ -0,0 +1,21 @@ +@import '~scss/variables'; +@import '~scss/mixins'; + +:host { + display: flex; + + @include md { + flex-direction: column; + } +} + +::ng-deep { + .share-modal { + max-width: $breakpoint__md; + + .nsm-content { + padding: 0; + margin: 0; + } + } +} diff --git a/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.spec.ts b/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.spec.ts new file mode 100644 index 0000000..0ca668c --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.spec.ts @@ -0,0 +1,73 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ReactiveFormsModule } from '@angular/forms'; + +import { ContactData } from '../../../models'; +import { ButtonComponent, InputComponent } from '../../../shared/components'; +import { mockNgxSmartModalService } from '../../../stub/ngx-smart-modal-service.mock'; +import { QuotePreviewComponent, QuoteShareModalComponent, ShareFormComponent } from '../../components'; + + +describe('ShareModalComponent', () => { + let component: QuoteShareModalComponent; + let fixture: ComponentFixture; + + const testQuote = { id: '1', text: 'test quote text', author: 'test' }; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ ReactiveFormsModule ], + declarations: [ + InputComponent, + ButtonComponent, + QuoteShareModalComponent, + QuotePreviewComponent, + ShareFormComponent, + ], + providers: [ + mockNgxSmartModalService, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QuoteShareModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('onShareSubmit', () => { + it('should set data and close modal on share submit', () => { + const contractData = { + email: 'test@test.com', + } as ContactData; + const spySetData = spyOn((component as any).modal, 'setData'); + const spyClose = spyOn((component as any).modal, 'close'); + + component.quote = { ...testQuote }; + component.onShareSubmit(contractData); + + expect(spySetData).toHaveBeenCalledWith({ + quote: { ...testQuote }, + ...contractData, + }, true); + expect(spyClose).toHaveBeenCalled(); + }); + }); + + describe('onShareCancel', () => { + it('should set data to null on modal close', () => { + const spySetData = spyOn((component as any).modal, 'setData'); + const spyClose = spyOn((component as any).modal, 'close'); + + component.onShareCancel(); + + expect(spySetData).toHaveBeenCalledWith(null, true); + expect(spyClose).toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.ts b/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.ts new file mode 100644 index 0000000..30033dc --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote-share-modal/quote-share-modal.component.ts @@ -0,0 +1,39 @@ +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; + +import { NgxSmartModalComponent, NgxSmartModalService } from 'ngx-smart-modal'; + +import { ContactData, Quote } from '../../../models'; +import { ModalIds } from '../view.models'; + +@Component({ + selector: 'app-share-modal', + templateUrl: './quote-share-modal.component.html', + styleUrls: [ './quote-share-modal.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class QuoteShareModalComponent implements OnInit { + private modal: NgxSmartModalComponent; + quote: Quote; + + constructor( + private modalService: NgxSmartModalService, + ) { } + + ngOnInit(): void { + this.modal = this.modalService.get(ModalIds.quoteShare); + + const { quote } = this.modal.getData(); + this.quote = quote; + } + + onShareSubmit(contactData: ContactData): void { + this.modal.setData({ quote: this.quote, ...contactData }, true); + this.modal.close(); + } + + onShareCancel(): void { + this.modal.setData(null, true); + this.modal.close(); + } + +} diff --git a/apps/quotes/src/app/quote/components/quote/quote.component.html b/apps/quotes/src/app/quote/components/quote/quote.component.html new file mode 100644 index 0000000..5d4229a --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote/quote.component.html @@ -0,0 +1,11 @@ + +
+
+

+ {{ quote.text }} +

+ ©{{ quote.author }} +
+
+
+ diff --git a/apps/quotes/src/app/quote/components/quote/quote.component.mock.ts b/apps/quotes/src/app/quote/components/quote/quote.component.mock.ts new file mode 100644 index 0000000..e0b747d --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote/quote.component.mock.ts @@ -0,0 +1,12 @@ +import { Component, Input } from '@angular/core'; + +import { Quote } from '../../../models'; + +@Component({ + selector: 'app-quote', + templateUrl: './quote.component.html', + styleUrls: [ './quote.component.scss' ], +}) +export class MockQuoteComponent { + @Input() quote: Quote; +} diff --git a/apps/quotes/src/app/quote/components/quote/quote.component.scss b/apps/quotes/src/app/quote/components/quote/quote.component.scss new file mode 100644 index 0000000..09417a0 --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote/quote.component.scss @@ -0,0 +1,107 @@ +@import "~scss/mixins"; +@import "~scss/variables"; + +$max-width: 1100px; + +$quote_gap: 190px; +$quote_gap_md: 155px; +$quote_gap_md_s: 110px; + +$quote_mark_size_normal: 150px; +$quote_mark_size_md_l: 120px; +$quote_mark_size_md_s: 100px; +$quote_mark_size_sm_l: 60px; + +.quote { + max-width: $max-width; + + &__blockquote { + position: relative; + margin: 0 auto; + padding: $quote_gap $quote_gap $quote_gap; + + @include md_l { + padding: $quote_gap_md $quote_gap_md $quote_gap_md; + } + + @include md { + padding: $quote_gap_md $quote_gap_md $quote_gap_md; + } + + @include md_s { + padding: $quote_gap_md_s $quote_gap_md_s $quote_gap_md_s; + } + + @include sm_l { + padding: 80px 15px 80px; + } + + &::before, + &::after { + font-family: $font__icons; + position: absolute; + font-size: $quote_mark_size_normal; + opacity: 0.5; + + @include md_l { + font-size: $quote_mark_size_md_l; + } + + @include md_s { + font-size: $quote_mark_size_md_s; + } + + @include sm_l { + font-size: $quote_mark_size_sm_l; + } + } + + &::before { + content: '\275d'; + left: 0; + top: 0; + } + + &::after { + content: '\e800'; + right: 0; + bottom: 0; + } + + } + + &__blockquote p { + font-size: 40px; + text-align: justify; + line-height: 50px; + + @include md { + font-size: 35px; + line-height: 40px; + } + + @include md_s { + font-size: 20px; + line-height: 30px; + } + + } + + &__blockquote cite { + margin-top: 20px; + font-size: 35px; + line-height: 60px; + text-align: right; + display: block; + + @include md { + line-height: 40px; + font-size: 30px; + } + + @include md_s { + font-size: 15px; + line-height: 25px; + } + } +} diff --git a/apps/quotes/src/app/quote/components/quote/quote.component.spec.ts b/apps/quotes/src/app/quote/components/quote/quote.component.spec.ts new file mode 100644 index 0000000..8808ce9 --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote/quote.component.spec.ts @@ -0,0 +1,72 @@ +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; + +import { Quote } from '../../../models'; +import { QuoteComponent } from './quote.component'; + +const mockQuote: Quote = { + id: '1', + text: 'test quote text', + author: 'me', +}; + +@Component({ + template: '', +}) +export class TestHostQuoteComponent { + quote: Quote = mockQuote; +} + +describe('QuoteComponent', () => { + let component: TestHostQuoteComponent; + let quoteComponentElem; + let fixture: ComponentFixture; + + const getQuoteDebugElement = () => fixture.debugElement.query(By.css('.quote')); + const getBlockquoteTextDebugElement = () => fixture.debugElement.query(By.css('blockquote p')); + const getQuoteAuthorDebugElement = () => fixture.debugElement.query(By.css('cite')); + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ QuoteComponent, TestHostQuoteComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TestHostQuoteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should not render quote component if quote has not been provided', () => { + component.quote = null; + fixture.detectChanges(); + + quoteComponentElem = getQuoteDebugElement(); + + expect(quoteComponentElem).toBeFalsy(); + }); + + it('should render quote component', () => { + quoteComponentElem = getQuoteDebugElement(); + + expect(quoteComponentElem).toBeTruthy(); + }); + + it('should contain quote text', () => { + const quoteText = getBlockquoteTextDebugElement().nativeElement.textContent; + expect(quoteText).toContain(mockQuote.text); + }); + + it('should contain quote authoe', () => { + const quoteAuthor = getQuoteAuthorDebugElement().nativeElement.textContent; + expect(quoteAuthor).toContain(mockQuote.author); + }); + +}); diff --git a/apps/quotes/src/app/quote/components/quote/quote.component.ts b/apps/quotes/src/app/quote/components/quote/quote.component.ts new file mode 100644 index 0000000..2e1cc37 --- /dev/null +++ b/apps/quotes/src/app/quote/components/quote/quote.component.ts @@ -0,0 +1,14 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +import { Quote } from '../../../models'; + +@Component({ + selector: 'app-quote', + templateUrl: './quote.component.html', + styleUrls: [ './quote.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, + +}) +export class QuoteComponent { + @Input() quote: Quote; +} diff --git a/apps/quotes/src/app/quote/components/share-form/share-form.component.html b/apps/quotes/src/app/quote/components/share-form/share-form.component.html new file mode 100644 index 0000000..877aefe --- /dev/null +++ b/apps/quotes/src/app/quote/components/share-form/share-form.component.html @@ -0,0 +1,45 @@ + +
+ + + + +
diff --git a/apps/quotes/src/app/quote/components/share-form/share-form.component.scss b/apps/quotes/src/app/quote/components/share-form/share-form.component.scss new file mode 100644 index 0000000..6d454c5 --- /dev/null +++ b/apps/quotes/src/app/quote/components/share-form/share-form.component.scss @@ -0,0 +1,54 @@ +@import "~scss/variables"; + +:host { + display: flex; + flex-direction: column; + flex-basis: 50%; + padding: 20px; +} + +.share-form-wrapper { + display: flex; + flex-direction: column; + margin-bottom: auto; + + .toggler-wrapper { + display: flex; + flex-direction: column; + + label { + margin-bottom: 15px; + } + + &-options { + display: flex; + border-radius: 10px; + overflow: hidden; + margin-right: auto; + + ::ng-deep { + app-button { + button { + border-radius: 0; + } + + &.active button{ + background: $color__blue_dark; + } + } + } + } + } +} + +.button-wrapper { + margin-top: auto; + align-self: flex-end; + + ::ng-deep { + app-button:first-child { + margin-right: 10px; + } + } +} + diff --git a/apps/quotes/src/app/quote/components/share-form/share-form.component.spec.ts b/apps/quotes/src/app/quote/components/share-form/share-form.component.spec.ts new file mode 100644 index 0000000..64777e8 --- /dev/null +++ b/apps/quotes/src/app/quote/components/share-form/share-form.component.spec.ts @@ -0,0 +1,82 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ReactiveFormsModule } from '@angular/forms'; + +import { ButtonComponent, InputComponent } from '../../../shared/components'; +import { ShareFormComponent } from './share-form.component'; + +describe('ShareFormComponent', () => { + let component: ShareFormComponent; + let fixture: ComponentFixture; + + const shareOption = { + type: 'test', + inputType: 'test', + title: 'title', + placeholder: 'placeholder', + validators: [], + }; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + ReactiveFormsModule, + ], + declarations: [ + ShareFormComponent, + ButtonComponent, + InputComponent, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ShareFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('selectShareOption', () => { + it('should initialize share form control and set selectedShareOption', () => { + component.selectShareOption(shareOption); + + expect(component.shareFormControl).toBeTruthy(); + expect(component.selectedShareOption).toEqual(shareOption); + }); + }); + + describe('submit', () => { + it('should submit the form', () => { + const spy = spyOn(component.shareSubmit, 'emit'); + + component.selectShareOption(shareOption); + component.shareFormControl.setValue('value_test'); + component.submit(); + + expect(spy).toHaveBeenCalledWith({ + 'test': 'value_test', + }); + }); + + it('should not submit the form if it is not valid', () => { + const spy = spyOn(component.shareSubmit, 'emit'); + + component.submit(); + + expect(spy).not.toHaveBeenCalled(); + }); + }); + + describe('dismiss', () => { + it('should dismiss the form', () => { + const spy = spyOn(component.shareCancel, 'emit'); + component.dismiss(); + + expect(spy).toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/quotes/src/app/quote/components/share-form/share-form.component.ts b/apps/quotes/src/app/quote/components/share-form/share-form.component.ts new file mode 100644 index 0000000..34d3e66 --- /dev/null +++ b/apps/quotes/src/app/quote/components/share-form/share-form.component.ts @@ -0,0 +1,87 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, OnInit, Output } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; + +import { ShareOption } from '../view.models'; + +// eslint-disable-next-line max-len +const EMAIL_REG_EX = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + +@Component({ + selector: 'app-share-form', + templateUrl: './share-form.component.html', + styleUrls: [ './share-form.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ShareFormComponent implements OnInit { + shareOptions: ShareOption[] = [ + { + type: 'email', + inputType: 'email', + title: 'Email', + placeholder: 'email@example.com', + validators: [ + Validators.required, + Validators.pattern(EMAIL_REG_EX), + ], + }, + { + type: 'phone', + inputType: 'tel', + title: 'Phone', + placeholder: '+380999998877', + validators: [ Validators.required, Validators.maxLength(15) ], + }, + ]; + selectedShareOption = this.shareOptions[ 0 ]; + shareFormControl: FormControl; + form: FormGroup; + + @Output() shareSubmit = new EventEmitter(); + @Output() shareCancel = new EventEmitter(); + + constructor( + private fb: FormBuilder, + ) { + this.selectShareOption(this.selectedShareOption); + } + + ngOnInit(): void { + this.form = this.fb.group({ + [ 'share' ]: this.shareFormControl, + }); + } + + selectShareOption(shareOption: ShareOption): void { + this.selectedShareOption = shareOption; + + if (this.shareFormControl) { + this.form.controls[ 'share' ].setValidators(shareOption.validators); + this.shareFormControl.setValue(''); + + return; + } + + this.shareFormControl = new FormControl('', shareOption.validators); + } + + isShareOptionActive(shareOption: ShareOption): boolean { + return this.selectedShareOption === shareOption; + } + + submit(): void { + if (!this.isShareFormValid) { + return; + } + + this.shareSubmit.emit({ [ this.selectedShareOption.type ]: this.shareFormControl.value }); + } + + dismiss(): void { + this.shareCancel.emit(); + } + + get isShareFormValid() { + return this.shareFormControl && this.shareFormControl.valid; + } + +} diff --git a/apps/quotes/src/app/quote/components/view.models.ts b/apps/quotes/src/app/quote/components/view.models.ts new file mode 100644 index 0000000..d63d97b --- /dev/null +++ b/apps/quotes/src/app/quote/components/view.models.ts @@ -0,0 +1,14 @@ +import { ValidatorFn } from '@angular/forms'; + +export enum ModalIds { + quoteShare = 'quoteShare', + deleteQuote = 'deleteQuote', +} + +export interface ShareOption { + type: string; + inputType: string; + title: string; + placeholder: string; + validators: ValidatorFn[]; +} diff --git a/apps/quotes/src/app/quote/quote-routing.module.ts b/apps/quotes/src/app/quote/quote-routing.module.ts new file mode 100644 index 0000000..3ff03b8 --- /dev/null +++ b/apps/quotes/src/app/quote/quote-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { QuoteContainerComponent } from './components'; + +const routes: Routes = [ + { + path: '', + component: QuoteContainerComponent, + }, +]; + +@NgModule({ + imports: [ RouterModule.forChild(routes) ], + exports: [ RouterModule ], +}) +export class QuoteRoutingModule { } diff --git a/apps/quotes/src/app/quote/quote.module.ts b/apps/quotes/src/app/quote/quote.module.ts new file mode 100644 index 0000000..07351d4 --- /dev/null +++ b/apps/quotes/src/app/quote/quote.module.ts @@ -0,0 +1,33 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../shared/shared.module'; +import { + QuoteComponent, + QuoteContainerComponent, + QuotePreviewComponent, + QuoteShareModalComponent, + ShareFormComponent, +} from './components'; +import { QuoteRoutingModule } from './quote-routing.module'; + +const COMPONENTS = [ + QuoteContainerComponent, + QuoteComponent, + QuoteShareModalComponent, + QuotePreviewComponent, + ShareFormComponent, +]; + +@NgModule({ + declarations: [ + ...COMPONENTS, + ], + imports: [ + CommonModule, + QuoteRoutingModule, + SharedModule, + ], +}) +export class QuoteModule { +} diff --git a/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.html b/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.html new file mode 100644 index 0000000..98ebaba --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.html @@ -0,0 +1,15 @@ +

Are you sure you want to delete this quote ?

+ +
+ + + + +
diff --git a/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.scss b/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.scss new file mode 100644 index 0000000..9b44026 --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.scss @@ -0,0 +1,8 @@ +.button-wrapper { + margin-top: 20px; + ::ng-deep { + app-button:first-child { + margin-right: 20px; + } + } +} diff --git a/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.spec.ts b/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.spec.ts new file mode 100644 index 0000000..16891d7 --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.spec.ts @@ -0,0 +1,33 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { ButtonComponent } from '../../../shared/components'; +import { mockNgxSmartModalService } from '../../../stub/ngx-smart-modal-service.mock'; +import { DeleteQuoteModalComponent } from './delete-quote-modal.component'; + +describe('DeleteQuoteModalComponent', () => { + let component: DeleteQuoteModalComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ + DeleteQuoteModalComponent, + ButtonComponent, + ], + providers: [ + mockNgxSmartModalService, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DeleteQuoteModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.ts b/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.ts new file mode 100644 index 0000000..f34900b --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/delete-quote-modal/delete-quote-modal.component.ts @@ -0,0 +1,36 @@ +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; + +import { NgxSmartModalComponent, NgxSmartModalService } from 'ngx-smart-modal'; + +import { ModalIds } from '../../../quote/components/view.models'; + +@Component({ + selector: 'app-delete-quote-modal', + templateUrl: './delete-quote-modal.component.html', + styleUrls: [ './delete-quote-modal.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DeleteQuoteModalComponent implements OnInit { + private modal: NgxSmartModalComponent; + private quoteIdToDelete; + + constructor( + private modalService: NgxSmartModalService, + ) { } + + ngOnInit(): void { + this.modal = this.modalService.get(ModalIds.deleteQuote); + this.quoteIdToDelete = this.modal.getData(); + } + + deleteQuote() { + this.modal.setData(this.quoteIdToDelete, true); + this.modal.close(); + } + + cancel() { + this.modal.setData(null, true); + this.modal.close(); + } + +} diff --git a/apps/quotes/src/app/quotes-list/components/index.ts b/apps/quotes/src/app/quotes-list/components/index.ts new file mode 100644 index 0000000..a85c080 --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/index.ts @@ -0,0 +1,3 @@ +export * from './quotes-list-container/quotes-list-container.component'; +export * from './quotes-list-table/quotes-list-table.component'; +export * from './delete-quote-modal/delete-quote-modal.component'; diff --git a/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.html b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.html new file mode 100644 index 0000000..07fa9f5 --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.html @@ -0,0 +1,5 @@ + + diff --git a/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.scss b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.scss new file mode 100644 index 0000000..072345f --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.scss @@ -0,0 +1,4 @@ +:host { + display: flex; + flex-grow: 1; +} diff --git a/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.spec.ts b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.spec.ts new file mode 100644 index 0000000..3bde700 --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.spec.ts @@ -0,0 +1,44 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { LoaderComponent, TableComponent } from '../../../shared/components'; +import { mockToastrServiceProvider } from '../../../stub'; +import { mockNgxSmartModalService } from '../../../stub/ngx-smart-modal-service.mock'; +import { QuotesListTableComponent } from '../../components'; +import { QuotesListContainerComponent } from './quotes-list-container.component'; + +describe('QuotesListContainerComponent', () => { + let component: QuotesListContainerComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ + QuotesListContainerComponent, + QuotesListTableComponent, + LoaderComponent, + TableComponent, + ], + imports: [ + HttpClientTestingModule, + RouterTestingModule, + ], + providers: [ + mockNgxSmartModalService, + mockToastrServiceProvider, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QuotesListContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.ts b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.ts new file mode 100644 index 0000000..51049be --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.component.ts @@ -0,0 +1,44 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +import { BehaviorSubject, Observable } from 'rxjs'; +import { map, switchMap, take, tap } from 'rxjs/operators'; + +import { Quote } from '../../../models'; +import { QuoteService } from '../../../services'; +import { TableDataSource } from '../../../shared/components/table/table.models'; +import { filterDeleted, getTableData } from './quotes-list-container.models.rules'; + +@Component({ + selector: 'app-quotes-list-container', + templateUrl: './quotes-list-container.component.html', + styleUrls: [ './quotes-list-container.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class QuotesListContainerComponent { + + private quotes$$ = new BehaviorSubject(null); + quotes$ = this.quotes$$.asObservable(); + + constructor( + private quoteService: QuoteService, + ) { + this.getAll().pipe( + take(1), + ).subscribe(); + } + + getAll(): Observable { + return this.quoteService.getAll().pipe( + map((quotes: Quote[]) => filterDeleted(quotes)), + map(getTableData), + tap((data: TableDataSource[]) => this.quotes$$.next(data)), + ); + } + + deleteById(id: string): void { + this.quoteService.delete(id).pipe( + take(1), + switchMap(() => this.getAll()), + ).subscribe(); + } +} diff --git a/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.models.rules.spec.ts b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.models.rules.spec.ts new file mode 100644 index 0000000..3855bbb --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.models.rules.spec.ts @@ -0,0 +1,58 @@ +import { Quote } from '../../../models'; +import { filterDeleted, getTableData } from './quotes-list-container.models.rules'; + +describe('quotes list container models rules', () => { + const mockQuotes = [ + { id: '1', text: 'text', author: 'author', isDeleted: true }, + { id: '2', text: 'text2', author: 'author2', isDeleted: false }, + { id: '3', text: 'text3', author: 'author3', isDeleted: false }, + ] as Quote[]; + + describe('getTableData', () => { + it('should return table data from quotes', () => { + const expectedResult = [ + { + id: { + value: mockQuotes[ 0 ].id, + }, + text: { + value: mockQuotes[ 0 ].text, + }, + author: { + value: mockQuotes[ 0 ].author, + }, + }, + { + id: { + value: mockQuotes[ 1 ].id, + }, + text: { + value: mockQuotes[ 1 ].text, + }, + author: { + value: mockQuotes[ 1 ].author, + }, + }, + { + id: { + value: mockQuotes[ 2 ].id, + }, + text: { + value: mockQuotes[ 2 ].text, + }, + author: { + value: mockQuotes[ 2 ].author, + }, + }, + ]; + + expect(getTableData(mockQuotes)).toEqual(expectedResult); + }); + }); + + describe('filterDeleted', () => { + it('should filter deleted quotes', () => { + expect(filterDeleted(mockQuotes)).toEqual([ mockQuotes[ 1 ], mockQuotes[ 2 ] ]); + }); + }); +}); diff --git a/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.models.rules.ts b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.models.rules.ts new file mode 100644 index 0000000..c56edc9 --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/quotes-list-container/quotes-list-container.models.rules.ts @@ -0,0 +1,30 @@ +import { Quote } from '../../../models'; +import { TableDataSource } from '../../../shared/components/table/table.models'; + +export function getTableData(data: Quote[]): TableDataSource[] { + return data.map(({ text, author, id }: Quote) => { + return { + id: { + value: id, + }, + text: { + value: text, + }, + author: { + value: author, + }, + }; + }); +} + +export function getQuoteFromTableDataSource(tableData: TableDataSource): Quote { + return { + id: tableData.id.value, + text: tableData.text.value, + author: tableData.author.value, + }; +} + +export function filterDeleted(quotes: Quote[]): Quote[] { + return quotes.filter((quote: Quote) => !quote.isDeleted); +} diff --git a/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.html b/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.html new file mode 100644 index 0000000..42d7bc4 --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.html @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.scss b/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.scss new file mode 100644 index 0000000..aab3bbb --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.scss @@ -0,0 +1,25 @@ +:host { + display: flex; + flex-grow: 1; +} + +app-table { + display: block; + width: 100%; + margin: 20px; + + button { + background: transparent; + margin-right: 10px; + + &:hover { + text-decoration: underline; + } + } + + ::ng-deep { + table { + width: 100%; + } + } +} diff --git a/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.spec.ts b/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.spec.ts new file mode 100644 index 0000000..1a6d6e6 --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.spec.ts @@ -0,0 +1,66 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { Router } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { RoutesPaths } from '../../../app-routing.config'; +import { LoaderComponent, TableComponent } from '../../../shared/components'; +import { TableDataSource } from '../../../shared/components/table/table.models'; +import { mockToastrServiceProvider } from '../../../stub'; +import { mockNgxSmartModalService } from '../../../stub/ngx-smart-modal-service.mock'; +import { QuotesListTableComponent } from './quotes-list-table.component'; + +describe('QuotesListTableComponent', () => { + let component: QuotesListTableComponent; + let fixture: ComponentFixture; + + const mockRow = { + id: { + value: '1', + }, + text: { + value: 'text', + }, + author: { + value: 'author', + }, + } as TableDataSource; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + HttpClientTestingModule, + ], + declarations: [ + QuotesListTableComponent, + TableComponent, + LoaderComponent, + ], + providers: [ + mockNgxSmartModalService, + mockToastrServiceProvider, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QuotesListTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('editQuote', () => { + it('should redirect to edit page', inject([ Router ], router => { + const spy = spyOn(router, 'navigate'); + component.editQuote(mockRow); + + expect(spy).toHaveBeenCalledWith([ `/${ RoutesPaths.quotes }`, RoutesPaths.edit, mockRow.id.value ]); + })); + }); +}); diff --git a/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.ts b/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.ts new file mode 100644 index 0000000..b3b99cd --- /dev/null +++ b/apps/quotes/src/app/quotes-list/components/quotes-list-table/quotes-list-table.component.ts @@ -0,0 +1,100 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; +import { Router } from '@angular/router'; + +import { NgxSmartModalComponent, NgxSmartModalService } from 'ngx-smart-modal'; +import { combineLatest, of, race } from 'rxjs'; +import { switchMap, take, tap } from 'rxjs/operators'; + +import { environment } from '../../../../environments/environment'; +import { RoutesPaths } from '../../../app-routing.config'; +import { ModalIds } from '../../../quote/components/view.models'; +import { QuoteService } from '../../../services'; +import { TableDataSource, TableHeadColumns } from '../../../shared/components/table/table.models'; +import { DeleteQuoteModalComponent } from '../delete-quote-modal/delete-quote-modal.component'; +import { getQuoteFromTableDataSource } from '../quotes-list-container/quotes-list-container.models.rules'; + +@Component({ + selector: 'app-quotes-list-table', + templateUrl: './quotes-list-table.component.html', + styleUrls: [ './quotes-list-table.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class QuotesListTableComponent { + @Output() delete = new EventEmitter(); + @Input() data: TableDataSource[]; + + columns: TableHeadColumns[] = [ + { + label: 'Text', + key: 'text', + }, + { + label: 'Author', + key: 'author', + }, + ]; + + isControlCellAvailable = environment.apiUrls.quote; + + isLoading$ = this.quoteService.isLoading$; + + constructor( + private router: Router, + private modalService: NgxSmartModalService, + private quoteService: QuoteService, + ) { + if (this.isControlCellAvailable) { + this.columns.push({ + label: 'Action', + key: 'action', + }); + } + } + + editQuote(row: TableDataSource) { + const { id } = getQuoteFromTableDataSource(row); + + this.router.navigate([ `/${ RoutesPaths.quotes }`, RoutesPaths.edit, id ]); + } + + deleteQuote(row: TableDataSource) { + const { id } = getQuoteFromTableDataSource(row); + + this.listenToShareModalEvents(this.createAndOpenDeleteQuoteModal(id)); + } + + private createAndOpenDeleteQuoteModal(id: string): NgxSmartModalComponent { + return this.modalService + .create(ModalIds.deleteQuote, DeleteQuoteModalComponent) + .setData(id) + .open(); + } + + private listenToShareModalEvents(modal: NgxSmartModalComponent): void { + // Listen to modal result + combineLatest([ + modal.onClose, + modal.onDataAdded, + ]).pipe( + switchMap(([ , id ]: [ any, any ]) => { + if (id) { + this.delete.emit(id); + } + + return of(null); + }), + take(1), + ).subscribe(); + + // Destroy modal after its close/dismiss to not duplicate its instances within modalService + race( + modal.onCloseFinished, + modal.onDismissFinished, + ) + .pipe( + take(1), + tap(() => this.modalService.removeModal(ModalIds.deleteQuote)), + ).subscribe(); + } + +} diff --git a/apps/quotes/src/app/quotes-list/quotes-list-routing.module.ts b/apps/quotes/src/app/quotes-list/quotes-list-routing.module.ts new file mode 100644 index 0000000..050a4d5 --- /dev/null +++ b/apps/quotes/src/app/quotes-list/quotes-list-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { QuotesListContainerComponent } from './components'; + +const routes: Routes = [ + { + path: '', + component: QuotesListContainerComponent, + }, +]; + +@NgModule({ + imports: [ RouterModule.forChild(routes) ], + exports: [ RouterModule ], +}) +export class QuotesListRoutingModule { } diff --git a/apps/quotes/src/app/quotes-list/quotes-list.module.ts b/apps/quotes/src/app/quotes-list/quotes-list.module.ts new file mode 100644 index 0000000..164709e --- /dev/null +++ b/apps/quotes/src/app/quotes-list/quotes-list.module.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../shared/shared.module'; +import { DeleteQuoteModalComponent, QuotesListContainerComponent, QuotesListTableComponent } from './components'; +import { QuotesListRoutingModule } from './quotes-list-routing.module'; + +const COMPONENTS = [ + QuotesListContainerComponent, + QuotesListTableComponent, + DeleteQuoteModalComponent, +]; + +@NgModule({ + declarations: [ + ...COMPONENTS, + ], + imports: [ + CommonModule, + SharedModule, + QuotesListRoutingModule, + ], +}) +export class QuotesListModule { } diff --git a/apps/quotes/src/app/services/index.ts b/apps/quotes/src/app/services/index.ts new file mode 100644 index 0000000..098dd7a --- /dev/null +++ b/apps/quotes/src/app/services/index.ts @@ -0,0 +1 @@ +export * from './quote.service'; diff --git a/apps/quotes/src/app/services/quote.service.mock.ts b/apps/quotes/src/app/services/quote.service.mock.ts new file mode 100644 index 0000000..effc64c --- /dev/null +++ b/apps/quotes/src/app/services/quote.service.mock.ts @@ -0,0 +1,56 @@ +import { BehaviorSubject, Observable, of } from 'rxjs'; + +import { Quote } from '../models'; +import { QuoteService, QUOTESY } from './quote.service'; + +export class MockQuoteService { + quote$ = of({ id: '1', text: 'test quote text', author: 'test' }); + hasApiUrl = true; + hasShareApiUrl = false; + private isLoading$$: BehaviorSubject = new BehaviorSubject(false); + isLoading$: Observable = this.isLoading$$.asObservable(); + + getRandom(): Observable { + return of({} as Quote); + } + + share() { + return of({}); + } + + getById() { + return of({}); + } + + edit() { + return of({}); + } + + create() { + return of({}); + } + + getAll() { + return of([]); + } + + delete() { + return of({}); + } +} + + +export const mockQuoteServiceProvider = { + provide: QuoteService, + useClass: MockQuoteService, +}; + +export const mockQuotesyProvider = { + provide: QUOTESY, + useValue: { + random() { + }, + parse_json() { + }, + }, +}; diff --git a/apps/quotes/src/app/services/quote.service.spec.ts b/apps/quotes/src/app/services/quote.service.spec.ts new file mode 100644 index 0000000..02f9a48 --- /dev/null +++ b/apps/quotes/src/app/services/quote.service.spec.ts @@ -0,0 +1,248 @@ +import { inject, TestBed, waitForAsync } from '@angular/core/testing'; + +import { ToastrService } from 'ngx-toastr'; +import { Observable, of, throwError } from 'rxjs'; + +import { QuoteApiService } from '../api-services'; +import { mockQuoteApiServiceProvider } from '../api-services/quote-api.service.mock'; +import { ContactData, Quote } from '../models'; +import { mockToastrServiceProvider } from '../stub/toastr-service.mock'; +import { QuoteService, QUOTESY } from './quote.service'; +import { mockQuotesyProvider } from './quote.service.mock'; + +const mockQuote: Quote = { + id: '1', + text: 'quote text', + author: 'author', +}; + +const mockError = { + error: { + message: 'error message', + status: 404, + }, +}; + +describe('QuoteService', () => { + let service: QuoteService; + let quotesy: any; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + mockQuoteApiServiceProvider, + mockQuotesyProvider, + mockToastrServiceProvider, + ], + }); + service = TestBed.inject(QuoteService); + quotesy = TestBed.inject(QUOTESY); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + describe('getRandom', () => { + it('should return an Observable of quote object', () => { + const quote = service.getRandom(); + expect(quote).toEqual(jasmine.any(Observable)); + }); + + it('should execute quotesy to get random quote', waitForAsync(inject([ QuoteApiService ], quotesApi => { + service.hasApiUrl = false; + const spyQuotesy = spyOn(quotesy, 'random').and.returnValue(mockQuote); + const spy = spyOn(quotesApi, 'getRandom').and.returnValue(of(mockQuote)); + + service.getRandom().subscribe(quote => { + expect(spyQuotesy).toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); + expect(quote).toEqual(mockQuote); + }); + }))); + + it('should execute API to get random quote', waitForAsync(inject([ QuoteApiService ], quotesApi => { + service.hasApiUrl = true; + const spyQuotesy = spyOn(quotesy, 'random').and.returnValue(mockQuote); + const spy = spyOn(quotesApi, 'getRandom').and.returnValue(of(mockQuote)); + + service.getRandom().subscribe(quote => { + expect(spyQuotesy).not.toHaveBeenCalled(); + expect(spy).toHaveBeenCalled(); + expect(quote).toEqual(mockQuote); + }); + }))); + + it('should execute API and emit error', inject([ QuoteApiService ], quotesApi => { + service.hasApiUrl = true; + spyOn(quotesApi, 'getRandom').and.returnValue(throwError(mockError)); + + service.getRandom().subscribe( + () => {}, + err => { + expect(err).toEqual(mockError); + }, + ); + })); + }); + describe('share', () => { + it('should call share API', inject([ QuoteApiService, ToastrService ], (quoteApi, toastrService) => { + const toastrSpy = spyOn(toastrService, 'success'); + const spy = spyOn(quoteApi, 'share').and.returnValue({}); + + service.hasShareApiUrl = true; + service.share({} as Quote, {} as ContactData); + + service.hasShareApiUrl = false; + service.share({} as Quote, {} as ContactData).subscribe(() => { + expect(toastrSpy).toHaveBeenCalled(); + }); + expect(spy).toHaveBeenCalledTimes(1); + })); + }); + + describe('edit', () => { + it('should call edit API', inject([ QuoteApiService, ToastrService ], (quoteApi, toastrService) => { + const spy = spyOn(quoteApi, 'edit').and.returnValue(of(mockQuote)); + const toastrSpy = spyOn(toastrService, 'success'); + + service.edit(mockQuote).subscribe(() => { + expect(toastrSpy).toHaveBeenCalled(); + }); + + expect(spy).toHaveBeenCalledWith(mockQuote); + })); + + it('should call edit API and emit error', inject([ QuoteApiService ], quoteApi => { + const spy = spyOn(quoteApi, 'edit').and.returnValue(throwError(mockError)); + + service.edit(mockQuote).subscribe( + () => { + }, + err => { + expect(err).toEqual(mockError); + }, + ); + + expect(spy).toHaveBeenCalledWith(mockQuote); + })); + }); + + describe('create', () => { + it('should call create API', inject([ QuoteApiService, ToastrService ], (quoteApi, toastrService) => { + const spy = spyOn(quoteApi, 'create').and.returnValue(of(mockQuote)); + const toastrSpy = spyOn(toastrService, 'success'); + + service.create(mockQuote).subscribe(() => { + expect(toastrSpy).toHaveBeenCalled(); + }); + + expect(spy).toHaveBeenCalledWith(mockQuote); + })); + + it('should call create API and emit error', inject([ QuoteApiService ], quoteApi => { + const spy = spyOn(quoteApi, 'create').and.returnValue(throwError(mockError)); + + service.create(mockQuote).subscribe( + () => { + }, + err => { + expect(err).toEqual(mockError); + }, + ); + + expect(spy).toHaveBeenCalledWith(mockQuote); + })); + }); + + describe('delete', () => { + it('should call delete API', inject([ QuoteApiService, ToastrService ], (quoteApi, toastrService) => { + const spy = spyOn(quoteApi, 'delete').and.returnValue(of(mockQuote)); + const toastrSpy = spyOn(toastrService, 'success'); + + service.delete(mockQuote.id).subscribe(() => { + expect(toastrSpy).toHaveBeenCalled(); + }); + + expect(spy).toHaveBeenCalledWith(mockQuote.id); + })); + + it('should call delete API and emit error', inject([ QuoteApiService ], quoteApi => { + const spy = spyOn(quoteApi, 'delete').and.returnValue(throwError(mockError)); + + service.delete(mockQuote.id).subscribe( + () => { + }, + err => { + expect(err).toEqual(mockError); + }, + ); + + expect(spy).toHaveBeenCalledWith(mockQuote.id); + })); + }); + + describe('getById', () => { + it('should call getById API', inject([ QuoteApiService ], quoteApi => { + const spy = spyOn(quoteApi, 'getById').and.returnValue(of(mockQuote)); + + service.getById(mockQuote.id).subscribe(() => { + expect(spy).toHaveBeenCalled(); + }); + + expect(spy).toHaveBeenCalledWith(mockQuote.id); + })); + + it('should call getById API and emit error', inject([ QuoteApiService ], quoteApi => { + const spy = spyOn(quoteApi, 'getById').and.returnValue(throwError(mockError)); + + service.getById(mockQuote.id).subscribe( + () => { + }, + err => { + expect(err).toEqual(mockError); + }, + ); + + expect(spy).toHaveBeenCalledWith(mockQuote.id); + })); + }); + + describe('getAll', () => { + it('should call getAll API', inject([ QuoteApiService ], quoteApi => { + service.hasApiUrl = true; + + const spy = spyOn(quoteApi, 'getAll').and.returnValue(of([ mockQuote ])); + + service.getAll().subscribe(); + + expect(spy).toHaveBeenCalled(); + })); + + it('should call getAll API and emit error', inject([ QuoteApiService ], quoteApi => { + service.hasApiUrl = true; + + const spy = spyOn(quoteApi, 'getAll').and.returnValue(throwError(mockError)); + + service.getAll().subscribe( + () => { + }, + err => { + expect(err).toEqual(mockError); + }, + ); + + expect(spy).toHaveBeenCalled(); + })); + + it('should execute quotesy to get all quotes', () => { + service.hasApiUrl = false; + + const spy = spyOn(quotesy, 'parse_json').and.returnValue([]); + + service.getAll().subscribe(() => { + expect(spy).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/apps/quotes/src/app/services/quote.service.ts b/apps/quotes/src/app/services/quote.service.ts new file mode 100644 index 0000000..c2fe4da --- /dev/null +++ b/apps/quotes/src/app/services/quote.service.ts @@ -0,0 +1,148 @@ +import { Inject, Injectable, InjectionToken } from '@angular/core'; + +import { ToastrService } from 'ngx-toastr'; +import quotesy from 'quotesy'; +import { BehaviorSubject, Observable, of, throwError } from 'rxjs'; +import { catchError, distinctUntilChanged, tap } from 'rxjs/operators'; + +import { environment } from '../../environments/environment'; +import { QuoteApiService } from '../api-services'; +import { ContactData, Quote } from '../models'; + +export const QUOTESY = new InjectionToken('QUOTESY', { + providedIn: 'root', + factory: () => quotesy, +}); + +@Injectable({ + providedIn: 'root', +}) +export class QuoteService { + private isLoading$$: BehaviorSubject = new BehaviorSubject(false); + isLoading$: Observable = this.isLoading$$.asObservable(); + + private quote$$ = new BehaviorSubject(null); + quote$: Observable = this.quote$$.asObservable().pipe(distinctUntilChanged()); + + hasApiUrl = !!environment.apiUrls.quote; + hasShareApiUrl = !!environment.apiUrls.share; + + constructor( + private quotesApi: QuoteApiService, + private toastrService: ToastrService, + @Inject(QUOTESY) private quotes: any, + ) {} + + getRandom(): Observable { + this.isLoading$$.next(true); + + return ( + this.hasApiUrl + ? this.quotesApi.getRandom() + : of(this.quotes.random()) + ).pipe( + tap((quote: Quote) => this.emitQuote({ ...quote })), + tap(() => this.isLoading$$.next(false)), + catchError((err: any) => { + this.isLoading$$.next(false); + + return throwError(err); + }), + ); + } + + getById(id: string): Observable { + this.isLoading$$.next(true); + + return this.quotesApi.getById(id).pipe( + tap(() => this.isLoading$$.next(false)), + catchError((err: any) => { + this.isLoading$$.next(false); + + return throwError(err); + }), + ); + } + + edit(quote: Quote): Observable { + this.isLoading$$.next(true); + + return this.quotesApi.edit(quote).pipe( + tap(() => this.isLoading$$.next(false)), + tap(() => this.toastrService.success('Quote successfully edited.')), + catchError((err: any) => { + this.isLoading$$.next(false); + + return throwError(err); + }), + ); + } + + create(quote: Quote): Observable { + this.isLoading$$.next(true); + + return this.quotesApi.create(quote).pipe( + tap(() => this.isLoading$$.next(false)), + tap(() => this.toastrService.success('Quote has been created.')), + catchError((err: any) => { + this.isLoading$$.next(false); + + return throwError(err); + }), + ); + } + + getAll(): Observable { + this.isLoading$$.next(true); + + return ( + this.hasApiUrl + ? this.quotesApi.getAll() + : of(this.quotes.parse_json()) + ).pipe( + tap(() => this.isLoading$$.next(false)), + catchError((err: any) => { + this.isLoading$$.next(false); + + return throwError(err); + }), + ); + } + + share(quote: Quote, contactData: ContactData): Observable { + this.isLoading$$.next(true); + + return this.hasShareApiUrl ? + this.quotesApi.share(quote, contactData) : + of(null).pipe( + // eslint-disable-next-line no-restricted-syntax + tap(() => console.info('shared: ', quote, contactData)), + tap(() => this.isLoading$$.next(false)), + tap(() => this.toastrService.success('Quote has been successfully shared.')), + catchError((err: any) => { + this.isLoading$$.next(false); + + return throwError(err); + }), + ); + } + + delete(id: string): Observable { + this.isLoading$$.next(true); + + return this.quotesApi.delete(id).pipe( + tap(() => this.isLoading$$.next(false)), + tap(() => this.toastrService.success('Quote successfully removed.')), + catchError((err: any) => { + this.isLoading$$.next(false); + + return throwError(err); + }), + ); + } + + private emitQuote(quote: Quote): void { + this.quote$$.next({ ...quote }); + } + +} diff --git a/apps/quotes/src/app/shared/components/burger-button/burger-button.component.html b/apps/quotes/src/app/shared/components/burger-button/burger-button.component.html new file mode 100644 index 0000000..565ae19 --- /dev/null +++ b/apps/quotes/src/app/shared/components/burger-button/burger-button.component.html @@ -0,0 +1 @@ + diff --git a/apps/quotes/src/app/shared/components/burger-button/burger-button.component.scss b/apps/quotes/src/app/shared/components/burger-button/burger-button.component.scss new file mode 100644 index 0000000..2932f8b --- /dev/null +++ b/apps/quotes/src/app/shared/components/burger-button/burger-button.component.scss @@ -0,0 +1,23 @@ +@import '~scss/variables.scss'; + +button { + background: transparent; + border: 2px solid $color__white; + border-left: 0; + border-right: 0; + cursor: pointer; + font-size: 0; + height: 24px; + position: relative; + width: 32px; + + &:after { + background: $color__white; + content: ''; + height: 2px; + left: 0; + position: absolute; + top: 50%; + width: 100%; + } +} diff --git a/apps/quotes/src/app/shared/components/burger-button/burger-button.component.spec.ts b/apps/quotes/src/app/shared/components/burger-button/burger-button.component.spec.ts new file mode 100644 index 0000000..ada6276 --- /dev/null +++ b/apps/quotes/src/app/shared/components/burger-button/burger-button.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { BurgerButtonComponent } from './burger-button.component'; + +describe('BurgerButtonComponent', () => { + let component: BurgerButtonComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ BurgerButtonComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BurgerButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/shared/components/burger-button/burger-button.component.ts b/apps/quotes/src/app/shared/components/burger-button/burger-button.component.ts new file mode 100644 index 0000000..aaf774b --- /dev/null +++ b/apps/quotes/src/app/shared/components/burger-button/burger-button.component.ts @@ -0,0 +1,15 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angular/core'; + +@Component({ + selector: 'app-burger-button', + templateUrl: './burger-button.component.html', + styleUrls: [ './burger-button.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class BurgerButtonComponent { + @Output() clicked = new EventEmitter(); + + onClick(): void { + this.clicked.emit(); + } +} diff --git a/apps/quotes/src/app/shared/components/button/button.component.html b/apps/quotes/src/app/shared/components/button/button.component.html new file mode 100644 index 0000000..40df308 --- /dev/null +++ b/apps/quotes/src/app/shared/components/button/button.component.html @@ -0,0 +1,9 @@ + diff --git a/apps/quotes/src/app/shared/components/button/button.component.scss b/apps/quotes/src/app/shared/components/button/button.component.scss new file mode 100644 index 0000000..86d5fa0 --- /dev/null +++ b/apps/quotes/src/app/shared/components/button/button.component.scss @@ -0,0 +1,37 @@ +@import '~scss/variables'; + +.app-button { + padding: 10px 20px; + font-size: 14px; + background: $color__blue_light_dark; + border-radius: 18px; + color: #fff; + font-weight: bold; + + &.cancel-btn { + background: none; + color: $color__blue_light_dark; + border-radius: 0; + border-bottom: 2px solid transparent; + padding: 5px 0; + + &:hover { + color: $color__blue_dark; + border-bottom: 2px solid $color__blue_dark; + background: none; + } + } + + &:hover { + background: $color__blue_dark; + } + + &:nth-child(2) { + margin-left: 15px; + } + + &:disabled { + background-color: $color__disabled; + cursor: not-allowed; + } +} diff --git a/apps/quotes/src/app/shared/components/button/button.component.spec.ts b/apps/quotes/src/app/shared/components/button/button.component.spec.ts new file mode 100644 index 0000000..4d39ec4 --- /dev/null +++ b/apps/quotes/src/app/shared/components/button/button.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { ButtonComponent } from './button.component'; + +describe('ButtonComponent', () => { + let component: ButtonComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ ButtonComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/shared/components/button/button.component.ts b/apps/quotes/src/app/shared/components/button/button.component.ts new file mode 100644 index 0000000..fa0ae79 --- /dev/null +++ b/apps/quotes/src/app/shared/components/button/button.component.ts @@ -0,0 +1,21 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; + +@Component({ + selector: 'app-button', + templateUrl: './button.component.html', + styleUrls: [ './button.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ButtonComponent { + @Input() label: string; + @Input() type = 'button'; + @Input() disabled?: boolean; + @Input() class?: string; + + @Output() clicked = new EventEmitter(); + + onClick(event: MouseEvent | KeyboardEvent): void { + this.clicked.next(event); + } + +} diff --git a/apps/quotes/src/app/shared/components/index.ts b/apps/quotes/src/app/shared/components/index.ts new file mode 100644 index 0000000..12076e1 --- /dev/null +++ b/apps/quotes/src/app/shared/components/index.ts @@ -0,0 +1,8 @@ +export * from './table/table.component'; +export * from './button/button.component'; +export * from './input/input.component'; +export * from './text-area/text-area.component'; +export * from './loader/loader.component'; +export * from './quote-edit-form/quote-edit-form.component'; +export * from './quote-tag/quote-tag.component'; +export * from './burger-button/burger-button.component'; diff --git a/apps/quotes/src/app/shared/components/input/input.component.html b/apps/quotes/src/app/shared/components/input/input.component.html new file mode 100644 index 0000000..9f528af --- /dev/null +++ b/apps/quotes/src/app/shared/components/input/input.component.html @@ -0,0 +1,19 @@ + + + diff --git a/apps/quotes/src/app/shared/components/input/input.component.scss b/apps/quotes/src/app/shared/components/input/input.component.scss new file mode 100644 index 0000000..e1f26d3 --- /dev/null +++ b/apps/quotes/src/app/shared/components/input/input.component.scss @@ -0,0 +1,44 @@ +@import '~scss/variables'; + +.app-input { + width: 100%; + border: $border__size solid $color__blue_light_dark; + border-radius: $border__radius; + padding: 10px 20px; + margin-bottom: 20px; + + &:focus { + border-color: $color__blue_dark; + } + + &.invalid { + border-color: $color__error; + } +} + +.label-text { + font-weight: bold; + color: $color__white; + font-size: 16px; +} + +label { + position: relative; + + .clear-button { + position: absolute; + right: 10px; + top: 50%; + display: flex; + justify-content: center; + align-items: center; + transform: translateY(-50%); + padding: 5px; + background: $color__blue; + color: $color__white; + border: 2px solid $color__blue_light_dark; + border-radius: 50%; + width: 25px; + height: 25px; + } +} diff --git a/apps/quotes/src/app/shared/components/input/input.component.spec.ts b/apps/quotes/src/app/shared/components/input/input.component.spec.ts new file mode 100644 index 0000000..580e2e9 --- /dev/null +++ b/apps/quotes/src/app/shared/components/input/input.component.spec.ts @@ -0,0 +1,35 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; + +import { InputComponent } from './input.component'; + +describe('InputComponent', () => { + let component: InputComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + ReactiveFormsModule, + ], + declarations: [ + InputComponent, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(InputComponent); + component = fixture.componentInstance; + component.id = 'text'; + component.form = new FormBuilder().group({ + text: '', + }); + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/shared/components/input/input.component.ts b/apps/quotes/src/app/shared/components/input/input.component.ts new file mode 100644 index 0000000..355fd5d --- /dev/null +++ b/apps/quotes/src/app/shared/components/input/input.component.ts @@ -0,0 +1,29 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { FormControl, FormGroup } from '@angular/forms'; + +@Component({ + selector: 'app-input', + templateUrl: './input.component.html', + styleUrls: [ './input.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InputComponent implements OnInit { + @Output() clear = new EventEmitter(); + + @Input() placeholder = ''; + @Input() label = ''; + @Input() hasClearButton = false; + @Input() form: FormGroup; + @Input() type: string; + @Input() id: string; + + control: FormControl; + + ngOnInit(): void { + this.control = this.form.get(this.id) as FormControl; + } + + clearButtonClicked(): void { + this.clear.emit(this.id); + } +} diff --git a/apps/quotes/src/app/shared/components/loader/loader.component.html b/apps/quotes/src/app/shared/components/loader/loader.component.html new file mode 100644 index 0000000..ed6356f --- /dev/null +++ b/apps/quotes/src/app/shared/components/loader/loader.component.html @@ -0,0 +1,13 @@ +
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/quotes/src/app/shared/components/loader/loader.component.scss b/apps/quotes/src/app/shared/components/loader/loader.component.scss new file mode 100644 index 0000000..f8364b3 --- /dev/null +++ b/apps/quotes/src/app/shared/components/loader/loader.component.scss @@ -0,0 +1,90 @@ +:host { + width: 100%; + height: 100%; +} + +.loader-wrapper { + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.lds-grid { + display: inline-block; + position: relative; + width: 80px; + height: 80px; +} + +.lds-grid div { + position: absolute; + width: 16px; + height: 16px; + border-radius: 50%; + background: #fff; + animation: lds-grid 1.2s linear infinite; +} + +.lds-grid div:nth-child(1) { + top: 8px; + left: 8px; + animation-delay: 0s; +} + +.lds-grid div:nth-child(2) { + top: 8px; + left: 32px; + animation-delay: -0.4s; +} + +.lds-grid div:nth-child(3) { + top: 8px; + left: 56px; + animation-delay: -0.8s; +} + +.lds-grid div:nth-child(4) { + top: 32px; + left: 8px; + animation-delay: -0.4s; +} + +.lds-grid div:nth-child(5) { + top: 32px; + left: 32px; + animation-delay: -0.8s; +} + +.lds-grid div:nth-child(6) { + top: 32px; + left: 56px; + animation-delay: -1.2s; +} + +.lds-grid div:nth-child(7) { + top: 56px; + left: 8px; + animation-delay: -0.8s; +} + +.lds-grid div:nth-child(8) { + top: 56px; + left: 32px; + animation-delay: -1.2s; +} + +.lds-grid div:nth-child(9) { + top: 56px; + left: 56px; + animation-delay: -1.6s; +} + +@keyframes lds-grid { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} diff --git a/apps/quotes/src/app/shared/components/loader/loader.component.spec.ts b/apps/quotes/src/app/shared/components/loader/loader.component.spec.ts new file mode 100644 index 0000000..b811099 --- /dev/null +++ b/apps/quotes/src/app/shared/components/loader/loader.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { LoaderComponent } from './loader.component'; + +describe('LoaderComponent', () => { + let component: LoaderComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ LoaderComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/shared/components/loader/loader.component.ts b/apps/quotes/src/app/shared/components/loader/loader.component.ts new file mode 100644 index 0000000..9a268af --- /dev/null +++ b/apps/quotes/src/app/shared/components/loader/loader.component.ts @@ -0,0 +1,10 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'app-loader', + templateUrl: './loader.component.html', + styleUrls: [ './loader.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class LoaderComponent { +} diff --git a/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.html b/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.html new file mode 100644 index 0000000..ad9a77d --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.html @@ -0,0 +1,35 @@ +
+ + + + + + + + + + + + + +
diff --git a/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.scss b/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.scss new file mode 100644 index 0000000..1af174d --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.scss @@ -0,0 +1,28 @@ +@import '~scss/variables'; + +:host { + width: 100%; + display: flex; + padding: 20px; +} + +app-quote-tag { + display: block; + margin-bottom: 20px; +} + +.edit-form { + max-width: 400px; + width: 100%; + padding: 20px; + margin: auto; + + border: $border__size solid #fff; + border-radius: $border__radius; +} + +.label-text { + font-weight: bold; + color: $color__white; + font-size: 16px; +} diff --git a/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.spec.ts b/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.spec.ts new file mode 100644 index 0000000..326d538 --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.spec.ts @@ -0,0 +1,87 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; + +import { Quote } from '../../../models'; +import { ButtonComponent, InputComponent, QuoteTagComponent, TextAreaComponent } from '../../../shared/components'; +import { QuoteEditFormComponent } from './quote-edit-form.component'; + +describe('QuoteEditFormComponent', () => { + let component: QuoteEditFormComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule, + ReactiveFormsModule, + ], + declarations: [ + QuoteEditFormComponent, + ButtonComponent, + InputComponent, + TextAreaComponent, + QuoteTagComponent, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QuoteEditFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('onSubmit', () => { + it('should emit form value', () => { + const spy = spyOn(component.submitted, 'emit'); + + component.initialData = { + author: 'Author', + text: 'Text', + source: 'Source', + tags: '', + } as Quote; + component.ngOnInit(); + component.editQuoteForm.get('text').setValue('Modified text through form'); + component.quoteTags.form = new FormBuilder().group({ + tag1: 'value1', + tag2: 'value2', + }); + component.onSubmit(); + + const expectedResult = { + author: 'Author', + text: 'Modified text through form', + source: 'Source', + tags: 'value1, value2', + }; + + expect(spy).toHaveBeenCalledWith(expectedResult); + }); + + it('should not emit nothing if form is invalid', () => { + const spy = spyOn(component.submitted, 'emit'); + + component.initialData = { + author: 'Author', + text: '', + source: 'Source', + tags: '', + } as Quote; + component.ngOnInit(); + component.quoteTags.form = new FormBuilder().group({ + tag1: 'value1', + tag2: 'value2', + }); + component.onSubmit(); + + expect(spy).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.ts b/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.ts new file mode 100644 index 0000000..d55c752 --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-edit-form/quote-edit-form.component.ts @@ -0,0 +1,51 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; + +import { Quote } from '../../../models'; +import { QuoteTagComponent } from '../quote-tag/quote-tag.component'; + +@Component({ + selector: 'app-quote-edit-form', + templateUrl: './quote-edit-form.component.html', + styleUrls: [ './quote-edit-form.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class QuoteEditFormComponent implements OnInit { + @ViewChild('quoteTags', { static: false }) quoteTags: QuoteTagComponent; + @Output() submitted = new EventEmitter(); + + @Input() initialData: Quote = { + author: '', + text: '', + source: '', + tags: '', + } as Quote; + + editQuoteForm: FormGroup; + + constructor( + private fb: FormBuilder, + ) { + } + + ngOnInit(): void { + this.editQuoteForm = this.fb.group({ + [ 'author' ]: new FormControl(this.initialData.author, [ Validators.required ]), + [ 'text' ]: new FormControl(this.initialData.text, [ Validators.required ]), + [ 'source' ]: new FormControl(this.initialData.source, [ Validators.required ]), + }); + } + + onSubmit(): void { + if (this.editQuoteForm.invalid) { + return; + } + + this.submitted.emit({ + ...this.initialData, + ...this.editQuoteForm.value, + tags: this.quoteTags.getValue, + }); + } + +} diff --git a/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.html b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.html new file mode 100644 index 0000000..3d01dc8 --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.html @@ -0,0 +1,19 @@ +Tags +
+ + + + + + + +
diff --git a/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.scss b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.scss new file mode 100644 index 0000000..8f58424 --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.scss @@ -0,0 +1,7 @@ +@import '~scss/variables'; + +.label-text { + font-weight: bold; + color: $color__white; + font-size: 16px; +} diff --git a/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.spec.ts b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.spec.ts new file mode 100644 index 0000000..05f6a22 --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.spec.ts @@ -0,0 +1,78 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; + +import { ButtonComponent, InputComponent } from '..'; +import { QuoteTagComponent } from './quote-tag.component'; + +describe('QuoteTagComponent', () => { + let component: QuoteTagComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + ReactiveFormsModule, + ], + declarations: [ + QuoteTagComponent, + ButtonComponent, + InputComponent, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QuoteTagComponent); + component = fixture.componentInstance; + component.initialData = 'some, test, data'; + + fixture.detectChanges(); + + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('getValue', () => { + it('should return formatted value', () => { + expect(component.getValue).toBe('some, test, data'); + }); + }); + + describe('addTag', () => { + it('should add empty tag control to the form', () => { + const pushSpy = spyOn(component.tags, 'push'); + + component.addTag(); + + expect(pushSpy).toHaveBeenCalled(); + }); + }); + + describe('deleteTagById', () => { + it('should delete tag from the form by id', () => { + component.form = new FormBuilder().group({ + tag1: 'first', + tag2: 'second', + tag3: 'third', + }); + component.tags = [ + { id: 'tag1', value: 'first' }, + { id: 'tag2', value: 'second' }, + { id: 'tag3', value: 'third' }, + ]; + const expectedResult = [ + { id: 'tag1', value: 'first' }, + { id: 'tag3', value: 'third' }, + ]; + + component.deleteTagById('tag2'); + expect(component.tags).toEqual(expectedResult); + + component.deleteTagById('tag5'); + expect(component.tags).toEqual(expectedResult); + }); + }); +}); diff --git a/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.ts b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.ts new file mode 100644 index 0000000..d359998 --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.component.ts @@ -0,0 +1,56 @@ +import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; + +import { QuoteTag } from './quote-tag.models'; +import { generateUniqueId, getFormattedTagsFromFormValue, getTagsArrayFromTagsData } from './quote-tag.models-rules'; + +@Component({ + selector: 'app-quote-tag', + templateUrl: './quote-tag.component.html', + styleUrls: [ './quote-tag.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class QuoteTagComponent implements OnInit { + @Input() initialData: string | string[]; + + form: FormGroup; + tags: QuoteTag[] = []; + + get getValue() { + return getFormattedTagsFromFormValue(this.form); + } + + constructor( + private fb: FormBuilder, + ) { } + + ngOnInit(): void { + this.tags = getTagsArrayFromTagsData(this.initialData); + + this.form = this.fb.group({}); + + this.tags.forEach((tag: QuoteTag) => { + this.form.addControl(tag.id, new FormControl(tag.value)); + }); + } + + addTag(): void { + const uniqueId = generateUniqueId(); + this.form.addControl(uniqueId, new FormControl('')); + + this.tags.push({ + id: uniqueId, + value: '', + }); + } + + deleteTagById(id: string): void { + const index = this.tags.findIndex((tag: QuoteTag) => tag.id === id); + + if (index !== -1) { + this.tags.splice(index, 1); + this.form.removeControl(id); + } + } + +} diff --git a/apps/quotes/src/app/shared/components/quote-tag/quote-tag.models-rules.spec.ts b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.models-rules.spec.ts new file mode 100644 index 0000000..5f643e2 --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.models-rules.spec.ts @@ -0,0 +1,31 @@ +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; + +import { getFormattedTagsFromFormValue } from './quote-tag.models-rules'; + +describe('quote-tag models rules', () => { + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ ReactiveFormsModule ], + }) + .compileComponents(); + })); + + describe('getFormattedTagsFromFormValue', () => { + it('should return formatted string value from tag form', () => { + const form = new FormBuilder().group({ + control1: 'tag1', + control2: 'tag2', + control3: 'tag3', + control4: 'tag4', + }); + + const expectedResult1 = 'tag1, tag2, tag3, tag4'; + const expectedResult2 = 'tag1. tag2. tag3. tag4'; + + expect(getFormattedTagsFromFormValue(form)).toBe(expectedResult1); + expect(getFormattedTagsFromFormValue(form, '. ')).toBe(expectedResult2); + + }); + }); +}); diff --git a/apps/quotes/src/app/shared/components/quote-tag/quote-tag.models-rules.ts b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.models-rules.ts new file mode 100644 index 0000000..478f2b6 --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.models-rules.ts @@ -0,0 +1,25 @@ +import { FormGroup } from '@angular/forms'; + +import * as uuid from 'uuid'; + +import { QuoteTag } from './quote-tag.models'; + +export function generateUniqueId(): string { + return uuid.v4(); +} + +export function getTagsArrayFromTagsData(tags: string | string[], separator: string = ', '): QuoteTag[] { + const tagsArray = typeof tags === 'string' ? tags.split(separator) : tags; + + return tagsArray.map((tag: string) => ({ + id: generateUniqueId(), + value: tag, + })); +} + +export function getFormattedTagsFromFormValue(tagForm: FormGroup, separator: string = ', '): string { + return Object.entries(tagForm.value) + .filter(([ _, value ]) => !!value) + .map(([ _, value ]) => (value as string).replace(/,/g, '')) + .join(separator); +} diff --git a/apps/quotes/src/app/shared/components/quote-tag/quote-tag.models.ts b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.models.ts new file mode 100644 index 0000000..b0ff55d --- /dev/null +++ b/apps/quotes/src/app/shared/components/quote-tag/quote-tag.models.ts @@ -0,0 +1,4 @@ +export interface QuoteTag { + id: string; + value: string; +} diff --git a/apps/quotes/src/app/shared/components/table/table.component.html b/apps/quotes/src/app/shared/components/table/table.component.html new file mode 100644 index 0000000..d23d47c --- /dev/null +++ b/apps/quotes/src/app/shared/components/table/table.component.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + +
{{ column.label }}
+ {{ value }} + + + +
+ No data found. +
+ + + + diff --git a/apps/quotes/src/app/shared/components/table/table.component.scss b/apps/quotes/src/app/shared/components/table/table.component.scss new file mode 100644 index 0000000..201703f --- /dev/null +++ b/apps/quotes/src/app/shared/components/table/table.component.scss @@ -0,0 +1,21 @@ +@import '~scss/variables.scss'; + +table { + border-collapse: collapse; + + th { + text-align: left; + font-family: $font__primary; + color: $color__white; + font-size: 16px; + } + + th, td { + border: 2px solid $color__white; + padding: 10px; + } + + .no-data-tr { + color: $color__white; + } +} diff --git a/apps/quotes/src/app/shared/components/table/table.component.spec.ts b/apps/quotes/src/app/shared/components/table/table.component.spec.ts new file mode 100644 index 0000000..54fd620 --- /dev/null +++ b/apps/quotes/src/app/shared/components/table/table.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { TableComponent } from './table.component'; + +describe('TableComponent', () => { + let component: TableComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ TableComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/shared/components/table/table.component.ts b/apps/quotes/src/app/shared/components/table/table.component.ts new file mode 100644 index 0000000..60f9ec6 --- /dev/null +++ b/apps/quotes/src/app/shared/components/table/table.component.ts @@ -0,0 +1,31 @@ +import { ChangeDetectionStrategy, Component, ContentChildren, Input, QueryList } from '@angular/core'; + +import { environment } from '../../../../environments/environment'; +import { TemplateDirective } from '../../directives'; +import { TableDataSource, TableHeadColumns } from './table.models'; + +@Component({ + selector: 'app-table', + templateUrl: './table.component.html', + styleUrls: [ './table.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class TableComponent { + @ContentChildren(TemplateDirective) set contentChildren(queryList: QueryList) { + if (!queryList.length) { + return; + } + + this.templateRefList = queryList.toArray().reduce( + (buf: any, templateDirective: TemplateDirective) => ({ + ...buf, + [ templateDirective.name ]: templateDirective.template, + }), {}); + } + templateRefList: any; + + @Input() tableData: TableDataSource[] = []; + @Input() columns: TableHeadColumns[] = []; + + isApiProvided = environment.apiUrls.quote; +} diff --git a/apps/quotes/src/app/shared/components/table/table.models.ts b/apps/quotes/src/app/shared/components/table/table.models.ts new file mode 100644 index 0000000..99f2cb1 --- /dev/null +++ b/apps/quotes/src/app/shared/components/table/table.models.ts @@ -0,0 +1,12 @@ +export type TableBodyColumnValue = { + value: any; +} + +export interface TableHeadColumns { + label: string; + key: string; +} + +export interface TableDataSource { + [ key: string ]: TableBodyColumnValue; +} diff --git a/apps/quotes/src/app/shared/components/text-area/text-area.component.html b/apps/quotes/src/app/shared/components/text-area/text-area.component.html new file mode 100644 index 0000000..be08a5f --- /dev/null +++ b/apps/quotes/src/app/shared/components/text-area/text-area.component.html @@ -0,0 +1,11 @@ + + + diff --git a/apps/quotes/src/app/shared/components/text-area/text-area.component.scss b/apps/quotes/src/app/shared/components/text-area/text-area.component.scss new file mode 100644 index 0000000..225c5a6 --- /dev/null +++ b/apps/quotes/src/app/shared/components/text-area/text-area.component.scss @@ -0,0 +1,25 @@ +@import '~scss/variables'; + +.app-text-area { + width: 100%; + font-family: $font, $font__primary, $font__fallback; + resize: vertical; + border: 2px solid $color__blue_light_dark; + border-radius: 10px; + padding: 10px 20px; + margin-bottom: 20px; + + &:focus { + border-color: $color__blue_dark; + } + + &.invalid { + border-color: $color__error; + } +} + +.label-text { + font-weight: bold; + color: $color__white; + font-size: 16px; +} diff --git a/apps/quotes/src/app/shared/components/text-area/text-area.component.spec.ts b/apps/quotes/src/app/shared/components/text-area/text-area.component.spec.ts new file mode 100644 index 0000000..75003dc --- /dev/null +++ b/apps/quotes/src/app/shared/components/text-area/text-area.component.spec.ts @@ -0,0 +1,34 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; + +import { TextAreaComponent } from './text-area.component'; + +describe('TextAreaComponent', () => { + let component: TextAreaComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ ReactiveFormsModule ], + declarations: [ TextAreaComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TextAreaComponent); + component = fixture.componentInstance; + + component.id = 'text'; + component.form = new FormBuilder().group({ + text: '', + }); + + fixture.detectChanges(); + + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/quotes/src/app/shared/components/text-area/text-area.component.ts b/apps/quotes/src/app/shared/components/text-area/text-area.component.ts new file mode 100644 index 0000000..a511861 --- /dev/null +++ b/apps/quotes/src/app/shared/components/text-area/text-area.component.ts @@ -0,0 +1,21 @@ +import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { FormControl, FormGroup } from '@angular/forms'; + +@Component({ + selector: 'app-text-area', + templateUrl: './text-area.component.html', + styleUrls: [ './text-area.component.scss' ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class TextAreaComponent implements OnInit { + @Input() placeholder = ''; + @Input() label = ''; + @Input() form: FormGroup; + @Input() id: string; + + control: FormControl; + + ngOnInit() { + this.control = this.form.get(this.id) as FormControl; + } +} diff --git a/apps/quotes/src/app/shared/directives/index.ts b/apps/quotes/src/app/shared/directives/index.ts new file mode 100644 index 0000000..d7fc616 --- /dev/null +++ b/apps/quotes/src/app/shared/directives/index.ts @@ -0,0 +1 @@ +export * from './template.directive'; diff --git a/apps/quotes/src/app/shared/directives/template.directive.ts b/apps/quotes/src/app/shared/directives/template.directive.ts new file mode 100644 index 0000000..3be646a --- /dev/null +++ b/apps/quotes/src/app/shared/directives/template.directive.ts @@ -0,0 +1,13 @@ +import { Directive, Input, TemplateRef } from '@angular/core'; + +@Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector + selector: 'ng-template[name]', +}) +export class TemplateDirective { + @Input() name: string; + + constructor( + public template: TemplateRef, + ) { } +} diff --git a/apps/quotes/src/app/shared/shared.module.ts b/apps/quotes/src/app/shared/shared.module.ts new file mode 100644 index 0000000..3de7959 --- /dev/null +++ b/apps/quotes/src/app/shared/shared.module.ts @@ -0,0 +1,50 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + +import { + BurgerButtonComponent, + ButtonComponent, + InputComponent, + LoaderComponent, + QuoteEditFormComponent, + QuoteTagComponent, + TableComponent, + TextAreaComponent } from './components'; +import { TemplateDirective } from './directives'; + +const COMPONENTS = [ + TableComponent, + ButtonComponent, + InputComponent, + TextAreaComponent, + LoaderComponent, + QuoteEditFormComponent, + QuoteTagComponent, + BurgerButtonComponent, +]; + +const DIRECTIVES = [ + TemplateDirective, +]; + +@NgModule({ + declarations: [ + ...COMPONENTS, + ...DIRECTIVES, + ], + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + ], + exports: [ + ...COMPONENTS, + ...DIRECTIVES, + + FormsModule, + ReactiveFormsModule, + ], + schemas: [ CUSTOM_ELEMENTS_SCHEMA ], +}) +export class SharedModule { } diff --git a/apps/quotes/src/app/stub/index.ts b/apps/quotes/src/app/stub/index.ts new file mode 100644 index 0000000..b527ed4 --- /dev/null +++ b/apps/quotes/src/app/stub/index.ts @@ -0,0 +1,2 @@ +export * from './ngx-smart-modal-service.mock'; +export * from './toastr-service.mock'; diff --git a/apps/quotes/src/app/stub/local-storage.mock.ts b/apps/quotes/src/app/stub/local-storage.mock.ts new file mode 100644 index 0000000..e073751 --- /dev/null +++ b/apps/quotes/src/app/stub/local-storage.mock.ts @@ -0,0 +1,15 @@ +export function mockLocalStorage() { + let store = {}; + + return { + getItem: function(key: string) { + return store[ key ]; + }, + setItem: function(key: string, value: any) { + store[ key ] = value.toString(); + }, + clear: function() { + store = {}; + }, + }; +} diff --git a/apps/quotes/src/app/stub/ngx-smart-modal-service.mock.ts b/apps/quotes/src/app/stub/ngx-smart-modal-service.mock.ts new file mode 100644 index 0000000..7ae28ac --- /dev/null +++ b/apps/quotes/src/app/stub/ngx-smart-modal-service.mock.ts @@ -0,0 +1,94 @@ +import { NgxSmartModalService } from 'ngx-smart-modal'; +import { of } from 'rxjs'; + +export class MockNgxSmartModalService { + create() { + return { + setData(data: any) { + return { + open() { + return { + onClose: of({}), + onDataAdded: of(data), + onCloseFinished: of({}), + onDismissFinished: of({}), + }; + }, + }; + }, + }; + } + + getModal(id: any) { + return { + open: function () { + return; + }, + close: function () { + return; + }, + isVisible: function () { + return; + }, + onOpen: of({}), + onAnyCloseEvent: of({}), + onAnyCloseEventFinished: of({}), + }; + } + + get(id: any) { + return { + open: function () { + return; + }, + close: function () { + return; + }, + isVisible: function () { + return; + }, + getData: function() { + return {}; + }, + setData: function() { + return; + }, + onOpen: of({}), + onAnyCloseEvent: of({ + removeData() { + return; + }, + }), + onAnyCloseEventFinished: of({ + removeData() { + return; + }, + }), + }; + } + + setModalData() { + return; + } + + open() { + return; + } + + getModalStackCount() { + return; + } + + addModal() { + return; + } + + removeModal() { + return; + } +} + +export const mockNgxSmartModalService = { + provide: NgxSmartModalService, + useClass: MockNgxSmartModalService, +}; diff --git a/apps/quotes/src/app/stub/toastr-service.mock.ts b/apps/quotes/src/app/stub/toastr-service.mock.ts new file mode 100644 index 0000000..7483972 --- /dev/null +++ b/apps/quotes/src/app/stub/toastr-service.mock.ts @@ -0,0 +1,21 @@ +import { IndividualConfig, ToastrService } from 'ngx-toastr'; + +const toastrService = { + success: ( + message?: string, + title?: string, + override?: Partial, + ) => { + }, + error: ( + message?: string, + title?: string, + override?: Partial, + ) => { + }, +}; + +export const mockToastrServiceProvider = { + provide: ToastrService, + useValue: toastrService, +}; diff --git a/apps/quotes/src/assets/fonts/LICENSE.txt b/apps/quotes/src/assets/fonts/LICENSE.txt new file mode 100644 index 0000000..ca6523d --- /dev/null +++ b/apps/quotes/src/assets/fonts/LICENSE.txt @@ -0,0 +1,39 @@ +Font license info + + +## Entypo + + Copyright (C) 2012 by Daniel Bruce + + Author: Daniel Buce + License: SIL (http://scripts.sil.org/OFL) + Homepage: http://www.entypo.com + + +## Iconic + + Copyright (C) 2012 by P.J. Onori + + Author: P.J. Onori + License: SIL (http://scripts.sil.org/OFL) + Homepage: http://somerandomdude.com/work/iconic/ + + +## Web Symbols + + Copyright (c) 2011 by Just Be Nice studio. All rights reserved. + + Author: Just Be Nice studio + License: SIL (http://scripts.sil.org/OFL) + Homepage: http://www.justbenicestudio.com/studio/websymbols/ + + +## Typicons + + (c) Stephen Hutchings 2012 + + Author: Stephen Hutchings + License: CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/) + Homepage: http://typicons.com/ + + diff --git a/apps/quotes/src/assets/fonts/icons.eot b/apps/quotes/src/assets/fonts/icons.eot new file mode 100644 index 0000000..f110df4 Binary files /dev/null and b/apps/quotes/src/assets/fonts/icons.eot differ diff --git a/apps/quotes/src/assets/fonts/icons.svg b/apps/quotes/src/assets/fonts/icons.svg new file mode 100644 index 0000000..4779842 --- /dev/null +++ b/apps/quotes/src/assets/fonts/icons.svg @@ -0,0 +1,79 @@ + + + + +Created by FontForge 20100429 at Wed Jul 25 09:32:13 2012 + By root +Copyright (C) 2012 by original authors @ fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/quotes/src/assets/fonts/icons.ttf b/apps/quotes/src/assets/fonts/icons.ttf new file mode 100644 index 0000000..7ffe6cc Binary files /dev/null and b/apps/quotes/src/assets/fonts/icons.ttf differ diff --git a/apps/quotes/src/assets/fonts/icons.woff b/apps/quotes/src/assets/fonts/icons.woff new file mode 100644 index 0000000..c2c6494 Binary files /dev/null and b/apps/quotes/src/assets/fonts/icons.woff differ diff --git a/apps/quotes/src/assets/static/refresh.svg b/apps/quotes/src/assets/static/refresh.svg new file mode 100644 index 0000000..72fd377 --- /dev/null +++ b/apps/quotes/src/assets/static/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/quotes/src/assets/static/share.svg b/apps/quotes/src/assets/static/share.svg new file mode 100644 index 0000000..82cb767 --- /dev/null +++ b/apps/quotes/src/assets/static/share.svg @@ -0,0 +1 @@ + diff --git a/apps/quotes/src/environments/environment.prod.ts b/apps/quotes/src/environments/environment.prod.ts index c966979..d0081e8 100644 --- a/apps/quotes/src/environments/environment.prod.ts +++ b/apps/quotes/src/environments/environment.prod.ts @@ -1,3 +1,9 @@ export const environment = { production: true, + isAuthorizationEnabled: false, + apiUrls: { + quote: '/api', + auth: '', + share: '', + }, }; diff --git a/apps/quotes/src/environments/environment.test.ts b/apps/quotes/src/environments/environment.test.ts new file mode 100644 index 0000000..c082ced --- /dev/null +++ b/apps/quotes/src/environments/environment.test.ts @@ -0,0 +1,9 @@ +export const environment = { + production: false, + isAuthorizationEnabled: false, + apiUrls: { + quote: 'https://ef1d2e47-7791-4fdf-9db1-4c7af31aee5d.mock.pstmn.io/api', + share: '', + auth: '', + }, +}; diff --git a/apps/quotes/src/environments/environment.ts b/apps/quotes/src/environments/environment.ts index 99c3763..8ba3f9f 100644 --- a/apps/quotes/src/environments/environment.ts +++ b/apps/quotes/src/environments/environment.ts @@ -4,6 +4,12 @@ export const environment = { production: false, + isAuthorizationEnabled: false, + apiUrls: { + auth: '', + quote: '/api', // Put here your QUOTE API BASE URL. E.g.: api or https://quote.com/api + share: '', // Put here your SHARE API BASE URL. E.g.: api or https://share.com/api + }, }; /* diff --git a/apps/quotes/src/favicon.ico b/apps/quotes/src/favicon.ico index 317ebcb..997406a 100644 Binary files a/apps/quotes/src/favicon.ico and b/apps/quotes/src/favicon.ico differ diff --git a/apps/quotes/src/index.html b/apps/quotes/src/index.html index 2f0239f..ca7d603 100644 --- a/apps/quotes/src/index.html +++ b/apps/quotes/src/index.html @@ -8,6 +8,6 @@ - + diff --git a/apps/quotes/src/main.ts b/apps/quotes/src/main.ts index d9a2e7e..fa4e0ae 100644 --- a/apps/quotes/src/main.ts +++ b/apps/quotes/src/main.ts @@ -10,4 +10,4 @@ if (environment.production) { platformBrowserDynamic() .bootstrapModule(AppModule) - .catch((err) => console.error(err)); + .catch(err => console.error(err)); diff --git a/apps/quotes/src/polyfills.ts b/apps/quotes/src/polyfills.ts index 5812bad..dc03a7e 100644 --- a/apps/quotes/src/polyfills.ts +++ b/apps/quotes/src/polyfills.ts @@ -18,9 +18,7 @@ * BROWSER POLYFILLS */ -/** - * IE11 requires the following for NgClass support on SVG elements - */ +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ // import 'classlist.js'; // Run `npm install --save classlist.js`. /** @@ -59,6 +57,7 @@ */ import 'zone.js/dist/zone'; // Included with Angular CLI. + /*************************************************************************************************** * APPLICATION IMPORTS */ diff --git a/apps/quotes/src/scss/base.scss b/apps/quotes/src/scss/base.scss new file mode 100644 index 0000000..de8dae8 --- /dev/null +++ b/apps/quotes/src/scss/base.scss @@ -0,0 +1,18 @@ +@import './reset'; +@import './fonts'; +@import './icons'; +@import './variables'; +@import './modal'; + +body { + font-family: $font, $font__primary, $font__fallback; + background-color: $color__blue; + display: flex; + min-width: 320px; + width: 100%; + line-height: 1; + font-size: $font__size; + -ms-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} diff --git a/apps/quotes/src/scss/fonts.scss b/apps/quotes/src/scss/fonts.scss new file mode 100644 index 0000000..e69de29 diff --git a/apps/quotes/src/scss/icons.scss b/apps/quotes/src/scss/icons.scss new file mode 100644 index 0000000..74ccc56 --- /dev/null +++ b/apps/quotes/src/scss/icons.scss @@ -0,0 +1,11 @@ +@font-face { + font-family: 'icons'; + src: url('/assets/fonts/icons.eot'); + src: + url('/assets/fonts/icons.eot?#iefix') format('embedded-opentype'), + url('/assets/fonts/icons.woff') format('woff'), + url('/assets/fonts/icons.ttf') format('truetype'), + url('/assets/fonts/icons.svg#icons') format('svg'); + font-weight: normal; + font-style: normal; +} diff --git a/apps/quotes/src/scss/mixins.scss b/apps/quotes/src/scss/mixins.scss new file mode 100644 index 0000000..f6e0c35 --- /dev/null +++ b/apps/quotes/src/scss/mixins.scss @@ -0,0 +1,31 @@ +@import './variables'; + +@mixin md { + @media (max-width: $breakpoint__md) { + @content; + } +} + +@mixin lg { + @media (max-width: $breakpoint__lg) { + @content; + } +} + +@mixin md_l { + @media (max-width: $breakpoint__md_l) { + @content; + } +} + +@mixin md_s { + @media (max-width: $breakpoint__md_s) { + @content; + } +} + +@mixin sm_l { + @media (max-width: $breakpoint__sm_l) { + @content; + } +} diff --git a/apps/quotes/src/scss/modal.scss b/apps/quotes/src/scss/modal.scss new file mode 100644 index 0000000..4595686 --- /dev/null +++ b/apps/quotes/src/scss/modal.scss @@ -0,0 +1,10 @@ +ngx-smart-modal { + .overlay { + display: flex; + } + + .nsm-dialog { + align-self: center; + min-height: unset; + } +} diff --git a/apps/quotes/src/scss/reset.scss b/apps/quotes/src/scss/reset.scss new file mode 100644 index 0000000..bd64390 --- /dev/null +++ b/apps/quotes/src/scss/reset.scss @@ -0,0 +1,66 @@ +* { + padding: 0; + margin: 0; + border: 0; +} + +*, *:before, *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +:focus, :active { + outline: none; +} + +a:focus, a:active { + outline: none; +} + +nav, footer, header, aside, section, main { + display: block; +} + +html, body { + height: 100%; + margin: 0; + padding: 0; + position: relative; + width: 100%; + color: #000; +} + +input::-ms-clear { + display: none; +} + +button { + cursor: pointer; +} + +button::-moz-focus-inner { + padding: 0; + border: 0; +} + +a, a:visited { + text-decoration: none; +} + +a:hover { + text-decoration: none; +} + +ul li { + list-style: none; +} + +img { + vertical-align: top; +} + +h1, h2, h3, h4, h5, h6 { + font-size: inherit; + font-weight: 400; +} diff --git a/apps/quotes/src/scss/variables.scss b/apps/quotes/src/scss/variables.scss new file mode 100644 index 0000000..f2722cb --- /dev/null +++ b/apps/quotes/src/scss/variables.scss @@ -0,0 +1,30 @@ +// typography +$font: Calibri; +$font__size: 16px; // 14px; +$font__fallback: sans-serif; +$font__primary: 'SourceSansPro', $font__fallback; +$font__icons: 'icons'; + +// colors +$color__black: #000000; +$color__white: #ffffff; +$color__blue: #8ccddd; +$color__blue_light_dark: #7cb6c4; +$color__blue_dark: #64929E; +$color__error: #ff7373; +$color__disabled: #94b2b9; +$color__light_gray: #c7e6ee; +//# + +$border__size: 2px; +$border__radius: 10px; + +$shadow: 0px 0px 8px 0px rgba(34, 60, 80, 0.2); + +// breakpoints +$breakpoint__sm: 320px; +$breakpoint__sm_l: 480px; // 500px +$breakpoint__md_s: 620px; +$breakpoint__md: 768px; +$breakpoint__md_l: 1080px; // 920px +$breakpoint__lg: 1280px; diff --git a/apps/quotes/src/styles.scss b/apps/quotes/src/styles.scss index 90d4ee0..105a6b3 100644 --- a/apps/quotes/src/styles.scss +++ b/apps/quotes/src/styles.scss @@ -1 +1,4 @@ /* You can add global styles to this file, and also import other style files */ + +@import '~scss/base'; +@import "~ngx-smart-modal/ngx-smart-modal"; diff --git a/apps/quotes/tsconfig.app.json b/apps/quotes/tsconfig.app.json index e9fa6df..560c540 100644 --- a/apps/quotes/tsconfig.app.json +++ b/apps/quotes/tsconfig.app.json @@ -1,8 +1,29 @@ { "extends": "./tsconfig.json", "compilerOptions": { + "baseUrl": "src", "outDir": "../../dist/out-tsc", - "types": [] + "types": [], + "sourceMap": true, + "declaration": false, + "esModuleInterop": true, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "es2020", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true }, "files": ["src/main.ts", "src/polyfills.ts"] } diff --git a/apps/quotes/tsconfig.spec.json b/apps/quotes/tsconfig.spec.json index cfff29a..0b8f99d 100644 --- a/apps/quotes/tsconfig.spec.json +++ b/apps/quotes/tsconfig.spec.json @@ -6,5 +6,5 @@ "types": ["jest", "node"] }, "files": ["src/test-setup.ts"], - "include": ["**/*.spec.ts", "**/*.d.ts"] + "include": ["**/*.spec.ts", "**/*.d.ts"], } diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..f2ffddd --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: [ '@commitlint/config-conventional' ], +}; diff --git a/libs/api-interfaces/src/lib/api-interfaces.ts b/libs/api-interfaces/src/lib/api-interfaces.ts index 0f1e936..0304b97 100644 --- a/libs/api-interfaces/src/lib/api-interfaces.ts +++ b/libs/api-interfaces/src/lib/api-interfaces.ts @@ -1,3 +1,2 @@ -export interface Message { - message: string; -} +export * from './quote'; +export * from './response'; diff --git a/libs/api-interfaces/src/lib/quote.ts b/libs/api-interfaces/src/lib/quote.ts new file mode 100644 index 0000000..4bbabb7 --- /dev/null +++ b/libs/api-interfaces/src/lib/quote.ts @@ -0,0 +1,11 @@ +export interface Quote { + id: string; + author: string; // TODO: relation o2m + text: string; + source?: string; + tags?: string[]; // TODO: relation m2m + isDeleted?: boolean; + createdBy?: string; // TODO: relation o2m + createdAt?: number; + updatedAt?: number; +} diff --git a/libs/api-interfaces/src/lib/response.ts b/libs/api-interfaces/src/lib/response.ts new file mode 100644 index 0000000..a07e5d1 --- /dev/null +++ b/libs/api-interfaces/src/lib/response.ts @@ -0,0 +1,6 @@ +export interface ApiResponseData { + message: string; + statusCode: number; + data?: T; + error?: E|Error|string|unknown; +} diff --git a/libs/buildspecs/buildspec-build.yml b/libs/buildspecs/buildspec-build.yml new file mode 100755 index 0000000..dfe5154 --- /dev/null +++ b/libs/buildspecs/buildspec-build.yml @@ -0,0 +1,65 @@ +version: 0.2 + +env: + variables: + BUILD_ENV: "production" + S3_BUCKET: "quote-app" + CLOUDFRONT_DIST_ID: "" + +phases: + install: + runtime-versions: + nodejs: 12.x + + commands: + # temporary fix of YARN cert issue + # TODO: clean it up... + - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - + - + # Update packages. + - apt-get update -y -q + + # Install @angular/cli and app dependencies. + - echo Installing source NPM dependencies... + - npm install -g @angular/cli + - npm install + + build: + commands: + # Build Angular application. + - echo Build started on `date` + - npm run build -- --configuration=${BUILD_ENV} + + + post_build: + commands: + - echo Application deployment is started on `date` + + - aws configure set preview.cloudfront true + + # Copy the maintenance page to S3 bucket: + - aws s3 cp maintenance/index.html s3://${S3_BUCKET}/index.html + # Invalidate CloudFront cache + - aws cloudfront create-invalidation --distribution-id ${CLOUDFRONT_DIST_ID} --paths "/index.html" + + # Clear S3 bucket: + - aws s3 rm s3://${S3_BUCKET} --recursive --exclude "index.html" + - echo S3 bucket is cleared. + + # Copy dist folder to S3 bucket: + - aws s3 cp dist s3://${S3_BUCKET} --recursive + + # Create CloudFront invalidation (which actually clears cache): + - aws cloudfront create-invalidation --distribution-id ${CLOUDFRONT_DIST_ID} --paths "/*" + + - echo Application deployment is successfully completed on `date` + +artifacts: + files: + - '**/*' + base-directory: 'dist*' + discard-paths: yes + +cache: + paths: + - '/**/*' diff --git a/libs/buildspecs/buildspec-e2e.yml b/libs/buildspecs/buildspec-e2e.yml new file mode 100644 index 0000000..ea9f76d --- /dev/null +++ b/libs/buildspecs/buildspec-e2e.yml @@ -0,0 +1,31 @@ +version: 0.2 + +env: + variables: + CLOUDFRONT_APP_URL: "" + +phases: + install: + runtime-versions: + nodejs: 12.x + + commands: + # Get Chrome Information. + - curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - + - echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list + + # Update packages. + - apt-get update -y -q + + # Install Chrome. + - apt-get -y install google-chrome-stable + + # Install @angular/cli and app dependencies. + - echo Installing source NPM dependencies... + - npm install -g @angular/cli + - npm install + + build: + commands: + # FINALLY: Run e2e tests. + - npm run e2e -- --configuration=production --base-url=${CLOUDFRONT_APP_URL} diff --git a/libs/buildspecs/buildspec-quality.yml b/libs/buildspecs/buildspec-quality.yml new file mode 100644 index 0000000..84dfc3c --- /dev/null +++ b/libs/buildspecs/buildspec-quality.yml @@ -0,0 +1,58 @@ +version: 0.2 + +#env: +# variables: +# GIT_BRANCH: develop +# CI_NAME: CodeBuild + # CODE_CLIMATE_REPORTER_ID: "" + # CODECOV_TOKEN: "" +# CODECOV_COVERAGE_REPORT_PATH: "coverage/lcov.info" + +phases: + install: + runtime-versions: + nodejs: 12.x + + commands: + # Get Chrome Information. + - curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - + - echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list + + # TODO: clean it up... + # temporary fix of YARN cert issue + - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - + + # Update packages. + - apt-get update -y -q + + # Install Chrome. + - apt-get -y install google-chrome-stable + + # Install @angular/cli and app dependencies. + - echo Installing source NPM dependencies... + - npm install -g @angular/cli + - npm install + + # Set up all necessary/required env variables and Install CodeClimate reporter. +# - export GIT_COMMIT_SHA="$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION)" +# - export GIT_COMMITTED_AT="$(date +%s)" +# - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter +# - chmod +x ./cc-test-reporter +# - ./cc-test-reporter before-build + + build: + commands: + # Run code quality tools. + - echo Running code quality checks... + - npm run lint + - npm run test:coverage + +# post_build: +# commands: + # Upload test coverage report to CodeCov and CodeClimate. +# - curl -s https://codecov.io/bash | bash -s - -t $(echo $CODECOV_TOKEN) -f ${CODECOV_COVERAGE_REPORT_PATH} +# - ./cc-test-reporter after-build -t lcov -r $(echo $CODE_CLIMATE_REPORTER_ID) --exit-code $? + +cache: + paths: + - '/**/*' diff --git a/libs/buildspecs/buildspec.pre-check.yml b/libs/buildspecs/buildspec.pre-check.yml new file mode 100755 index 0000000..987a748 --- /dev/null +++ b/libs/buildspecs/buildspec.pre-check.yml @@ -0,0 +1,39 @@ +version: 0.2 + +phases: + install: + runtime-versions: + nodejs: 12.x + + commands: + # Get Chrome Information. + - curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - + - echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list + + # temporary fix of YARN cert issue + # TODO: clean it up... + - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - + + # Update packages. + - apt-get update -y -q + + # Install Chrome. + - apt-get -y install google-chrome-stable + + # Install @angular/cli and app dependencies. + - echo Installing source NPM dependencies... + - npm install -g @angular/cli + - npm install + + pre_build: + commands: + # Run code quality tools. + - echo Running code quality checks... + - npm run lint + - npm run test:coverage + +artifacts: + files: + - '**/*' + base-directory: 'dist*' + discard-paths: yes diff --git a/libs/cf-templates/cf-cloudfront.yaml b/libs/cf-templates/cf-cloudfront.yaml new file mode 100755 index 0000000..cf2f9f1 --- /dev/null +++ b/libs/cf-templates/cf-cloudfront.yaml @@ -0,0 +1,177 @@ +AWSTemplateFormatVersion: '2010-09-09' + +Description: CloudFront Redirect to SSL, Custom DomainName, Edge Gzip, Angular Redirects, S3 origin bucket + +Parameters: + Environment: + Description: Environment + Type: String + Default: 'production' + AppName: + Description: Application name to concat with HostedZoneResourceUrl + Type: String + Default: 'quote' + S3BucketName: + Description: S3 bucket name + Type: String + Default: '' + AcmCertificateArn: + Description: The ARN of a certificate from AWS Certificate Manager (ACM) + Type: String + Default: '' + HostedZoneResourceUrl: + AllowedPattern: (([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.){1,}([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]){1,} + Description: 'Must be a valid DNS zone name WITHOUT trailing period' + Type: String + Default: 'alex-bondarenko.com' + WebACL: + Description: Restriction for access to CloudFrond. Empty line allow access from anywhere + Type: String + Default: '' + HSTSLambdaARN: + Description: The ARN of the Lambda function. You must specify the ARN of a function version; you can't specify a Lambda alias or $LATEST + Type: String + Default: '' + +Conditions: + HasAppName: !Not [ !Equals [ !Ref AppName, '' ] ] + HasS3BucketName: !Not [ !Equals [ !Ref S3BucketName, '' ] ] + HasWebACL: !Not [ !Equals [ !Ref WebACL, '' ] ] + HasHSTSLambdaARN: !Not [ !Equals [ !Ref HSTSLambdaARN, '' ] ] + HasAcmCertificateArn: !Not [ !Equals [ !Ref AcmCertificateArn, '' ] ] + +Resources: + AppBucket: + Type: AWS::S3::Bucket + DeletionPolicy: 'Delete' + Properties: + BucketName: !If [ HasS3BucketName, !Ref S3BucketName, !Ref 'AWS::StackName' ] + WebsiteConfiguration: + IndexDocument: index.html + + AppBucketPolicy: + Type: AWS::S3::BucketPolicy + Properties: + Bucket: !Ref AppBucket + PolicyDocument: + Id: WebAppBucketPolicy + Version: 2012-10-17 + Statement: + - Sid: 'AllowCloudFrontAccessIdentity' + Effect: Allow + Action: + - 's3:GetObject' + - 's3:ListBucket' + Resource: + - !Join [ '', [ 'arn:aws:s3:::', !Ref 'AppBucket', /* ] ] + - !Join [ '', [ 'arn:aws:s3:::', !Ref 'AppBucket' ] ] + Principal: + AWS: + Fn::Join: + - ' ' + - + - 'arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity' + - + !Ref OriginAccessIdentity + + OriginAccessIdentity: + Type: AWS::CloudFront::CloudFrontOriginAccessIdentity + Properties: + CloudFrontOriginAccessIdentityConfig: + Comment: Access identity between CloudFront and S3 bucket + + CloudFront: + Type: AWS::CloudFront::Distribution + DependsOn: AppBucket + Properties: + DistributionConfig: + WebACLId: !If [ HasWebACL, !Ref WebACL, !Ref 'AWS::NoValue' ] + Enabled: true + IPV6Enabled: true + HttpVersion: http2 + DefaultRootObject: index.html + Comment: !Join [ '', [ !If [ HasAppName, !Ref AppName, !Ref 'AWS::StackName' ], ' Angular CloudFront distribution for ', !Ref Environment, ' environment' ] ] + Aliases: + - !If + - HasAcmCertificateArn + - !Join [ '.', [ !If [ HasAppName, !Ref AppName, !Ref 'AWS::StackName' ], !Ref HostedZoneResourceUrl ] ] + - !Ref AWS::NoValue + ViewerCertificate: + !If + - HasAcmCertificateArn + - + AcmCertificateArn: !Ref AcmCertificateArn + SslSupportMethod: sni-only + MinimumProtocolVersion: TLSv1.2_2019 + - + CloudFrontDefaultCertificate: true + Origins: + - DomainName: !Sub ${AppBucket}.s3.amazonaws.com + Id: myS3Origin + S3OriginConfig: + OriginAccessIdentity: !Sub origin-access-identity/cloudfront/${OriginAccessIdentity} + DefaultCacheBehavior: + AllowedMethods: [ 'GET', 'HEAD', 'OPTIONS' ] + CachedMethods: [ 'GET', 'HEAD', 'OPTIONS' ] + ForwardedValues: + Headers: + - Access-Control-Request-Headers + - Access-Control-Request-Method + - Origin + - Authorization + QueryString: false + Cookies: + Forward: none + TargetOriginId: myS3Origin + ViewerProtocolPolicy: redirect-to-https + Compress: true + DefaultTTL: 0 + LambdaFunctionAssociations: + - !If + - HasHSTSLambdaARN + - + EventType: 'origin-response' + LambdaFunctionARN: !Ref HSTSLambdaARN + IncludeBody: false + - !Ref AWS::NoValue + CustomErrorResponses: + - ErrorCode: 404 + ResponsePagePath: /index.html + ResponseCode: 200 + ErrorCachingMinTTL: 300 + - ErrorCode: 400 + ErrorCachingMinTTL: 0 + - ErrorCode: 403 + ErrorCachingMinTTL: 1 + - ErrorCode: 500 + ErrorCachingMinTTL: 5 + + Route53: + Type: AWS::Route53::RecordSet + DependsOn: CloudFront + Condition: HasAcmCertificateArn + Properties: + HostedZoneName: !Join [ '', [ !Ref HostedZoneResourceUrl, '.' ] ] + Name: !Join + - '.' + - - !If [ HasAppName, !Ref AppName, !Ref 'AWS::StackName' ] + - !Join [ '', [ !Ref HostedZoneResourceUrl, '.' ] ] + Type: A + AliasTarget: + DNSName: !GetAtt CloudFront.DomainName + EvaluateTargetHealth: false + HostedZoneId: 'Z2FDTNDATAQYW2' + +Outputs: + CloudFront: + Description: CloudFront ID + Value: !Ref CloudFront + S3Bucket: + Description: S3 Bucket name + Value: !Ref AppBucket + Environment: + Description: Environment name + Value: !Ref Environment + CloudFrontDistributionDomainName: + Value: + 'Fn::GetAtt': [ CloudFront, DomainName ] diff --git a/libs/maintenance/index.html b/libs/maintenance/index.html new file mode 100644 index 0000000..8d7dfb2 --- /dev/null +++ b/libs/maintenance/index.html @@ -0,0 +1,35 @@ + + + + + Site Maintenance + + + + + + + +
+

We’ll be back soon!

+
+

Sorry for the inconvenience but we’re performing some maintenance at the moment. If you need to you can + always contact us, otherwise we’ll be back online shortly!

+

© The Quote app team

+
+
+ + diff --git a/nx.json b/nx.json index 2acc2ee..e4a9c86 100644 --- a/nx.json +++ b/nx.json @@ -7,7 +7,7 @@ ".eslintrc.json": "*" }, "affected": { - "defaultBase": "master" + "defaultBase": "main" }, "npmScope": "quotes", "tasksRunnerOptions": { diff --git a/package-lock.json b/package-lock.json index 5d0551a..6125c6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,48 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@angular-builders/jest": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@angular-builders/jest/-/jest-11.2.0.tgz", + "integrity": "sha512-WTdRn6z+BeIXpM51Hr8p/riBlpN24nOuop5FAJYVF7HgsdGRCY+RqMhy6I7ZU8T39E4T1rgoRlqtmRscPnQ3qw==", + "dev": true, + "requires": { + "@angular-devkit/architect": ">=0.1100.0 < 0.1200.0", + "@angular-devkit/core": "^11.0.0", + "jest-preset-angular": "^8.4.0", + "lodash": "^4.17.15" + }, + "dependencies": { + "jest-preset-angular": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-8.4.0.tgz", + "integrity": "sha512-lngQRVVMy2qdzhSzUVTkKFsWC+Z2uMFlJf8J5ZeapNZFsRYW2tjlVqdm+sJOTnVmMVnN7CtDqvRDwlyFTIYD+A==", + "dev": true, + "requires": { + "pretty-format": "26.x", + "ts-jest": "26.x" + } + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + } + } + }, "@angular-devkit/architect": { "version": "0.1102.8", "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1102.8.tgz", @@ -1626,6 +1668,12 @@ "rxjs": "6.6.3" } }, + "@angular-eslint/builder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-1.1.0.tgz", + "integrity": "sha512-VXQY+lLqN7KqqyoV/p5avp1qxavtspy3266QetMzy6Dh+6BYWznA3YPO8TMgEG/JwpFLXuLBdc8YUg8hVeZCcA==", + "dev": true + }, "@angular-eslint/eslint-plugin": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-2.0.2.tgz", @@ -1646,6 +1694,121 @@ "axobject-query": "^2.2.0" } }, + "@angular-eslint/schematics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-1.1.0.tgz", + "integrity": "sha512-LuAM0Wcan0l+Ol/CNMHJIAz/H8Y3kreO7ZS/jpMV3JnYo8ThvnD6av/MulI6OvMG5pxToEjCyFDyG/JJzh57Og==", + "dev": true, + "requires": { + "@angular-eslint/eslint-plugin": "1.1.0", + "@angular-eslint/eslint-plugin-template": "1.1.0", + "strip-json-comments": "3.1.1", + "tslint-to-eslint-config": "2.0.1" + }, + "dependencies": { + "@angular-eslint/eslint-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-1.1.0.tgz", + "integrity": "sha512-gL0RAx9+hD2Sm39ZH/sRZYS6TKY6oRzCaYEw8yO0/poL9AescJprTIfwzUnPwzIH78kkWI9B8xRClrk0u+5ZEQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.3.0" + } + }, + "@angular-eslint/eslint-plugin-template": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-1.1.0.tgz", + "integrity": "sha512-WAU6qnQQ52H+C3BaLNxgVAXf8LA8pqPRaq38nWf3dcSQsHzbyfsez39n2XzK0w+w2VaSY3bPAmOWW5K+RM9VxQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.3.0", + "aria-query": "^4.2.2", + "axobject-query": "^2.2.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.3.0.tgz", + "integrity": "sha512-cmmIK8shn3mxmhpKfzMMywqiEheyfXLV/+yPDnOTvQX/ztngx7Lg/OD26J8gTZfkLKUmaEBxO2jYP3keV7h2OQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.3.0", + "@typescript-eslint/types": "4.3.0", + "@typescript-eslint/typescript-estree": "4.3.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.3.0.tgz", + "integrity": "sha512-cTeyP5SCNE8QBRfc+Lgh4Xpzje46kNUhXYfc3pQWmJif92sjrFuHT9hH4rtOkDTo/si9Klw53yIr+djqGZS1ig==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.3.0", + "@typescript-eslint/visitor-keys": "4.3.0" + } + }, + "@typescript-eslint/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.3.0.tgz", + "integrity": "sha512-Cx9TpRvlRjOppGsU6Y6KcJnUDOelja2NNCX6AZwtVHRzaJkdytJWMuYiqi8mS35MRNA3cJSwDzXePfmhU6TANw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.3.0.tgz", + "integrity": "sha512-ZAI7xjkl+oFdLV/COEz2tAbQbR3XfgqHEGy0rlUXzfGQic6EBCR4s2+WS3cmTPG69aaZckEucBoTxW9PhzHxxw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.3.0", + "@typescript-eslint/visitor-keys": "4.3.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.3.0.tgz", + "integrity": "sha512-xZxkuR7XLM6RhvLkgv9yYlTcBHnTULzfnw4i6+z2TGBLy9yljAypQaZl9c3zFvy7PNI7fYWyvKYtohyF8au3cw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.3.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, "@angular-eslint/template-parser": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-2.0.2.tgz", @@ -2939,202 +3102,177 @@ "minimist": "^1.2.0" } }, - "@cypress/listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=", + "@commitlint/cli": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-12.1.1.tgz", + "integrity": "sha512-SB67/s6VJ50seoPx/Sr2gj1fMzKrx+udgarecGdr8h43ah+M2e22gjQJ7xHv5KwyPQ+6ug1YOMCL34ubT4zupQ==", "dev": true, "requires": { - "chalk": "^1.1.3", - "cli-cursor": "^1.0.2", - "date-fns": "^1.27.2", - "figures": "^1.7.0" + "@commitlint/format": "^12.1.1", + "@commitlint/lint": "^12.1.1", + "@commitlint/load": "^12.1.1", + "@commitlint/read": "^12.1.1", + "@commitlint/types": "^12.1.1", + "get-stdin": "8.0.0", + "lodash": "^4.17.19", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^16.2.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", "dev": true } } }, - "@cypress/request": { - "version": "2.88.5", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz", - "integrity": "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==", + "@commitlint/config-conventional": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-12.1.1.tgz", + "integrity": "sha512-15CqbXMsQiEb0qbzjEHe2OkzaXPYSp7RxaS6KoSVk/4W0QiigquavQ+M0huBZze92h0lMS6Pxoq4AJ5CQ3D+iQ==", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } + "conventional-changelog-conventionalcommits": "^4.3.1" } }, - "@cypress/webpack-preprocessor": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-4.1.5.tgz", - "integrity": "sha512-B4miSaS3VCMVSlfuvbWCjytTywdnquRsF1tQ3quC7TGUzEXnQZ4+o8WUKibjMozrOomALkUdMxqOJ1ib5oFkKw==", + "@commitlint/ensure": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-12.1.1.tgz", + "integrity": "sha512-XEUQvUjzBVQM7Uv8vYz+c7PDukFvx0AvQEyX/V+PaTkCK/xPvexu7FLbFwvypjSt9BPMf+T/rhB1hVmldkd6lw==", + "dev": true, "requires": { - "@babel/core": "^7.0.1", - "@babel/preset-env": "^7.0.0", - "babel-loader": "^8.0.2", - "bluebird": "3.7.1", - "debug": "4.1.1" + "@commitlint/types": "^12.1.1", + "lodash": "^4.17.19" } }, - "@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "@commitlint/execute-rule": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-12.1.1.tgz", + "integrity": "sha512-6mplMGvLCKF5LieL7BRhydpg32tm6LICnWQADrWU4S5g9PKi2utNvhiaiuNPoHUXr29RdbNaGNcyyPv8DSjJsQ==", + "dev": true + }, + "@commitlint/format": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-12.1.1.tgz", + "integrity": "sha512-bTAoOryTFLqls17JTaRwk2WDVOP0NwuG4F/JPK8RaF6DMZNVQTfajkgTxFENNZRnESfau1BvivvEXfUAW2ZsvA==", "dev": true, "requires": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" + "@commitlint/types": "^12.1.1", + "chalk": "^4.0.0" + } + }, + "@commitlint/is-ignored": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-12.1.1.tgz", + "integrity": "sha512-Sn4fsnWX+wLAJOD/UZeoVruB98te1TyPYRiDEq0MhRJAQIrP+7jE/O3/ass68AAMq00HvH3OK9kt4UBXggcGjA==", + "dev": true, + "requires": { + "@commitlint/types": "^12.1.1", + "semver": "7.3.5" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "lru-cache": "^6.0.0" } } } }, - "@discoveryjs/json-ext": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", - "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", - "dev": true + "@commitlint/lint": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-12.1.1.tgz", + "integrity": "sha512-FFFPpku/E0svL1jaUVqosuZJDDWiNWYBlUw5ZEljh3MwWRcoaWtMIX5bseX+IvHpFZsCTAiBs1kCgNulCi0UvA==", + "dev": true, + "requires": { + "@commitlint/is-ignored": "^12.1.1", + "@commitlint/parse": "^12.1.1", + "@commitlint/rules": "^12.1.1", + "@commitlint/types": "^12.1.1" + } }, - "@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "@commitlint/load": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-12.1.1.tgz", + "integrity": "sha512-qOQtgNdJRULUQWP9jkpTwhj7aEtnqUtqeUpbQ9rjS+GIUST65HZbteNUX4S0mAEGPWqy2aK5xGd73cUfFSvuuw==", "dev": true, "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "@commitlint/execute-rule": "^12.1.1", + "@commitlint/resolve-extends": "^12.1.1", + "@commitlint/types": "^12.1.1", + "chalk": "^4.0.0", + "cosmiconfig": "^7.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0" }, "dependencies": { - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -3143,35 +3281,22 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, - "resolve-from": { + "path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - } - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -3180,477 +3305,898 @@ } } }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "@commitlint/message": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-12.1.1.tgz", + "integrity": "sha512-RakDSLAiOligXjhbLahV8HowF4K75pZIcs0+Ii9Q8Gz5H3DWf1Ngit7alFTWfcbf/+DTjSzVPov5HiwQZPIBUg==", "dev": true }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "@commitlint/parse": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-12.1.1.tgz", + "integrity": "sha512-nuljIvAbBDr93DgL0wCArftEIhjSghawAwhvrKNV9FFcqAJqfVqitwMxJrNDCQ5pgUMCSKULLOEv+dA0bLlTEQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" + "@commitlint/types": "^12.1.1", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.0.0" } }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "@commitlint/read": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-12.1.1.tgz", + "integrity": "sha512-1k0CQEoZIdixvmqZRKEcWdj2XiKS7SlizEOJ1SE99Qui5d5FlBey8eaooTGgmpR6zObpIHJehtEPzM3VzUT3qA==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@commitlint/top-level": "^12.1.1", + "@commitlint/types": "^12.1.1", + "fs-extra": "^9.0.0", + "git-raw-commits": "^2.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, - "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "@commitlint/resolve-extends": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-12.1.1.tgz", + "integrity": "sha512-/DXRt0S0U3o9lq5cc8OL1Lkx0IjW0HcDWjUkUXshAajBIKBYSJB8x/loNCi1krNEJ8SwLXUEFt5OLxNO6wE9yQ==", "dev": true, "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "dependencies": { + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, - "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "@commitlint/rules": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-12.1.1.tgz", + "integrity": "sha512-oCcLF/ykcJfhM2DeeaDyrgdaiuKsqIPNocugdPj2WEyhSYqmx1/u18CV96LAtW+WyyiOLCCeiZwiQutx3T5nXg==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "@commitlint/ensure": "^12.1.1", + "@commitlint/message": "^12.1.1", + "@commitlint/to-lines": "^12.1.1", + "@commitlint/types": "^12.1.1" } }, - "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "@commitlint/to-lines": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-12.1.1.tgz", + "integrity": "sha512-W23AH2XF5rI27MOAPSSr0TUDoRe7ZbFoRtYhFnPu2MBmcuDA9Tmfd9N5sM2tBXtdE26uq3SazwKqGt1OoGAilQ==", + "dev": true + }, + "@commitlint/top-level": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-12.1.1.tgz", + "integrity": "sha512-g7uRbr81QEIg+pbii0OkE17Zh/2C/f6dSmiMDVRn1S0+hNHR1bENCh18hVUKcV/qKTUsKkFlhhWXM9mQBfxQJw==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "find-up": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } } }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "@commitlint/types": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.1.1.tgz", + "integrity": "sha512-+qGH+s2Lo6qwacV2X3/ZypZwaAI84ift+1HBjXdXtI/q0F5NtmXucV3lcQOTviMTNiJhq4qWON2fjci2NItASw==", "dev": true, "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "chalk": "^4.0.0" } }, - "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "@cypress/listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=", "dev": true, "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" }, "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } } }, - "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - } - }, - "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "@cypress/request": { + "version": "2.88.5", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz", + "integrity": "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true } } }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "@cypress/webpack-preprocessor": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-4.1.5.tgz", + "integrity": "sha512-B4miSaS3VCMVSlfuvbWCjytTywdnquRsF1tQ3quC7TGUzEXnQZ4+o8WUKibjMozrOomALkUdMxqOJ1ib5oFkKw==", "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "14.14.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", - "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" - } + "@babel/core": "^7.0.1", + "@babel/preset-env": "^7.0.0", + "babel-loader": "^8.0.2", + "bluebird": "3.7.1", + "debug": "4.1.1" } }, - "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", - "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", "dev": true, "requires": { - "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.3", - "loader-utils": "^2.0.0", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.7.0" + "debug": "^3.1.0", + "lodash.once": "^4.1.1" }, "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "ms": "^2.1.1" } } } }, - "@nestjs/common": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-7.6.15.tgz", - "integrity": "sha512-H/3Nk7M02Fc4YN9St05i34gZKVuzE54gd5eXAX6WwisqU5fQ00kss1pYGbltjb2QGu3A/fpO1MdYEwOA18Z/VQ==", - "requires": { - "axios": "0.21.1", - "iterare": "1.2.1", - "tslib": "2.1.0", - "uuid": "8.3.2" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@nestjs/core": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.6.15.tgz", - "integrity": "sha512-8CrL/iY5Gt4HJfyDg1PgPalhT7tVRT643f2mGMgPum/P/e94uuwEYBNIgsMEVOJUrOAWZkNIN60uEf8JkH6GWw==", - "requires": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.0.7", - "iterare": "1.2.1", - "object-hash": "2.1.1", - "path-to-regexp": "3.2.0", - "tslib": "2.1.0", - "uuid": "8.3.2" - }, - "dependencies": { - "path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@nestjs/platform-express": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-7.6.15.tgz", - "integrity": "sha512-XpoHtai7UlUvm6rLo0u2xtkABhC6YbxNuNYqpv/L+mT1xzKJtPV2jWYxJnsE4WNZAddsnKsAcDjj2nCQgiJ52Q==", - "requires": { - "body-parser": "1.19.0", - "cors": "2.8.5", - "express": "4.17.1", - "multer": "1.4.2", - "tslib": "2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true }, - "@nestjs/schematics": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-7.3.1.tgz", - "integrity": "sha512-eyBjJstAjecpdzRuBLiqnwomwXIAEV3+kPkpaphOieRUM6nBhjnXCCl3Qf8Dul2QUQK4NOVPd8FFxWtGP5XNlg==", + "@eslint/eslintrc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", + "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", "dev": true, "requires": { - "@angular-devkit/core": "11.2.4", - "@angular-devkit/schematics": "11.2.4", - "fs-extra": "9.1.0", - "jsonc-parser": "3.0.0", - "pluralize": "8.0.0" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" }, "dependencies": { - "@angular-devkit/core": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.2.4.tgz", - "integrity": "sha512-98mGDV4XtKWiQ/2D6yzvOHrnJovXchaAN9AjscAHd2an8Fkiq72d9m2wREpk+2J40NWTDB6J5iesTh3qbi8+CA==", + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" + "type-fest": "^0.8.1" } }, - "@angular-devkit/schematics": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.2.4.tgz", - "integrity": "sha512-M9Ike1TYawOIHzenlZS1ufQbsS+Z11/doj5w/UrU0q2OEKc6U375t5qVGgKo3PLHHS8osb9aW9xYwBfVlKrryQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.2.4", - "ora": "5.3.0", - "rxjs": "6.6.3" - } + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true } } }, - "@nestjs/testing": { - "version": "7.6.15", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-7.6.15.tgz", - "integrity": "sha512-AWr8stnRoS0yCU/EotAJKveYXm1XSB4ZT+ReqFDXhPyqC1ppOfU+zZuCjQlQHorMzidsVHsAstK5/rUsXnrZUQ==", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { - "optional": "0.1.4", - "tslib": "2.1.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, - "@ngtools/webpack": { - "version": "11.2.8", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.2.8.tgz", - "integrity": "sha512-ONn/MLJF8ieXrvvmmnDwga1sredsfedAsCLNmRpyDdamQwzqIErHuMmQhP4kuTw2+9Lj3V1gQOHyxdayO0d91A==", + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@angular-devkit/core": "11.2.8", - "enhanced-resolve": "5.7.0", - "webpack-sources": "2.2.0" - }, - "dependencies": { - "enhanced-resolve": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", - "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true - }, - "webpack-sources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", - "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", - "dev": true, - "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - } - } + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" } }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "14.14.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", + "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" + } + } + }, + "@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.7.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "@nestjs/common": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-7.6.15.tgz", + "integrity": "sha512-H/3Nk7M02Fc4YN9St05i34gZKVuzE54gd5eXAX6WwisqU5fQ00kss1pYGbltjb2QGu3A/fpO1MdYEwOA18Z/VQ==", + "requires": { + "axios": "0.21.1", + "iterare": "1.2.1", + "tslib": "2.1.0", + "uuid": "8.3.2" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, + "@nestjs/core": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.6.15.tgz", + "integrity": "sha512-8CrL/iY5Gt4HJfyDg1PgPalhT7tVRT643f2mGMgPum/P/e94uuwEYBNIgsMEVOJUrOAWZkNIN60uEf8JkH6GWw==", + "requires": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.0.7", + "iterare": "1.2.1", + "object-hash": "2.1.1", + "path-to-regexp": "3.2.0", + "tslib": "2.1.0", + "uuid": "8.3.2" + }, + "dependencies": { + "path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, + "@nestjs/platform-express": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-7.6.15.tgz", + "integrity": "sha512-XpoHtai7UlUvm6rLo0u2xtkABhC6YbxNuNYqpv/L+mT1xzKJtPV2jWYxJnsE4WNZAddsnKsAcDjj2nCQgiJ52Q==", + "requires": { + "body-parser": "1.19.0", + "cors": "2.8.5", + "express": "4.17.1", + "multer": "1.4.2", + "tslib": "2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, + "@nestjs/schematics": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-7.3.1.tgz", + "integrity": "sha512-eyBjJstAjecpdzRuBLiqnwomwXIAEV3+kPkpaphOieRUM6nBhjnXCCl3Qf8Dul2QUQK4NOVPd8FFxWtGP5XNlg==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.2.4", + "@angular-devkit/schematics": "11.2.4", + "fs-extra": "9.1.0", + "jsonc-parser": "3.0.0", + "pluralize": "8.0.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.2.4.tgz", + "integrity": "sha512-98mGDV4XtKWiQ/2D6yzvOHrnJovXchaAN9AjscAHd2an8Fkiq72d9m2wREpk+2J40NWTDB6J5iesTh3qbi8+CA==", + "dev": true, + "requires": { + "ajv": "6.12.6", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.3", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.2.4.tgz", + "integrity": "sha512-M9Ike1TYawOIHzenlZS1ufQbsS+Z11/doj5w/UrU0q2OEKc6U375t5qVGgKo3PLHHS8osb9aW9xYwBfVlKrryQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.2.4", + "ora": "5.3.0", + "rxjs": "6.6.3" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "@nestjs/serve-static": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-2.1.4.tgz", + "integrity": "sha512-w2PpLKzQOB8rJ+vMOy28xm8jwE8VjJfA9U+KOm0H0OY62g2oOWJ+OQPSDogP7XxAzZwq+Bt8wNU2oS8+z6v6Zg==", + "requires": { + "path-to-regexp": "0.1.7" + } + }, + "@nestjs/testing": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-7.6.15.tgz", + "integrity": "sha512-AWr8stnRoS0yCU/EotAJKveYXm1XSB4ZT+ReqFDXhPyqC1ppOfU+zZuCjQlQHorMzidsVHsAstK5/rUsXnrZUQ==", + "dev": true, + "requires": { + "optional": "0.1.4", + "tslib": "2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, + "@ngtools/webpack": { + "version": "11.2.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.2.8.tgz", + "integrity": "sha512-ONn/MLJF8ieXrvvmmnDwga1sredsfedAsCLNmRpyDdamQwzqIErHuMmQhP4kuTw2+9Lj3V1gQOHyxdayO0d91A==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.2.8", + "enhanced-resolve": "5.7.0", + "webpack-sources": "2.2.0" + }, + "dependencies": { + "enhanced-resolve": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + }, + "webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", "dev": true, @@ -3904,7 +4450,6 @@ "integrity": "sha512-BF8F5zp9zorjFoHAt0wuWyb4Xe6gUHEaX5bNFZpYhrnar3sQNbHymGIsD5bPBjmCLcoq20iO+OEZE9PGcxaFpQ==", "requires": { "@nrwl/devkit": "12.0.4", - "glob": "7.1.4", "minimatch": "3.0.4", "tmp": "0.0.33", "tslib": "^2.0.0" @@ -3952,6 +4497,22 @@ "webpack-dev-server": "3.11.0", "webpack-merge": "4.2.1", "webpack-node-externals": "1.7.2" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "@nrwl/tao": { @@ -4041,6 +4602,239 @@ "node-fetch": "^2.6.1" } }, + "@opencensus/core": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.9.tgz", + "integrity": "sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q==", + "requires": { + "continuation-local-storage": "^3.2.1", + "log-driver": "^1.2.7", + "semver": "^5.5.0", + "shimmer": "^1.2.0", + "uuid": "^3.2.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "@opencensus/propagation-b3": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz", + "integrity": "sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A==", + "requires": { + "@opencensus/core": "^0.0.8", + "uuid": "^3.2.1" + }, + "dependencies": { + "@opencensus/core": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.8.tgz", + "integrity": "sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ==", + "requires": { + "continuation-local-storage": "^3.2.1", + "log-driver": "^1.2.7", + "semver": "^5.5.0", + "shimmer": "^1.2.0", + "uuid": "^3.2.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "@pm2/agent": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-1.0.8.tgz", + "integrity": "sha512-r8mud8BhBz+a2yjlgtk+PBXUR5EQ9UKSJCs232OxfCmuBr1MZw0Mo+Kfog6WJ8OmVk99r1so9yTUK4IyrgGcMQ==", + "requires": { + "async": "~3.2.0", + "chalk": "~3.0.0", + "dayjs": "~1.8.24", + "debug": "~4.3.1", + "eventemitter2": "~5.0.1", + "fclone": "~1.0.11", + "nssocket": "0.6.0", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.0", + "proxy-agent": "~4.0.1", + "semver": "~7.2.0", + "ws": "~7.2.0" + }, + "dependencies": { + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "dayjs": { + "version": "1.8.36", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", + "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.2.3.tgz", + "integrity": "sha512-utbW9Z7ZxVvwiIWkdOMLOR9G/NFXh2aRucghkVrEMJWuC++r3lCkBC3LwqBinyHzGMAJxY5tn6VakZGHObq5ig==" + }, + "ws": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==" + } + } + }, + "@pm2/io": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@pm2/io/-/io-5.0.0.tgz", + "integrity": "sha512-3rToDVJaRoob5Lq8+7Q2TZFruoEkdORxwzFpZaqF4bmH6Bkd7kAbdPrI/z8X6k1Meq5rTtScM7MmDgppH6aLlw==", + "requires": { + "@opencensus/core": "0.0.9", + "@opencensus/propagation-b3": "0.0.8", + "async": "~2.6.1", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "require-in-the-middle": "^5.0.0", + "semver": "6.3.0", + "shimmer": "^1.2.0", + "signal-exit": "^3.0.3", + "tslib": "1.9.3" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@pm2/js-api": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.6.7.tgz", + "integrity": "sha512-jiJUhbdsK+5C4zhPZNnyA3wRI01dEc6a2GhcQ9qI38DyIk+S+C8iC3fGjcjUbt/viLYKPjlAaE+hcT2/JMQPXw==", + "requires": { + "async": "^2.6.3", + "axios": "^0.21.0", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "ws": "^7.0.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" + } + } + }, + "@pm2/pm2-version-check": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", + "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==", + "requires": { + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "@samverschueren/stream-to-observable": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", @@ -4108,8 +4902,7 @@ "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" }, "@types/babel__core": { "version": "7.1.14", @@ -4192,6 +4985,21 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jasmine": { + "version": "3.6.9", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.9.tgz", + "integrity": "sha512-B53NIwMj/AO0O+xfSWLYmKB0Mo6TYxfv2Mk8/c1T2w/e38t55iaPR6p7pHXTTtqfTmevPK3i8T1YweYFTZlxDw==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, "@types/jest": { "version": "26.0.8", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.8.tgz", @@ -4218,6 +5026,12 @@ "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", "dev": true }, + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, "@types/node": { "version": "14.14.33", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.33.tgz", @@ -4247,6 +5061,12 @@ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", "dev": true }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "dev": true + }, "@types/sinonjs__fake-timers": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", @@ -4271,6 +5091,12 @@ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "dev": true + }, "@types/webpack-sources": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", @@ -4731,6 +5557,16 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -4788,6 +5624,12 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "dev": true + }, "adjust-sourcemap-loader": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", @@ -4811,11 +5653,16 @@ } } }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "requires": { "debug": "4" } @@ -4869,6 +5716,19 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, + "amp": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", + "integrity": "sha1-at+NWKdPNh6CwfqNOJwHnhOfxH0=" + }, + "amp-message": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", + "integrity": "sha1-p48cmJlQh602GSpBKY5NtJ49/EU=", + "requires": { + "amp": "0.3.1" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -5029,12 +5889,37 @@ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -5052,6 +5937,23 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -5119,6 +6021,14 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "requires": { + "tslib": "^2.0.1" + } + }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -5142,6 +6052,22 @@ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, + "async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "requires": { + "semver": "^5.3.0", + "shimmer": "^1.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5476,12 +6402,26 @@ "readable-stream": "^3.4.0" } }, + "blessed": { + "version": "0.1.81", + "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", + "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=" + }, "blob-util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", "dev": true }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "bluebird": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", @@ -5493,6 +6433,11 @@ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, + "bodec": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", + "integrity": "sha1-vIUVVUMPI8n3ZQp172TGqUw0GMw=" + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -5677,6 +6622,45 @@ "node-releases": "^1.1.71" } }, + "browserstack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } + } + }, "bs-logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", @@ -5727,6 +6711,12 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -5774,8 +6764,7 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { "version": "15.0.6", @@ -5851,605 +6840,1042 @@ "caller-callsite": "^2.0.0" } }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001208", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz", + "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==" + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=" + }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "dev": true + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==" + }, + "cli-table3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + } + }, + "cli-tableau": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", + "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", + "requires": { + "chalk": "3.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "caniuse-lite": { - "version": "1.0.30001208", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz", - "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==" - }, - "canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "requires": { - "rsvp": "^4.8.4" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "coffeescript": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", + "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", "dev": true }, - "check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "delayed-stream": "~1.0.0" } }, - "circular-dependency-plugin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", - "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "comment-parser": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.2.tgz", + "integrity": "sha512-AOdq0i8ghZudnYv8RUnHrhTgafUGs61Rdz9jemU5x2lnZwAWyOq7vySo626K59e1fVKH1xSRorJwPVRLSWOoAQ==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", "dev": true }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" } }, - "cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==" + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, - "cli-table3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", - "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", "dev": true, "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^4.2.0" + "arity-n": "^1.0.4" } }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "number-is-nan": "^1.0.0" + "ms": "2.0.0" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "ansi-regex": "^2.0.0" + "safe-buffer": "~5.1.0" } } } }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "requires": { + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" + } + }, + "conventional-changelog": { + "version": "3.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.24.tgz", + "integrity": "sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + } + }, + "conventional-changelog-angular": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", + "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "compare-func": "^2.0.0", + "q": "^1.5.1" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", "dev": true, "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "q": "^1.5.1" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "conventional-changelog-config-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", + "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", "dev": true }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "conventional-changelog-conventionalcommits": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz", + "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==", "dev": true, "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.2.tgz", + "integrity": "sha512-7pDpRUiobQDNkwHyJG7k9f6maPo9tfPzkSWbRq97GGiZqisElhnvUZSvyQH20ogfOjntB5aadvv6NNcKL1sReg==", + "dev": true, + "requires": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^4.0.18", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "shelljs": "^0.8.3", + "through2": "^4.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "color-convert": "^1.9.0" + "locate-path": "^2.0.0" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "lru-cache": "^6.0.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "color-name": "1.1.3" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "normalize-package-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", + "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "has-flag": { + "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "has-flag": "^3.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "color-name": "1.1.3" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } } } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, "requires": { - "color-name": "~1.1.4" + "q": "^1.5.1" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", "dev": true, "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "q": "^1.5.1" } }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "q": "^1.5.1" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", "dev": true, "requires": { - "arity-n": "^1.0.4" + "q": "^1.5.1" } }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", "dev": true, "requires": { - "mime-db": ">= 1.43.0 < 2" + "compare-func": "^2.0.0", + "q": "^1.5.1" } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz", + "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==", "dev": true, "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "compare-func": "^2.0.0", + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { - "ms": "2.0.0" + "readable-stream": "3" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true } } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "conventional-commits-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz", + "integrity": "sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==", + "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0", + "trim-off-newlines": "^1.0.0" }, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "readable-stream": "3" } } } }, - "confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" + "conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } } } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -6692,6 +8118,14 @@ "pretty-bytes": "^5.3.0" } }, + "cron": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", + "integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==", + "requires": { + "moment-timezone": "^0.5.x" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -6730,6 +8164,15 @@ "randomfill": "^1.0.3" } }, + "cson-parser": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cson-parser/-/cson-parser-4.0.7.tgz", + "integrity": "sha512-BSnAl0gllETWjU9/lb8MmeqhsGaRINPwhoPiBjI/TJBRvKf/24I9EVqnwvmk6R3Gt66cMRSGVktl6QicxIb72g==", + "dev": true, + "requires": { + "coffeescript": "1.12.7" + } + }, "css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", @@ -7386,6 +8829,20 @@ } } }, + "culvert": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", + "integrity": "sha1-lQL18BVKLVoioCPnn3HMk2+m728=" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", @@ -7604,6 +9061,12 @@ "type": "^1.0.1" } }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -7613,6 +9076,11 @@ "assert-plus": "^1.0.0" } }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" + }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -7630,6 +9098,12 @@ "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, "dayjs": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", @@ -7649,6 +9123,24 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, "decimal.js": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", @@ -7677,8 +9169,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deepmerge": { "version": "4.2.2", @@ -7749,6 +9240,71 @@ } } }, + "degenerator": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-2.2.0.tgz", + "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", + "requires": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -7855,6 +9411,12 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "dev": true + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -8047,11 +9609,57 @@ "is-obj": "^2.0.0" } }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" - }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "dotgitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "minimatch": "^3.0.4" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -8153,6 +9761,14 @@ } } }, + "emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "requires": { + "shimmer": "^1.2.0" + } + }, "emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", @@ -8300,6 +9916,21 @@ "es6-symbol": "^3.1.1" } }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -8546,25 +10177,344 @@ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "^2.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz", + "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-cypress": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.2.tgz", + "integrity": "sha512-1SergF1sGbVhsf7MYfOLiBhdOg6wqyeV9pXUAIDIffYTGMN3dTBQS9nFAzhLsHhO+Bn0GaVM1Ecm71XUidQ7VA==", + "dev": true, + "requires": { + "globals": "^11.12.0" + } + }, + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + } + } + }, + "eslint-plugin-jsdoc": { + "version": "32.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.3.0.tgz", + "integrity": "sha512-zyx7kajDK+tqS1bHuY5sapkad8P8KT0vdd/lE55j47VPG2MeenSYuIY/M/Pvmzq5g0+3JB+P3BJGUXmHxtuKPQ==", + "dev": true, + "requires": { + "comment-parser": "1.1.2", + "debug": "^4.3.1", + "jsdoctypeparser": "^9.0.0", + "lodash": "^4.17.20", + "regextras": "^0.7.1", + "semver": "^7.3.4", + "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" } } } }, - "eslint-config-prettier": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz", - "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==", + "eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", "dev": true }, - "eslint-plugin-cypress": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.2.tgz", - "integrity": "sha512-1SergF1sGbVhsf7MYfOLiBhdOg6wqyeV9pXUAIDIffYTGMN3dTBQS9nFAzhLsHhO+Bn0GaVM1Ecm71XUidQ7VA==", - "dev": true, - "requires": { - "globals": "^11.12.0" - } + "eslint-plugin-simple-import-sort": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", + "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==", + "dev": true }, "eslint-scope": { "version": "4.0.3", @@ -8666,8 +10616,7 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { "version": "2.0.3", @@ -8682,8 +10631,7 @@ "eventemitter2": { "version": "6.4.4", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz", - "integrity": "sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==", - "dev": true + "integrity": "sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==" }, "eventemitter3": { "version": "4.0.7", @@ -9094,8 +11042,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fast-safe-stringify": { "version": "2.0.7", @@ -9129,6 +11076,11 @@ "bser": "2.1.1" } }, + "fclone": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", + "integrity": "sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=" + }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -9584,6 +11536,15 @@ } } }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -9658,6 +11619,38 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -9742,56 +11735,354 @@ "has-symbols": "^1.0.1" } }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "requires": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "dependencies": { + "file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "requires": { + "async": "^3.2.0" + }, + "dependencies": { + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + } + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-node-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", + "integrity": "sha1-SbIV4kLr5Dqkx1Ybu6SZUhdSCA8=" + }, + "git-raw-commits": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", + "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + } + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, "requires": { - "pump": "^3.0.0" + "meow": "^8.0.0", + "semver": "^6.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "git-sha1": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", + "integrity": "sha1-WZrBkrcYdYJeE6RF86bgURjC90U=" }, - "getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", "dev": true, "requires": { - "async": "^3.2.0" + "ini": "^1.3.2" }, "dependencies": { - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true } } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9863,6 +12154,27 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -9879,6 +12191,12 @@ "har-schema": "^2.0.0" } }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -10142,7 +12460,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, "requires": { "@tootallnate/once": "1", "agent-base": "6", @@ -10287,7 +12604,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, "requires": { "agent-base": "6", "debug": "4" @@ -10308,6 +12624,12 @@ "ms": "^2.0.0" } }, + "husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "dev": true + }, "iconv-lite": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", @@ -10355,6 +12677,12 @@ "dev": true, "optional": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -10495,11 +12823,16 @@ "ipaddr.js": "^1.9.0" } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ip-regex": { "version": "2.1.0", @@ -10672,6 +13005,12 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -10782,6 +13121,12 @@ "path-is-inside": "^1.0.2" } }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -10836,6 +13181,15 @@ "has-symbols": "^1.0.1" } }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -10847,6 +13201,12 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, "is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", @@ -11004,6 +13364,31 @@ } } }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", + "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", + "dev": true + }, "jasmine-marbles": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/jasmine-marbles/-/jasmine-marbles-0.6.0.tgz", @@ -11012,6 +13397,21 @@ "lodash": "^4.5.0" } }, + "jasmine-spec-reporter": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-6.0.0.tgz", + "integrity": "sha512-MvTOVoMxDZAftQYBApIlSfKnGMzi9cj351nXeqtnZTuXffPlbONN31+Es7F+Ke4okUeQ2xISukt4U1npfzLVrQ==", + "dev": true, + "requires": { + "colors": "1.4.0" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, "jest": { "version": "26.2.2", "resolved": "https://registry.npmjs.org/jest/-/jest-26.2.2.tgz", @@ -11849,6 +14249,24 @@ "supports-color": "^7.0.0" } }, + "js-git": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", + "integrity": "sha1-UvplWrYYd9bxB578ZTS1VPMeVEQ=", + "requires": { + "bodec": "^0.1.0", + "culvert": "^0.1.2", + "git-sha1": "^0.1.2", + "pako": "^0.2.5" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + } + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -11869,6 +14287,12 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "jsdoctypeparser": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "dev": true + }, "jsdom": { "version": "16.5.3", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", @@ -12011,6 +14435,50 @@ "verror": "1.10.0" } }, + "jszip": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", + "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "karma-source-map-support": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", @@ -12043,6 +14511,11 @@ "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", "dev": true }, + "lazy": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", + "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=" + }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -12168,6 +14641,15 @@ "webpack-sources": "^1.2.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -12478,6 +14960,12 @@ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -12519,6 +15007,11 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -12628,6 +15121,16 @@ "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", "dev": true }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -12713,6 +15216,12 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, + "map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -12786,6 +15295,69 @@ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", + "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -12880,6 +15452,12 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "mini-css-extract-plugin": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.5.tgz", @@ -12940,6 +15518,17 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, "minipass": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", @@ -13057,14 +15646,31 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "dev": true + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "moment-timezone": { + "version": "0.5.33", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", + "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", + "requires": { + "moment": ">= 2.9.0" + } }, "move-concurrently": { "version": "1.0.1", @@ -13149,8 +15755,7 @@ "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { "version": "2.14.2", @@ -13234,12 +15839,35 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" + }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "ng-sidebar": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ng-sidebar/-/ng-sidebar-9.4.2.tgz", + "integrity": "sha512-8KmEQYFhn4S5LDjRDXBhDfCgLchJEj+ClBdiTCAQoRjX8vdh85hmKIGN7aBsh1HNOXKN3rzDu0qmd90193/P3Q==" + }, + "ngx-smart-modal": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ngx-smart-modal/-/ngx-smart-modal-7.4.1.tgz", + "integrity": "sha512-1vvqavgJYa06lMAgAniuoaLDCNN4i4M7GzWdSTfndrdtknPUwLlXjmr0uJG7NvgeOnZYICWwx/c/dtgHsMjH/Q==" + }, + "ngx-toastr": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-13.2.1.tgz", + "integrity": "sha512-UAzp7/xWK9IXA2LsOmhpaaIGCqscvJokoQpBNpAMrjEkDeSlFf8PWQAuQY795KW0mJb3qF9UG/s23nsXfMYKmg==", + "requires": { + "tslib": "^2.0.0" + } + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -13709,6 +16337,22 @@ "set-blocking": "~2.0.0" } }, + "nssocket": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", + "integrity": "sha1-Wflvb/MhVm8zxw99vu7N/cBxVPo=", + "requires": { + "eventemitter2": "~0.4.14", + "lazy": "~1.0.11" + }, + "dependencies": { + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=" + } + } + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -13718,6 +16362,12 @@ "boolbase": "~1.0.0" } }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -13861,8 +16511,7 @@ "on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, "once": { "version": "1.4.0", @@ -14021,6 +16670,32 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "pac-proxy-agent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz", + "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^4.1.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + } + }, + "pac-resolver": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-4.2.0.tgz", + "integrity": "sha512-rPACZdUyuxT5Io/gFKUeeZFfE5T7ve7cAkE5TUZRRfuKP0u5Hocwe48X7ZEm6mYB+bTB0Qf+xlVlA/RM/i6RCQ==", + "requires": { + "degenerator": "^2.2.0", + "ip": "^1.1.5", + "netmask": "^2.0.1" + } + }, "pacote": { "version": "11.2.4", "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.2.4.tgz", @@ -14127,6 +16802,12 @@ "safe-buffer": "^5.1.1" } }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -14274,6 +16955,14 @@ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==" }, + "pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "requires": { + "safe-buffer": "^5.2.1" + } + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -14317,6 +17006,213 @@ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true }, + "pm2": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/pm2/-/pm2-4.5.6.tgz", + "integrity": "sha512-4J5q704Xl6VmpmQhXFGMJL4kXyyQw3AZM1FE9vRxhS3LiDI/+WVBtOM6pqJ4g/RKW+AUjEkc23i/DCC4BVenDA==", + "requires": { + "@pm2/agent": "~1.0.8", + "@pm2/io": "~5.0.0", + "@pm2/js-api": "~0.6.7", + "@pm2/pm2-version-check": "^1.0.4", + "async": "~3.2.0", + "blessed": "0.1.81", + "chalk": "3.0.0", + "chokidar": "^3.5.1", + "cli-tableau": "^2.0.0", + "commander": "2.15.1", + "cron": "1.8.2", + "dayjs": "~1.8.25", + "debug": "^4.3.1", + "enquirer": "2.3.6", + "eventemitter2": "5.0.1", + "fclone": "1.0.11", + "mkdirp": "1.0.4", + "needle": "2.4.0", + "pidusage": "2.0.21", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.0", + "pm2-deploy": "~1.0.2", + "pm2-multimeter": "^0.1.2", + "promptly": "^2", + "ps-list": "6.3.0", + "semver": "^7.2", + "source-map-support": "0.5.19", + "sprintf-js": "1.1.2", + "vizion": "2.2.1", + "yamljs": "0.3.0" + }, + "dependencies": { + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + }, + "dayjs": { + "version": "1.8.36", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", + "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + } + } + }, + "pm2-axon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz", + "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==", + "requires": { + "amp": "~0.3.1", + "amp-message": "~0.1.1", + "debug": "^4.3.1", + "escape-string-regexp": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "pm2-axon-rpc": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", + "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==", + "requires": { + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "pm2-deploy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", + "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", + "requires": { + "run-series": "^1.1.8", + "tv4": "^1.3.0" + } + }, + "pm2-multimeter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", + "integrity": "sha1-Gh5VFT1BoFU0zqI8/oYKuqDrSs4=", + "requires": { + "charm": "~0.1.1" + } + }, "pnp-webpack-plugin": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", @@ -17228,24 +20124,232 @@ "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", "dev": true }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + } + } + }, + "promptly": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", + "integrity": "sha1-KhP6BjaIoqWYOxYf/wEIoH0m/HQ=", + "requires": { + "read": "^1.0.4" + } + }, + "prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "protractor": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", + "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.1.7", + "yargs": "^15.3.1" + }, + "dependencies": { + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true + }, + "webdriver-manager": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", + "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } } } }, - "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -17255,11 +20359,51 @@ "ipaddr.js": "1.9.1" } }, + "proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", + "integrity": "sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA==", + "requires": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^4.1.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, + "ps-list": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-6.3.0.tgz", + "integrity": "sha512-qau0czUSB0fzSlBOQt0bo+I2v6R+xiQdj78e1BR/Qjfl5OHWJ/urXi8+ilw1eHe+5hSeDI1wrwVTgDp2wst4oA==" + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -17362,6 +20506,17 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "quotesy": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/quotesy/-/quotesy-1.0.5.tgz", + "integrity": "sha512-r3HjlxUJXNes3BO0M8KHAa+dZcL1SkAEoPZLm7NGHVEgr5vkAS6eDxZggCCmTIQlf29plZZR7gjAL67Uh/6y2Q==" + }, "ramda": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", @@ -17458,6 +20613,14 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "requires": { + "mute-stream": "~0.0.4" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -17531,6 +20694,25 @@ "picomatch": "^2.2.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -17606,6 +20788,12 @@ "unicode-match-property-value-ecmascript": "^1.2.0" } }, + "regextras": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "dev": true + }, "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", @@ -17642,6 +20830,15 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -17717,6 +20914,16 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, + "require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", + "requires": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -17752,6 +20959,32 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "requires": { + "global-dirs": "^0.1.1" + }, + "dependencies": { + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + } + } + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -18019,6 +21252,11 @@ "aproba": "^1.1.1" } }, + "run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==" + }, "rxjs": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", @@ -18253,11 +21491,49 @@ } } }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { "version": "5.0.1", @@ -18284,6 +21560,38 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, "selfsigned": { "version": "1.10.8", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", @@ -18438,6 +21746,12 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -18507,6 +21821,17 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", @@ -18514,6 +21839,11 @@ "dev": true, "optional": true }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -18556,8 +21886,7 @@ "smart-buffer": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" }, "snapdragon": { "version": "0.8.2", @@ -18731,7 +22060,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.0.tgz", "integrity": "sha512-mNmr9owlinMplev0Wd7UHFlqI4ofnBnNzFuzrm63PPaHgbkqCFe4T5LzwKmtQ/f2tX0NTpcdVLyD/FHxFBstYw==", - "dev": true, "requires": { "ip": "^1.1.5", "smart-buffer": "^4.1.0" @@ -18741,7 +22069,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", - "dev": true, "requires": { "agent-base": "6", "debug": "4", @@ -18907,6 +22234,15 @@ "chalk": "^4.1.0" } }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -18915,6 +22251,15 @@ "extend-shallow": "^3.0.0" } }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -18969,6 +22314,202 @@ } } }, + "standard-version": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.2.0.tgz", + "integrity": "sha512-utJcqjk/wR4sePSwDoRcc5CzJ6S+kec5Hd0+1TJI+j1TRYuuptweAnEUdkkjGf2vYoGab2ezefyVtW065HZ1Uw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "conventional-changelog": "3.1.24", + "conventional-changelog-config-spec": "2.1.0", + "conventional-changelog-conventionalcommits": "4.5.0", + "conventional-recommended-bump": "6.1.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "dotgitignore": "^2.1.0", + "figures": "^3.1.0", + "find-up": "^5.0.0", + "fs-access": "^1.0.1", + "git-semver-tags": "^4.0.0", + "semver": "^7.1.1", + "stringify-package": "^1.0.1", + "yargs": "^16.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -19163,6 +22704,12 @@ "safe-buffer": "~5.2.0" } }, + "stringify-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", + "dev": true + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -19188,6 +22735,15 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -19815,6 +23371,12 @@ "minimatch": "^3.0.4" } }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -19993,6 +23555,18 @@ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, "ts-jest": { "version": "26.4.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.0.tgz", @@ -20301,6 +23875,171 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" }, + "tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "tslint-to-eslint-config": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslint-to-eslint-config/-/tslint-to-eslint-config-2.0.1.tgz", + "integrity": "sha512-RURU/zcBQpW9jKS7H2J6of4+64npTb0nrH7ND8tNhagMwryVjVnUDcucsl8DQuD7tO9RgjFO9bmJfDhyP0yV1w==", + "dev": true, + "requires": { + "chalk": "4.1.0", + "commander": "6.2.0", + "cson-parser": "4.0.7", + "eslint-config-prettier": "6.15.0", + "glob": "7.1.6", + "json5": "2.1.3", + "lodash": "4.17.20", + "minimatch": "3.0.4", + "tslint": "6.1.3", + "typescript": "4.1.2" + }, + "dependencies": { + "commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "dev": true + }, + "eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "typescript": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", + "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", + "dev": true + } + } + }, "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -20333,6 +24072,11 @@ "safe-buffer": "^5.0.1" } }, + "tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=" + }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -20394,6 +24138,13 @@ "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", "dev": true }, + "uglify-js": { + "version": "3.13.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.4.tgz", + "integrity": "sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw==", + "dev": true, + "optional": true + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -20699,6 +24450,32 @@ "extsprintf": "^1.2.0" } }, + "vizion": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", + "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==", + "requires": { + "async": "^2.6.3", + "git-node-fs": "^1.0.0", + "ini": "^1.3.5", + "js-git": "^0.7.8" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + } + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -21024,6 +24801,16 @@ "defaults": "^1.0.3" } }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -21987,7 +25774,12 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "worker-farm": { @@ -22058,12 +25850,33 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -22085,6 +25898,15 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, + "yamljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", + "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "requires": { + "argparse": "^1.0.7", + "glob": "^7.0.5" + } + }, "yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", diff --git a/package.json b/package.json index 13d6315..651dc08 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,15 @@ "name": "quotes", "version": "0.0.0", "license": "MIT", + "author": "Oleksandr Bondarenko", "scripts": { - "ng": "nx", + "prepare": "husky install", "postinstall": "node ./decorate-angular-cli.js && ngcc --properties es2015 browser module main", + "ng": "nx", "nx": "nx", "start": "ng serve", "build": "ng build", + "build:api-with-assets": "ng build api --configuration=production && ng build quotes --configuration=production --outputPath=dist/apps/api/assets/client", "test": "ng test", "lint": "nx workspace-lint && ng lint", "e2e": "ng e2e", @@ -25,7 +28,9 @@ "update": "nx migrate latest", "workspace-generator": "nx workspace-generator", "dep-graph": "nx dep-graph", - "help": "nx help" + "help": "nx help", + "release": "npm --prefix apps/quotes run standard-version", + "release:api": "npm --prefix apps/api run standard-version" }, "private": true, "dependencies": { @@ -40,13 +45,24 @@ "@nestjs/common": "^7.0.0", "@nestjs/core": "^7.0.0", "@nestjs/platform-express": "^7.0.0", + "@nestjs/serve-static": "^2.1.4", "@nrwl/angular": "12.0.4", + "ng-sidebar": "^9.4.2", + "ngx-smart-modal": "^7.4.1", + "ngx-toastr": "^13.2.1", + "quotesy": "^1.0.5", + "compression": "^1.7.4", + "pm2": "^4.5.6", "reflect-metadata": "^0.1.13", "rxjs": "~6.6.3", "tslib": "^2.0.0", + "uuid": "^8.3.2", "zone.js": "^0.10.2" }, "devDependencies": { + "@angular-builders/jest": "^11.2.0", + "@angular-eslint/builder": "1.1.0", + "@angular-eslint/schematics": "1.1.0", "@angular-devkit/build-angular": "~0.1102.0", "@angular-eslint/eslint-plugin": "~2.0.2", "@angular-eslint/eslint-plugin-template": "~2.0.2", @@ -54,6 +70,8 @@ "@angular/cli": "~11.2.0", "@angular/compiler-cli": "^11.2.0", "@angular/language-service": "^11.2.0", + "@commitlint/cli": "^12.1.1", + "@commitlint/config-conventional": "^12.1.1", "@nestjs/schematics": "^7.0.0", "@nestjs/testing": "^7.0.0", "@nrwl/cli": "12.0.4", @@ -67,16 +85,29 @@ "@nrwl/workspace": "12.0.4", "@types/jest": "26.0.8", "@types/node": "14.14.33", + "@types/uuid": "^8.3.0", + "@types/jasmine": "~3.6.3", + "@types/jasminewd2": "~2.0.8", "@typescript-eslint/eslint-plugin": "4.19.0", "@typescript-eslint/parser": "4.19.0", + "glob": "^7.1.6", + "jasmine-core": "~3.6.0", + "jasmine-spec-reporter": "~6.0.0", + "protractor": "~7.0.0", "cypress": "^6.0.1", "dotenv": "8.2.0", "eslint": "7.22.0", "eslint-config-prettier": "8.1.0", "eslint-plugin-cypress": "^2.10.3", + "eslint-plugin-import": "2.22.1", + "eslint-plugin-jsdoc": "32.3.0", + "eslint-plugin-prefer-arrow": "1.2.3", + "eslint-plugin-simple-import-sort": "^7.0.0", + "husky": "^6.0.0", "jest": "26.2.2", "jest-preset-angular": "8.3.2", "prettier": "2.2.1", + "standard-version": "^9.2.0", "ts-jest": "26.4.0", "ts-node": "~9.1.1", "typescript": "~4.1.4" diff --git a/tsconfig.base.json b/tsconfig.base.json index 1bf9712..cb18736 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -8,12 +8,13 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "importHelpers": true, - "target": "es2015", + "target": "es2017", "module": "esnext", "lib": ["es2017", "dom"], "skipLibCheck": true, "skipDefaultLibCheck": true, "baseUrl": ".", + "resolveJsonModule": true, "paths": { "@quotes/api-interfaces": ["libs/api-interfaces/src/index.ts"] }