From 1b6fa67294de837e417208398b5518b75bdeea16 Mon Sep 17 00:00:00 2001 From: Niels Kooiman Date: Wed, 14 Aug 2019 10:13:49 +0200 Subject: [PATCH] Fix linter errors; add domain; add unit test support --- jasmine.json | 4 + package-lock.json | 357 ++++++++++++++++++ package.json | 12 +- src/adapters/music/VinylCatalog.ts | 42 +++ src/domain/dependencies.ts | 9 + src/domain/domain.ts | 9 + src/domain/exports/IMusicCatalog.ts | 10 + src/domain/imports/IMusicRepository.ts | 10 + src/domain/models/Track.ts | 14 + src/domain/services/BaseService.ts | 5 + .../services/MusicCatalogService.spec.ts | 20 + src/domain/services/MusicCatalogService.ts | 26 ++ src/main.ts | 11 +- src/registerServiceWorker.ts | 20 +- src/router.ts | 16 +- src/views/Home.vue | 4 +- src/wiring/TestWiring.ts | 19 + src/wiring/Wiring.ts | 24 ++ tsconfig.json | 4 +- tsconfig.spec.json | 36 ++ tslint.json | 5 +- 21 files changed, 628 insertions(+), 29 deletions(-) create mode 100644 jasmine.json create mode 100644 src/adapters/music/VinylCatalog.ts create mode 100644 src/domain/dependencies.ts create mode 100644 src/domain/domain.ts create mode 100644 src/domain/exports/IMusicCatalog.ts create mode 100644 src/domain/imports/IMusicRepository.ts create mode 100644 src/domain/models/Track.ts create mode 100644 src/domain/services/BaseService.ts create mode 100644 src/domain/services/MusicCatalogService.spec.ts create mode 100644 src/domain/services/MusicCatalogService.ts create mode 100644 src/wiring/TestWiring.ts create mode 100644 src/wiring/Wiring.ts create mode 100644 tsconfig.spec.json diff --git a/jasmine.json b/jasmine.json new file mode 100644 index 0000000..3821aa2 --- /dev/null +++ b/jasmine.json @@ -0,0 +1,4 @@ +{ + "spec_dir": "src", + "spec_files": ["**/*.spec.ts"] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f63ebef..cbeeb44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -894,6 +894,10 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, + "@nx/typescript-domain": { + "version": "git+https://solidt.eu/git/niels.kooiman/typescript-domain.git#9e28cad48b97907a571a1d4429c877547b978db2", + "from": "git+https://solidt.eu/git/niels.kooiman/typescript-domain.git" + }, "@soda/friendly-errors-webpack-plugin": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz", @@ -964,6 +968,12 @@ "@types/node": "*" } }, + "@types/jasmine": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.4.0.tgz", + "integrity": "sha512-6pUnBg6DuSB55xnxJ5+gW9JOkFrPsXkYAuqqEE8oyrpgDiPQ+TZ+1Zt4S+CHcRJcxyNYXeIXG4vHSzdF6y9Uvw==", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -1625,6 +1635,12 @@ "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", "dev": true }, + "arg": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", + "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -6115,6 +6131,241 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "jasmine": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.4.0.tgz", + "integrity": "sha512-sR9b4n+fnBFDEd7VS2el2DeHgKcPiMVn44rtKFumq9q7P/t8WrxsVIZPob4UDdgcDNCwyDqwxCt4k9TDRmjPoQ==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "jasmine-core": "~3.4.0" + } + }, + "jasmine-core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", + "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", + "dev": true + }, + "jasmine-ts": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/jasmine-ts/-/jasmine-ts-0.3.0.tgz", + "integrity": "sha512-K5joodjVOh3bnD06CNXC8P5htDq/r0Rhjv66ECOpdIGFLly8kM7V+X/GXcd9kv+xO+tIq3q9Y8B5OF6yr/iiDw==", + "dev": true, + "requires": { + "yargs": "^8.0.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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "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" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "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" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "javascript-stringify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", @@ -6366,6 +6617,35 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, + "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" + }, + "dependencies": { + "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" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -6520,6 +6800,12 @@ "semver": "^5.6.0" } }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -8340,6 +8626,44 @@ } } }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -9484,6 +9808,12 @@ "ansi-regex": "^4.1.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-comments": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", @@ -9811,6 +10141,27 @@ "semver": "^5.0.1" } }, + "ts-node": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", + "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "dependencies": { + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true + } + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -11054,6 +11405,12 @@ "decamelize": "^1.2.0" } }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "yorkie": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", diff --git a/package.json b/package.json index b66ff84..451d813 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,11 @@ "version": "0.1.0", "private": true, "scripts": { + "start": "npm run serve", "serve": "vue-cli-service serve", "build": "vue-cli-service build", - "lint": "vue-cli-service lint" + "lint": "vue-cli-service lint", + "test": "jasmine-ts --config=jasmine.json --project tsconfig.spec.json" }, "dependencies": { "core-js": "^2.6.5", @@ -13,15 +15,21 @@ "vue": "^2.6.10", "vue-class-component": "^7.0.2", "vue-property-decorator": "^8.1.0", - "vue-router": "^3.0.3" + "vue-router": "^3.0.3", + "@nx/typescript-domain": "git+https://solidt.eu/git/niels.kooiman/typescript-domain.git" }, "devDependencies": { + "@types/jasmine": "^3.3.9", "@vue/cli-plugin-babel": "^3.10.0", "@vue/cli-plugin-pwa": "^3.10.0", "@vue/cli-plugin-typescript": "^3.10.0", "@vue/cli-service": "^3.10.0", + "jasmine": "^3.3.1", + "jasmine-core": "^3.3.0", + "jasmine-ts": "^0.3.0", "less": "^3.0.4", "less-loader": "^4.1.0", + "ts-node": "^8.3.0", "typescript": "^3.4.3", "vue-template-compiler": "^2.6.10" } diff --git a/src/adapters/music/VinylCatalog.ts b/src/adapters/music/VinylCatalog.ts new file mode 100644 index 0000000..defb4f8 --- /dev/null +++ b/src/adapters/music/VinylCatalog.ts @@ -0,0 +1,42 @@ +import { Track } from "../../domain/models/Track"; +import { IMusicRepository } from "../../domain/imports/IMusicRepository"; + +export class VinylCatalog implements IMusicRepository { + + private vinylList: Track[] = new Array( + new Track(1, "DNA.", "Kendrick Lamar", 340), + new Track(2, "Come Down", "Anderson Paak.", 430), + new Track(3, "DNA.", "Kendrick Lamar", 340), + new Track(4, "DNA.", "Kendrick Lamar", 340), + new Track(5, "DNA.", "Kendrick Lamar", 340) + ); + + public get(): Track[] { + return this.vinylList; + } + public getById(id: number): Track { + return this.vinylList.filter(track => track.id === id).pop(); + } + public add(track: Track): number { + return this.vinylList.push(track); + } + public edit(id: number, track: Track): Track { + const existingTrack = this.getById(id); + if (existingTrack) { + existingTrack.artist = track.artist; + existingTrack.title = track.title; + existingTrack.duration = track.duration; + return existingTrack; + } + throw new Error("Track not found"); + } + public delete(id: number): Track { + const track = this.getById(id); + if (track) { + const targetIndex = this.vinylList.indexOf(track); + if (targetIndex < -1) { return null; } + return this.vinylList.splice(targetIndex, 1)[0]; + } + return null; + } +} diff --git a/src/domain/dependencies.ts b/src/domain/dependencies.ts new file mode 100644 index 0000000..c1a4ccb --- /dev/null +++ b/src/domain/dependencies.ts @@ -0,0 +1,9 @@ + +import { BaseResolver } from "@nx/typescript-domain"; +import { IMusicRepository } from "./imports/IMusicRepository"; + +class Dependencies extends BaseResolver { + get MusicRepository() { return this.resolve("IMusicRepository"); } +} +const dependencies = new Dependencies(); +export default dependencies; diff --git a/src/domain/domain.ts b/src/domain/domain.ts new file mode 100644 index 0000000..0d4a078 --- /dev/null +++ b/src/domain/domain.ts @@ -0,0 +1,9 @@ + +import { BaseResolver } from "@nx/typescript-domain"; +import { IMusicCatalog } from "./exports/IMusicCatalog"; + +class Domain extends BaseResolver { + public get musicCatalog() { return this.resolve("IMusicCatalog"); } +} +const domain = new Domain(); +export default domain; diff --git a/src/domain/exports/IMusicCatalog.ts b/src/domain/exports/IMusicCatalog.ts new file mode 100644 index 0000000..f4bcf94 --- /dev/null +++ b/src/domain/exports/IMusicCatalog.ts @@ -0,0 +1,10 @@ +import { Track } from "../models/Track"; + + +export interface IMusicCatalog { + get(): Track[]; + getById(id: number): Track; + add(track: Track): number; + edit(id: number, track: Track): Track; + delete(id: number): Track; +} diff --git a/src/domain/imports/IMusicRepository.ts b/src/domain/imports/IMusicRepository.ts new file mode 100644 index 0000000..5ff98f8 --- /dev/null +++ b/src/domain/imports/IMusicRepository.ts @@ -0,0 +1,10 @@ +import { Track } from "../models/Track"; + + +export interface IMusicRepository { + get(): Track[]; + getById(id: number): Track; + add(track: Track): number; + edit(id: number, track: Track): Track; + delete(id: number): Track; +} diff --git a/src/domain/models/Track.ts b/src/domain/models/Track.ts new file mode 100644 index 0000000..3c4097d --- /dev/null +++ b/src/domain/models/Track.ts @@ -0,0 +1,14 @@ + +export class Track { + public id: number; + public title: string; + public artist: string; + public duration: number; + + constructor(id: number, title: string, artist: string, duration: number) { + this.id = id; + this.title = title; + this.artist = artist; + this.duration = duration; + } +} diff --git a/src/domain/services/BaseService.ts b/src/domain/services/BaseService.ts new file mode 100644 index 0000000..68d18cd --- /dev/null +++ b/src/domain/services/BaseService.ts @@ -0,0 +1,5 @@ + + +export class BaseService { + +} diff --git a/src/domain/services/MusicCatalogService.spec.ts b/src/domain/services/MusicCatalogService.spec.ts new file mode 100644 index 0000000..4daa60f --- /dev/null +++ b/src/domain/services/MusicCatalogService.spec.ts @@ -0,0 +1,20 @@ +import "jasmine"; +import { resolver } from "../../wiring/TestWiring"; +import domain from "../domain"; +import { MusicCatalogService } from "./MusicCatalogService"; +import { IMusicRepository } from "../imports/IMusicRepository"; +import { IMusicCatalog } from "../exports/IMusicCatalog"; + +const fakeMusicRepository = { get: () => { console.log("fakeMusicRepository"); } } as IMusicRepository; + +describe("MusicCatalog", () => { + it("should create a new MusicCatalog", (done: any) => { + const spiedGet = spyOn(fakeMusicRepository, "get").and.returnValue([]); + resolver.registerInstance("IMusicRepository", () => fakeMusicRepository); + resolver.registerInstance("IMusicCatalog", () => new MusicCatalogService()); + domain.musicCatalog.get(); + + expect(spiedGet.calls.count()).toBe(1); + done(); + }); +}); diff --git a/src/domain/services/MusicCatalogService.ts b/src/domain/services/MusicCatalogService.ts new file mode 100644 index 0000000..2752a86 --- /dev/null +++ b/src/domain/services/MusicCatalogService.ts @@ -0,0 +1,26 @@ +import { BaseService } from "./BaseService"; + +import dependencies from "../../domain/dependencies"; +import { Track } from "../../domain/models/Track"; +import { IMusicCatalog } from "../exports/IMusicCatalog"; + +export class MusicCatalogService extends BaseService implements IMusicCatalog { + constructor() { + super(); + } + public get(): Track[] { + return dependencies.MusicRepository.get(); + } + public getById(id: number): Track { + return dependencies.MusicRepository.getById(id); + } + public add(track: Track): number { + return dependencies.MusicRepository.add(track); + } + public edit(id: number, track: Track): Track { + return dependencies.MusicRepository.edit(id, track); + } + public delete(id: number): Track { + return dependencies.MusicRepository.delete(id); + } +} diff --git a/src/main.ts b/src/main.ts index 43c2ece..c8955e9 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,11 +1,12 @@ -import Vue from 'vue'; -import App from './App.vue'; -import router from './router'; -import './registerServiceWorker'; +import Vue from "vue"; +import App from "./App.vue"; +import router from "./router"; +import "./registerServiceWorker"; +import "./wiring/Wiring"; Vue.config.productionTip = false; new Vue({ router, render: (h) => h(App), -}).$mount('#app'); +}).$mount("#app"); diff --git a/src/registerServiceWorker.ts b/src/registerServiceWorker.ts index ef87577..7c049be 100644 --- a/src/registerServiceWorker.ts +++ b/src/registerServiceWorker.ts @@ -1,32 +1,32 @@ /* tslint:disable:no-console */ -import { register } from 'register-service-worker'; +import { register } from "register-service-worker"; -if (process.env.NODE_ENV === 'production') { +if (process.env.NODE_ENV === "production") { register(`${process.env.BASE_URL}service-worker.js`, { ready() { console.log( - 'App is being served from cache by a service worker.\n' + - 'For more details, visit https://goo.gl/AFskqB', + "App is being served from cache by a service worker.\n" + + "For more details, visit https://goo.gl/AFskqB", ); }, registered() { - console.log('Service worker has been registered.'); + console.log("Service worker has been registered."); }, cached() { - console.log('Content has been cached for offline use.'); + console.log("Content has been cached for offline use."); }, updatefound() { - console.log('New content is downloading.'); + console.log("New content is downloading."); }, updated() { - console.log('New content is available; please refresh.'); + console.log("New content is available; please refresh."); }, offline() { - console.log('No internet connection found. App is running in offline mode.'); + console.log("No internet connection found. App is running in offline mode."); }, error(error) { - console.error('Error during service worker registration:', error); + console.error("Error during service worker registration:", error); }, }); } diff --git a/src/router.ts b/src/router.ts index e540d9a..2815a80 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,23 +1,23 @@ -import Vue from 'vue'; -import Router from 'vue-router'; -import Home from './views/Home.vue'; +import Vue from "vue"; +import Router from "vue-router"; +import Home from "./views/Home.vue"; Vue.use(Router); export default new Router({ routes: [ { - path: '/', - name: 'home', + path: "/", + name: "home", component: Home, }, { - path: '/about', - name: 'about', + path: "/about", + name: "about", // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. - component: () => import(/* webpackChunkName: "about" */ './views/About.vue'), + component: () => import(/* webpackChunkName: "about" */ "./views/About.vue"), }, ], }); diff --git a/src/views/Home.vue b/src/views/Home.vue index c56cb01..c05ac7f 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -6,8 +6,8 @@