Compare commits

...

116 Commits

Author SHA1 Message Date
Arne
417179a5e2 Merge branch 'master' into main 2023-09-28 15:37:10 +02:00
Arne
37e6e6d003 Latest 2023-09-28 15:33:05 +02:00
Arne
11bdecc6d3 Added config concept 2023-04-02 21:59:10 +02:00
Arne
7611f10b1c Initial commit 2023-04-02 20:35:10 +02:00
Amadou A. DIENE
80ffb8b70c Merge pull request #35 from sourcygen/develop
Upgrading technical stack (Angular/Electron)
2022-09-24 15:48:09 +02:00
DIENE
6422846605 chore(release): 3.2.0 2022-09-24 15:21:26 +02:00
Amadou Ada DIENE
f1fce63e24 feat: electron upgrade - 18.0.3 => 20.2.0 2022-09-24 15:01:33 +02:00
Amadou Ada DIENE
fa6222a1a8 feat: angular upgrade - 13.3.2 => 14.2.3 2022-09-22 23:34:10 +02:00
Amadou Ada DIENE
b37c040655 Merge branch 'develop' 2022-04-07 11:27:47 +02:00
Amadou Ada DIENE
573b91d224 chore(release): 3.1.0 2022-04-07 11:25:36 +02:00
Amadou Ada DIENE
344127b617 Merge branch 'develop' 2022-04-07 11:24:55 +02:00
Amadou Ada DIENE
eed389b59b docs(readme): update readme 2022-04-07 11:22:07 +02:00
Amadou Ada DIENE
87a43b0b37 chore(ci): update ci node matrix version 2022-04-07 11:08:17 +02:00
Amadou Ada DIENE
a69186daaa Merge branch 'develop' 2022-04-07 10:58:31 +02:00
Amadou Ada DIENE
a54cbf1338 chore(release): 3.0.0 2022-04-07 10:54:54 +02:00
Amadou A. DIENE
36eea85b97 chore(deps): bump angular from 12.2.0 to 13.3.2 (#33) 2022-04-07 10:51:42 +02:00
Amadou A. DIENE
d7c7af13f1 feat: migrating electron e2e from spectron (deprecated) to wdio (#32) 2022-04-07 09:14:32 +02:00
Amadou A. DIENE
3534d64960 chore: merge pull request #31 from sourcygen/feature/dependabot 2022-04-05 10:46:35 +02:00
Amadou Ada DIENE
99b46f891b chore: dependabot config 2022-04-05 10:34:41 +02:00
DIENE Amadou Ada
f580c85587 chore: mere branch 'master' into develop 2022-04-05 10:15:02 +02:00
Amadou A. DIENE
18b1137641 Merge pull request #29 from sourcygen/dependabot/npm_and_yarn/nanoid-3.3.2
chore(deps): bump nanoid from 3.1.23 to 3.3.2
2022-04-05 09:56:22 +02:00
dependabot[bot]
83791ed223 chore(deps): bump nanoid from 3.1.23 to 3.3.2
Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.23 to 3.3.2.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.1.23...3.3.2)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:53:16 +00:00
Amadou A. DIENE
0cb9e5cebe Merge pull request #28 from sourcygen/dependabot/npm_and_yarn/plist-3.0.5
chore(deps): bump plist from 3.0.4 to 3.0.5
2022-04-05 09:52:02 +02:00
Amadou A. DIENE
a6b5cf62da Create close-inactive-issues.yml 2022-04-05 09:38:41 +02:00
dependabot[bot]
3ea3016e2c chore(deps): bump plist from 3.0.4 to 3.0.5
Bumps [plist](https://github.com/TooTallNate/node-plist) from 3.0.4 to 3.0.5.
- [Release notes](https://github.com/TooTallNate/node-plist/releases)
- [Changelog](https://github.com/TooTallNate/plist.js/blob/master/History.md)
- [Commits](https://github.com/TooTallNate/node-plist/commits)

---
updated-dependencies:
- dependency-name: plist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:31:40 +00:00
Amadou A. DIENE
2ae1d82a65 Merge pull request #27 from sourcygen/dependabot/npm_and_yarn/axios-0.21.4
chore(deps): bump axios from 0.21.1 to 0.21.4
2022-04-05 09:30:43 +02:00
Amadou A. DIENE
875b4dc352 Merge pull request #26 from sourcygen/dependabot/npm_and_yarn/workspaces/angular-app/jszip-3.9.0
chore(deps): bump jszip from 3.6.0 to 3.9.0 in /workspaces/angular-app
2022-04-05 09:30:28 +02:00
dependabot[bot]
fd8ba8faa2 chore(deps): bump axios from 0.21.1 to 0.21.4
Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:19:21 +00:00
dependabot[bot]
b0f5125908 chore(deps): bump jszip from 3.6.0 to 3.9.0 in /workspaces/angular-app
Bumps [jszip](https://github.com/Stuk/jszip) from 3.6.0 to 3.9.0.
- [Release notes](https://github.com/Stuk/jszip/releases)
- [Changelog](https://github.com/Stuk/jszip/blob/master/CHANGES.md)
- [Commits](https://github.com/Stuk/jszip/compare/v3.6.0...v3.9.0)

---
updated-dependencies:
- dependency-name: jszip
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:18:41 +00:00
Amadou A. DIENE
dd644fc971 Merge pull request #25 from sourcygen/dependabot/npm_and_yarn/workspaces/angular-app/nanoid-3.3.2
chore(deps): bump nanoid from 3.1.23 to 3.3.2 in /workspaces/angular-app
2022-04-05 09:18:21 +02:00
Amadou A. DIENE
242ee0777a Merge pull request #24 from sourcygen/dependabot/npm_and_yarn/workspaces/angular-app/tar-6.1.11
chore(deps): bump tar from 6.1.0 to 6.1.11 in /workspaces/angular-app
2022-04-05 09:18:04 +02:00
Amadou A. DIENE
c3015fceda Merge pull request #23 from sourcygen/dependabot/npm_and_yarn/workspaces/angular-app/nth-check-2.0.1
chore(deps): bump nth-check from 2.0.0 to 2.0.1 in /workspaces/angular-app
2022-04-05 09:17:44 +02:00
Amadou A. DIENE
3efa03eb36 Merge pull request #22 from sourcygen/dependabot/npm_and_yarn/minimist-1.2.6
chore(deps): bump minimist from 1.2.5 to 1.2.6
2022-04-05 09:17:30 +02:00
Amadou A. DIENE
5b230c835d Merge pull request #20 from sourcygen/dependabot/npm_and_yarn/electron-13.6.6
chore(deps): bump electron from 13.1.8 to 13.6.6
2022-04-05 09:11:28 +02:00
dependabot[bot]
07e35d881d chore(deps): bump electron from 13.1.8 to 13.6.6
Bumps [electron](https://github.com/electron/electron) from 13.1.8 to 13.6.6.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v13.1.8...v13.6.6)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:11:00 +00:00
dependabot[bot]
9dfd320aea chore(deps): bump minimist from 1.2.5 to 1.2.6
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:10:58 +00:00
Amadou A. DIENE
4420ac799e Merge pull request #18 from sourcygen/dependabot/npm_and_yarn/karma-6.3.16
chore(deps-dev): bump karma from 6.3.4 to 6.3.16
2022-04-05 09:09:50 +02:00
Amadou A. DIENE
f65368c9c3 Merge pull request #17 from sourcygen/dependabot/npm_and_yarn/workspaces/angular-app/karma-6.3.16
chore(deps-dev): bump karma from 6.3.4 to 6.3.16 in /workspaces/angular-app
2022-04-05 09:09:24 +02:00
dependabot[bot]
470d52309e chore(deps): bump nanoid from 3.1.23 to 3.3.2 in /workspaces/angular-app
Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.23 to 3.3.2.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.1.23...3.3.2)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:08:54 +00:00
dependabot[bot]
941de4c1dc chore(deps): bump tar from 6.1.0 to 6.1.11 in /workspaces/angular-app
Bumps [tar](https://github.com/npm/node-tar) from 6.1.0 to 6.1.11.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.1.0...v6.1.11)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:08:52 +00:00
Amadou A. DIENE
6f069d5cec Merge pull request #16 from sourcygen/dependabot/npm_and_yarn/plist-3.0.4
chore(deps): bump plist from 3.0.3 to 3.0.4
2022-04-05 09:08:46 +02:00
dependabot[bot]
6d32dc1adb chore(deps-dev): bump karma from 6.3.4 to 6.3.16
Bumps [karma](https://github.com/karma-runner/karma) from 6.3.4 to 6.3.16.
- [Release notes](https://github.com/karma-runner/karma/releases)
- [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md)
- [Commits](https://github.com/karma-runner/karma/compare/v6.3.4...v6.3.16)

---
updated-dependencies:
- dependency-name: karma
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:08:18 +00:00
Amadou A. DIENE
09d8e219e1 Merge pull request #15 from sourcygen/dependabot/npm_and_yarn/url-parse-1.5.10
chore(deps): bump url-parse from 1.5.1 to 1.5.10
2022-04-05 09:08:03 +02:00
dependabot[bot]
bc5740c90c chore(deps-dev): bump karma in /workspaces/angular-app
Bumps [karma](https://github.com/karma-runner/karma) from 6.3.4 to 6.3.16.
- [Release notes](https://github.com/karma-runner/karma/releases)
- [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md)
- [Commits](https://github.com/karma-runner/karma/compare/v6.3.4...v6.3.16)

---
updated-dependencies:
- dependency-name: karma
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:07:41 +00:00
Amadou A. DIENE
5e7210125a Merge pull request #14 from sourcygen/dependabot/npm_and_yarn/workspaces/angular-app/url-parse-1.5.10
chore(deps): bump url-parse from 1.5.3 to 1.5.10 in /workspaces/angular-app
2022-04-05 09:07:10 +02:00
dependabot[bot]
b2b6f8be9f chore(deps): bump nth-check in /workspaces/angular-app
Bumps [nth-check](https://github.com/fb55/nth-check) from 2.0.0 to 2.0.1.
- [Release notes](https://github.com/fb55/nth-check/releases)
- [Commits](https://github.com/fb55/nth-check/compare/v2.0.0...v2.0.1)

---
updated-dependencies:
- dependency-name: nth-check
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:06:55 +00:00
dependabot[bot]
6c006970a8 chore(deps): bump url-parse in /workspaces/angular-app
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.10.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.10)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 07:06:50 +00:00
Amadou A. DIENE
0dc18d8c43 Merge pull request #11 from sourcygen/dependabot/npm_and_yarn/workspaces/angular-app/follow-redirects-1.14.8
chore(deps): bump follow-redirects from 1.14.1 to 1.14.8 in /workspaces/angular-app
2022-04-05 09:05:53 +02:00
Amadou A. DIENE
a0a5028ae2 Merge pull request #10 from sourcygen/dependabot/npm_and_yarn/follow-redirects-1.14.8
chore(deps): bump follow-redirects from 1.14.1 to 1.14.8
2022-04-05 09:05:07 +02:00
dependabot[bot]
43897efe1b chore(deps): bump plist from 3.0.3 to 3.0.4
Bumps [plist](https://github.com/TooTallNate/node-plist) from 3.0.3 to 3.0.4.
- [Release notes](https://github.com/TooTallNate/node-plist/releases)
- [Changelog](https://github.com/TooTallNate/plist.js/blob/master/History.md)
- [Commits](https://github.com/TooTallNate/node-plist/commits)

---
updated-dependencies:
- dependency-name: plist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-02 02:43:30 +00:00
dependabot[bot]
ad28164188 chore(deps): bump url-parse from 1.5.1 to 1.5.10
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.10.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.10)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-27 23:03:59 +00:00
dependabot[bot]
e207f64bb1 chore(deps): bump follow-redirects in /workspaces/angular-app
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.1 to 1.14.8.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.1...v1.14.8)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-15 00:56:03 +00:00
dependabot[bot]
40915f89fc chore(deps): bump follow-redirects from 1.14.1 to 1.14.8
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.1 to 1.14.8.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.1...v1.14.8)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-15 00:55:45 +00:00
Amadou A. DIENE
7b9007b02d chore: create pull_request_template.md 2021-08-31 15:37:06 +02:00
Amadou A. DIENE
6e2c007709 chore: create CODE_OF_CONDUCT.md 2021-08-31 15:19:28 +02:00
Amadou A. DIENE
7995e88f83 chore: update issue templates 2021-08-31 15:11:48 +02:00
Amadou Ada DIENE
0a74e29e0e chore: merge v2.4.0 2021-08-06 11:52:20 +02:00
Amadou Ada DIENE
2d6066532a chore(release): 2.4.0 2021-08-06 11:49:36 +02:00
Amadou Ada DIENE
923cd6fe2f docs: improving README regarding how to update deps 2021-08-06 11:37:36 +02:00
Amadou Ada DIENE
acdaa86ab8 chore: updating dependencies 2021-08-06 11:36:59 +02:00
Amadou Ada DIENE
19955a01b1 chore: merge v2.3.0 2021-08-02 00:04:20 +02:00
Amadou Ada DIENE
e8a3e72523 chore(release): 2.3.0 2021-08-01 23:58:51 +02:00
Amadou Ada DIENE
351eb1a7f0 feat: ci build/test/make (github workflows) 2021-08-01 23:56:56 +02:00
Amadou Ada DIENE
23dd9f5cc8 docs: improving README regarding dependencies and icons 2021-07-31 14:49:49 +02:00
Amadou Ada DIENE
2feedcefc5 fix: using chokidar instead of npm-watch (issue #4) 2021-07-31 14:49:38 +02:00
Amadou Ada DIENE
750aea5e0c chore: merge branch 'release/2.0.2' 2021-07-22 14:31:39 +02:00
Amadou Ada DIENE
5c11822d09 chore(release): 2.2.0 2021-07-22 14:22:02 +02:00
Amadou A. DIENE
a274767a48 Merge pull request #5 from sourcygen/hotfix/save-shared-lib-dist
fix: shared-lib not found
2021-07-22 14:13:10 +02:00
Amadou Ada DIENE
99742e3dc1 fix: shared-lib not found
https://github.com/sourcygen/electron-angular-quick-start/issues/4
2021-07-22 14:06:31 +02:00
Amadou Ada DIENE
b55552dd00 chore: merge branch 'release/2.0.1' 2021-07-22 13:51:28 +02:00
Amadou Ada DIENE
cd7a150c1d chore(release): 2.1.0 2021-07-22 13:48:03 +02:00
Amadou Ada DIENE
4e9506aca5 feat: crossplatform icon config 2021-07-21 17:55:49 +02:00
Amadou Ada DIENE
7a3d5d7d3a feat: cypress setup for angular e2e tests 2021-07-20 17:46:47 +02:00
Amadou Ada DIENE
77b15bdfc4 feat: git hook config (husky eslint prettier) 2021-07-20 11:05:21 +02:00
Amadou Ada DIENE
1a5a76f912 fix: fixing eslint problems 2021-07-20 09:13:46 +02:00
Amadou Ada DIENE
e84821388e chore: merge branch 'release/2.0.0' 2021-07-19 12:56:50 +02:00
Amadou Ada DIENE
f45cd5d04d 2.0.0 2021-07-19 12:51:32 +02:00
Amadou A. DIENE
8d15786e5d Merge pull request #3 from sourcygen/feature/electron-forge
feat: migrate from electron-webpack to electron-forge
2021-07-19 12:42:46 +02:00
Amadou Ada DIENE
4fa2999961 feat: migrate from electron-webpack to electron-forge
Electron upgrade : 10.1.3 => 13.1.7
Angular upgrade : 10.1.3 => 12.1.2
2021-07-19 12:35:00 +02:00
Amadou Ada DIENE
ce29f13f41 chore: merge branch 'release/1.0.2' 2020-09-29 23:04:17 +02:00
Amadou Ada DIENE
433dfeb7f5 v1.0.2 2020-09-29 23:02:38 +02:00
Amadou Ada DIENE
39efb20600 feat: other dependencies upgrade 2020-09-29 23:02:27 +02:00
Amadou Ada DIENE
0924b4a4bd feat: electron upgrade : 8.2.3 => 10.1.3 2020-09-29 23:02:00 +02:00
Amadou Ada DIENE
66c7d033ac feat: angular upgrade : 9.1.1 => 10.1.3 2020-09-29 23:01:56 +02:00
Amadou Ada DIENE
aa338ca75e feat: use npm instead of yarn (issues with binaries) 2020-09-29 23:01:44 +02:00
Amadou Ada DIENE
731ce15206 chore: merge branch 'release/1.0.1' 2020-04-30 22:48:04 +02:00
Amadou Ada DIENE
afcb096f59 v1.0.1 2020-04-30 22:39:39 +02:00
Amadou A. DIENE
42f8cfdc5a Add badges 2020-04-30 21:10:29 +02:00
Amadou Ada DIENE
215fde1a64 Add Travis CI 2020-04-30 21:10:19 +02:00
Amadou A. DIENE
ff2953fc4f Add MIT license 2020-04-30 21:10:11 +02:00
Amadou A. DIENE
e87515e49a Update README.md 2020-04-30 21:10:05 +02:00
Amadou A. DIENE
21b3408214 Set theme jekyll-theme-cayman 2020-04-30 21:09:59 +02:00
Amadou Ada DIENE
56fc02295b chore: merge branch 'release/1.0.0' 2020-04-30 11:04:34 +02:00
Amadou Ada DIENE
a1c2aa35bd docs(readme): readme init 2020-04-30 10:38:44 +02:00
Amadou Ada DIENE
f442df72c4 fix: reopening window crash on macos 2020-04-30 10:21:02 +02:00
Amadou Ada DIENE
4a0397f56e feat: conventional commit setup 2020-04-30 10:13:37 +02:00
Amadou Ada DIENE
fd598bb10d feat: log setup with winston 2020-04-30 09:39:49 +02:00
Amadou Ada DIENE
8822440f7d feat: env config setup 2020-04-29 22:06:18 +02:00
Amadou Ada DIENE
f17719c7e8 feat: i18n setup with ngx-translate 2020-04-29 22:06:18 +02:00
Amadou Ada DIENE
720223ec7f feat: icon settings 2020-04-29 18:16:15 +02:00
Amadou Ada DIENE
2559e973dc feat: packaging config 2020-04-28 18:56:23 +02:00
Amadou Ada DIENE
7e02b37b10 feat: add electron e2e launch scripts 2020-04-20 02:06:00 +02:00
Amadou Ada DIENE
45a02e392c feat: init electron e2e code source 2020-04-20 01:56:15 +02:00
Amadou Ada DIENE
8543cf148c feat: decrease security in e2e tests 2020-04-20 01:54:53 +02:00
Amadou Ada DIENE
a100e3c488 feat: add spectron and utility dependencies 2020-04-20 01:51:36 +02:00
Amadou Ada DIENE
83301e0fe7 feat: adapt angular part 2020-04-18 17:42:49 +02:00
Amadou Ada DIENE
73acf88a07 feat: adapt electron part 2020-04-18 17:42:40 +02:00
Amadou Ada DIENE
647889cd70 feat: init shared code source 2020-04-18 17:42:33 +02:00
Amadou Ada DIENE
afd8916d71 feat: add electron packaging scripts 2020-04-18 17:37:15 +02:00
Amadou Ada DIENE
0c82cf4259 feat: disable remote content execution 2020-04-18 17:37:15 +02:00
Amadou Ada DIENE
9c8788fb2e feat: change project structure to meet targeted architecture 2020-04-18 17:37:15 +02:00
Amadou Ada DIENE
f506c0c2ab feat: add electron dependencies 2020-04-18 17:37:15 +02:00
Amadou Ada DIENE
47c74d015d feat: move production dependencies into development dependencies 2020-04-18 17:35:18 +02:00
Amadou Ada DIENE
ea90fd845f feat: change project structure to meet targeted architecture 2020-04-18 17:34:27 +02:00
Amadou Ada DIENE
cae7f629aa feat: init new angular project with angular cli 2020-04-17 21:00:52 +02:00
Amadou A. DIENE
ae45b810de Initial commit 2020-04-17 17:51:38 +02:00
130 changed files with 48573 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
import { app, shell } from 'electron';
import { Window } from './window';
export class App {
static launch() {
app.on('window-all-closed', App.quit);
app.on('activate', App.start);
app.on('ready', App.start);
// Limit navigation and open external links in default browser
app.on('web-contents-created', App.openExternalLinksInDefaultBrowser);
}
static get electronWindow() {
return this._wrapper ? this._wrapper.electronWindow : undefined;
}
static start() {
// On MacOS it is common to re-create a window from app even after all windows have been closed
if (!App.electronWindow) {
App._wrapper = new Window();
}
}
static quit() {
// On MacOS it is common for applications to stay open until the user explicitly quits
// But WebDriverIO Test Runner does handle that behaviour yet
if (process.platform !== 'darwin' ||
global.appConfig.configId === 'e2e-test') {
app.quit();
}
}
}
App.openExternalLinksInDefaultBrowser = (event, contents) => {
// Disabling creation of new windows
contents.setWindowOpenHandler((handler) => {
// Telling the user platform to open this event's url in the default browser
shell.openExternal(handler.url);
// Blocking this event from loading in current app
return { action: 'deny' };
});
// Limiting navigation
contents.on('will-navigate', (event, navigationUrl) => {
const parsedUrl = new URL(navigationUrl);
// Allowing local navigation only
if (parsedUrl.origin !== 'http://localhost:4200') {
event.preventDefault();
}
});
};
//# sourceMappingURL=app.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/components/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAiB,KAAK,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC,MAAM,OAAO,GAAG;IAGR,MAAM,CAAC,MAAM;QACnB,GAAG,CAAC,EAAE,CAAC,mBAAmB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAE3B,8DAA8D;QAC9D,GAAG,CAAC,EAAE,CAAC,sBAAsB,EAAE,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACvE,CAAC;IAEM,MAAM,KAAK,cAAc;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,CAAC;IAEO,MAAM,CAAC,KAAK;QACnB,+FAA+F;QAC/F,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE;YACxB,GAAG,CAAC,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAC;SAC5B;IACF,CAAC;IAEO,MAAM,CAAC,IAAI;QAClB,sFAAsF;QACtF,6DAA6D;QAC7D,IACC,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC7B,MAAM,CAAC,SAAS,CAAC,QAAQ,KAAK,UAAU,EACvC;YACD,GAAG,CAAC,IAAI,EAAE,CAAC;SACX;IACF,CAAC;;AAEc,qCAAiC,GAAG,CAClD,KAAqB,EACrB,QAA8B,EAC7B,EAAE;IACH,oCAAoC;IACpC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,OAAgC,EAAE,EAAE;QAClE,4EAA4E;QAC5E,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEhC,kDAAkD;QAClD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,sBAAsB;IACtB,QAAQ,CAAC,EAAE,CACV,eAAe,EACf,CAAC,KAAqB,EAAE,aAAqB,EAAE,EAAE;QAChD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QACzC,iCAAiC;QACjC,IAAI,SAAS,CAAC,MAAM,KAAK,uBAAuB,EAAE;YACjD,KAAK,CAAC,cAAc,EAAE,CAAC;SACvB;IACF,CAAC,CACD,CAAC;AACH,CAAC,CAAC"}

View File

@@ -0,0 +1,126 @@
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import * as remoteMain from '@electron/remote/main';
import { app, BrowserWindow, ipcMain, nativeImage } from 'electron';
import * as path from 'node:path';
import { FileListService } from '../services/file-list-service';
import { PrintService } from './../services/print-service';
import { Logger } from '../utils/logger';
import { DoorService } from '../services/door-service';
import { readFile } from 'node:fs';
export class Window {
constructor() {
this.createWindow();
this.loadRenderer();
const fileListService = new FileListService();
this.registerService(fileListService);
this.registerService(new DoorService());
readFile('./config.json', 'utf8', (error, data) => {
if (error) {
console.log(error);
return;
}
const config = JSON.parse(data);
fileListService.setPaths(config.filePaths);
});
}
createWindow() {
this._electronWindow = new BrowserWindow({
fullscreen: false,
backgroundColor: '#FFFFFF',
icon: this.loadIcon(),
webPreferences: {
// Default behavior in Electron since 5, that
// limits the powers granted to remote content
// except in e2e test when those powers are required
nodeIntegration: global.appConfig.isNodeIntegration,
// Isolate window context to protect against prototype pollution
// except in e2e test when that access is required
contextIsolation: global.appConfig.isContextIsolation,
// Introduced in Electron 20 and enabled by default
// Among others security constraints, it prevents from required
// CommonJS modules imports into preload script
// which is not bundled yet in dev mode
sandbox: global.appConfig.isSandbox,
// Use a preload script to enhance security
preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY,
},
});
this._printService = new PrintService();
this._printService.setWindow(this._electronWindow);
this.registerService(this._printService);
// Disable the remote module to enhance security
// except in e2e test when that access is required
if (global.appConfig.isEnableRemoteModule) {
remoteMain.enable(this._electronWindow.webContents);
}
}
loadIcon() {
let iconObject;
if (global.appConfig.isIconAvailable) {
const iconPath = path.join(__dirname, 'icons/icon.png');
Logger.debug('Icon Path', iconPath);
iconObject = nativeImage.createFromPath(iconPath);
// Change dock icon on MacOS
if (iconObject && process.platform === 'darwin') {
app.dock.setIcon(iconObject);
}
}
return iconObject;
}
loadRenderer() {
if (global.appConfig.configId === 'development') {
// Dev mode, take advantage of the live reload by loading local URL
this.electronWindow.loadURL(`http://localhost:4200`);
}
else {
// Else mode, we simply load angular bundle
const indexPath = path.join(__dirname, '../renderer/angular_window/index.html');
this.electronWindow.loadURL(`file://${indexPath}`);
}
if (global.appConfig.isOpenDevTools) {
this.openDevTools();
}
// When the window is closed`
this._electronWindow.on('closed', () => {
// Remove IPC Main listeners
ipcMain.removeAllListeners();
// Delete current reference
delete this._electronWindow;
});
}
openDevTools() {
this._electronWindow.webContents.openDevTools();
this._electronWindow.webContents.on('devtools-opened', () => {
this._electronWindow.focus();
setImmediate(() => {
this._electronWindow.focus();
});
});
}
registerService(service) {
ipcMain.on(service.receptionChannel(), (event, ...parameters) => __awaiter(this, void 0, void 0, function* () {
// Handling input
const input = parameters[0];
Logger.debug(`[${service.receptionChannel()}] =====> `, input);
service.process(input).then((output) => {
// Handling output
if (service.sendingChannel()) {
Logger.debug(`[${service.sendingChannel()}] =====> `, output);
this._electronWindow.webContents.send(service.sendingChannel(), output);
}
});
}));
}
get electronWindow() {
return this._electronWindow;
}
}
//# sourceMappingURL=window.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/components/window.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,16 @@
import * as fs from 'fs-extra';
import _ from 'lodash';
import * as path from 'node:path';
import { App } from './components/app';
// Load config
const currentEnvironment = process.env.X_NODE_ENV || process.env.NODE_ENV;
const appConfigs = fs.readJsonSync(path.join(__dirname, 'config.json'));
const defaultConfig = appConfigs.development;
const currentConfig = appConfigs[currentEnvironment];
global.appConfig =
currentEnvironment === 'development'
? defaultConfig
: _.merge(defaultConfig, currentConfig);
// Launch app
App.launch();
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../workspaces/electron-app/main/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,CAAC,MAAM,QAAQ,CAAC;AACvB,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAWvC,cAAc;AACd,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC1E,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;AACxE,MAAM,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC;AAC7C,MAAM,aAAa,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACrD,MAAM,CAAC,SAAS;IACf,kBAAkB,KAAK,aAAa;QACnC,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE1C,aAAa;AACb,GAAG,CAAC,MAAM,EAAE,CAAC"}

View File

@@ -0,0 +1,13 @@
const NOT_IMPEMENTED_YET = 'Method not implemented yet.';
export class AbstractService {
receptionChannel() {
throw new Error(NOT_IMPEMENTED_YET);
}
sendingChannel() {
throw new Error(NOT_IMPEMENTED_YET);
}
process(_input) {
throw new Error(NOT_IMPEMENTED_YET);
}
}
//# sourceMappingURL=abstract-service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"abstract-service.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/services/abstract-service.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,6BAA6B,CAAC;AACzD,MAAM,OAAO,eAAe;IAC3B,gBAAgB;QACf,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC;IAED,cAAc;QACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,MAAU;QACjB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC;CACD"}

View File

@@ -0,0 +1,65 @@
import { WindowApiConst } from 'shared-lib';
import { AbstractService } from './abstract-service';
import { readFile, set_fs } from 'xlsx';
import * as fs from 'node:fs';
set_fs(fs);
export class DoorService extends AbstractService {
receptionChannel() {
return WindowApiConst.PROJECT_INPUT;
}
sendingChannel() {
return WindowApiConst.PROJECT_OUTPUT;
}
process(input) {
return new Promise((resolve) => {
var _a, _b, _c, _d, _e, _f, _g, _h;
const workbook = readFile(`${input.path}/${input.name}`);
const workingSheet = workbook.Sheets['DEURLIJST'];
const doorList = [];
// remove 2 top rows
const headers = {};
// get header values
for (let index = 65; index <= 90; index++) {
const currentValue = (_a = workingSheet[`${index}3`]) === null || _a === void 0 ? void 0 : _a.v;
switch (currentValue) {
case 'L/R':
headers['lr'] = index;
break;
case 'KRUK/SLOT':
headers['krukSlot'] = index;
break;
case 'SCHARNIER':
headers['pivot'] = index;
break;
case 'SOORT DEUR':
headers['type'] = index;
break;
case 'MODEL KRUK':
headers['modelKruk'] = index;
break;
case 'OPMERKING':
headers['remark'] = index;
break;
default: break;
}
}
console.log(headers);
// stop at 19
for (let index = 4; index < 19; index++) {
const door = {};
door.nr = (_b = workingSheet[`A${index}`]) === null || _b === void 0 ? void 0 : _b.v;
if (door.nr) {
door.lr = (_c = workingSheet[`${headers['lr']}${index}`]) === null || _c === void 0 ? void 0 : _c.v;
door.krukSlot = (_d = workingSheet[`${headers['krukSlot']}${index}`]) === null || _d === void 0 ? void 0 : _d.v;
door.pivot = (_e = workingSheet[`${headers['pivot']}${index}`]) === null || _e === void 0 ? void 0 : _e.v;
door.type = (_f = workingSheet[`${headers['type']}${index}`]) === null || _f === void 0 ? void 0 : _f.v;
door.modelKruk = (_g = workingSheet[`${headers['modelKruk']}${index}`]) === null || _g === void 0 ? void 0 : _g.v;
door.remark = (_h = workingSheet[`${headers['remark']}${index}`]) === null || _h === void 0 ? void 0 : _h.v;
doorList.push(door);
}
}
resolve(doorList);
});
}
}
//# sourceMappingURL=door-service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"door-service.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/services/door-service.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,52 @@
import { readdir } from 'node:fs';
import { WindowApiConst } from 'shared-lib';
import { AbstractService } from './abstract-service';
export class FileListService extends AbstractService {
constructor() {
super(...arguments);
this._paths = ['./assets'];
}
receptionChannel() {
return WindowApiConst.FILELIST_INPUT;
}
sendingChannel() {
return WindowApiConst.FILELIST_OUTPUT;
}
process() {
return new Promise((resolve) => {
const projects = [];
Promise.all(this._paths.map((path) => this.readPath(path))).then((result) => {
for (const entry of result.entries()) {
for (const file of entry[1].result) {
projects.push({
path: entry[1].path,
name: file,
});
}
}
resolve(projects);
});
});
}
readPath(path) {
return new Promise((resolve) => {
readdir(path, (error, fileList) => {
if (!error) {
const newList = [];
for (const file of fileList) {
newList.push(file);
}
return resolve({
path,
result: newList,
});
}
return {};
});
});
}
setPaths(inputPaths) {
this._paths = inputPaths;
}
}
//# sourceMappingURL=file-list-service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"file-list-service.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/services/file-list-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,OAAO,eAAgB,SAAQ,eAA4B;IAAjE;;QACS,WAAM,GAAa,CAAC,UAAU,CAAC,CAAC;IAiDzC,CAAC;IA/CA,gBAAgB;QACf,OAAO,cAAc,CAAC,cAAc,CAAC;IACtC,CAAC;IAED,cAAc;QACb,OAAO,cAAc,CAAC,eAAe,CAAC;IACvC,CAAC;IAED,OAAO;QACN,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE;gBAChF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE;oBACrC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;wBACnC,QAAQ,CAAC,IAAI,CAAC;4BACb,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;4BACnB,IAAI,EAAE,IAAI;yBACV,CAAC,CAAC;qBACH;iBACD;gBACD,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnB,CAAC,CAAC,CAAA;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,QAAQ,CAAC,IAAY;QAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,QAAkB,EAAE,EAAE;gBAC3C,IAAI,CAAC,KAAK,EAAE;oBACX,MAAM,OAAO,GAAa,EAAE,CAAC;oBAC7B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;wBAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACnB;oBACD,OAAO,OAAO,CAAC;wBACd,IAAI;wBACJ,MAAM,EAAE,OAAO;qBACf,CAAC,CAAC;iBACH;gBAED,OAAO,EAAE,CAAC;YACX,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,QAAQ,CAAC,UAAoB;QACnC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;IAC1B,CAAC;CACD"}

View File

@@ -0,0 +1,20 @@
// import { WindowApiConst } from 'shared-lib';
// import { AbstractService } from './abstract-service';
// export class MultiplesService extends AbstractService<number, number[]> {
// receptionChannel(): string {
// return WindowApiConst.MULTIPLES_INPUT;
// }
// sendingChannel(): string {
// return WindowApiConst.MULTIPLES_OUTPUT;
// }
// process(input: number): number[] {
// // From 1 to 10, return input multiples
// const multiples = [];
// for (let n = 1; n <= 10; n++) {
// multiples.push(n * input);
// }
// return multiples;
// }
// }
//
//# sourceMappingURL=multiples-service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"multiples-service.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/services/multiples-service.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,wDAAwD;AAExD,4EAA4E;AAC5E,gCAAgC;AAChC,2CAA2C;AAC3C,KAAK;AAEL,8BAA8B;AAC9B,4CAA4C;AAC5C,KAAK;AAEL,sCAAsC;AACtC,4CAA4C;AAC5C,0BAA0B;AAC1B,oCAAoC;AACpC,gCAAgC;AAChC,MAAM;AACN,sBAAsB;AACtB,KAAK;AACL,IAAI;AACJ,EAAE"}

View File

@@ -0,0 +1,22 @@
import { WindowApiConst } from 'shared-lib';
import { AbstractService } from './abstract-service';
export class PrintService extends AbstractService {
sendingChannel() {
return WindowApiConst.PRINT_OUTPUT;
}
receptionChannel() {
return WindowApiConst.PRINT_INPUT;
}
process() {
return new Promise((resolve) => {
if (this._browserWindow) {
this._browserWindow.webContents.print({ silent: true });
}
resolve();
});
}
setWindow(window) {
this._browserWindow = window;
}
}
//# sourceMappingURL=print-service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"print-service.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/services/print-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,OAAO,YAAa,SAAQ,eAA6B;IAE9D,cAAc;QACb,OAAO,cAAc,CAAC,YAAY,CAAC;IACpC,CAAC;IAED,gBAAgB;QACf,OAAO,cAAc,CAAC,WAAW,CAAC;IACnC,CAAC;IAED,OAAO;QACN,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,IAAI,IAAI,CAAC,cAAc,EAAE;gBACxB,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACxD;YACD,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,SAAS,CAAC,MAAqB;QACrC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;IAC9B,CAAC;CACD"}

View File

@@ -0,0 +1,113 @@
import { app } from 'electron';
import * as os from 'node:os';
import * as path from 'node:path';
import * as winston from 'winston';
export class Logger {
constructor() {
/**
* Custom winston file format
* Write JSON logs with given format :
* `${timestamp} ${level} : ${info.message} : ${meta})`
*/
this.fileFormat = winston.format.printf((data) => {
return JSON.stringify(this.prepareLogData(data));
});
/**
* Custom winston console format
* Write logs with given format :
* `${timestamp} ${level} : ${info.message} : JSON.stringify({ ...meta }) `
*/
this.consoleFormat = winston.format.printf((data) => {
const preparedData = this.prepareLogData(data);
return (`${preparedData.timestamp} ${preparedData.level} : ` +
`${preparedData.message} : ${JSON.stringify(preparedData.meta)}`);
});
this.prepareLogData = (data) => {
const additionalData = Object.assign({}, data);
delete additionalData.timestamp;
delete additionalData.level;
delete additionalData.message;
delete additionalData.service;
return {
timestamp: data.timestamp,
level: data.level,
message: data.message,
meta: additionalData,
};
};
this._logger = winston.createLogger({
level: 'debug',
format: winston.format.json(),
defaultMeta: { service: 'user-service' },
transports: [
new winston.transports.File({
filename: this.getLogFilename(),
level: global.appConfig.mainLogLevel,
format: winston.format.combine(winston.format.timestamp(), this.fileFormat),
}),
],
});
// If we're not in production then log also to the `console` with the format:
// `${info.timestamp} ${info.level}: ${info.message} JSON.stringify({ ...rest }) `
if (global.appConfig.configId === 'development') {
this._logger.add(new winston.transports.Console({
stderrLevels: ['error', 'warn'],
format: winston.format.combine(winston.format.timestamp(), this.consoleFormat),
}));
}
}
static error(message, ...meta) {
Logger.initSingleton();
Logger.singleton._logger.error(message, meta);
}
static warn(message, ...meta) {
Logger.initSingleton();
Logger.singleton._logger.warn(message, meta);
}
static info(message, ...meta) {
Logger.initSingleton();
Logger.singleton._logger.info(message, meta);
}
static http(message, ...meta) {
Logger.initSingleton();
Logger.singleton._logger.http(message, meta);
}
static verbose(message, ...meta) {
Logger.initSingleton();
Logger.singleton._logger.verbose(message, meta);
}
static debug(message, ...meta) {
Logger.initSingleton();
Logger.singleton._logger.debug(message, meta);
}
static silly(message, ...meta) {
Logger.initSingleton();
Logger.singleton._logger.silly(message, meta);
}
static initSingleton() {
if (!Logger.singleton) {
Logger.singleton = new Logger();
}
}
/**
* Returns log filename with standard path
* In production, returns absolute standard path depending on platform
*/
getLogFilename() {
let filename = global.appConfig.mainLogFile;
if (global.appConfig.configId === 'production') {
const appName = app.getName();
if (process.platform == 'linux') {
filename = `.config/${appName}/${filename}`;
}
else if (process.platform == 'darwin') {
filename = `Library/Logs/${appName}/${filename}`;
}
else if (process.platform == 'win32') {
filename = `AppData\\Roaming\\${appName}\\${filename}`;
}
}
return path.join(os.homedir(), filename);
}
}
//# sourceMappingURL=logger.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/utils/logger.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,30 @@
/**
* This file will automatically be loaded by webpack and run in the "renderer" context.
* To learn more about the differences between the "main" and the "renderer" context in
* Electron, visit:
*
* https://electronjs.org/docs/tutorial/application-architecture#main-and-renderer-processes
*
* By default, Node.js integration in this file is disabled. When enabling Node.js integration
* in a renderer process, please be aware of potential security implications. You can read
* more about security risks here:
*
* https://electronjs.org/docs/tutorial/security
*
* To enable Node.js integration in this file, open up `main.js` and enable the `nodeIntegration`
* flag:
*
* ```
* // Create the browser window.
* mainWindow = new BrowserWindow({
* width: 800,
* height: 600,
* webPreferences: {
* nodeIntegration: true
* }
* });
* ```
*/
import './index.css';
console.log('👋 This message is being logged by "renderer.js", included via webpack');
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../workspaces/electron-app/renderer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,aAAa,CAAC;AAErB,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC"}

View File

@@ -0,0 +1,53 @@
/*/ To secure user platform when running renderer process stuff,
// Node.JS and Electron APIs are only available in this script
import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron';
import { WindowApi, WindowApiConst } from 'shared-lib';
// So we expose protected methods that allow the renderer process
// to use the ipcRenderer without exposing the entire object
const windowApi: WindowApi = {
send: <In>(channel: string, input: In) => {
if (WindowApiConst.SENDING_SAFE_CHANNELS.includes(channel)) {
ipcRenderer.send(channel, input);
}
},
receive: <Out>(channel: string, callback: (output: Out) => void) => {
if (WindowApiConst.RECEIVING_SAFE_CHANNELS.includes(channel)) {
// Deliberately strip event as it includes `sender`
ipcRenderer.on(
channel,
(_event: IpcRendererEvent, ...parameters: any[]) =>
callback(parameters[0])
);
}
},
};
declare const window: Window;
if (process.env.X_NODE_ENV === 'e2e-test') {
// Injecting windowApi directly
window.api = windowApi;
} else {
// ContextBridge API can only be used when contextIsolation is enabled
// which is normally the case except in e2e test mode
contextBridge.exposeInMainWorld('api', windowApi);
}*/
import { contextBridge, ipcRenderer } from 'electron';
import { WindowApiConst } from 'shared-lib';
contextBridge.exposeInMainWorld('api', {
node: () => process.versions.node,
chrome: () => process.versions.chrome,
electron: () => process.versions.electron,
send: (channel, input) => {
if (WindowApiConst.SENDING_SAFE_CHANNELS.includes(channel)) {
ipcRenderer.send(channel, input);
}
},
receive: (channel, callback) => {
// Deliberately strip event as it includes `sender`
ipcRenderer.on(channel, (_event, ...parameters) => callback(parameters[0]));
},
// we can also expose variables, not just functions
});
console.log('The preload script has been injected successfully.');
//# sourceMappingURL=preload.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"preload.js","sourceRoot":"","sources":["../../../workspaces/electron-app/renderer/preload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAoB,MAAM,UAAU,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,aAAa,CAAC,iBAAiB,CAAC,KAAK,EAAE;IACtC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI;IACjC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACrC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzC,IAAI,EAAE,CAAK,OAAe,EAAE,KAAS,EAAE,EAAE;QACxC,IAAI,cAAc,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC3D,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SACjC;IACF,CAAC;IACD,OAAO,EAAE,CAAM,OAAe,EAAE,QAA+B,EAAE,EAAE;QAClE,mDAAmD;QACnD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,MAAwB,EAAE,GAAG,UAAiB,EAAE,EAAE,CAC1E,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACvB,CAAC;IACH,CAAC;IACD,mDAAmD;CACnD,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC"}

View File

@@ -0,0 +1,54 @@
/*import MainPage from './pageobjects/main.page';
describe('My Login application', () => {
it('should login with valid credentials', async () => {
await MainPage.open();
/*await LoginPage.open();
await LoginPage.login('tomsmith', 'SuperSecretPassword!');
await expect(SecurePage.flashAlert).toBeExisting();
await expect(SecurePage.flashAlert).toHaveTextContaining(
'You logged into a secure area!');* /
});
});* /
describe('application loading', () => {
describe('App', () => {
it('should launch the application', async () => {
console.log('==>', await browser.getTitle());
// expect(title).toEqual('Test');
});
// it('should pass args through to the launched application', async () => {
// // custom args are set in the wdio.conf.js file as they need to be set before WDIO starts
// const argv = await app.mainProcess.argv();
// expect(argv).toContain('--foo');
// expect(argv).toContain('--bar=baz');
// });
});
}); */
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
describe('A simple test to check if app window is opened, visible and with expected title', () => {
describe('App should', () => {
it('show an initial window', () => __awaiter(this, void 0, void 0, function* () {
// Checking there is one visible window
// expect(await browser.).toEqual(true);
// Please note that getWindowHandles() will return 2 if `dev tools` is opened.
const { length } = yield browser.getWindowHandles();
expect(length).toEqual(1);
}));
it('have expected title', () => __awaiter(this, void 0, void 0, function* () {
expect(yield browser.getTitle()).toEqual('ElectronAngularQuickStart');
}));
});
});
//# sourceMappingURL=app.spec.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"app.spec.js","sourceRoot":"","sources":["../../workspaces/electron-e2e/app.spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA6BM;;;;;;;;;;AAEN,QAAQ,CAAC,iFAAiF,EAAE,GAAG,EAAE;IAChG,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,wBAAwB,EAAE,GAAS,EAAE;YACvC,uCAAuC;YACvC,wCAAwC;YACxC,8EAA8E;YAC9E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAA,CAAC,CAAC;QAEH,EAAE,CAAC,qBAAqB,EAAE,GAAS,EAAE;YACpC,MAAM,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QACvE,CAAC,CAAA,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}

View File

@@ -0,0 +1,28 @@
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import MultiplesPage from './pageobjects/multiples.page';
describe('A simple test to check if a given input matches with computed multiples', () => {
describe('Multiples component should', () => {
it('show up on startup', () => __awaiter(void 0, void 0, void 0, function* () {
yield expect(MultiplesPage.root).toBeDisplayed();
}));
const number = Math.floor(Math.random() * 100) % 10;
it(`display expected results on input (${number})`, () => __awaiter(void 0, void 0, void 0, function* () {
yield MultiplesPage.enterInput(number);
const results = yield MultiplesPage.results;
for (const index of results.keys()) {
const ntimes = 1 + index;
const expected = `${number} * ${ntimes} = ${number * ntimes}`;
expect(yield results[index].getText()).toEqual(expected);
}
}));
});
});
//# sourceMappingURL=multiples.spec.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"multiples.spec.js","sourceRoot":"","sources":["../../workspaces/electron-e2e/multiples.spec.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,aAAa,MAAM,8BAA8B,CAAC;AAEzD,QAAQ,CAAC,yEAAyE,EAAE,GAAG,EAAE;IACxF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,oBAAoB,EAAE,GAAS,EAAE;YACnC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QAClD,CAAC,CAAA,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;QACpD,EAAE,CAAC,sCAAsC,MAAM,GAAG,EAAE,GAAS,EAAE;YAC9D,MAAM,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE;gBACnC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC;gBACzB,MAAM,QAAQ,GAAG,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;gBAC9D,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;aACzD;QACF,CAAC,CAAA,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}

View File

@@ -0,0 +1,38 @@
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import AbstractPage from './page';
class MultiplesPage extends AbstractPage {
/**
* Selectors using getter methods
*/
get root() {
return $('#multiples');
}
get input() {
return $('#input');
}
get results() {
return $$('.results');
}
get buttonSubmit() {
return $('button[type="submit"]');
}
/**
* Wrapper method to interact with the page
*/
enterInput(number) {
return __awaiter(this, void 0, void 0, function* () {
yield this.input.setValue(number);
yield this.buttonSubmit.click();
});
}
}
export default new MultiplesPage();
//# sourceMappingURL=multiples.page.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"multiples.page.js","sourceRoot":"","sources":["../../../workspaces/electron-e2e/pageobjects/multiples.page.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,MAAM,aAAc,SAAQ,YAAY;IACvC;;OAEG;IACH,IAAW,IAAI;QACd,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC;IAED,IAAW,KAAK;QACf,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,IAAW,OAAO;QACjB,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC;IAED,IAAW,YAAY;QACtB,OAAO,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACU,UAAU,CAAC,MAAc;;YACrC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACjC,CAAC;KAAA;CACD;AAED,eAAe,IAAI,aAAa,EAAE,CAAC"}

View File

@@ -0,0 +1,7 @@
/**
* Abstract page object containing all methods, selectors and functionality
* that is shared across all page objects
*/
export default class AbstractPage {
}
//# sourceMappingURL=page.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../../workspaces/electron-e2e/pageobjects/page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAgB,YAAY;CAEzC"}

View File

@@ -0,0 +1,362 @@
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import path from 'node:path';
// Path to local electron binary
let electronPath = path.join(__dirname, '../../node_modules/.bin/electron');
if (process.platform === 'win32') {
electronPath += '.cmd';
}
// Starting hook
const waitUntilWindowLoaded = () => __awaiter(void 0, void 0, void 0, function* () {
const timeout = 10000;
yield browser.waitUntil(() => __awaiter(void 0, void 0, void 0, function* () { return (yield browser.isLoading()) === false; }), {
timeout: timeout,
timeoutMsg: `Expected app to be loaded in less than ${timeout}ms`,
});
});
// Closing hook
const closeApplication = () => __awaiter(void 0, void 0, void 0, function* () {
if (browser) {
// Wait 1 second and close window
yield new Promise((resolve) => setTimeout(resolve, 1000));
yield browser.closeWindow();
}
});
export const config = {
//
// ====================
// Runner Configuration
// ====================
//
//
// =====================
// ts-node Configurations
// =====================
//
// You can write tests using TypeScript to get autocompletion and type safety.
// You will need typescript and ts-node installed as devDependencies.
// WebdriverIO will automatically detect if these dependencies are installed
// and will compile your config and tests for you.
// If you need to configure how ts-node runs please use the
// environment variables for ts-node or use wdio config's autoCompileOpts section.
//
autoCompileOpts: {
autoCompile: true,
// see https://github.com/TypeStrong/ts-node#cli-and-programmatic-options
// for all available options
tsNodeOpts: {
transpileOnly: true,
project: 'workspaces/electron-e2e/tsconfig.json',
},
// tsconfig-paths is only used if "tsConfigPathsOpts" are provided, if you
// do please make sure "tsconfig-paths" is installed as dependency
// tsConfigPathsOpts: {
// baseUrl: './'
// }
},
//
// ==================
// Specify Test Files
// ==================
// Define which test specs should run. The pattern is relative to the directory
// from which `wdio` was called.
//
// The specs are defined as an array of spec files (optionally using wildcards
// that will be expanded). The test for each spec file will be run in a separate
// worker process. In order to have a group of spec files run in the same worker
// process simply enclose them in an array within the specs array.
//
// If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script),
// then the current working directory is where your `package.json` resides, so `wdio`
// will be called from there.
//
specs: ['./workspaces/electron-e2e/**/*.spec.ts'],
// Patterns to exclude.
exclude: [
// 'path/to/excluded/files'
],
//
// ============
// Capabilities
// ============
// Define your capabilities here. WebdriverIO can run multiple capabilities at the same
// time. Depending on the number of capabilities, WebdriverIO launches several test
// sessions. Within your capabilities you can overwrite the spec and exclude options in
// order to group specific specs to a specific capability.
//
// First, you can define how many instances should be started at the same time. Let's
// say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
// set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
// files and you set maxInstances to 10, all spec files will get tested at the same time
// and 30 processes will get spawned. The property handles how many capabilities
// from the same test should run tests.
//
maxInstances: 10,
//
// If you have trouble getting all important capabilities together, check out the
// Sauce Labs platform configurator - a great tool to configure your capabilities:
// https://saucelabs.com/platform/platform-configurator
//
capabilities: [
{
// maxInstances can get overwritten per capability. So if you have an in-house Selenium
// grid with only 5 firefox instances available you can make sure that not more than
// 5 instances get started at a time.
maxInstances: 5,
//
browserName: 'chrome',
acceptInsecureCerts: true,
'goog:chromeOptions': {
binary: electronPath,
args: ['app=' + '.webpack/main/index.js'],
},
// If outputDir is provided WebdriverIO can capture driver session logs
// it is possible to configure which logTypes to include/exclude.
// excludeDriverLogs: ['*'], // pass '*' to exclude all driver session logs
// excludeDriverLogs: ['bugreport', 'server'],
},
],
//
// ===================
// Test Configurations
// ===================
// Define all options that are relevant for the WebdriverIO instance here
//
// Level of logging verbosity: trace | debug | info | warn | error | silent
logLevel: 'info',
//
// Set specific log levels per logger
// loggers:
// - webdriver, webdriverio
// - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service
// - @wdio/mocha-framework, @wdio/jasmine-framework
// - @wdio/local-runner
// - @wdio/sumologic-reporter
// - @wdio/cli, @wdio/config, @wdio/utils
// Level of logging verbosity: trace | debug | info | warn | error | silent
// logLevels: {
// webdriver: 'info',
// '@wdio/appium-service': 'info'
// },
//
// If you only want to run your tests until a specific amount of tests have failed use
// bail (default is 0 - don't bail, run all tests).
bail: 0,
//
// Set a base URL in order to shorten url command calls. If your `url` parameter starts
// with `/`, the base url gets prepended, not including the path portion of your baseUrl.
// If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url
// gets prepended directly.
baseUrl: 'http://localhost',
//
// Default timeout for all waitFor* commands.
waitforTimeout: 10000,
//
// Default timeout in milliseconds for request
// if browser driver or grid doesn't send response
connectionRetryTimeout: 120000,
//
// Default request retries count
connectionRetryCount: 3,
//
// Test runner services
// Services take over a specific job you don't want to take care of. They enhance
// your test setup with almost no effort. Unlike plugins, they don't add new
// commands. Instead, they hook themselves up into the test process.
services: ['chromedriver'],
// Framework you want to run your specs with.
// The following are supported: Mocha, Jasmine, and Cucumber
// see also: https://webdriver.io/docs/frameworks
//
// Make sure you have the wdio adapter package for the specific framework installed
// before running any tests.
framework: 'jasmine',
//
// The number of times to retry the entire specfile when it fails as a whole
// specFileRetries: 1,
//
// Delay in seconds between the spec file retry attempts
// specFileRetriesDelay: 0,
//
// Whether or not retried specfiles should be retried immediately or deferred to the end of the queue
// specFileRetriesDeferred: false,
//
// Test reporter for stdout.
// The only one supported by default is 'dot'
// see also: https://webdriver.io/docs/dot-reporter
reporters: ['spec', ['allure', { outputDir: 'allure-results' }]],
//
// Options to be passed to Jasmine.
jasmineOpts: {
// Jasmine default timeout
defaultTimeoutInterval: 60000,
//
// The Jasmine framework allows interception of each assertion in order to log the state of the application
// or website depending on the result. For example, it is pretty handy to take a screenshot every time
// an assertion fails.
expectationResultHandler: function (_passed, _assertion) {
// do something
},
},
//
// =====
// Hooks
// =====
// WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
// it and to build services around it. You can either apply a single function or an array of
// methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
// resolved to continue.
/**
* Gets executed once before all workers get launched.
* @param {Object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details
*/
// onPrepare: function (config, capabilities) {
// },
/**
* Gets executed before a worker process is spawned and can be used to initialise specific service
* for that worker as well as modify runtime environments in an async fashion.
* @param {String} cid capability id (e.g 0-0)
* @param {[type]} caps object containing capabilities for session that will be spawn in the worker
* @param {[type]} specs specs to be run in the worker process
* @param {[type]} args object that will be merged with the main configuration once worker is initialized
* @param {[type]} execArgv list of string arguments passed to the worker process
*/
// onWorkerStart: function (cid, caps, specs, args, execArgv) {
// },
/**
* Gets executed just after a worker process has exited.
* @param {String} cid capability id (e.g 0-0)
* @param {Number} exitCode 0 - success, 1 - fail
* @param {[type]} specs specs to be run in the worker process
* @param {Number} retries number of retries used
*/
// onWorkerEnd: function (cid, exitCode, specs, retries) {
// },
/**
* Gets executed just before initialising the webdriver session and test framework. It allows you
* to manipulate configurations depending on the capability or spec.
* @param {Object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that are to be run
* @param {String} cid worker id (e.g. 0-0)
*/
// beforeSession: function (config, capabilities, specs, cid) {
// },
/**
* Gets executed before test execution begins. At this point you can access to all global
* variables like `browser`. It is the perfect place to define custom commands.
* @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that are to be run
* @param {Object} browser instance of created browser/device session
*/
// before: function (capabilities, specs) {
// },
/**
* Runs before a WebdriverIO command gets executed.
* @param {String} commandName hook command name
* @param {Array} args arguments that command would receive
*/
// beforeCommand: function (commandName, args) {
// },
/**
* Hook that gets executed before the suite starts
* @param {Object} suite suite details
*/
beforeSuite: (_suite) => __awaiter(void 0, void 0, void 0, function* () {
yield waitUntilWindowLoaded();
}),
/**
* Function to be executed before a test (in Mocha/Jasmine) starts.
*/
// beforeTest: function (test, context) {
// },
/**
* Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
* beforeEach in Mocha)
*/
// beforeHook: function (test, context) {
// },
/**
* Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
* afterEach in Mocha)
*/
// afterHook: function (test, context, { error, result, duration, passed, retries }) {
// },
/**
* Function to be executed after a test (in Mocha/Jasmine only)
* @param {Object} test test object
* @param {Object} context scope object the test was executed with
* @param {Error} result.error error object in case the test fails, otherwise `undefined`
* @param {Any} result.result return object of test function
* @param {Number} result.duration duration of test
* @param {Boolean} result.passed true if test has passed, otherwise false
* @param {Object} result.retries informations to spec related retries, e.g. `{ attempts: 0, limit: 0 }`
*/
afterTest: function (_test, _context, result) {
return __awaiter(this, void 0, void 0, function* () {
// result = { _error, _result, _duration, passed, _retries }
if (!result.passed) {
yield browser.takeScreenshot();
}
});
},
/**
* Hook that gets executed after the suite has ended
* @param {Object} suite suite details
*/
// afterSuite: async function (_suite) {
// },
/**
* Runs after a WebdriverIO command gets executed
* @param {String} commandName hook command name
* @param {Array} args arguments that command would receive
* @param {Number} result 0 - command success, 1 - command error
* @param {Object} error error object if any
*/
// afterCommand: function (commandName, args, result, error) {
// },
/**
* Gets executed after all tests are done. You still have access to all global variables from
* the test.
* @param {Number} result 0 - test pass, 1 - test fail
* @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that ran
*/
after: (_result, _capabilities, _specs) => __awaiter(void 0, void 0, void 0, function* () {
yield closeApplication();
}),
/**
* Gets executed right after terminating the webdriver session.
* @param {Object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that ran
*/
// afterSession: function (config, capabilities, specs) {
// },
/**
* Gets executed after all workers got shut down and the process is about to exit. An error
* thrown in the onComplete hook will result in the test run failing.
* @param {Object} exitCode 0 - success, 1 - fail
* @param {Object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details
* @param {<Object>} results object containing test results
*/
// onComplete: function(_exitCode, _config, _capabilities, _results) {
// },
/**
* Gets executed when a refresh happens.
* @param {String} oldSessionId session ID of the old session
* @param {String} newSessionId session ID of the new session
*/
// onReload: function(oldSessionId, newSessionId) {
// }
};
//# sourceMappingURL=webdriverio.config.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"webdriverio.config.js","sourceRoot":"","sources":["../../workspaces/electron-e2e/webdriverio.config.ts"],"names":[],"mappings":"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"}

36
.eslintrc.json Normal file
View File

@@ -0,0 +1,36 @@
{
"env": {
"browser": true,
"es2020": true,
"node": true
},
"plugins": ["@typescript-eslint", "import", "unicorn", "sonarjs"],
"extends": [
"plugin:unicorn/recommended",
"plugin:sonarjs/recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
"plugin:import/errors",
"plugin:import/warnings",
"plugin:import/typescript"
],
"parser": "@typescript-eslint/parser",
"settings": {
"import/resolver": {
"typescript": {
"project": "workspaces/*/tsconfig.json"
}
}
},
"ignorePatterns": ["**/dist/**/*", "**/.dist/**/*"],
"rules": {
"@typescript-eslint/no-unused-vars": [
"error",
{
"argsIgnorePattern": "^_"
}
],
"@typescript-eslint/no-explicit-any": ["off"],
"unicorn/prefer-module": "off"
}
}

29
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,29 @@
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]"
labels: bug
assignees: aadiene
---
**Describe the bug**
A clear and concise description of what the bug is.
**How to reproduce**
Simple steps to follow to reproduce the bug.
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Configuration (please complete the following information):**
- OS : [e.g. iOS]
- node version : [e.g. 14]
- npm version : [e.g. 7]
- ng-cli version : [e.g. 12]
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: "[FEAT]"
labels: enhancement
assignees: aadiene
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

14
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,14 @@
version: 2
updates:
- package-ecosystem: 'npm'
schedule:
interval: 'weekly'
# Check for npm updates on Sundays
day: 'sunday'
# Raise pull requests for version updates
# to pip against the `develop` branch
target-branch: 'develop'
# Labels on pull requests for security and version updates
labels:
- 'npm dependencies'

26
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,26 @@
# Pull Request Template
## Description
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.
Fixes # (issue)
## Type of change
Please delete options that are not relevant.
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] This change requires a documentation update
## Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes

64
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,64 @@
# This is a basic workflow to help you get started with Actions
name: 'CI'
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches:
- master
- develop
pull_request:
branches:
- master
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macOS-latest, ubuntu-latest, windows-latest]
node-version: [14.x, 16.x, 18.x]
steps:
- uses: actions/checkout@v2
- name: Cache node modules
uses: actions/cache@v2
env:
cache-name: cache-node-modules
with:
# npm cache files are stored in `~/.npm`
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Upgrade to the latest version of npm
run: npm install -g npm@latest
- name: Upgrade to the latest version of Angular CLI
run: npm install -g @angular/cli@latest
- name: Install dependencies
run: npm install
- name: Test Angular E2E
uses: GabrielBB/xvfb-action@v1
with:
run: npm run test:angular-e2e
- name: Test Electron E2E
uses: GabrielBB/xvfb-action@v1
with:
run: npm run test:electron-e2e
- name: Check lint
run: npm run lint
- name: Make app distributables
run: npm run make

View File

@@ -0,0 +1,22 @@
name: 'Close inactive issues'
on:
schedule:
- cron: "30 1 * * *"
jobs:
close-issues:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v4
with:
days-before-issue-stale: 30
days-before-issue-close: 14
stale-issue-label: "stale"
stale-issue-message: "This issue is stale because it has been open for 30 days with no activity."
close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
days-before-pr-stale: -1
days-before-pr-close: -1
repo-token: ${{ secrets.GITHUB_TOKEN }}

27
.gitignore vendored
View File

@@ -16,6 +16,7 @@ pids
*.pid
*.seed
*.pid.lock
.DS_Store
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
@@ -45,6 +46,8 @@ jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
@@ -97,6 +100,18 @@ dist
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# vuepress build output
.vuepress/dist
@@ -130,3 +145,15 @@ dist
.yarn/install-state.gz
.pnp.*
# Webpack
.webpack/
# Electron-Forge
out/
# Allure
allure-results
# System Files
.DS_Store
Thumbs.db

1
.husky/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
_;

36
.husky/_/husky.sh Normal file
View File

@@ -0,0 +1,36 @@
#!/usr/bin/env sh
if [ -z "$husky_skip_init" ]; then
debug () {
if [ "$HUSKY_DEBUG" = "1" ]; then
echo "husky (debug) - $1"
fi
}
readonly hook_name="$(basename -- "$0")"
debug "starting $hook_name..."
if [ "$HUSKY" = "0" ]; then
debug "HUSKY env variable is set to 0, skipping hook"
exit 0
fi
if [ -f ~/.huskyrc ]; then
debug "sourcing ~/.huskyrc"
. ~/.huskyrc
fi
readonly husky_skip_init=1
export husky_skip_init
sh -e "$0" "$@"
exitCode="$?"
if [ $exitCode != 0 ]; then
echo "husky - $hook_name hook exited with code $exitCode (error)"
fi
if [ $exitCode = 127 ]; then
echo "husky - command not found in PATH=$PATH"
fi
exit $exitCode
fi

8
.prettierrc Normal file
View File

@@ -0,0 +1,8 @@
{
"useTabs": true,
"tabSize": 2,
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"bracketSpacing": true
}

12
.versionrc.json Normal file
View File

@@ -0,0 +1,12 @@
{
"types": [
{ "type": "feat", "section": "Features" },
{ "type": "fix", "section": "Bug Fixes" },
{ "type": "chore", "hidden": true },
{ "type": "docs", "hidden": true },
{ "type": "style", "hidden": true },
{ "type": "refactor", "hidden": true },
{ "type": "perf", "hidden": true },
{ "type": "test", "hidden": true }
]
}

17
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,17 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": ["<node_internals>/**"],
"program": "${workspaceFolder}\\.webpack\\main",
"preLaunchTask": "tsc: build - tsconfig.json",
"outFiles": ["${workspaceFolder}/.dist/**/*.js"]
}
]
}

127
CHANGELOG.md Normal file
View File

@@ -0,0 +1,127 @@
# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [3.2.0](https://github.com/sourcygen/electron-angular-quick-start/compare/v3.1.0...v3.2.0) (2022-09-24)
### Features
- angular upgrade - 13.3.2 => 14.2.3 ([fa6222a](https://github.com/sourcygen/electron-angular-quick-start/commit/fa6222a1a86c0528a09f901a97f61f374933e2a6))
- electron upgrade - 18.0.3 => 20.2.0 ([f1fce63](https://github.com/sourcygen/electron-angular-quick-start/commit/f1fce63e24fc8c0ca53a97a83e337ea36332e645))
## [3.1.0](https://github.com/sourcygen/electron-angular-quick-start/compare/v3.0.0...v3.1.0) (2022-04-07)
## [3.0.0](https://github.com/sourcygen/electron-angular-quick-start/compare/v2.4.0...v3.0.0) (2022-04-07)
### Features
- migrating electron e2e from spectron (deprecated) to wdio ([#32](https://github.com/sourcygen/electron-angular-quick-start/issues/32)) ([d7c7af1](https://github.com/sourcygen/electron-angular-quick-start/commit/d7c7af13f109427c74e55886c2de0a19614283b6))
## [2.4.0](https://github.com/sourcygen/electron-angular-quick-start/compare/v2.0.1...v2.4.0) (2021-08-06)
### Features
- ci build/test/make (github workflows) ([351eb1a](https://github.com/sourcygen/electron-angular-quick-start/commit/351eb1a7f0bd78043d8590effe7482965e0574b1))
### Bug Fixes
- shared-lib not found ([99742e3](https://github.com/sourcygen/electron-angular-quick-start/commit/99742e3dc1779141c5c8f2ec573faf33c72dea84))
- using chokidar instead of npm-watch (issue [#4](https://github.com/sourcygen/electron-angular-quick-start/issues/4)) ([2feedce](https://github.com/sourcygen/electron-angular-quick-start/commit/2feedcefc5a2125e701b460bbd3d644775572d47))
## [2.3.0](https://github.com/sourcygen/electron-angular-quick-start/compare/v2.0.1...v2.3.0) (2021-08-01)
### Features
- ci build/test/make (github workflows) ([351eb1a](https://github.com/sourcygen/electron-angular-quick-start/commit/351eb1a7f0bd78043d8590effe7482965e0574b1))
### Bug Fixes
- shared-lib not found ([99742e3](https://github.com/sourcygen/electron-angular-quick-start/commit/99742e3dc1779141c5c8f2ec573faf33c72dea84))
- using chokidar instead of npm-watch (issue [#4](https://github.com/sourcygen/electron-angular-quick-start/issues/4)) ([2feedce](https://github.com/sourcygen/electron-angular-quick-start/commit/2feedcefc5a2125e701b460bbd3d644775572d47))
## [2.2.0](https://github.com/sourcygen/electron-angular-quick-start/compare/v2.0.1...v2.2.0) (2021-07-22)
### Bug Fixes
- shared-lib not found ([99742e3](https://github.com/sourcygen/electron-angular-quick-start/commit/99742e3dc1779141c5c8f2ec573faf33c72dea84))
## 2.1.0 (2021-07-22)
### Features
- git hook config (husky eslint prettier) ([77b15bd](https://github.com/sourcygen/electron-angular-quick-start/commit/77b15bdfc4355afa63cd7517e87da0029a804691))
- cypress setup for angular e2e tests ([7a3d5d7](https://github.com/sourcygen/electron-angular-quick-start/commit/7a3d5d7d3aaf92c4de9c89349a14c59d84d38afb))
- crossplatform icon config ([4e9506a](https://github.com/sourcygen/electron-angular-quick-start/commit/4e9506aca5515dd32b481b9c6d26c5c79598dcea))
### Bug Fixes
- fixing eslint problems ([1a5a76f](https://github.com/sourcygen/electron-angular-quick-start/commit/1a5a76f9121115db65ad3e1cb07f0b008c2e958a))
# 2.0.0 (2021-07-19)
### Features
- migrate from electron-webpack to electron-forge ([4fa2999](https://github.com/sourcygen/electron-angular-quick-start/commit/4fa299996145deb61e3b65d3d05faab0bd8a25e1))
## 1.0.2 (2020-09-29)
### Bug Fixes
- reopening window crash on macos ([f442df7](https://github.com/sourcygen/electron-angular-quick-start/commit/f442df72c4120fb616d21c5c4e245a5eb478f57e))
### Features
- disable remote content execution ([0c82cf4](https://github.com/sourcygen/electron-angular-quick-start/commit/0c82cf425930de7368debfbc6176a3ef8ed7591e))
- adapt angular part ([83301e0](https://github.com/sourcygen/electron-angular-quick-start/commit/83301e0fe7387e791d23f7c1d6cdaeb1f53e3cf4))
- adapt electron part ([73acf88](https://github.com/sourcygen/electron-angular-quick-start/commit/73acf88a079984e50c15e23e5ad0aa98b0a7c2a1))
- add electron dependencies ([f506c0c](https://github.com/sourcygen/electron-angular-quick-start/commit/f506c0c2ab613ec0d72863f5a30c2c1ce553dcd2))
- add electron e2e launch scripts ([7e02b37](https://github.com/sourcygen/electron-angular-quick-start/commit/7e02b37b10f54f7bbb66e88f7e433ba67594287b))
- add electron packaging scripts ([afd8916](https://github.com/sourcygen/electron-angular-quick-start/commit/afd8916d7143b258ed273d613f15135f91cb8edd))
- add spectron and utility dependencies ([a100e3c](https://github.com/sourcygen/electron-angular-quick-start/commit/a100e3c488fde1cc2d60229f47032331b201f7b5))
- angular upgrade : 9.1.1 => 10.1.3 ([b3a22e8](https://github.com/sourcygen/electron-angular-quick-start/commit/b3a22e8023b56d2e9707b98ec871c496d054a74d))
- change project structure to meet targeted architecture ([9c8788f](https://github.com/sourcygen/electron-angular-quick-start/commit/9c8788fb2e419ae63c3a6545f4c5966547232702))
- change project structure to meet targeted architecture ([ea90fd8](https://github.com/sourcygen/electron-angular-quick-start/commit/ea90fd845f8188c5fd4f867d7ec7f80ffd1b6e3f))
- conventional commit setup ([4a0397f](https://github.com/sourcygen/electron-angular-quick-start/commit/4a0397f56e10e6e88312eeda2f9716d4314b1ea0))
- decrease security in e2e tests ([8543cf1](https://github.com/sourcygen/electron-angular-quick-start/commit/8543cf148c498caa3e3298d8f08b14d16b5426b0))
- electron upgrade : 8.2.3 => 10.1.3 ([c53b0d4](https://github.com/sourcygen/electron-angular-quick-start/commit/c53b0d497ea5d0823d425b445449cff2a9c1ddc7))
- env config setup ([8822440](https://github.com/sourcygen/electron-angular-quick-start/commit/8822440f7dfa4452b588520cca5179121b276188))
- i18n setup with ngx-translate ([f17719c](https://github.com/sourcygen/electron-angular-quick-start/commit/f17719c7e8d4c7798b299a6d500712f903ddda3e))
- icon settings ([720223e](https://github.com/sourcygen/electron-angular-quick-start/commit/720223ec7ff4984445dcb52fe06ffe3386756367))
- init electron e2e code source ([45a02e3](https://github.com/sourcygen/electron-angular-quick-start/commit/45a02e392c0fd755df33760db7f4adbbd31d9616))
- init new angular project with angular cli ([cae7f62](https://github.com/sourcygen/electron-angular-quick-start/commit/cae7f629aafe69edb9aaaa6907615e5a2138b05a))
- init shared code source ([647889c](https://github.com/sourcygen/electron-angular-quick-start/commit/647889cd70d8d334122ea33c376f8cb51cf3fe7d))
- log setup with winston ([fd598bb](https://github.com/sourcygen/electron-angular-quick-start/commit/fd598bb10de942869a857e8927831aa87f768024))
- move production dependencies into development dependencies ([47c74d0](https://github.com/sourcygen/electron-angular-quick-start/commit/47c74d015d130a15768be5e783b80f9bfcc97754))
- other dependencies upgrade ([5db39a1](https://github.com/sourcygen/electron-angular-quick-start/commit/5db39a1f8b7135d1ed668dd4a77674bbfd9f4ef6))
- packaging config ([2559e97](https://github.com/sourcygen/electron-angular-quick-start/commit/2559e973dcf1478f81e25d6acb7332f3edf91dcc))
- use npm instead of yarn (issues with binaries) ([29e4dd9](https://github.com/sourcygen/electron-angular-quick-start/commit/29e4dd95bae61025faf820d141206deb81fdcf61))
## [1.0.1](https://github.com/sourcygen/electron-angular-quick-start/compare/v1.0.0...v1.0.1) (2020-04-30)
### Bug Fixes
- reopening window crash on macos ([f442df7](https://github.com/sourcygen/electron-angular-quick-start/commit/f442df72c4120fb616d21c5c4e245a5eb478f57e))
# 1.0.0 (2020-04-30)
### Features
- disable remote content execution ([0c82cf4](https://github.com/sourcygen/electron-angular-quick-start/commit/0c82cf425930de7368debfbc6176a3ef8ed7591e))
- adapt angular part ([83301e0](https://github.com/sourcygen/electron-angular-quick-start/commit/83301e0fe7387e791d23f7c1d6cdaeb1f53e3cf4))
- adapt electron part ([73acf88](https://github.com/sourcygen/electron-angular-quick-start/commit/73acf88a079984e50c15e23e5ad0aa98b0a7c2a1))
- add electron dependencies ([f506c0c](https://github.com/sourcygen/electron-angular-quick-start/commit/f506c0c2ab613ec0d72863f5a30c2c1ce553dcd2))
- add electron e2e launch scripts ([7e02b37](https://github.com/sourcygen/electron-angular-quick-start/commit/7e02b37b10f54f7bbb66e88f7e433ba67594287b))
- add electron packaging scripts ([afd8916](https://github.com/sourcygen/electron-angular-quick-start/commit/afd8916d7143b258ed273d613f15135f91cb8edd))
- add spectron and utility dependencies ([a100e3c](https://github.com/sourcygen/electron-angular-quick-start/commit/a100e3c488fde1cc2d60229f47032331b201f7b5))
- change project structure to meet targeted architecture ([9c8788f](https://github.com/sourcygen/electron-angular-quick-start/commit/9c8788fb2e419ae63c3a6545f4c5966547232702))
- change project structure to meet targeted architecture ([ea90fd8](https://github.com/sourcygen/electron-angular-quick-start/commit/ea90fd845f8188c5fd4f867d7ec7f80ffd1b6e3f))
- decrease security in e2e tests ([8543cf1](https://github.com/sourcygen/electron-angular-quick-start/commit/8543cf148c498caa3e3298d8f08b14d16b5426b0))
- env config setup ([8822440](https://github.com/sourcygen/electron-angular-quick-start/commit/8822440f7dfa4452b588520cca5179121b276188))
- i18n setup with ngx-translate ([f17719c](https://github.com/sourcygen/electron-angular-quick-start/commit/f17719c7e8d4c7798b299a6d500712f903ddda3e))
- icon settings ([720223e](https://github.com/sourcygen/electron-angular-quick-start/commit/720223ec7ff4984445dcb52fe06ffe3386756367))
- init electron e2e code source ([45a02e3](https://github.com/sourcygen/electron-angular-quick-start/commit/45a02e392c0fd755df33760db7f4adbbd31d9616))
- init new angular project with angular cli ([cae7f62](https://github.com/sourcygen/electron-angular-quick-start/commit/cae7f629aafe69edb9aaaa6907615e5a2138b05a))
- init shared code source ([647889c](https://github.com/sourcygen/electron-angular-quick-start/commit/647889cd70d8d334122ea33c376f8cb51cf3fe7d))
- log setup with winston ([fd598bb](https://github.com/sourcygen/electron-angular-quick-start/commit/fd598bb10de942869a857e8927831aa87f768024))
- move production dependencies into development dependencies ([47c74d0](https://github.com/sourcygen/electron-angular-quick-start/commit/47c74d015d130a15768be5e783b80f9bfcc97754))
- packaging config ([2559e97](https://github.com/sourcygen/electron-angular-quick-start/commit/2559e973dcf1478f81e25d6acb7332f3edf91dcc))

128
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
contact.sourcygen@gmail.com.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

1
_config.yml Normal file
View File

@@ -0,0 +1 @@
theme: jekyll-theme-cayman

BIN
assets/murmur.xlsx Normal file

Binary file not shown.

BIN
assets/test-klant-2.xlsx Normal file

Binary file not shown.

3
commitlint.config.js Normal file
View File

@@ -0,0 +1,3 @@
module.exports = {
extends: ["@commitlint/config-conventional"],
};

5
config.json Normal file
View File

@@ -0,0 +1,5 @@
{
"filePaths": [
"./assets"
]
}

44384
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

167
package.json Normal file
View File

@@ -0,0 +1,167 @@
{
"name": "pevabo-deuren",
"productName": "Pevabo Deuren",
"version": "3.2.0",
"description": "Deuren",
"repository": "https://github.com/sourcygen/electron-angular-quick-start.git",
"author": "Sourcygen",
"license": "MIT",
"main": ".webpack/main",
"keywords": [
"angular",
"angular 14",
"electron",
"electron 18",
"typescript",
"typescript 4",
"wdio",
"webdriverio",
"chromedriver",
"scss",
"live reload"
],
"workspaces": [
"workspaces/angular-app",
"workspaces/shared-lib"
],
"scripts": {
"start": "npm-run-all -p start:shared-lib start:angular-app start:electron-app",
"start:shared-lib": "tsc -b workspaces/shared-lib -w",
"start:angular-app": "wait-on workspaces/shared-lib/.dist/index.d.ts && cd workspaces/angular-app && npm run start",
"start:electron-app": "node scripts/electron-forge-start-watch.js",
"start:electron-app:once": "wait-on http://localhost:4200 && electron-forge start",
"package": "npm run package:angular-app && npm run package:electron-app",
"package:shared-lib": "tsc -b workspaces/shared-lib",
"package:angular-app": "npm run package:shared-lib && cd workspaces/angular-app && npm run package",
"package:electron-app": "npm run package:shared-lib && electron-forge package",
"make": "npm run package:angular-app && electron-forge make",
"publish": "electron-forge publish",
"lint": "npm run package:shared-lib && eslint --ext .ts .",
"test:e2e": "npm run test:angular-e2e && npm run test:electron-e2e",
"test:angular-e2e": "npm-run-all -p -r start start:angular-e2e",
"start:angular-e2e": "wait-on http://localhost:4200 && cd workspaces/angular-app && npm run cypress:run",
"test:electron-e2e": "npm run package && npm run test:electron-e2e:wdio-only",
"test:electron-e2e:wdio-only": "cross-env X_NODE_ENV=e2e-test wdio run workspaces/electron-e2e/webdriverio.config.ts --autoCompileOpts.tsNodeOpts.project=workspaces/electron-e2e/tsconfig.json",
"clean": "shx rm -rf .webpack out allure-results package-lock.json node_modules workspaces/shared-lib/.dist workspaces/angular-app/node_modules workspaces/angular-app/.angular workspaces/angular-app/.dist",
"prepare": "husky install",
"postinstall": "husky install && shx rm -rf .git/hooks && shx ln -s ../.husky .git/hooks",
"outdated-deps": "npm run outdated-deps:electron-app && npm run outdated-deps:angular-app && npm run outdated-deps:shared-lib",
"outdated-deps:electron-app": "npx ncu",
"outdated-deps:angular-app": "cd workspaces/angular-app && npx ncu",
"outdated-deps:shared-lib": "cd workspaces/shared-lib && npx ncu",
"update-deps": "npm run update-deps:electron-app && npm run update-deps:angular-app && npm run update-deps:shared-lib",
"update-deps:electron-app": "npx ncu -u",
"update-deps:angular-app": "cd workspaces/angular-app && ng update @angular/cli @angular/core --force && npx ncu -u && cd ../.. && npm run clean",
"update-deps:shared-lib": "cd workspaces/shared-lib && npx ncu -u",
"release:minor": "standard-version --release-as minor",
"release:patch": "standard-version --release-as patch",
"release:major": "standard-version --release-as major"
},
"config": {
"forge": {
"packagerConfig": {
"name": "Electron Angular App",
"executableName": "electron-angular-app",
"icon": "./workspaces/electron-app/main/assets/icons/icon"
},
"makers": [
{
"name": "@electron-forge/maker-dmg",
"config": {}
},
{
"name": "@electron-forge/maker-deb",
"config": {}
},
{
"name": "@electron-forge/maker-squirrel",
"config": {}
}
],
"plugins": [
[
"@electron-forge/plugin-webpack",
{
"mainConfig": "./webpack.main.config.js",
"renderer": {
"config": "./webpack.renderer.config.js",
"entryPoints": [
{
"html": "./workspaces/electron-app/renderer/index.html",
"js": "./workspaces/electron-app/renderer/index.ts",
"name": "main_window",
"preload": {
"js": "./workspaces/electron-app/renderer/preload.ts"
}
}
]
}
}
]
]
}
},
"devDependencies": {
"@commitlint/cli": "^17.1.2",
"@commitlint/config-conventional": "^17.1.0",
"@electron-forge/cli": "^6.0.0-beta.66",
"@electron-forge/maker-deb": "^6.0.0-beta.66",
"@electron-forge/maker-dmg": "^6.0.0-beta.66",
"@electron-forge/maker-rpm": "^6.0.0-beta.66",
"@electron-forge/maker-squirrel": "^6.0.0-beta.66",
"@electron-forge/maker-zip": "^6.0.0-beta.66",
"@electron-forge/plugin-webpack": "6.0.0-beta.66",
"@types/lodash": "^4.14.185",
"@types/node": "^18.7.18",
"@typescript-eslint/eslint-plugin": "^5.38.0",
"@typescript-eslint/parser": "^5.38.0",
"@vercel/webpack-asset-relocator-loader": "^1.7.3",
"@wdio/allure-reporter": "^7.24.1",
"@wdio/cli": "^7.24.1",
"@wdio/jasmine-framework": "^7.24.1",
"@wdio/local-runner": "^7.24.1",
"@wdio/spec-reporter": "^7.24.1",
"allure-commandline": "^2.18.1",
"chokidar-cli": "^3.0.0",
"chromedriver": "^104.0.0",
"copy-webpack-plugin": "^11.0.0",
"cross-env": "^7.0.3",
"css-loader": "^6.7.1",
"electron": "^20.2.0",
"eslint": "^8.23.1",
"eslint-config-prettier": "^8.5.0",
"eslint-import-resolver-typescript": "^3.5.1",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-sonarjs": "^0.15.0",
"eslint-plugin-unicorn": "^43.0.2",
"fork-ts-checker-webpack-plugin": "^7.2.13",
"husky": "^8.0.1",
"lint-staged": "^13.0.3",
"node-loader": "^2.0.0",
"npm-check-updates": "^16.2.1",
"npm-run-all": "^4.1.5",
"prettier": "^2.7.1",
"shx": "^0.3.4",
"standard-version": "^9.5.0",
"style-loader": "^3.3.1",
"tree-kill": "^1.2.2",
"ts-loader": "^9.4.1",
"ts-node": "^10.9.1",
"typescript": "^4.8.3",
"wait-on": "^6.0.1",
"wdio-chromedriver-service": "^7.3.2",
"wdio-electron-service": "^3.5.0",
"wdio-wait-for": "^2.2.6"
},
"dependencies": {
"@electron/remote": "^2.0.8",
"electron-squirrel-startup": "^1.0.0",
"fs-extra": "^10.1.0",
"winston": "^3.8.2",
"xlsx": "^0.18.5"
},
"lint-staged": {
"*.ts": "npm run lint"
}
}

View File

@@ -0,0 +1,46 @@
#!/usr/bin/env node
const spawn = require('child_process').spawn;
const chokidar = require('chokidar');
const kill = require('tree-kill');
const path = require('path');
class ElectronForgeRunner {
constructor() {
this.__init__();
}
__init__ = () => {
this.args = process.argv;
this.command = this.args[2];
this.cwd = process.cwd();
this.watchPaths = [
path.join(this.cwd, '/workspaces/electron-app/**/*.ts'),
path.join(this.cwd, '/workspaces/shared-lib/.dist/**/*.ts'),
];
this.ignoredPaths = '**/node_modules/*';
this.startWatching();
this.reload();
};
reload = () => {
if (this.childProcess) kill(this.childProcess.pid);
this.childProcess = spawn('npm run start:electron-app:once', [], {
shell: true,
stdio: 'inherit',
});
};
startWatching = () => {
chokidar
.watch(this.watchPaths, {
ignored: this.ignoredPaths,
ignoreInitial: true,
})
.on('all', (event, path) => {
this.reload();
});
};
}
new ElectronForgeRunner();

26
tsconfig.json Normal file
View File

@@ -0,0 +1,26 @@
{
"compilerOptions": {
"allowJs": true,
"module": "es2020",
"target": "es2015",
"skipLibCheck": true,
"esModuleInterop": true,
"noImplicitAny": true,
"noImplicitReturns": true,
"sourceMap": true,
"baseUrl": ".",
"outDir": ".dist",
"moduleResolution": "node",
"resolveJsonModule": true,
"paths": {
"*": ["node_modules/*"]
},
"types": [
"node",
"webdriverio/async",
"@wdio/jasmine-framework",
"expect-webdriverio"
]
},
"include": ["workspaces/electron-app/**/*", "workspaces/electron-e2e/**/*"]
}

30
webpack.main.config.js Normal file
View File

@@ -0,0 +1,30 @@
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
/**
* This is the main entry point for your application, it's the first file
* that runs in the main process.
*/
entry: './workspaces/electron-app/main/index.ts',
// Put your normal webpack config below here
module: {
rules: require('./webpack.rules'),
},
resolve: {
extensions: ['.js', '.ts', '.jsx', '.tsx', '.css', '.json'],
modules: [path.resolve(__dirname, 'node_modules'), 'node_modules'],
},
plugins: [
new CopyWebpackPlugin({
patterns: [
{ from: 'workspaces/electron-app/main/assets' },
{
from: 'workspaces/angular-app/.dist/angular-app',
to: '../renderer/angular_window',
noErrorOnMissing: true,
},
],
}),
],
};

5
webpack.plugins.js Normal file
View File

@@ -0,0 +1,5 @@
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
module.exports = [
new ForkTsCheckerWebpackPlugin()
];

View File

@@ -0,0 +1,19 @@
const path = require("path");
const rules = require('./webpack.rules');
const plugins = require('./webpack.plugins');
rules.push({
test: /\.css$/,
use: [{ loader: 'style-loader' }, { loader: 'css-loader' }],
});
module.exports = {
module: {
rules,
},
plugins: plugins,
resolve: {
extensions: ['.js', '.ts', '.jsx', '.tsx', '.css'],
modules: [path.resolve(__dirname, "node_modules"), "node_modules"]
},
};

27
webpack.rules.js Normal file
View File

@@ -0,0 +1,27 @@
module.exports = [
// Add support for native node modules
{
test: /\.node$/,
use: 'node-loader',
},
{
test: /\.(m?js|node)$/,
parser: { amd: false },
use: {
loader: '@vercel/webpack-asset-relocator-loader',
options: {
outputAssetBase: 'native_modules',
},
},
},
{
test: /\.tsx?$/,
exclude: /(node_modules|\.webpack)/,
use: {
loader: 'ts-loader',
options: {
transpileOnly: true
}
}
},
];

View File

@@ -0,0 +1,17 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# For the full list of supported browsers by the Angular framework, please see:
# https://angular.io/guide/browser-support
# You can see what browsers were selected by your queries by running:
# npx browserslist
last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR
not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line.

46
workspaces/angular-app/.gitignore vendored Normal file
View File

@@ -0,0 +1,46 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
# compiled output
/.dist
/tmp
/out-tsc
# Only exists if Bazel was run
/bazel-out
# dependencies
/node_modules
# profiling files
chrome-profiler-events*.json
# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
# misc
/.angular/cache
/.sass-cache
/connect.lock
/coverage
/libpeerconnection.log
npm-debug.log
yarn-error.log
testem.log
/typings
# System Files
.DS_Store
Thumbs.db

View File

@@ -0,0 +1,27 @@
# AngularApp
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.1.2.
## 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.
## 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 a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.

View File

@@ -0,0 +1,134 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"angular-app": {
"projectType": "application",
"schematics": {
"@schematics/angular:component": {
"style": "scss"
},
"@schematics/angular:application": {
"strict": true
}
},
"root": "",
"sourceRoot": "src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "./.dist/angular-app",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "scss",
"assets": ["src/favicon.ico", "src/assets"],
"styles": ["src/styles.scss"],
"scripts": []
},
"configurations": {
"production": {
"budgets": [
{
"type": "initial",
"maximumWarning": "500kb",
"maximumError": "1mb"
},
{
"type": "anyComponentStyle",
"maximumWarning": "2kb",
"maximumError": "4kb"
}
],
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.production.ts"
}
],
"outputHashing": "all"
},
"development": {
"buildOptimizer": false,
"optimization": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
}
},
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"configurations": {
"production": {
"browserTarget": "angular-app:build:production"
},
"development": {
"browserTarget": "angular-app:build:development"
}
},
"defaultConfiguration": "development"
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "angular-app:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json",
"karmaConfig": "karma.conf.js",
"inlineStyleLanguage": "scss",
"assets": ["src/favicon.ico", "src/assets"],
"styles": ["src/styles.scss"],
"scripts": []
}
},
"cypress-run": {
"builder": "@cypress/schematic:cypress",
"options": {
"devServerTarget": "angular-app:serve"
},
"configurations": {
"production": {
"devServerTarget": "angular-app:serve:production"
}
}
},
"cypress-open": {
"builder": "@cypress/schematic:cypress",
"options": {
"watch": true,
"headless": false
}
},
"e2e": {
"builder": "@cypress/schematic:cypress",
"options": {
"devServerTarget": "angular-app:serve",
"watch": true,
"headless": false
},
"configurations": {
"production": {
"devServerTarget": "angular-app:serve:production"
}
}
}
}
}
},
"cli": {
"analytics": false
}
}

View File

@@ -0,0 +1,18 @@
import { defineConfig } from 'cypress';
import configCypress from './cypress/plugins/index';
export default defineConfig({
videosFolder: 'cypress/videos',
screenshotsFolder: 'cypress/screenshots',
fixturesFolder: 'cypress/fixtures',
screenshotOnRunFailure: false,
video: false,
e2e: {
// We've imported your old cypress plugins here.
// You may want to clean this up later by importing these.
setupNodeEvents(on, config) {
return configCypress(on, config);
},
baseUrl: 'http://localhost:4200',
},
});

View File

@@ -0,0 +1,7 @@
describe('My First Test', () => {
it('Visits the initial project page', () => {
cy.visit('/');
cy.contains('Welcome');
cy.contains('electron-angular-quick-start app is running!');
});
});

View File

@@ -0,0 +1,5 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

View File

@@ -0,0 +1,8 @@
// Plugins enable you to tap into, modify, or extend the internal behavior of Cypress
// For more info, visit https://on.cypress.io/plugins-api
export default (
_on: Cypress.PluginEvents,
_config: Cypress.PluginConfigOptions
): void => {
// configure plugins here
};

View File

@@ -0,0 +1,37 @@
/// <reference types="cypress" />
// ***********************************************
// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add('login', (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
//
// declare global {
// namespace Cypress {
// interface Chainable {
// login(email: string, password: string): Chainable<void>
// drag(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
// dismiss(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
// visit(originalFn: CommandOriginalFn, url: string, options: Partial<VisitOptions>): Chainable<Element>
// }
// }
// }

View File

@@ -0,0 +1,22 @@
/* eslint-disable unicorn/prevent-abbreviations */
// ***********************************************************
// This example support/e2e.ts is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import './commands';
// Alternatively you can use CommonJS syntax:
// require('./commands')

View File

@@ -0,0 +1,8 @@
{
"extends": "../tsconfig.json",
"include": ["**/*.ts"],
"compilerOptions": {
"sourceMap": false,
"types": ["cypress"]
}
}

View File

@@ -0,0 +1,44 @@
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage'),
require('@angular-devkit/build-angular/plugins/karma')
],
client: {
jasmine: {
// you can add configuration options for Jasmine here
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
// for example, you can disable the random execution with `random: false`
// or set a specific seed with `seed: 4321`
},
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
jasmineHtmlReporter: {
suppressAll: true // removes the duplicated traces
},
coverageReporter: {
dir: require('path').join(__dirname, './coverage/angular-app'),
subdir: '.',
reporters: [
{ type: 'html' },
{ type: 'text-summary' }
]
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false,
restartOnFileChange: true
});
};

View File

@@ -0,0 +1,43 @@
{
"name": "angular-app",
"version": "2.0.0",
"scripts": {
"start": "ng serve",
"package": "ng build --configuration production --base-href ./",
"e2e": "ng e2e",
"cypress:open": "cypress open",
"cypress:run": "cypress run"
},
"private": true,
"dependencies": {
"@angular/animations": "^14.2.3",
"@angular/common": "^14.2.3",
"@angular/compiler": "^14.2.3",
"@angular/core": "^14.2.3",
"@angular/forms": "^14.2.3",
"@angular/material": "^7.0.0",
"@angular/platform-browser": "^14.2.3",
"@angular/platform-browser-dynamic": "^14.2.3",
"@angular/router": "^14.2.3",
"@ngx-translate/core": "^14.0.0",
"@ngx-translate/http-loader": "^7.0.0",
"electron": "^20.2.0",
"rxjs": "~7.5.6",
"tslib": "^2.4.0",
"zone.js": "~0.11.8"
},
"devDependencies": {
"@angular-devkit/build-angular": "^14.2.3",
"@angular/cli": "^14.2.3",
"@angular/compiler-cli": "^14.2.3",
"@cypress/schematic": "^2.1.1",
"@types/node": "^18.7.18",
"cypress": "10.8.0",
"karma": "~6.4.1",
"karma-chrome-launcher": "~3.1.1",
"karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.0.0",
"typescript": "^4.8.3"
}
}

View File

@@ -0,0 +1,16 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { MultiplesComponent } from './components/multiples/multiples.component';
const routes: Routes = [
{
path: '',
component: MultiplesComponent,
},
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
})
export class AppRoutingModule {}

View File

@@ -0,0 +1 @@
<router-outlet></router-outlet>

View File

@@ -0,0 +1,35 @@
import { TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
AppComponent
],
}).compileComponents();
});
it('should create the app', () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.componentInstance;
expect(app).toBeTruthy();
});
it(`should have as title 'angular-app'`, () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.componentInstance;
expect(app.title).toEqual('angular-app');
});
it('should render title', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
expect(compiled.querySelector('.content span')?.textContent).toContain('angular-app app is running!');
});
});

View File

@@ -0,0 +1,10 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
title = 'PEVABO - Deuren';
}

View File

@@ -0,0 +1,30 @@
import { HttpClientModule } from '@angular/common/http';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { MatSelectModule } from '@angular/material/select';
import { BrowserModule } from '@angular/platform-browser';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { MultiplesComponent } from './components/multiples/multiples.component';
import { MatInputModule } from '@angular/material/input';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatButtonModule } from '@angular/material/button';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
@NgModule({
declarations: [AppComponent, MultiplesComponent],
imports: [
BrowserModule,
AppRoutingModule,
HttpClientModule,
ReactiveFormsModule,
MatSelectModule,
MatFormFieldModule,
MatInputModule,
BrowserAnimationsModule,
MatButtonModule,
],
providers: [],
bootstrap: [AppComponent],
})
export class AppModule {}

View File

@@ -0,0 +1,83 @@
<mat-form-field appearance="fill" class="projects">
<mat-label>Klantenbestand</mat-label>
<mat-select [value]="project?.name" (selectionChange)="projectChange($event)">
<mat-option *ngFor="let projectOption of projects" [value]="projectOption.name">
{{ projectOption.name }}
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field appearance="fill" class="doors">
<mat-label>Deuren</mat-label>
<mat-select [(value)]="door" [disabled]="!project" (selectionChange)="focus()">
<mat-option *ngFor="let doorOption of doors" [value]="doorOption">
{{ doorOption?.nr }}
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field appearance="fill" class="doors">
<mat-label>Deuren</mat-label>
<input
matInput
placeholder="Scanner"
(input)="textInput($event)"
[disabled]="!project"
id="textsearch"
/>
</mat-form-field>
<button
mat-raised-button
color="primary"
class="print-button"
(click)="printLabel()"
[disabled]="!door"
>
Print
</button>
<div *ngIf="door?.nr" class="door">
<div class="specs">
<p class="property">Deurnummer</p>
<p class="value">
{{ door?.nr }}
</p>
</div>
<div class="specs">
<p class="property">L/R</p>
<p class="value">
{{ door?.lr }}
</p>
</div>
<div class="specs">
<p class="property">KRUK/SLOT</p>
<p class="value">
{{ door?.krukSlot }}
</p>
</div>
<div class="specs">
<p class="property">SCHARNIER</p>
<p class="value">
{{ door?.pivot }}
</p>
</div>
<div class="specs">
<p class="property">Soort Deur</p>
<p class="value">
{{ door?.type }}
</p>
</div>
<div class="specs">
<p class="property">Model Kruk</p>
<p class="value">
{{ door?.modelKruk }}
</p>
</div>
<div class="specs">
<p class="property">Opmerkingen</p>
<p class="value">
{{ door?.remark }}
</p>
</div>
</div>

View File

@@ -0,0 +1,26 @@
.doors {
margin-left: 2rem;
}
.specs {
flex-direction: column;
flex: 1 1 0;
p {
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
font-size: 1.5rem;
}
.value {
font-weight: 600;
}
}
.door {
display: flex;
flex-direction: row;
}
.print-button {
margin-left: 2rem;
}

View File

@@ -0,0 +1,79 @@
import { Component, OnInit } from '@angular/core';
import { WindowApiConst, Door } from 'shared-lib';
import { ElectronIpcService } from '../../services/electron-ipc.service';
@Component({
selector: 'app-multiples',
templateUrl: './multiples.component.html',
styleUrls: ['./multiples.component.scss'],
})
export class MultiplesComponent implements OnInit {
public projects: any[] = [];
public project: {name: string|undefined, path: string|undefined} | undefined = undefined;
public doors: Door[] = [];
public door: Door | undefined = undefined;
public Object = Object;
constructor(private electronIpc: ElectronIpcService) {}
ngOnInit(): void {
// Specifying what to do with received data from main process
this.electronIpc.receive<string[][]>(
WindowApiConst.FILELIST_OUTPUT,
(output: any[]) => {
this.projects = output;
}
);
this.electronIpc.receive<[]>(
WindowApiConst.PROJECT_OUTPUT,
(output: Door[]) => {
// Update current data
this.doors = output;
this.focus();
}
);
this.electronIpc.receive<void>(WindowApiConst.PRINT_OUTPUT, () => {
this.focus();
});
this.refreshProjects();
}
refreshProjects(): void {
this.electronIpc.send(WindowApiConst.FILELIST_INPUT, 'refresh');
}
projectChange(event: any): void {
this.door = undefined;
this.project = this.projects.find(x => x.name === event.value);
this.electronIpc.send(WindowApiConst.PROJECT_INPUT, this.project);
}
textInput(event: any): void {
const searchValue = event?.target?.value;
const door: Door | undefined =
this.doors.find((x) => x.nr === searchValue) || undefined;
if (door) {
this.door = door;
event.target.value = '';
this.printLabel();
}
}
printLabel(): void {
this.electronIpc.send(WindowApiConst.PRINT_INPUT, {});
}
focus(): void {
setTimeout(() => {
// eslint-disable-next-line unicorn/prefer-query-selector
const input = document.getElementById('textsearch');
(input as any).value = "";
input?.focus();
}, 0);
}
}

View File

@@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { ElectronIpcService } from './electron-ipc.service';
describe('ElectronIpcService', () => {
let service: ElectronIpcService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(ElectronIpcService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

View File

@@ -0,0 +1,40 @@
import { Injectable, NgZone } from '@angular/core';
import { WindowApi } from 'shared-lib';
@Injectable({
providedIn: 'root',
})
export class ElectronIpcService {
private _api!: WindowApi;
constructor(private zone: NgZone) {
if (window && (window as Window).api) {
this._api = (window as Window).api;
console.log('Preloader API has been loaded successfully');
} else {
console.warn('Preloader API is not loaded');
}
}
public receive<Out>(channel: string, callback: (output: Out) => void): void {
if (this._api) {
this._api.receive<Out>(channel, (output) => {
console.log(`Received from main process channel [${channel}]`, output);
// Next code might run outside of Angular zone and therefore Angular
// doesn't recognize it needs to run change detection
// Further details on SO : https://stackoverflow.com/a/49136353/11480016
this.zone.run(() => {
callback(output);
});
});
}
}
public send<In>(channel: string, input: In): void {
if (this._api) {
console.log(`Sending to main process channel [${channel}]`, input);
this._api.send<In>(channel, input);
}
}
}

View File

@@ -0,0 +1,6 @@
{
"MULTIPLES": {
"TITLE": "Times table",
"SUBMIT": "SUBMIT"
}
}

View File

@@ -0,0 +1,6 @@
{
"MULTIPLES": {
"TITLE": "Table de multiplication",
"SUBMIT": "SOUMETTRE"
}
}

View File

@@ -0,0 +1,3 @@
export const environment = {
production: true,
};

View File

@@ -0,0 +1,16 @@
// This file can be replaced during build by using the `fileReplacements` array.
// `ng build` replaces `environment.ts` with `environment.production.ts`.
// The list of file replacements can be found in `angular.json`.
export const environment = {
production: false,
};
/*
* For easier debugging in development mode, you can import the following file
* to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
*
* This import should be commented out in production mode because it will have a negative impact
* on performance if an error is thrown.
*/
// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.

Binary file not shown.

After

Width:  |  Height:  |  Size: 948 B

View File

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>ElectronAngularQuickStart</title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!--<meta http-equiv="Content-Security-Policy" content="script-src 'self'" />-->
<link rel="icon" type="image/x-icon" href="favicon.ico" />
</head>
<body>
<app-root></app-root>
</body>
</html>

View File

@@ -0,0 +1,14 @@
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
enableProdMode();
}
platformBrowserDynamic()
.bootstrapModule(AppModule)
// eslint-disable-next-line unicorn/prefer-top-level-await
.catch((error) => console.error(error));

View File

@@ -0,0 +1,52 @@
/**
* This file includes polyfills needed by Angular and is loaded before the app.
* You can add your own extra polyfills to this file.
*
* This file is divided into 2 sections:
* 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
* 2. Application imports. Files imported after ZoneJS that should be loaded before your main
* file.
*
* The current setup is for so-called "evergreen" browsers; the last versions of browsers that
* automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
* Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
*
* Learn more in https://angular.io/guide/browser-support
*/
/***************************************************************************************************
* BROWSER POLYFILLS
*/
/**
* By default, zone.js will patch all possible macroTask and DomEvents
* user can disable parts of macroTask/DomEvents patch by setting following flags
* because those flags need to be set before `zone.js` being loaded, and webpack
* will put import in the top of bundle, so user need to create a separate file
* in this directory (for example: zone-flags.ts), and put the following flags
* into that file, and then add the following code before importing zone.js.
* import './zone-flags';
*
* The flags allowed in zone-flags.ts are listed here.
*
* The following flags will work for all browsers.
*
* (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
* (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
* (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
*
* in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
* with the following flag, it will bypass `zone.js` patch for IE/Edge
*
* (window as any).__Zone_enable_cross_context_check = true;
*
*/
/***************************************************************************************************
* Zone JS is required by default for Angular itself.
*/
import 'zone.js'; // Included with Angular CLI.
/***************************************************************************************************
* APPLICATION IMPORTS
*/

View File

@@ -0,0 +1,2 @@
/* You can add global styles to this file, and also import other style files */
@import '~@angular/material/prebuilt-themes/indigo-pink.css';

View File

@@ -0,0 +1,34 @@
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
import { getTestBed } from '@angular/core/testing';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting,
} from '@angular/platform-browser-dynamic/testing';
import 'zone.js/testing';
declare const require: {
context(
path: string,
deep?: boolean,
filter?: RegExp
): {
keys(): string[];
<T>(id: string): T;
};
};
// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting(),
{
teardown: { destroyAfterEach: false },
}
);
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
for (const key of context.keys()) {
context(key);
}

View File

@@ -0,0 +1,15 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/app",
"types": []
},
"files": [
"src/main.ts",
"src/polyfills.ts"
],
"include": [
"src/**/*.d.ts"
]
}

View File

@@ -0,0 +1,28 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./.dist/out-tsc",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"sourceMap": true,
"declaration": false,
"downlevelIteration": true,
"experimentalDecorators": true,
"moduleResolution": "node",
"importHelpers": true,
"target": "es2020",
"module": "es2020",
"lib": ["es2018", "dom"]
},
"angularCompilerOptions": {
"enableI18nLegacyMessageIdFormat": false,
"strictInjectionParameters": true,
"strictInputAccessModifiers": true,
"strictTemplates": true
},
"references": [{ "path": "../shared-lib" }]
}

View File

@@ -0,0 +1,18 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/spec",
"types": [
"jasmine"
]
},
"files": [
"src/test.ts",
"src/polyfills.ts"
],
"include": [
"src/**/*.spec.ts",
"src/**/*.d.ts"
]
}

View File

@@ -0,0 +1,29 @@
{
"development": {
"configId": "development",
"mainLogFile": "dist/dev-main.log",
"mainLogLevel": "debug",
"isIconAvailable": true,
"isNodeIntegration": false,
"isContextIsolation": true,
"isEnableRemoteModule": false,
"isOpenDevTools": true
},
"e2e-test": {
"configId": "e2e-test",
"mainLogFile": "dist/e2e-main.log",
"mainLogLevel": "error",
"isIconAvailable": true,
"isNodeIntegration": true,
"isContextIsolation": false,
"isEnableRemoteModule": true,
"isOpenDevTools": false
},
"production": {
"configId": "production",
"mainLogFile": "main.log",
"mainLogLevel": "error",
"isIconAvailable": false,
"isOpenDevTools": false
}
}

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More