Fix linter errors; add domain; add unit test support

This commit is contained in:
Niels Kooiman
2019-08-14 10:13:49 +02:00
parent 6f70ba29c9
commit 1b6fa67294
21 changed files with 628 additions and 29 deletions

4
jasmine.json Normal file
View File

@@ -0,0 +1,4 @@
{
"spec_dir": "src",
"spec_files": ["**/*.spec.ts"]
}

357
package-lock.json generated
View File

@@ -894,6 +894,10 @@
"integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
"dev": true "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": { "@soda/friendly-errors-webpack-plugin": {
"version": "1.7.1", "version": "1.7.1",
"resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz", "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/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": { "@types/minimatch": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
@@ -1625,6 +1635,12 @@
"integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==",
"dev": true "dev": true
}, },
"arg": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz",
"integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==",
"dev": true
},
"argparse": { "argparse": {
"version": "1.0.10", "version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -6115,6 +6131,241 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true "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": { "javascript-stringify": {
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz",
@@ -6366,6 +6617,35 @@
"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
"dev": true "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": { "loader-runner": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
@@ -6520,6 +6800,12 @@
"semver": "^5.6.0" "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": { "map-age-cleaner": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "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": { "readable-stream": {
"version": "2.3.6", "version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
@@ -9484,6 +9808,12 @@
"ansi-regex": "^4.1.0" "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": { "strip-comments": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz",
@@ -9811,6 +10141,27 @@
"semver": "^5.0.1" "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": { "tslib": {
"version": "1.10.0", "version": "1.10.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
@@ -11054,6 +11405,12 @@
"decamelize": "^1.2.0" "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": { "yorkie": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz",

View File

@@ -3,9 +3,11 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"start": "npm run serve",
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",
"build": "vue-cli-service build", "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": { "dependencies": {
"core-js": "^2.6.5", "core-js": "^2.6.5",
@@ -13,15 +15,21 @@
"vue": "^2.6.10", "vue": "^2.6.10",
"vue-class-component": "^7.0.2", "vue-class-component": "^7.0.2",
"vue-property-decorator": "^8.1.0", "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": { "devDependencies": {
"@types/jasmine": "^3.3.9",
"@vue/cli-plugin-babel": "^3.10.0", "@vue/cli-plugin-babel": "^3.10.0",
"@vue/cli-plugin-pwa": "^3.10.0", "@vue/cli-plugin-pwa": "^3.10.0",
"@vue/cli-plugin-typescript": "^3.10.0", "@vue/cli-plugin-typescript": "^3.10.0",
"@vue/cli-service": "^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": "^3.0.4",
"less-loader": "^4.1.0", "less-loader": "^4.1.0",
"ts-node": "^8.3.0",
"typescript": "^3.4.3", "typescript": "^3.4.3",
"vue-template-compiler": "^2.6.10" "vue-template-compiler": "^2.6.10"
} }

View File

@@ -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;
}
}

View File

@@ -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>("IMusicRepository"); }
}
const dependencies = new Dependencies();
export default dependencies;

9
src/domain/domain.ts Normal file
View File

@@ -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>("IMusicCatalog"); }
}
const domain = new Domain();
export default domain;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,5 @@
export class BaseService {
}

View File

@@ -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>("IMusicRepository", () => fakeMusicRepository);
resolver.registerInstance<IMusicCatalog>("IMusicCatalog", () => new MusicCatalogService());
domain.musicCatalog.get();
expect(spiedGet.calls.count()).toBe(1);
done();
});
});

View File

@@ -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);
}
}

View File

@@ -1,11 +1,12 @@
import Vue from 'vue'; import Vue from "vue";
import App from './App.vue'; import App from "./App.vue";
import router from './router'; import router from "./router";
import './registerServiceWorker'; import "./registerServiceWorker";
import "./wiring/Wiring";
Vue.config.productionTip = false; Vue.config.productionTip = false;
new Vue({ new Vue({
router, router,
render: (h) => h(App), render: (h) => h(App),
}).$mount('#app'); }).$mount("#app");

View File

@@ -1,32 +1,32 @@
/* tslint:disable:no-console */ /* 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`, { register(`${process.env.BASE_URL}service-worker.js`, {
ready() { ready() {
console.log( console.log(
'App is being served from cache by a service worker.\n' + "App is being served from cache by a service worker.\n" +
'For more details, visit https://goo.gl/AFskqB', "For more details, visit https://goo.gl/AFskqB",
); );
}, },
registered() { registered() {
console.log('Service worker has been registered.'); console.log("Service worker has been registered.");
}, },
cached() { cached() {
console.log('Content has been cached for offline use.'); console.log("Content has been cached for offline use.");
}, },
updatefound() { updatefound() {
console.log('New content is downloading.'); console.log("New content is downloading.");
}, },
updated() { updated() {
console.log('New content is available; please refresh.'); console.log("New content is available; please refresh.");
}, },
offline() { 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) { error(error) {
console.error('Error during service worker registration:', error); console.error("Error during service worker registration:", error);
}, },
}); });
} }

View File

@@ -1,23 +1,23 @@
import Vue from 'vue'; import Vue from "vue";
import Router from 'vue-router'; import Router from "vue-router";
import Home from './views/Home.vue'; import Home from "./views/Home.vue";
Vue.use(Router); Vue.use(Router);
export default new Router({ export default new Router({
routes: [ routes: [
{ {
path: '/', path: "/",
name: 'home', name: "home",
component: Home, component: Home,
}, },
{ {
path: '/about', path: "/about",
name: 'about', name: "about",
// route level code-splitting // route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route // this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited. // which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ './views/About.vue'), component: () => import(/* webpackChunkName: "about" */ "./views/About.vue"),
}, },
], ],
}); });

View File

@@ -6,8 +6,8 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { Component, Vue } from 'vue-property-decorator'; import { Component, Vue } from "vue-property-decorator";
import HelloWorld from '@/components/HelloWorld.vue'; // @ is an alias to /src import HelloWorld from "@/components/HelloWorld.vue"; // @ is an alias to /src
@Component({ @Component({
components: { components: {

19
src/wiring/TestWiring.ts Normal file
View File

@@ -0,0 +1,19 @@
import domain from "../domain/domain";
import dependencies from "../domain/dependencies";
import { PortResolver } from "@nx/typescript-domain";
export class TestWiring {
private portResolver: PortResolver;
constructor() {
this.portResolver = new PortResolver();
domain.setResolver(this.portResolver);
dependencies.setResolver(this.portResolver);
}
get resolver() {
return this.portResolver;
}
}
const wiring = new TestWiring();
export const resolver = wiring.resolver;
export default wiring;

24
src/wiring/Wiring.ts Normal file
View File

@@ -0,0 +1,24 @@
import domain from "../domain/domain";
import dependencies from "../domain/dependencies";
import { PortResolver } from "@nx/typescript-domain";
import { VinylCatalog } from "../adapters/music/VinylCatalog";
import { IMusicRepository } from "../domain/imports/IMusicRepository";
import { IMusicCatalog } from "../domain/exports/IMusicCatalog";
import { MusicCatalogService } from "../domain/services/MusicCatalogService";
export class Wiring {
constructor() {
const portResolver = new PortResolver();
domain.setResolver(portResolver);
dependencies.setResolver(portResolver);
// register imports
portResolver.registerInstance<IMusicRepository>("IMusicRepository", () => new VinylCatalog());
// register exports
portResolver.registerInstance<IMusicCatalog>("IMusicCatalog", () => new MusicCatalogService());
}
}
const wiring = new Wiring();
export default wiring;

View File

@@ -3,6 +3,7 @@
"target": "esnext", "target": "esnext",
"module": "esnext", "module": "esnext",
"strict": true, "strict": true,
"strictNullChecks": false,
"jsx": "preserve", "jsx": "preserve",
"importHelpers": true, "importHelpers": true,
"moduleResolution": "node", "moduleResolution": "node",
@@ -34,6 +35,7 @@
"tests/**/*.tsx" "tests/**/*.tsx"
], ],
"exclude": [ "exclude": [
"node_modules" "node_modules",
"**/*.spec.ts"
] ]
} }

36
tsconfig.spec.json Normal file
View File

@@ -0,0 +1,36 @@
{
"compilerOptions": {
"target": "esnext",
"module": "commonjs",
"strict": true,
"strictNullChecks": false,
"jsx": "preserve",
"importHelpers": true,
"moduleResolution": "node",
"experimentalDecorators": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"sourceMap": true,
"baseUrl": ".",
"types": [
"jasmine"
],
"paths": {
"@/*": [
"src/*"
]
},
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
},
"include": [
"src/**/*.ts",
],
"exclude": [
"node_modules"
]
}

View File

@@ -14,6 +14,9 @@
"no-consecutive-blank-lines": false, "no-consecutive-blank-lines": false,
"object-literal-sort-keys": false, "object-literal-sort-keys": false,
"ordered-imports": false, "ordered-imports": false,
"quotemark": [true, "single"] "quotemark": [true, "double"],
"no-console": false,
"trailing-comma": false,
"arrow-parens": false
} }
} }