Compare commits

...

1691 Commits

Author SHA1 Message Date
CNCF-bot a882d0675b uniq items 2024-07-11 15:15:44 +01:00
CNCF-bot 5ffa213fc9 remove ospo 2024-07-11 15:03:50 +01:00
CNCF-bot 2344353df5 fix 2024-03-19 14:33:26 +00:00
CNCF-bot b7e063d94e fix 2024-03-08 13:46:19 +00:00
John Mertic e915165065
Re-write `mobile.twitter.com` to `twitter.com` (#893)
* Re-write `mobile.twitter.com` to `twitter.com`

Signed-off-by: John Mertic <jmertic@linuxfoundation.org>

* Fix typo

---------

Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2024-03-08 13:45:41 +00:00
CNCF-bot 3de416fa3a relax checks on circular 2024-01-23 22:25:06 +00:00
CNCF-bot 7dd727758c update twitter checks 2024-01-15 22:45:37 +00:00
CNCF-bot 5235155c90 no export 2024-01-10 17:05:43 +00:00
CNCF-bot d8e4f84e5c disable daily updated on cncf landscape v1 2024-01-09 14:20:00 +00:00
CNCF-bot 61014620c2 linkedin 2023-10-05 22:39:25 +01:00
CNCF-bot 8137985380 support hide license 2023-10-05 12:14:39 +01:00
CNCF-bot 8c4b4941de reduce request time 2023-09-25 17:16:07 +01:00
CNCF-bot b2c7d52080 2 steps in daily updates 2023-09-25 08:17:37 +01:00
CNCF-bot 5e05834a46 Merge branch 'master' of github.com:cncf/landscapeapp 2023-09-25 07:19:45 +01:00
CNCF-bot 450ca5e141 hide no best practices 2023-09-25 07:19:40 +01:00
knanao d524f88001
Fix the link of the First Commit (#861)
Signed-off-by: knanao <nao.7ken@gmail.com>
2023-09-22 23:07:24 +01:00
CNCF-bot 12667a2b52 fix 2023-09-04 01:17:26 +01:00
CNCF-bot 52f2254d91 fix 2023-09-04 01:07:08 +01:00
CNCF-bot 10155fd1ea remove caching 2023-09-04 01:05:26 +01:00
CNCF-bot bc541000c9 use npm9 2023-09-03 17:22:44 +01:00
CNCF-bot b3638c04aa fix 2023-09-03 17:07:59 +01:00
CNCF-bot bd563a8465 debug 2023-09-03 16:53:48 +01:00
CNCF-bot 485cb1158d fix node version 2023-09-03 16:41:53 +01:00
CNCF-bot 1a3e59e157 fix 2023-08-23 18:30:58 +01:00
CNCF-bot b784d7f896 progress 2023-08-23 16:45:05 +01:00
CNCF-bot b45ce81784 fixes 2023-08-14 17:57:37 +01:00
CNCF-bot 808d219202 skip market ca 2023-07-18 15:19:02 +01:00
CNCF-bot 2bda551a74 fix 2023-07-12 17:41:53 +01:00
CNCF-bot 3775e220a3 report progress 2023-07-12 13:40:53 +01:00
CNCF-bot 0b41bc54da fix 2023-07-10 23:22:05 +01:00
CNCF-bot 97e8e882a3 fixes 2023-07-10 22:35:53 +01:00
John Mertic 62fa27892c
Add Bolsa de Madrid (#796)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2023-06-01 13:58:50 +02:00
CNCF-bot 8ce89db6e3 changes 2023-05-30 09:05:46 +01:00
CNCF-bot 0b66094876 make daily updates faster 2023-05-24 08:40:13 +01:00
CNCF-bot d4409f142a do not calc number of tweets 2023-05-22 12:20:08 +01:00
CNCF-bot 28973ed0bc do not fetch twitter entries, that just does not work 2023-05-17 16:31:44 +01:00
CNCF-bot 7a983a6583 fix 2023-04-20 22:50:30 +01:00
CNCF-bot af91ca7e16 fix an embedded server 2023-04-20 13:00:00 +01:00
CNCF-bot d4850f64fd allow x large 2023-04-17 13:41:29 +01:00
CNCF-bot af77ba322a support other tabs without subcategories 2023-03-30 21:44:13 +01:00
CNCF-bot 73ac6d4efe support large icons for premier members 2023-03-21 14:20:06 +00:00
CNCF-bot ffbb154c51 update message 2023-03-20 12:00:23 +00:00
CNCF-bot 90d9bead25 a warning message 2023-03-20 09:51:29 +00:00
CNCF-bot a17dc8d542 fix 2023-03-14 14:35:56 +00:00
CNCF-bot 0b0314f636 support cors 2023-03-02 20:38:02 +00:00
CNCF-bot d8c453c471 update the ip address of a build server 2023-02-23 22:10:03 +00:00
CNCF-bot b85dbd9100 fix 2023-02-22 14:29:42 +00:00
CNCF-bot 3a01088cda fix --noc-ci 2023-02-22 14:26:57 +00:00
CNCF-bot b0f6c86335 update landscape script --no-ci 2023-02-22 14:20:37 +00:00
CNCF-bot 06d592b3ba fix 2023-02-08 15:27:38 +00:00
CNCF-bot 60ea7c8551 allow gray large items 2023-02-08 08:45:46 +00:00
CNCF-bot f9b1fbe8ab autoupdate riscv as well 2023-01-27 19:41:27 +00:00
CNCF-bot d9020382c6 make it a link 2023-01-27 10:32:08 +00:00
CNCF-bot 1c5e8aaee3 forgot a file 2023-01-26 10:20:56 +00:00
CNCF-bot 5b8254f1b2 support CLO entries 2023-01-26 10:14:55 +00:00
CNCF-bot e12aaca02f summary fixes 2023-01-25 14:38:00 +00:00
CNCF-bot 2775c25b5b tolerate when processed_landscape.yml is not in sync 2023-01-24 21:02:31 +00:00
CNCF-bot 4ffbff6f9c fix the summary layout 2023-01-23 12:59:55 +00:00
CNCF-bot 1ac6a2c97f add a way to remove puppeteer 2023-01-19 10:01:51 +00:00
CNCF-bot 9aa1006f60 speed up RiscV 2023-01-17 15:29:54 +00:00
CNCF-bot b5802a5545 better links rendering 2023-01-12 20:46:34 +00:00
CNCF-bot fe9351f824 allow to override languages 2023-01-09 09:07:37 +00:00
CNCF-bot 8434098eaf styles 2023-01-09 08:51:12 +00:00
CNCF-bot 8dc5fd6c82 fix 2023-01-09 00:12:28 +00:00
CNCF-bot f922f3831d test 2023-01-09 00:08:43 +00:00
CNCF-bot fd3fc93889 test 2023-01-09 00:07:10 +00:00
CNCF-bot 4723c94b56 debug 2023-01-09 00:06:22 +00:00
CNCF-bot 97dd8d8f8b Merge branch 'master' of github.com:cncf/landscapeapp 2023-01-09 00:00:12 +00:00
CNCF-bot aebf1d588e trying to get landscapeapp working properly 2023-01-08 23:59:55 +00:00
CNCF-Bot2 1eb67b3668
Update netlify.md
Signed-off-by: CNCF-Bot2 <117075760+CNCF-Bot2@users.noreply.github.com>
2023-01-08 23:38:43 +00:00
Andrey Kozlov a12ce99e58 CNCF-Bot2 credentials for the landscapeapp 2023-01-08 23:14:54 +00:00
Andrey Kozlov 862a33eacd test 2023-01-06 22:00:23 +00:00
Andrey Kozlov 495c7997e8 replaceAll 2023-01-06 21:42:41 +00:00
Andrey Kozlov bd8f8f8d03 fixes 2023-01-06 21:14:17 +00:00
Andrey Kozlov cc125f24dd test 2023-01-06 21:13:19 +00:00
Andrey Kozlov 250bbe68b8 test 2023-01-06 21:05:26 +00:00
Andrey Kozlov f987c05cb7 test 2023-01-06 21:04:02 +00:00
Andrey Kozlov e577cbd700 test 2023-01-06 20:57:25 +00:00
Andrey Kozlov 2ae215c8c2 make it possible to commit again 2023-01-06 20:51:05 +00:00
Andrey Kozlov 901182882c support one more ssh key 2022-12-30 10:46:48 +00:00
Andrey Kozlov a657ae8540 support bot3 2022-12-30 10:43:30 +00:00
Andrey Kozlov 628c6f71a5 make dlt first 2022-12-09 15:24:27 +00:00
Andrey Kozlov 60e5c99514 fix 2022-12-08 19:25:29 +00:00
Andrey Kozlov 2dc0d29598 add DLT landscape to the autoupdater 2022-12-08 19:20:06 +00:00
Andrey Kozlov d330c59d41 fix 2022-12-08 00:25:41 +00:00
Andrey Kozlov e0429f758d fix autoupdater 2022-12-08 00:24:44 +00:00
Andrey Kozlov 95e60ef4a9 use an ssh key 2022-12-07 22:46:45 +00:00
Andrey Kozlov 9304e3a777 remove duplicates 2022-12-05 12:45:03 +00:00
Andrey Kozlov c5b75d14e2 Merge branch 'master' of github.com:cncf/landscapeapp 2022-11-28 16:49:06 +00:00
Andrey Kozlov 899dca8561 fix 2022-11-28 16:48:55 +00:00
Milan b762217ab1
(URLs): Add configurable setting for self hosted repo url (#854)
Adds a boolean option, self_hosted_repo, that is set in
settings.yml so as to avoid assuming that the git repo
url is prefixed with https://github.com .

Signed-off-by: Milan Lakhani <mlakhani14@bloomberg.net>

Signed-off-by: Milan Lakhani <mlakhani14@bloomberg.net>
2022-11-16 13:39:46 +00:00
Milan 8a8003b41f
(dialog box): Hide twitter button when no twitter key is provided (#853)
This checks whether TWITTER_KEYS is set and if not does not show
the twitter button in the dialog box.

Signed-off-by: Milan Lakhani <mlakhani14@bloomberg.net>

Signed-off-by: Milan Lakhani <mlakhani14@bloomberg.net>
Co-authored-by: Milan Lakhani <27683+mlakhani14@users.noreply.bbgithub.dev.bloomberg.com>
2022-11-15 17:02:50 -06:00
dependabot[bot] c99ae2514a
Bump minimatch from 3.0.4 to 3.1.2 (#850)
Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2.
- [Release notes](https://github.com/isaacs/minimatch/releases)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2)

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

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-15 16:31:31 -06:00
Andrey Kozlov fdab31e0f7 color 2022-11-15 14:47:11 +00:00
Andrey Kozlov e449569b86 minor alignment 2022-11-15 14:28:26 +00:00
Andrey Kozlov d6c2ecad33 update a summary 2022-11-15 14:03:43 +00:00
Andrey Kozlov ad5d51afe7 support filtering by specification 2022-11-14 08:39:43 +00:00
Andrey Kozlov a49ff4b891 summary 2022-10-25 11:03:08 +01:00
Andrey Kozlov 5a572110fe test 2022-10-19 18:04:51 +01:00
Andrey Kozlov f6dbef23f3 fixes 2022-10-19 17:31:51 +01:00
Andrey Kozlov 461c9d6d8a styling the summary page 2022-10-19 17:22:26 +01:00
Andrey Kozlov dae74b9d6d test 2022-10-18 12:46:50 +01:00
Andrey Kozlov 21d8621271 ga4 snippet 2022-10-17 23:12:40 +01:00
Andrey Kozlov 60d7704d7d remove console info 2022-10-14 08:30:00 +01:00
Andrey Kozlov 526822323c light borders in summary 2022-10-14 08:29:27 +01:00
Andrey Kozlov 47a6b6fb00 better padding 2022-10-14 00:08:06 +01:00
Andrey Kozlov 17f088a0de update summary renderer 2022-10-13 23:58:38 +01:00
Andrey Kozlov f6cd147f77 update subcategory renderer 2022-10-06 15:26:40 +01:00
Andrey Kozlov 1088b323ae fix 2022-09-23 17:15:48 +01:00
Andrey Kozlov 8c75b38bd2 fix funding 2022-09-23 17:13:12 +01:00
Andrey Kozlov e347630c9e speed up funding 2022-09-22 23:08:40 +01:00
Andrey Kozlov 674dd36513 pass accessibility 2022-09-20 20:23:15 +01:00
Andrey Kozlov 2ba49cc7a6 improve accessibility 2022-09-19 19:50:39 +01:00
Andrey Kozlov 1ab80e01c1 provide only extra meta tags 2022-09-14 16:48:29 +01:00
Andrey Kozlov c5e8289c77 support extra meta tags 2022-09-14 16:10:14 +01:00
Andrey Kozlov 1c6df12abf update summary - allow filtering 2022-09-08 20:25:17 +01:00
Andrey Kozlov 5e5110ca52 fix 2022-09-02 10:45:21 +01:00
Andrey Kozlov 875014bac0 project tag in two lines when necessary 2022-09-01 14:49:38 +01:00
Andrey Kozlov 05723ec72f fix 2022-08-22 16:43:53 +01:00
Andrey Kozlov 68452b5dfd support multiline text in label captions 2022-08-17 10:08:11 +01:00
Andrey Kozlov 53d01e8982 fix an issue when number of tweets is not calculated yet 2022-08-17 09:42:32 +01:00
Andrey Kozlov 0d0004ae18 fix 2022-08-12 18:22:33 +01:00
Andrey Kozlov 921e8a3cdf saneName to affect only existing items 2022-08-12 16:15:54 +01:00
Andrey Kozlov 544ba79b1d update the saneName 2022-08-09 16:26:56 +01:00
Andrey Kozlov 645e77ea29 filters 2022-08-07 16:49:03 +01:00
Andrey Kozlov 8cd5ba7a86 wip 2022-08-07 13:53:17 +01:00
Andrey Kozlov 12de9ea4f8 show info about absolutely all CNCF projects 2022-08-05 12:29:17 +01:00
Andrey Kozlov 848670d1e6 better support for a summary table 2022-08-05 10:43:10 +01:00
Andrey Kozlov b03a7878f2 fix 2022-08-02 16:39:15 +01:00
Andrey Kozlov c71dea1f6e more info 2022-08-02 16:20:08 +01:00
Andrey Kozlov 14c675ecf5 first result 2022-08-02 12:09:58 +01:00
Andrey Kozlov 0889f7833a scroll by the first letter 2022-07-18 22:50:29 +01:00
Andrey Kozlov 6b234663e9 update to position: fixed 2022-07-15 13:58:02 +01:00
Andrey Kozlov 2b0075056a position them properly 2022-07-15 13:56:24 +01:00
Andrey Kozlov fba9b1c416 forgot an icon 2022-07-15 13:39:10 +01:00
Andrey Kozlov d338c0bb39 update a guide - add edit and report links, closes #831 2022-07-15 13:08:09 +01:00
Andrey Kozlov fa34affd2d extra special dates 2022-07-08 16:13:20 +01:00
Andrey Kozlov 1437c53605 fix local development 2022-07-06 15:13:48 +01:00
Andrey Kozlov 04ef289bae export extra fields 2022-07-06 10:28:31 +01:00
Andrey Kozlov 90daf28206 better errors for second_path 2022-06-23 16:02:38 +01:00
Andrey Kozlov cb1b161a76 minpr fixes 2022-06-23 08:23:00 +01:00
Andrey Kozlov 8a281f8be2 fix 2022-06-15 13:43:59 +01:00
Andrey Kozlov a59ccb133f typo 2022-06-15 13:31:52 +01:00
Andrey Kozlov 7b4580f15d fix style parameter 2022-06-15 09:45:29 +01:00
Andrey Kozlov b1748d9ad8 fixes 2022-06-15 09:24:14 +01:00
Andrey Kozlov 8316ec3a9c popup window for an embed mode 2022-06-15 08:57:36 +01:00
Andrey Kozlov 84ee4cae5d return back a basic embed support 2022-06-15 08:19:52 +01:00
Andrey Kozlov 8728f7a67d rename best practices 2022-06-11 17:56:26 +01:00
Andrey Kozlov 34a2801c12 realign zoom level 2022-06-08 22:44:02 +01:00
Andrey Kozlov 4274e2dce0 disable filters in a landscape mode 2022-06-08 22:41:42 +01:00
Andrey Kozlov 35e442b220 fix issues 2022-06-08 18:19:41 +01:00
Andrey Kozlov 9dd4cbbce7 one more fix 2022-06-08 14:09:34 +01:00
Andrey Kozlov f420554102 fixes 2022-06-08 13:48:38 +01:00
Andrey Kozlov 51b07fd90f fix api 2022-06-08 08:32:10 +01:00
Andrey Kozlov 5e8272e951 update zIndex 2022-06-07 16:37:31 +01:00
Andrey Kozlov dc9ab23e3c fix 2022-06-07 16:21:39 +01:00
Andrey Kozlov 944b9d4ca5 support a cached version of iframeResizer.js 2022-06-07 16:15:32 +01:00
Andrey Kozlov 1d976569e6 fixes 2022-06-07 15:57:23 +01:00
Andrey Kozlov 4afbf066e1 remove cache control headers 2022-06-07 15:34:18 +01:00
Andrey Kozlov 1311cc87b3 fix external 2022-06-07 15:23:10 +01:00
Andrey Kozlov b36a6dde0f fix iframe 2022-06-07 15:20:04 +01:00
Andrey Kozlov d30b8ad818 eslint 2022-06-07 15:14:38 +01:00
Andrey Kozlov 5a4955b941 fix script --no-ci 2022-06-07 15:03:29 +01:00
Andrey Kozlov ae5ce3d9b0 disable an iframe test for now 2022-06-07 14:54:44 +01:00
Andrey Kozlov 6bd23218e7 rework embedded pages 2022-06-07 13:43:10 +01:00
Andrey Kozlov f0fe09fbf7 server --no-ci 2022-06-06 22:54:30 +01:00
Andrey Kozlov ca1d9882af fix 2022-06-03 19:12:58 +01:00
Andrey Kozlov e286ddaef9 one more typoe 2022-06-03 19:10:24 +01:00
Andrey Kozlov b4f92d7bb9 fix eslint 2022-06-03 18:50:42 +01:00
Andrey Kozlov fab5d5ab34 Merge remote-tracking branch 'origin/master' 2022-06-03 18:47:23 +01:00
Andrey Kozlov 3eb7b5d0f0 do not use npm packages - just rely on a branch 2022-06-03 16:03:33 +01:00
CNCF-bot 5b9f12d80d Update to a new version [skip ci] 2022-06-03 14:36:14 +00:00
CNCF-bot a292620f7a Update to a new version [skip ci] 2022-06-03 14:17:05 +00:00
Andrey Kozlov 7a51987a03 update yarn 2022-06-03 15:15:28 +01:00
Andrey Kozlov 282460a37a update to latest packages 2022-06-03 15:10:50 +01:00
Andrey Kozlov 84749ce870
Remove react (#824)
* convert to no react

* wip

* proper oss/nonoss fix

* more progress

* wip

* more progress

* fixes

* even more fixes

* even more fixes

* more fixes

* eslint added

* fixes

* fixes

* fixes

* fix annoying issues

* issues with export functions fixed

* properly embed data

* debug netlify

* fixes

* fix

* debug

* forgot async

* more fixes

* minor fixes

* do not forget eslint

Co-authored-by: Andrey Kozlov <zeus@Andreys-MacBook-Pro.local>
2022-06-03 15:01:22 +01:00
CNCF-bot ebb53fe075 Update to a new version [skip ci] 2022-05-27 21:12:32 +00:00
Andrey Kozlov c72a1e6148 Merge branch 'master' of github.com:cncf/landscapeapp 2022-05-27 22:06:10 +01:00
Andrey Kozlov 1d9f8c31d6 minor fixes 2022-05-27 22:06:04 +01:00
CNCF-bot 745e5057a4 Update to a new version [skip ci] 2022-05-25 21:23:24 +00:00
Andrey Kozlov 2eeafd345d Merge branch 'master' of github.com:cncf/landscapeapp 2022-05-25 22:17:20 +01:00
Andrey Kozlov abc521cefc support 3 and more categories/subcategories 2022-05-25 22:17:09 +01:00
CNCF-bot 1aa6cf747e Update to a new version [skip ci] 2022-05-25 16:07:18 +00:00
Andrey Kozlov d2719d926b fix 2022-05-25 16:58:00 +01:00
CNCF-bot 03321ab164 Update to a new version [skip ci] 2022-05-25 15:48:57 +00:00
Andrey Kozlov 54a7575b94 render back acquisitions 2022-05-25 16:42:59 +01:00
CNCF-bot e8e823e25b Update to a new version [skip ci] 2022-05-24 18:52:19 +00:00
Andrey Kozlov e8a6db4982
allow a second category/subcategory (#823)
Co-authored-by: Andrey Kozlov <zeus@Andreys-MacBook-Pro.local>
2022-05-24 19:46:36 +01:00
CNCF-bot c1c2fb26d1 Update to a new version [skip ci] 2022-05-22 11:10:04 +00:00
Andrey Kozlov 9009ceb9ad Merge branch 'master' of github.com:cncf/landscapeapp 2022-05-22 12:04:07 +01:00
Andrey Kozlov 991798616a update embedded pages - add extra ids 2022-05-22 12:03:57 +01:00
CNCF-bot 4c5e1df907 Update to a new version [skip ci] 2022-05-19 09:01:19 +00:00
Andrey Kozlov 11dba210df support sections and subsections from all landscape pages; 2022-05-19 09:55:37 +01:00
CNCF-bot e4e706e992 Update to a new version [skip ci] 2022-05-18 18:17:06 +00:00
Andrey Kozlov 3cd5090092 Merge branch 'master' of github.com:cncf/landscapeapp 2022-05-18 19:11:24 +01:00
Andrey Kozlov dea1363831 fix nonoss background 2022-05-18 19:11:16 +01:00
CNCF-bot b0a6aa9ef8 Update to a new version [skip ci] 2022-05-17 22:02:18 +00:00
Andrey Kozlov 619f7b7847 Merge branch 'master' of github.com:cncf/landscapeapp 2022-05-17 22:56:36 +01:00
Andrey Kozlov 7e645dbc3e disable auto redirect 2022-05-17 22:56:26 +01:00
CNCF-bot 6dba098fcc Update to a new version [skip ci] 2022-05-16 14:45:13 +00:00
Andrey Kozlov 0793fafd05 Merge branch 'master' of github.com:cncf/landscapeapp 2022-05-16 15:34:22 +01:00
Andrey Kozlov 1f5285428e test 2022-05-16 15:34:13 +01:00
CNCF-bot 9adb65ee38 Update to a new version [skip ci] 2022-05-16 14:24:42 +00:00
Andrey Kozlov 892362ea1f Merge branch 'master' of github.com:cncf/landscapeapp 2022-05-16 15:18:58 +01:00
Andrey Kozlov c080c125aa fix security issue --no-ci 2022-05-16 15:18:49 +01:00
CNCF-bot 550d8f30d7 Update to a new version [skip ci] 2022-05-16 14:06:40 +00:00
Andrey Kozlov a79556b99e Merge branch 'master' of github.com:cncf/landscapeapp 2022-05-16 15:00:47 +01:00
Andrey Kozlov dec187b4e5 add a space 2022-05-16 15:00:37 +01:00
CNCF-bot 52efed17d6 Update to a new version [skip ci] 2022-05-14 21:47:59 +00:00
Andrey Kozlov 611cf5f654 Merge branch 'master' of github.com:cncf/landscapeapp 2022-05-14 22:42:11 +01:00
Andrey Kozlov 20f32d35d0 update readme --no-ci 2022-05-14 22:42:02 +01:00
CNCF-bot 54fade6a94 Update to a new version [skip ci] 2022-05-14 17:58:56 +00:00
Andrey Kozlov 1f7c082cca loading=lazy for export 2022-05-14 18:53:13 +01:00
CNCF-bot 0d1e0e77e6 Update to a new version [skip ci] 2022-05-14 16:10:42 +00:00
Andrey Kozlov 853af61ab4
vanilla js - no libs, no frameworks (#821)
Vanilla js

Co-authored-by: Andrey Kozlov <zeus@Andreys-MacBook-Pro.local>
2022-05-14 17:05:02 +01:00
CNCF-bot 480aea9d04 Update to a new version [skip ci] 2022-05-09 17:55:46 +00:00
Andrey Kozlov 67a3b089de Merge branch 'master' of github.com:cncf/landscapeapp 2022-05-09 18:36:40 +01:00
CNCF-bot 27f62a94ae Update to a new version [skip ci] 2022-05-09 14:48:23 +00:00
CNCF-bot b21c5fd597 Update to a new version [skip ci] 2022-05-09 14:17:24 +00:00
Andrey Kozlov 926351f335 guarantee that keys are uniq 2022-05-09 15:14:35 +01:00
Andrey Kozlov 409f06a363 remove shadows 2022-05-09 14:58:46 +01:00
CNCF-bot 87f8445b71 Update to a new version [skip ci] 2022-04-25 15:21:11 +00:00
Andrey Kozlov cc71725661 lazy loading images 2022-04-25 16:03:49 +01:00
CNCF-bot e793eb733b Update to a new version [skip ci] 2022-04-10 15:06:25 +00:00
Andrey Kozlov 3eb689d578 fix for an issue in a prune command 2022-04-10 15:49:05 +01:00
CNCF-bot ee27648dfc Update to a new version [skip ci] 2022-03-23 19:10:51 +00:00
Andrey Kozlov bed59adea3 Merge branch 'master' of github.com:cncf/landscapeapp 2022-03-23 18:43:05 +00:00
Andrey Kozlov 3178e88459 proper handling of a license field 2022-03-23 18:42:56 +00:00
CNCF-bot 7babd5b764 Update to a new version [skip ci] 2022-03-23 18:35:58 +00:00
Andrey Kozlov 0d7155766b support explicit license 2022-03-23 18:18:45 +00:00
CNCF-bot adff0ebd1b Update to a new version [skip ci] 2022-03-13 09:20:46 +00:00
Andrey Kozlov 86e23443e4
weekly update (#812)
* weekly update

* weekly update

Co-authored-by: Andrey Kozlov <zeus@Andreys-MacBook-Pro.local>
2022-03-13 09:04:32 +00:00
CNCF-bot ae6b3f006e Update to a new version [skip ci] 2022-02-24 12:37:43 +00:00
Andrey Kozlov c484efebba
weekly update (#811)
Co-authored-by: Andrey Kozlov <zeus@Andreys-MacBook-Pro.local>
2022-02-24 12:23:28 +00:00
CNCF-bot ce1d6dbdfc Update to a new version [skip ci] 2022-02-07 21:00:37 +00:00
Andrey Kozlov dafa28aa1e
weekly update (#809)
Co-authored-by: Andrey Kozlov <zeus@Andreys-MacBook-Pro.local>
2022-02-07 20:47:47 +00:00
CNCF-bot 9065ea761a Update to a new version [skip ci] 2022-02-03 12:52:10 +00:00
Andrey Kozlov ab0c184625 fix 2022-02-03 12:39:27 +00:00
Andrey Kozlov 403a5651e0
support project_org for best practices lookup (#806)
Co-authored-by: Andrey Kozlov <zeus@Andreys-MacBook-Pro.local>
2022-02-01 15:00:33 +00:00
CNCF-bot a4e97097f8 Update to a new version [skip ci] 2022-01-21 08:15:52 +00:00
Trevor Bramwell 2f058973f0
Revert "Remove LFN landscape for now" (#756)
Now that LFN landscape is building successfully it can be added back.

This reverts commit 1dbe339543.
2022-01-21 08:03:52 +00:00
CNCF-bot 6bed68ba99 Update to a new version [skip ci] 2022-01-20 13:00:25 +00:00
Andrey Kozlov 9d20d4fe1a Merge branch 'master' of github.com:cncf/landscapeapp 2022-01-20 12:47:51 +00:00
Andrey Kozlov 6d9843cddf filter by best practices 2022-01-20 12:47:41 +00:00
CNCF-bot e9a3448952 Update to a new version [skip ci] 2022-01-20 09:45:05 +00:00
Andrey Kozlov 5dcf4a478a demand exact 100% matching 2022-01-20 09:32:39 +00:00
CNCF-bot cdbce7aa84 Update to a new version [skip ci] 2022-01-11 15:44:41 +00:00
Jordi Noguera eb7d99d9ba
Only match guide to main landscape for now (#797) 2022-01-11 16:32:17 +01:00
CNCF-bot 9b5c3c6ffb Update to a new version [skip ci] 2021-12-21 13:59:33 +00:00
ZeusTheTrueGod 71b54d5a62 Merge branch 'master' of github.com:cncf/landscapeapp 2021-12-21 13:47:08 +00:00
ZeusTheTrueGod fe515ca7d2 allow a guide without any sections 2021-12-21 13:46:56 +00:00
CNCF-bot 97f425b465 Update to a new version [skip ci] 2021-12-17 15:44:17 +00:00
Jordi Noguera c7e219b52c
Center category title (#795) 2021-12-17 16:31:58 +01:00
CNCF-bot 9a150a523c Update to a new version [skip ci] 2021-12-16 11:28:46 +00:00
Meet Gor 0588a0a63c
fix typos in README (#794)
* fixed typos in README

* changes after review

Co-authored-by: Bill Mulligan <billmulligan516@gmail.com>

Co-authored-by: Bill Mulligan <billmulligan516@gmail.com>
2021-12-16 12:16:32 +01:00
CNCF-bot 3d8522ba7e Update to a new version [skip ci] 2021-12-10 18:49:46 +00:00
ZeusTheTrueGod dfce515043 Merge branch 'master' of github.com:cncf/landscapeapp 2021-12-10 18:37:25 +00:00
ZeusTheTrueGod e180f8c6e5 fix 2021-12-10 18:37:20 +00:00
CNCF-bot 03cb35fad4 Update to a new version [skip ci] 2021-12-08 18:43:58 +00:00
ZeusTheTrueGod fe5fdec626 Merge branch 'master' of github.com:cncf/landscapeapp 2021-12-08 18:31:28 +00:00
ZeusTheTrueGod 624413a037 prerender items to use them in the online editor 2021-12-08 18:31:14 +00:00
CNCF-bot 6bac7f4231 Update to a new version [skip ci] 2021-12-07 11:31:22 +00:00
Andrey Kozlov 6356a9eeec
weekly updates (#793)
* weekly updates

* downgrade chalk

* fixes
2021-12-07 11:18:58 +00:00
CNCF-bot 6f01c906ef Update to a new version [skip ci] 2021-12-06 12:38:22 +00:00
Andrey Kozlov fcd219cc15
render every item (#792) 2021-12-06 12:29:44 +00:00
CNCF-bot bb7befeafc Update to a new version [skip ci] 2021-11-23 10:02:31 +00:00
ZeusTheTrueGod 53072942dd fix for a member tag 2021-11-23 09:54:15 +00:00
CNCF-bot ca3853a504 Update to a new version [skip ci] 2021-11-22 16:33:50 +00:00
ZeusTheTrueGod a8b5d5979b get rid of a false membership entry 2021-11-22 09:09:51 +00:00
CNCF-bot 18fbd506e3 Update to a new version [skip ci] 2021-11-21 22:26:15 +00:00
ZeusTheTrueGod 353484daab increase a timeout 2021-11-18 14:14:58 +00:00
ZeusTheTrueGod e2889a85de support an edge case when an item id contains only non-ASCII characters 2021-11-18 13:26:06 +00:00
ZeusTheTrueGod 34e404002e return required back to lfph landscape 2021-11-10 15:15:00 +00:00
CNCF-bot 2ea8b8a4fe Update to a new version [skip ci] 2021-11-08 20:07:57 +00:00
ZeusTheTrueGod 46f6bc0790 there are issues with lfph, skip for now 2021-11-08 19:57:39 +00:00
ZeusTheTrueGod 102c441cec support a custom validator in settings.yml for extra fields 2021-11-08 19:17:30 +00:00
CNCF-bot 4ca0570ab2 Update to a new version [skip ci] 2021-11-07 18:58:04 +00:00
ZeusTheTrueGod 7d3e5489b2 fix a list of necessary dependencies 2021-11-07 18:49:56 +00:00
CNCF-bot b91e8574b3 Update to a new version [skip ci] 2021-10-29 07:35:39 +00:00
Jordi Noguera cfc9be9e4b
Fix layout tests failing silently (#787) 2021-10-29 09:27:36 +02:00
CNCF-bot 0f4caabf66 Update to a new version [skip ci] 2021-10-28 13:00:26 +00:00
Jordi Noguera ab84dbd421
Tweak social media tags (#789) 2021-10-28 14:52:10 +02:00
CNCF-bot 15fd6a7b04 Update to a new version [skip ci] 2021-10-27 12:50:44 +00:00
Jordi Noguera d3841d6134 Fix basic auth config for axios 2021-10-27 14:28:59 +02:00
CNCF-bot 041aee358f Update to a new version [skip ci] 2021-10-27 12:24:10 +00:00
Jordi Noguera 6c78d61d9b Fix local builds 2021-10-27 14:16:07 +02:00
CNCF-bot f175ac012d Update to a new version [skip ci] 2021-10-26 13:49:18 +00:00
Jordi Noguera d715ddb9a2
Use size=small in landscape controls (#786) 2021-10-26 15:41:21 +02:00
CNCF-bot b79b530773 Update to a new version [skip ci] 2021-10-26 10:40:40 +00:00
Jordi Noguera f0e891ac68
Fix Guide Toggle glitch on Mobile Chrome (#785) 2021-10-26 12:32:48 +02:00
CNCF-bot 84df15804a Update to a new version [skip ci] 2021-10-26 09:55:02 +00:00
Jordi Noguera 21abb35b19
Prevent layout shifts when hovering over links (#784) 2021-10-26 11:46:55 +02:00
CNCF-bot d0f6963c95 Update to a new version [skip ci] 2021-10-25 18:58:10 +00:00
Andrey Kozlov 4ea4636537
75 weekly 2021 10 25 (#783)
* update nodejs to 17.0.1

* node 16.12
2021-10-25 19:50:23 +01:00
CNCF-bot 3a9ccd4cb2 Update to a new version [skip ci] 2021-10-24 18:41:31 +00:00
ZeusTheTrueGod 81829f4c97 Merge branch 'master' of github.com:cncf/landscapeapp 2021-10-24 19:33:27 +01:00
ZeusTheTrueGod e29b88103f make a build a bit faster in a preview 2021-10-24 19:33:21 +01:00
CNCF-bot b80b2ab739 Update to a new version [skip ci] 2021-10-24 07:42:53 +00:00
ZeusTheTrueGod 0e49b73a60 Merge branch 'master' of github.com:cncf/landscapeapp 2021-10-24 08:34:25 +01:00
ZeusTheTrueGod 74280f2655 support a preview from an online editor 2021-10-24 08:34:20 +01:00
CNCF-bot 269bc5c4a7 Update to a new version [skip ci] 2021-10-21 12:22:34 +00:00
Jordi Noguera ca08b4b8ef
Hide tweet count when adblocker is present (#781) 2021-10-21 14:14:33 +02:00
CNCF-bot 93fd1b7669 Update to a new version [skip ci] 2021-10-20 16:05:00 +00:00
ZeusTheTrueGod 73c8cdf11d Merge branch 'master' of github.com:cncf/landscapeapp 2021-10-20 16:56:56 +01:00
ZeusTheTrueGod 552e3eef71 support a quick preview build 2021-10-20 16:56:46 +01:00
CNCF-bot 15816250e7 Update to a new version [skip ci] 2021-10-20 14:40:20 +00:00
Jordi Noguera 375a726566 Add hover effect to guide toggle 2021-10-20 16:21:51 +02:00
CNCF-bot 15072e1fbc Update to a new version [skip ci] 2021-10-20 14:13:43 +00:00
Jordi Noguera 593d621cd6
request is deprecated, use axios instead (#780) 2021-10-20 16:05:45 +02:00
CNCF-bot e100971bc8 Update to a new version [skip ci] 2021-10-19 07:32:52 +00:00
ZeusTheTrueGod 30c5c449e1 minor fix 2021-10-19 08:24:11 +01:00
CNCF-bot 43d8bc22d8 Update to a new version [skip ci] 2021-10-15 13:53:24 +00:00
John Mertic 738a9a2dd3
Add stock ticker support for Taipei and alternate for Moscow (#775)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2021-10-15 14:33:11 +01:00
CNCF-bot 7e4d00d970 Update to a new version [skip ci] 2021-10-14 13:39:46 +00:00
Jordi Noguera 179a5ac15f
Don't make space for info icon if guide is not present (#779) 2021-10-14 15:31:46 +02:00
CNCF-bot 57dcb94859 Update to a new version [skip ci] 2021-10-12 05:02:43 +00:00
Jordi Noguera 1d6a0a5c7e
Minor guide bug fixes (#778) 2021-10-12 06:54:45 +02:00
CNCF-bot f4087e464c Update to a new version [skip ci] 2021-10-11 15:27:24 +00:00
Jordi Noguera fb1231d0d7
Generate landscape guide (#763)
* Initial guide work

* Only build CNCF guide branch

* Fix broken images in guide

* Put back basePath

* Increase spacing on guide sidebar and show active link

* Improve guide styling

* Open external links in new tab

* Link categories and subcategories to landscape

* center table

* Extract guide.css

* Add guide to page title

* Fix broken images

* Embed landscape items inside guide

* Automatically show projects belonging to CNCF in guide

* Fix left navigation indentation

* Make logos larger

* Allow content to come from markdown files

* Improve navigation bar spacing

* Add title to guide

* Stay on guide when opening modal

* Fix warnings

* Tweak guide margins

* Make guide's font color gray

* Capitalize guide

* Make main content narrower

* Tweaks to spacing and font size

* Fix logos alignment in guide

* More tweaks to spacing

* Fix layout of buzzwords and projects table

* Make sidebar expandible

* Fix og:image

* Fix not finding right category

* Add info icons next to each category

* Disable accessibility checking for now

* Center guide content

* Improve guide responsiveness

* Improve guide vertical spacing

* Change font weight to 400

* Add guide icon

* Don't scroll when opening/closing modal

* Fix accessibility issues

* Enable accessibility test in guide

* Fix permalink icon alignment in chrome

* Move sidebar to left and add padding between sidebar and main content

* Fix guide responsiveness

* Fix guide link in deploy preview

* Fix Guide cross-browser issues

* Fix sidebar scroling

* Add Guide Toggle

* Make toggles same size on both landscape and guide

* Collapse all other items when sidebar item is expanded

* Improve cards alignment in guide

* Add hover to category titles

* Make category title and info icon bolder on hover

* Position info icon at the end of subcategory grid

* Add hover behavior to subcategory info icon

* Adjust color of links and hover behavior

* Further improvements to link colors

* Rename breakpoints.css to constants.css

* DRY Header

* DRY Horizontal/Vertical Category

* Change color of tabs

* Fix couple of UI bugs

* Adjust guide link hover

* Fix UI regression on fullscreen landscape

* Tweaks to svg hover

* Convert guide to single markdown file

* Automatically parse h2/h3 from guide.md and add links to sidebar

* Add validations for guide data-attributes

* Validate h1 is not used in guide

* Add readme

* Revert changes to build.sh and landscapes.yml

* Add workaround for next export when guide is missing
2021-10-11 08:19:24 -07:00
CNCF-bot 768d27e5e5 Update to a new version [skip ci] 2021-10-11 14:40:22 +00:00
Jordi Noguera f625029e9c
Replace deprecated typeface-roboto with fontsource-roboto (#777) 2021-10-11 16:32:29 +02:00
CNCF-bot 1eff4b4261 Update to a new version [skip ci] 2021-09-23 12:08:25 +00:00
Jordi Noguera a8313f3374
Fix Roboto not being set (#771) 2021-09-23 13:59:59 +02:00
CNCF-bot 24ac7a7005 Update to a new version [skip ci] 2021-09-19 11:54:34 +00:00
Andrey Kozlov 3ce07ab2b6 Merge branch 'master' of github.com:cncf/landscapeapp 2021-09-19 11:33:18 +00:00
Andrey Kozlov 9b299d1b8f fix order by joined 2021-09-19 11:33:13 +00:00
CNCF-bot c21212ece4 Update to a new version [skip ci] 2021-09-19 11:28:33 +00:00
Andrey Kozlov f76e296894 update a list of allowed keys 2021-09-19 11:20:15 +00:00
Andrey Kozlov d87adfcda3 ensure that netlify is 16.04 2021-09-13 10:35:02 +00:00
Andrey Kozlov a54a0004bd 16.04 check --no-ci 2021-09-13 07:55:07 +00:00
Andrey Kozlov 5a90978744 debug uname -a on netlify 2021-09-13 07:37:07 +00:00
Andrey Kozlov 6364d40750 fix 2021-09-13 07:33:14 +00:00
Andrey Kozlov 76a617461a fix --no-ci 2021-09-13 07:30:26 +00:00
Andrey Kozlov eef21412d7 guarantee 16.04 ubuntu image on netlify 2021-09-13 06:56:24 +00:00
CNCF-bot 96d4a303ee Update to a new version [skip ci] 2021-09-07 22:54:28 +00:00
Andrey Kozlov 3e474ccea4 Revert "75 weekly updates (#770)"
This reverts commit f9fdcdbd59.
2021-09-07 22:41:41 +00:00
CNCF-bot cfd7480136 Update to a new version [skip ci] 2021-09-07 14:26:33 +00:00
Andrey Kozlov f9fdcdbd59
75 weekly updates (#770) 2021-09-07 09:03:38 -05:00
CNCF-bot 5f66d6ac18 Update to a new version [skip ci] 2021-09-07 13:59:52 +00:00
John Mertic de11917ba7
Add OpenSSF landscape (#769)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2021-09-07 15:39:10 +02:00
CNCF-bot 5db9201602 Update to a new version [skip ci] 2021-09-07 13:27:49 +00:00
Jordi Noguera cbd680513a Show stderr when preparing landscape fails 2021-09-07 15:17:34 +02:00
CNCF-bot 33f21969c4 Update to a new version [skip ci] 2021-09-06 14:58:49 +00:00
Jordi Noguera 62e8b76d43
Fix padding for vertical columns that stretch (#768) 2021-09-06 16:48:35 +02:00
Andrey Kozlov c4d81d9aa1 Merge branch 'master' of github.com:cncf/landscapeapp 2021-08-31 18:52:52 +00:00
Andrey Kozlov 3913522f9f fix --no-ci 2021-08-31 18:52:44 +00:00
CNCF-bot 7ea839aa60 Update to a new version [skip ci] 2021-08-31 17:13:28 +00:00
Andrey Kozlov 9dbc2c965c Merge branch 'master' of github.com:cncf/landscapeapp 2021-08-31 17:03:31 +00:00
Andrey Kozlov 06f143713f fix 2021-08-31 17:02:52 +00:00
CNCF-bot e2ec71d6b3 Update to a new version [skip ci] 2021-08-31 17:02:10 +00:00
Andrey Kozlov 23ea56455c fix remote build 2021-08-31 16:54:58 +00:00
Andrey Kozlov 0f1e969ce8 Merge branch 'master' of github.com:cncf/landscapeapp 2021-08-31 16:52:24 +00:00
Andrey Kozlov 0b309dd934 fix remote build 2021-08-31 16:52:20 +00:00
CNCF-bot d35c12be33 Update to a new version [skip ci] 2021-08-26 13:51:59 +00:00
Jordi Noguera 07c9a8a2b7
Fix og:image (#766) 2021-08-26 15:42:15 +02:00
CNCF-bot 1ce8814051 Update to a new version [skip ci] 2021-08-18 13:35:29 +00:00
Andrey Kozlov a1e8f1a0e7
weekly updates (#765) 2021-08-18 08:25:55 -05:00
CNCF-bot 455a516dc9 Update to a new version [skip ci] 2021-08-16 17:05:38 +00:00
Andrey Kozlov 9c048a3e85 update svg-autocrop 2021-08-16 16:55:43 +00:00
Andrey Kozlov be1560e673
weekly update (#761) 2021-07-13 15:57:52 +00:00
CNCF-bot c20cfa01a6 Update to a new version [skip ci] 2021-07-08 14:16:08 +00:00
Jordi Noguera 01874e0e3b
Allow empty ads (#759) 2021-07-08 16:08:15 +02:00
CNCF-bot 843562a311 Update to a new version [skip ci] 2021-06-29 00:39:02 +00:00
Andrey Kozlov 1bebfa3157
weekly update (#757) 2021-06-29 00:32:26 +00:00
CNCF-bot 66e31f9e84 Update to a new version [skip ci] 2021-06-28 16:48:26 +00:00
Jordi Noguera 10f520eb44
Fix zero funding (#758) 2021-06-28 18:41:46 +02:00
CNCF-bot 239a6f8945 Update to a new version [skip ci] 2021-06-18 22:39:19 +00:00
Andrey Kozlov 2dd94b2aa6 allow to skip funding 2021-06-18 22:32:37 +00:00
CNCF-bot 0a1686ed11 Update to a new version [skip ci] 2021-06-18 18:04:44 +00:00
Andrey Kozlov 66588446d4
75 weekly update (#755) 2021-06-18 17:58:20 +00:00
CNCF-bot 2bcb74724a Update to a new version [skip ci] 2021-06-18 12:09:22 +00:00
Jordi Noguera 89d96db72a
Fix functions again (#754)
* Fix functions not being deployed

* Fix functions again
2021-06-18 14:02:57 +02:00
CNCF-bot 1952334a5b Update to a new version [skip ci] 2021-06-17 16:17:36 +00:00
Jordi Noguera 116169d8dc
Fix functions not being deployed (#752) 2021-06-17 18:10:50 +02:00
CNCF-bot b4340202a8 Update to a new version [skip ci] 2021-06-09 21:35:39 +00:00
Andrey Kozlov d5752e767d fix 2021-06-09 21:29:08 +00:00
CNCF-bot 6c6dbda39a Update to a new version [skip ci] 2021-06-09 20:01:01 +00:00
Andrey Kozlov c41f6841da support extra info in the UI 2021-06-09 19:54:20 +00:00
CNCF-bot 76054075c9 Update to a new version [skip ci] 2021-06-08 22:58:39 +00:00
Andrey Kozlov 3289bc70d3 allow an extra field 2021-06-08 22:51:52 +00:00
Andrey Kozlov 4b18fff019 fix for fetching settings 2021-06-08 22:46:22 +00:00
CNCF-bot 2ea74c622f Update to a new version [skip ci] 2021-05-20 13:20:56 +00:00
Andrey Kozlov 6218cb44f6 logos should be stored in a hosted_logos folder. Urls are not allowed anymore 2021-05-20 13:14:23 +00:00
CNCF-bot 74eee81754 Update to a new version [skip ci] 2021-05-19 13:18:40 +00:00
Jordi Noguera 8368ae1e31
Github orgs improvements (#750) 2021-05-19 15:03:48 +02:00
CNCF-bot 98d4a5b542 Update to a new version [skip ci] 2021-05-19 10:39:27 +00:00
Andrey Kozlov 393974c70c
update puppeteer (#749) 2021-05-19 10:21:33 +00:00
CNCF-bot a675519cf3 Update to a new version [skip ci] 2021-05-19 10:13:59 +00:00
Andrey Kozlov 67243e245d
update charts (#748) 2021-05-19 10:07:17 +00:00
CNCF-bot 04600d61af Update to a new version [skip ci] 2021-05-17 10:11:29 +00:00
Jordi Noguera 0932ea7b2c
Restore github aggregates (#747) 2021-05-17 12:05:01 +02:00
CNCF-bot 638d4083eb Update to a new version [skip ci] 2021-05-12 08:11:02 +00:00
Andrey Kozlov 236c2c55e2
update some packages (#728)
* update some packages

* check if everything still works

* wip

* update
2021-05-12 08:04:32 +00:00
CNCF-bot adc9f0ae84 Update to a new version [skip ci] 2021-05-03 21:02:37 +00:00
Andrey Kozlov cb0b007ab1
update an update server ip (#746) 2021-05-03 20:53:05 +00:00
CNCF-bot 4b73f5a5b1 Update to a new version [skip ci] 2021-04-29 16:23:38 +00:00
Jordi Noguera b128ddb8ec Use deploy hook that actually works 2021-04-29 18:17:12 +02:00
CNCF-bot a8ffa7f348 Update to a new version [skip ci] 2021-04-29 12:22:06 +00:00
Jordi Noguera 993280bd3e Update aswf deploy hook 2021-04-29 14:15:33 +02:00
CNCF-bot d296f5b329 Update to a new version [skip ci] 2021-04-29 11:55:48 +00:00
Jordi Noguera 50f8f1de92 Update LFAI deploy hook 2021-04-29 13:49:16 +02:00
CNCF-bot 480bef0b2b Update to a new version [skip ci] 2021-04-29 11:29:08 +00:00
Jordi Noguera 1edbdbc1b6
Fix wrong rmdir (#745) 2021-04-29 13:22:34 +02:00
CNCF-bot d8f51c300a Update to a new version [skip ci] 2021-04-29 10:10:44 +00:00
Jordi Noguera bfeb028bdb
Fix rmdir deprecation warning (#744)
* Fix rmdir deprecation warning

* Also stop build server
2021-04-29 12:04:23 +02:00
CNCF-bot 43f65a168e Update to a new version [skip ci] 2021-04-28 15:03:10 +00:00
John Mertic ca6defb2e1
Update build hook for various landscapes moving from master to main (#727)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2021-04-28 16:56:44 +02:00
CNCF-bot 3a7f1bbf78 Update to a new version [skip ci] 2021-04-28 13:33:17 +00:00
Jordi Noguera 7b250a3814
Autoscale fullscreen landscape to fit window (#736) 2021-04-28 15:17:53 +02:00
CNCF-bot 9b3457db73 Update to a new version [skip ci] 2021-04-28 13:17:28 +00:00
Jordi Noguera 2c3977217a
Allow all origins (#743) 2021-04-28 15:05:38 +02:00
CNCF-bot 35d3cde36c Update to a new version [skip ci] 2021-04-28 12:59:35 +00:00
Jordi Noguera 6e74c695b3
Clean up modal (#742) 2021-04-28 14:53:31 +02:00
CNCF-bot 4dd6bdef7a Update to a new version [skip ci] 2021-04-27 08:31:42 +00:00
Jordi Noguera 0f02dc7a3c
Enable API for all landscapes and other improvements (#741)
* Redirect $landscape/api/$fnName to .netlify/functions/$landscape--$fnName

* Don't run tests twice

* Generate netlify.toml during daily update
2021-04-27 09:48:47 +02:00
CNCF-bot dbcf5f97b5 Update to a new version [skip ci] 2021-04-26 13:47:41 +00:00
Jordi Noguera 1dbe339543 Remove LFN landscape for now 2021-04-26 15:40:48 +02:00
CNCF-bot b1c9d6f578 Update to a new version [skip ci] 2021-04-26 09:00:18 +00:00
Jordi Noguera 3206bb6916
Add API items endpoint (#740)
* Add API items endpoint

* Generate netlify functions

* Use ncc for packaging

* Update  landscape deploy script to copy functions
2021-04-26 10:53:07 +02:00
CNCF-bot 22f1dede4c Update to a new version [skip ci] 2021-04-20 12:38:06 +00:00
Jordi Noguera a57eaea9f2
Fix exports not filtering correctly (#738) 2021-04-20 14:31:24 +02:00
CNCF-bot 2dd5b3539e Update to a new version [skip ci] 2021-04-19 10:08:18 +00:00
John Mertic 3ed651b31c
Add LFN landscape (#737)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2021-04-19 12:01:32 +02:00
CNCF-bot 3455457d27 Update to a new version [skip ci] 2021-04-15 12:28:25 +00:00
Jordi Noguera 709cc6ae1a
Restore responsiveness improvements (#734)
* Revert "Revert "Improve responsiveness (#731)""

This reverts commit afb7f94cc9.

* Fix embed height
2021-04-15 14:20:36 +02:00
CNCF-bot b26e8cb723 Update to a new version [skip ci] 2021-04-14 20:21:57 +00:00
CNCF-bot 173f4c9428 Update to a new version [skip ci] 2021-04-14 19:53:01 +00:00
Jordi Noguera afb7f94cc9 Revert "Improve responsiveness (#731)"
This reverts commit 0c61a45a27.
2021-04-14 21:46:02 +02:00
CNCF-bot 690d221952 Update to a new version [skip ci] 2021-04-14 15:19:57 +00:00
Jordi Noguera 83200685a6
Fix fullscreen zoom (#733) 2021-04-14 17:13:19 +02:00
CNCF-bot 11e47ff08c Update to a new version [skip ci] 2021-04-14 13:07:12 +00:00
Jordi Noguera 0c61a45a27
Improve responsiveness (#731)
* Improve responsiveness

* Use CSS to hide disclaimer
2021-04-14 15:00:31 +02:00
CNCF-bot 977fe9bc0c Update to a new version [skip ci] 2021-04-13 13:45:14 +00:00
Jordi Noguera bca0240a40
Fix subcategory width when there are large items (#732) 2021-04-13 15:38:29 +02:00
CNCF-bot 712225e18e Update to a new version [skip ci] 2021-04-13 12:48:20 +00:00
Jordi Noguera 6de44ddd9a
Filter organizations by company type and industries (#730)
* Filter by company type

* Filter by industries

* Allow overriding of industries
2021-04-13 14:41:41 +02:00
CNCF-bot 47ab527a96 Update to a new version [skip ci] 2021-04-07 12:43:47 +00:00
Jordi Noguera 87812f17ce
Fetch Industries and Company Type from Crunchbase (#729) 2021-04-07 14:36:28 +02:00
CNCF-bot a7de1ec0fe Update to a new version [skip ci] 2021-04-01 15:45:14 +00:00
Jordi Noguera 9a000ba213 Run update jobs at at 11pm ET 2021-04-01 17:37:30 +02:00
CNCF-bot 0b0a37ea84 Update to a new version [skip ci] 2021-04-01 12:31:23 +00:00
Jordi Noguera df4068fa56 Improve watching landscape files 2021-04-01 14:23:10 +02:00
CNCF-bot bfb5c91ec5 Update to a new version [skip ci] 2021-03-29 15:47:38 +00:00
John Mertic f212b81ce3
Update docs for #725 changes (#726)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2021-03-29 17:40:57 +02:00
CNCF-bot 0b6ea66e35 Update to a new version [skip ci] 2021-03-26 16:44:19 +00:00
Jordi Noguera 97fc474895
Allow additional repos not hosted on github (#725) 2021-03-26 17:37:23 +01:00
CNCF-bot ecc3ae39ab Update to a new version [skip ci] 2021-03-26 12:56:17 +00:00
Jordi Noguera 075aec7fad Fix landscapes.dev not showing update time 2021-03-26 13:46:38 +01:00
CNCF-bot 08280cde3f Update to a new version [skip ci] 2021-03-25 15:11:05 +00:00
Jordi Noguera 8fa13c6305 Update readme 2021-03-25 16:01:33 +01:00
Jordi Noguera 47a8aaf1ee Remove unused landscapes 2021-03-25 15:59:36 +01:00
CNCF-bot a9410d6595 Update to a new version [skip ci] 2021-03-25 14:16:28 +00:00
Jordi Noguera 6b89f6b7b9
Handle non-master default branch (#723) 2021-03-25 15:00:56 +01:00
CNCF-bot 440064ad04 Update to a new version [skip ci] 2021-03-24 15:33:56 +00:00
Jordi Noguera 3ef56b57c7
Fix opening embed modal in new tab (#721) 2021-03-24 16:26:35 +01:00
CNCF-bot 8ce37a0062 Update to a new version [skip ci] 2021-03-22 14:17:52 +00:00
Jordi Noguera 6db0830b48
Improvements to landscape links styling (#720) 2021-03-22 15:10:32 +01:00
CNCF-bot ce0b79386f Update to a new version [skip ci] 2021-03-22 12:52:55 +00:00
Jordi Noguera 50913e4202
Watch Landscape Project for changes (#719) 2021-03-22 13:45:34 +01:00
CNCF-bot 0e01a542b3 Update to a new version [skip ci] 2021-03-19 10:23:26 +00:00
Andrey Kozlov 2e61e37f4c support css param with a full url 2021-03-19 10:16:15 +00:00
CNCF-bot 7426aca10e Update to a new version [skip ci] 2021-03-18 17:14:08 +00:00
Jordi Noguera 777f88ad38
Link to external landscapes (#718) 2021-03-18 17:27:46 +01:00
CNCF-bot 5f0338e7cc Update to a new version [skip ci] 2021-03-16 20:56:45 +00:00
Andrey Kozlov 6cc843050d
support css/js payload from a parent frame (#717) 2021-03-16 20:49:38 +00:00
CNCF-bot a99b934b79 Update to a new version [skip ci] 2021-03-11 16:00:46 +00:00
Jordi Noguera 667b3d3d3b
Other repo is open source by default (#715) 2021-03-11 16:53:43 +01:00
Jordi Noguera e29eb88635 FIX Readme [skip ci] 2021-03-11 14:27:00 +01:00
CNCF-bot af05433430 Update to a new version [skip ci] 2021-03-11 13:02:57 +00:00
Jordi Noguera 58af5f2cb9
Add other repo (#714) 2021-03-11 13:55:49 +01:00
CNCF-bot 01218888e4 Update to a new version [skip ci] 2021-03-03 16:47:23 +00:00
Jordi Noguera f0ab12bbeb
Fix favicons (#713) 2021-03-03 17:37:48 +01:00
CNCF-bot 9b7f2580ba Update to a new version [skip ci] 2021-02-28 17:09:27 +00:00
CNCF-bot 3a8028d93d Update to a new version [skip ci] 2021-02-28 16:58:16 +00:00
John Mertic 048f4b091a
Re-worked to be a central resource for landscape entries (#710)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2021-02-28 10:48:55 -06:00
CNCF-bot 1451bcb653 Update to a new version [skip ci] 2021-02-23 18:27:48 +00:00
Jordi Noguera cb5c6540d3
Add ospo landscape (#708) 2021-02-23 19:18:44 +01:00
CNCF-bot a2d3449a29 Update to a new version [skip ci] 2021-02-23 16:12:06 +00:00
Jordi Noguera f6d436eb9d
Revert puppeteer upgrade (#707) 2021-02-23 17:03:03 +01:00
CNCF-bot 5f1349e20c Update to a new version [skip ci] 2021-02-23 15:17:56 +00:00
Jordi Noguera 3cefeff106
Improve logos positioning and size (#706) 2021-02-23 16:08:55 +01:00
CNCF-bot 37c6a9985c Update to a new version [skip ci] 2021-02-21 09:30:03 +00:00
CNCF-bot 37340e9528 Update to a new version [skip ci] 2021-02-21 09:19:58 +00:00
John Mertic 7d63c8bd19
Add CloudConvert instructions and clean up section (#703)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2021-02-21 09:05:40 +00:00
Andrey Kozlov 7b141f3be9
updates (#705) 2021-02-21 09:04:42 +00:00
CNCF-bot 0064ad4463 Update to a new version [skip ci] 2021-02-10 17:44:26 +00:00
Jordi Noguera 84f5570e60
Allow exporting subsets of items as JSON (#702)
* Allow exporting subsets of items as JSON

* Move item json to data/items

* Fix imports loading settings before ready
2021-02-10 18:36:39 +01:00
CNCF-bot ce3c367d49 Update to a new version [skip ci] 2021-02-10 13:57:19 +00:00
Jordi Noguera c49c6b4e62
Add URL param to sort by joined (#699) 2021-02-10 14:39:22 +01:00
CNCF-bot 6b1446f152 Update to a new version [skip ci] 2021-02-10 13:35:00 +00:00
Jordi Noguera f6b811c371
Wait for command to finish copying directory (#700) 2021-02-10 14:24:39 +01:00
CNCF-bot bf25e70131 Update to a new version [skip ci] 2021-02-02 13:45:52 +00:00
Jordi Noguera 4890c29436
Add joined (#697) 2021-02-02 14:38:56 +01:00
CNCF-bot ab250c8eae Update to a new version [skip ci] 2021-02-01 09:52:51 +00:00
Andrey Kozlov 2330307874
weekly updates 75 (#696)
* weekly updates 75

* debug
2021-02-01 09:45:57 +00:00
CNCF-bot 7d29956281 Update to a new version [skip ci] 2021-01-25 16:03:56 +00:00
Jordi Noguera c7a6581e1a
Improvements to next switch (#695)
* Put back open:src and open:dist

* Show the new URL when showing warning about deprecated URLs
2021-01-25 16:57:06 +01:00
CNCF-bot b53439ac71 Update to a new version [skip ci] 2021-01-23 20:39:58 +00:00
Andrey Kozlov 0d85b0c25f
weekly updates (#694)
* weekly updates

* remove waitFor
2021-01-23 20:33:09 +00:00
CNCF-bot ed35f69e9e Update to a new version [skip ci] 2021-01-22 18:40:15 +00:00
Jordi Noguera 565c4edddd
Fix embed scrolling (#693) 2021-01-22 19:32:22 +01:00
CNCF-bot 9526bf5287 Update to a new version [skip ci] 2021-01-20 10:57:07 +00:00
Jordi Noguera 1939df675b
Fix borderless mode (#692) 2021-01-20 11:49:24 +01:00
CNCF-bot f9059cfb43 Update to a new version [skip ci] 2021-01-19 16:58:33 +00:00
CNCF-bot c359270d66 Update to a new version [skip ci] 2021-01-19 16:03:17 +00:00
Jordi Noguera 838deafa8a Fix screenshots 2021-01-19 16:54:49 +01:00
CNCF-bot 2ae1853c61 Update to a new version [skip ci] 2021-01-19 14:29:12 +00:00
Jordi Noguera d7b859b78f Add items.json for now 2021-01-19 15:12:55 +01:00
CNCF-bot 7204bb4867 Update to a new version [skip ci] 2021-01-19 11:57:18 +00:00
CNCF-bot 9b5f6d926d Update to a new version [skip ci] 2021-01-19 10:31:59 +00:00
Jordi Noguera edf389cc27 Fix redirect for format=flat-mode or logo-mode 2021-01-19 11:23:29 +01:00
CNCF-bot a0b46903c9 Update to a new version [skip ci] 2021-01-19 09:59:52 +00:00
Jordi Noguera df3895d8e5
Switch to next (#685)
* Add next.js and remove babel-plugin-resolver

* Fix not defined errors for window and navigator

* Remove redux from homepage

* Render first landscape

* Put back sidebar

* Put back navigation

* Add page title

* Re-enable InternalLink

* Fix navigation between tabs

* Correctly set main content mode in syncToUrl

* Add TODO for parsing urls

* Use full path for image

* Render item modal

* Add close event to modal

* Open modal when clicking on item

* Only pass the necessary item data to the components

* Fix modal not opening in card mode

* Fix previous/next navigation

* Remove ItemDialogContainer and clean up

* Fix anonymous arrow function warning

* Re-enable zooming

* Set title for modal page

* Fix close modal not working

* Fix switchToLandscape

* It's not necessary to pass onSelectItem

* Put back summary

* Put back fullscreen toggle

* Put back number of tweets

* Preserve rest of params when switching landscapes

* Enable filtering by organization

* Clean up url generation

* Use stringifyUrl to encode arrays

* Enable headquarters filters

* Enable license filter

* Enable relation filter

* Re-enable reset filters

* Re-enable grouping

* Fix comment

* Re-enable sorting

* Remove unused methods

* Refactor decodeGrouping

* Set default grouping

* Fix header navigation

* Enable sidebar toggle

* Remove unnecessary title

* Remove unnecessary googlebot stuff

* Re-enable modal only

* Fix category filter

* Enable bestpractices filter

* Enable enduser filter

* Enable filtering by parent and language

* Remove dead

* Enable card style

* Add TODO items

* Add head info

* Fix embed

* Add fullscreen landscape

* Add TODO for acquisitions page

* Pre-rendering a modal does not load the entire landscape in the background

* Ignore out

* Fix modal not opening in card mode

* Rewrite DelayRender to use hooks

* Remove unnecessary prop cardStyle

* Add custom document so we can set lang on html

* Fixes to HomePage

* Make yarn build work

* Fix modal not closing

* Add path prefix for preview deploys

* Build one landscape for now

* Copy iframe resizer from node modules

* Disable screenshots for now

* Items urls are item/:item_id

* Remove _redirects

* Add logging

* It seems that a forward slash is needed

* Use full path

* Set right path for public

* Remove logging

* Re-enable screenshots

* Use right URL for screenshots

* Don't pre-render background underneath modal

* Add spinner TODO

* Remove unused code from home page

* Remove unnecessary parenthesis

* Convert Item inline style to jsx

* Configure webpack and some babel plugins

* Convert acquisitions page to next

* Remove dead code

* Add bundle analyzer

* Add moment to externals

* Add TODO

* Fix import for settings and lookup

* Clean up

* Remove syncToUrl

* Simplify babel and webpack

* Fix warnings

* Fix zoom calculations on fullscreen landscape

* Set version from query string in fullscreen landscape

* Get rid of Root Context

* Try using less data for pre-rendering

* Disable pre-fetching for now

* Pre-render material UI

* Calculate grouped items, width and height only once

* Use map for fields.relation.values

* Group and filter items before iterating

* Fix for pre-rendering blank landscape

* Don't fade in item

* Don't use isBrowser if possible

* Remove unnecessary event listener

* Fix current device throwing error when pre-rendering

* Fix layout issues on mobile

* Remove background color from logo

* Remove old HEAD

* Remove TODO

* Revert "Try using less data for pre-rendering"

This reverts commit 4c0472fe62627b4bf8b93d6de326150d0e54bc4c.

* Automatically generate iframeResizer.js when building pages/embed.js

* Fix issues caused by client/server rendering missmatch

* Don't pre-render item pages

* Consider the prefix when fetching item

* Fix rendered fewer hooks error

* We don't need to memoize page entries anymore

* Ready thing is not necessary

* If navigating directly to an item, load body with modal open automatically

* Fix http-equiv error

* Remove unnecessary TODO items

* Only load items from current landscape on each page

* Don't need to copy data.json

* Fullscreen landscapes are at /fullscreen[/landscape-name]

* Default title is already set in _app

* First pass at removing hard-coded "landscape"

* Show item info we already have instead of loading indicator when opening modal

* Remove animations from card mode

* Don't render page until params in query string are processed

* Print timing to check performance

* Skip hydration if query params are set for now

* Hard-code pre-rendered page to see performance

* Add embed comparison page

* Load all cards when embedding

* Fix modal error

* Move options to fields

* Fix fullscreen toggle issues

* Refactor long command to node script

* Fix filtering items error

* Re-enable exporting to CSV

* Rename ciServer to distServer

* Implement infinite scrolling on card-mode

* Require settings later so we know they've been generated

* Remove TODO item

* Re-enable opening items in new tab on mobile when embedding

* Remove TODO items

* Not sure how tests passed without this

* DRY test setup

* Remove logging stuff

* Add 404 page with redirect and notice

* Redirect legacy URLs to new format

* Set warning when URL is deprecated

* Handle legacy URLs in presets and detect active one

* Add redirects to 404 page for deploy preview

* Use router instead of location to detect legacy URL

* Improvements to hydration hack

* Fix unique keys in array warning

* Remove log

* Rename EntriesContext to LandscapeContext

* Break up catch-all page

* Rename classes

* Prerender pages specified in settings.yml

* Only load necessary data to render prerendered pages from settings.yml

* Simplify grouped items logic

* Remove default params

* Clean up routing

* Put back sass

* Re-enable commented out code

* Remove unused code

* Re-enable mobile zoom detection

* Remove unnecessary dependencies

* Remove webpack configuration

* Alias ./public to public

* Fix spelling

* Convert browserZoom and currentDevice to hooks

* Add TODO items

* Fixes for fullscreen page

* Fix infinite re-rendering

* Fix for empty category

* Re-enable all landscapes

* Fix Docker

* Add compression to dist server

* Check router.isReady to render component

* Add TODO item

* pnp linker

* more fixes

* fix for jest

* fix

* wip

* tmp

* Fix require warning

* Fix iOS issue

* Disable PNP for now

* get rid of sass

* Fix modal resizing

Co-authored-by: Andrey Kozlov <l-2732@yandex.ru>
2021-01-19 10:51:25 +01:00
CNCF-bot c25954631d Update to a new version [skip ci] 2021-01-18 10:51:07 +00:00
Andrey Kozlov 13808315ba disabling omp check for now 2021-01-18 10:41:57 +00:00
Andrey Kozlov d6dc2ca2cc fix 2021-01-18 09:48:04 +00:00
Andrey Kozlov fec7c7beb2 fix test 2021-01-18 09:41:28 +00:00
Andrey Kozlov 5fdd8d7335 Merge branch 'master' of github.com:cncf/landscapeapp 2021-01-18 09:23:05 +00:00
Andrey Kozlov 60c53ef6f7 fix daily update 2021-01-18 09:22:52 +00:00
CNCF-bot 68a30c95e7 Update to a new version [skip ci] 2021-01-17 10:34:17 +00:00
Andrey Kozlov da81be6743
update babel (#690)
* update babel

* material-ui and puppeteer

* fix landscape rendering

* update jest too;

* more updates

* update react

* more updates

* update terser plugin

* support webpack 4 yet

* more updates

* more updates

* test
2021-01-17 10:25:17 +00:00
CNCF-bot 4a8aeccac2 Update to a new version [skip ci] 2021-01-12 22:03:25 +00:00
Andrey Kozlov 781bbc9030
fix yaml (#688)
* fix yaml

* fix a js-yaml version in the landscapeapp script
2021-01-12 21:55:25 +00:00
Andrey Kozlov e6b97cbfeb remove extra noise 2021-01-12 13:59:56 +00:00
Andrey Kozlov 435fef8c82 allow to mark certain links as false positives 2021-01-03 21:25:21 +00:00
Andrey Kozlov b53079a979 Merge branch 'master' of github.com:cncf/landscapeapp 2021-01-03 20:48:54 +00:00
Andrey Kozlov aa52865117 update report builder 2021-01-03 20:48:45 +00:00
CNCF-bot 1c05daeded Update to a new version [skip ci] 2021-01-03 12:25:09 +00:00
Andrey Kozlov 80ead92e7f
no more node-sass (#687)
* no more node-sass

* fix
2021-01-03 12:16:35 +00:00
CNCF-bot 171c070afa Update to a new version [skip ci] 2021-01-02 23:05:43 +00:00
Andrey Kozlov bdf698179b allow to use a docker 2021-01-02 22:55:27 +00:00
Andrey Kozlov 0f8d03d236 Merge branch 'master' of github.com:cncf/landscapeapp 2021-01-02 22:37:32 +00:00
Andrey Kozlov 02376e7cf1 docker support 2021-01-02 22:37:26 +00:00
CNCF-bot 12effe5b09 Update to a new version [skip ci] 2021-01-02 20:32:32 +00:00
Andrey Kozlov af378f51e4 handle a case when /tmp/landscape.json has an object inside 2021-01-02 20:22:24 +00:00
CNCF-bot 74aef4afcf Update to a new version [skip ci] 2021-01-02 19:59:53 +00:00
ZeusTheTrueGod 11f7ff8e52 fix for v15.4 2021-01-02 19:49:48 +00:00
CNCF-bot fe90b2246e Update to a new version [skip ci] 2021-01-02 16:59:11 +00:00
Andrey Kozlov 5fe795b681
update to the latest version (#686) 2021-01-02 16:50:04 +00:00
CNCF-bot bb567278d2 Update to a new version [skip ci] 2021-01-01 15:03:19 +00:00
Andrey Kozlov 9547b22364 Merge branch 'master' of github.com:cncf/landscapeapp 2021-01-01 14:54:09 +00:00
Andrey Kozlov 99cb6c5a09 better reports 2021-01-01 14:53:57 +00:00
CNCF-bot 948b4c33d7 Update to a new version [skip ci] 2020-12-29 19:28:18 +00:00
Andrey Kozlov c550cd3dae add link to html logs 2020-12-29 19:19:21 +00:00
CNCF-bot 3e6dfff5c5 Update to a new version [skip ci] 2020-12-28 14:55:21 +00:00
Andrey Kozlov 4c75b7d7a5
test html reporting (#684)
* test html reporting

* fix

* fix

* fix

* update

* fix

* fix
2020-12-28 14:44:20 +00:00
CNCF-bot 02ba87d98b Update to a new version [skip ci] 2020-12-24 11:47:25 +00:00
Andrey Kozlov 6a203c123f fix for fetching an aggregated list of repos 2020-12-24 11:38:35 +00:00
CNCF-bot 3f3121f2ad Update to a new version [skip ci] 2020-12-16 14:33:56 +00:00
Andrey Kozlov 8462d3ef8b Merge branch 'master' of github.com:cncf/landscapeapp 2020-12-16 14:24:06 +00:00
Andrey Kozlov 4d033eb0a7 progress 2020-12-16 14:23:52 +00:00
Andrey Kozlov 165d081397 fix 2020-12-16 14:14:07 +00:00
CNCF-bot f97e85abfd Update to a new version [skip ci] 2020-12-16 13:05:42 +00:00
Andrey Kozlov cd74231b3d fetch best practices one by one 2020-12-16 12:56:36 +00:00
CNCF-bot 91c6e9069c Update to a new version [skip ci] 2020-12-08 23:53:45 +00:00
John Mertic 82b76a0222
Add VectorLogoZone as a source of SVGs (#679)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2020-12-08 17:44:15 -06:00
CNCF-bot 9bbb274ea1 Update to a new version [skip ci] 2020-12-08 10:27:19 +00:00
Andrey Kozlov c42bad1e4d make LFPH required again 2020-12-08 10:18:17 +00:00
Andrey Kozlov 1fb96119fe Merge branch 'master' of github.com:cncf/landscapeapp 2020-12-08 10:17:56 +00:00
Andrey Kozlov 477debd098 support a loading, please wait style 2020-12-08 10:17:50 +00:00
CNCF-bot c210533da6 Update to a new version [skip ci] 2020-12-05 23:42:09 +00:00
Andrey Kozlov dd42e5937b skip lfph 2020-12-05 23:32:44 +00:00
Andrey Kozlov b635d69b9c support 2nd github key 2020-12-05 20:18:09 +00:00
CNCF-bot 2fe3b8b434 Update to a new version [skip ci] 2020-12-04 21:59:40 +00:00
Andrey Kozlov 71d555b489 increase padding 2020-12-04 21:50:09 +00:00
CNCF-bot 47fb46f70b Update to a new version [skip ci] 2020-12-02 18:51:59 +00:00
Andrey Kozlov f506ef87c0 deploying without cncf 2020-12-02 15:04:33 +00:00
Andrey Kozlov 651c46e103 get rid of background color in the embedded mode 2020-12-01 20:09:39 +00:00
CNCF-bot 69de9493b9 Update to a new version [skip ci] 2020-10-06 08:30:16 +00:00
Andrey Kozlov 18378186ec update spec 2020-10-06 09:01:27 +01:00
CNCF-bot 72e033e890 Update to a new version [skip ci] 2020-09-23 13:07:04 +00:00
Jordi Noguera 5e4d9b9918
Improvements to horizontal categories (#677) 2020-09-23 08:58:39 -04:00
CNCF-bot c0d0e582eb Update to a new version [skip ci] 2020-09-18 22:19:12 +00:00
Jordi Noguera 49d5b2b286
Fix auto-zooming layout issues (#676) 2020-09-18 18:10:54 -04:00
CNCF-bot b24508a0c0 Update to a new version [skip ci] 2020-09-18 12:03:24 +00:00
Jordi Noguera 9c6365789b
Add configuration to make all items in category large [Fix #674] (#675) 2020-09-18 07:54:59 -04:00
CNCF-bot 8381f8dd5f Update to a new version [skip ci] 2020-09-09 01:53:34 +00:00
Andrey Kozlov 23c486f3f7
hide best practices when a global flag is set, close #672 (#673) 2020-09-08 21:45:16 -04:00
CNCF-bot 9fabb818d5 Update to a new version [skip ci] 2020-09-08 21:43:57 +00:00
Andrey Kozlov 032adab9fe Merge branch 'master' of github.com:cncf/landscapeapp 2020-09-08 22:35:23 +01:00
Andrey Kozlov 6bef34bbc0 properly handle a case when crunchbase has no addresses 2020-09-08 22:35:13 +01:00
CNCF-bot f81b0113c8 Update to a new version [skip ci] 2020-09-08 01:21:52 +00:00
Andrey Kozlov 933ac237f2
206 allow to skip crunchbase (#671)
* WIP: working on a setting to skip the crunchbase completely

* do not show an extra warning about crunchbase key

* do not forget to fetch saved crunchbase entries by default
2020-09-07 21:13:31 -04:00
CNCF-bot 9dbf4d050f Update to a new version [skip ci] 2020-09-03 00:17:17 +00:00
CNCF-bot 3f84198bc1 Update to a new version [skip ci] 2020-09-03 00:06:24 +00:00
John Mertic 3493647a70
Tweak slightly so it will work with zsh as well. (#669)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2020-09-03 00:57:04 +01:00
CNCF-bot ce83288889 Update to a new version [skip ci] 2020-08-14 14:06:19 +00:00
Jordi Noguera a24c08199a Wait at least one minute when rate limitted by github 2020-08-14 15:57:09 +02:00
CNCF-bot 5b8cd6d1e2 Update to a new version [skip ci] 2020-08-02 21:57:58 +00:00
Andrey Kozlov c8fb3daa46
weekly update, #75 (#667) 2020-08-02 17:49:01 -04:00
CNCF-bot 84bff5988e Update to a new version [skip ci] 2020-07-30 14:50:02 +00:00
Andrey Kozlov f6bfad6d98
fix local build for an iframe resizer, close #661 (#666) 2020-07-30 10:40:18 -04:00
CNCF-bot 5c1d73f085 Update to a new version [skip ci] 2020-07-30 11:56:51 +00:00
Jordi Noguera 0f3c32b32a
Allow embedding item modal [Close #664] (#663) 2020-07-30 07:47:53 -04:00
CNCF-bot a03d0b1977 Update to a new version [skip ci] 2020-07-29 00:32:21 +00:00
Andrey Kozlov df630babc4
update an iframe resizer, close #661 (#662)
* update an iframe resizer

* test

* ignore source map for an iframe resizer

* fix
2020-07-28 20:23:53 -04:00
CNCF-bot f28121ef9d Update to a new version [skip ci] 2020-07-22 23:40:41 +00:00
Andrey Kozlov 4e588ee686
allow to skip a category from a grouping header, close #659 (#660)
* allow to skip a category from a grouping header, close #659

* hide only End User Supporter
2020-07-22 19:31:37 -04:00
CNCF-bot 1b136bed88 Update to a new version [skip ci] 2020-07-21 09:07:07 +00:00
Andrey Kozlov 8c607c1ef9 fix a finos build 2020-07-21 09:58:32 +01:00
CNCF-bot b15f470baf Update to a new version [skip ci] 2020-07-20 08:00:52 +00:00
Andrey Kozlov edd1bcdf61 hide a tweet button in the embed mode 2020-07-20 08:52:39 +01:00
CNCF-bot acc6a0790a Update to a new version [skip ci] 2020-07-19 23:39:40 +00:00
Andrey Kozlov 0708ac4ea9
656 new formatting options (#658)
* WIP

* more progress

* fix

* more progress

* grab space before (

* fix
2020-07-19 19:30:45 -04:00
CNCF-bot 2b5394176f Update to a new version [skip ci] 2020-07-19 20:42:50 +00:00
Andrey Kozlov f68184e7c0 fix 2020-07-19 21:33:41 +01:00
CNCF-bot 311fce2345 Update to a new version [skip ci] 2020-07-16 00:56:20 +00:00
Andrey Kozlov d1ae8cc8f9
demand a proper homepage_url , close #654 (#655) 2020-07-15 20:47:16 -04:00
Dan Kohn 28cdea2552
Add Tarscloud [skip ci] 2020-07-15 00:48:48 -04:00
CNCF-bot 5f471b9a64 Update to a new version [skip ci] 2020-07-14 13:14:47 +00:00
Andrey Kozlov 95c8ae372d
update packages, #75 (#653) 2020-07-14 09:06:49 -04:00
CNCF-bot 26c55c0a00 Update to a new version [skip ci] 2020-07-10 22:30:49 +00:00
Dan Kohn 7ad1a5f5cb
Fix directions 2020-07-10 18:21:37 -04:00
CNCF-bot abc6f105a5 Update to a new version [skip ci] 2020-07-10 20:03:48 +00:00
Andrey Kozlov d2866d49c7
Update README.md 2020-07-10 20:55:53 +01:00
CNCF-bot b3730faec6 Update to a new version [skip ci] 2020-07-08 10:57:01 +00:00
Andrey Kozlov 22066e2912
update packages, #75 (#649)
* update packages, #75

* fix tests

* fixes

* patch puppeteer
2020-07-08 06:49:00 -04:00
CNCF-bot c71bf3b05b Update to a new version [skip ci] 2020-07-06 22:01:59 +00:00
Andrey Kozlov 6633a86253 ensure that we use a latest version from the landscapeapp 2020-07-06 22:53:10 +01:00
Andrey Kozlov 1d689a3560 Merge branch '650-ensure-latest-version' 2020-07-06 22:38:33 +01:00
Andrey Kozlov e54124a5bc more progress 2020-07-06 22:38:28 +01:00
Andrey Kozlov 664ea9e73e test 2020-07-06 22:08:07 +01:00
Andrey Kozlov 7871c176e2 check that we have a latest version of landscapeapp, close #650 2020-07-06 22:07:43 +01:00
CNCF-bot 8aa9723d58 Update to a new version [skip ci] 2020-07-05 19:10:21 +00:00
CNCF-bot 7e31fadf19 Update to a new version [skip ci] 2020-07-02 10:52:56 +00:00
Andrey Kozlov 15a9bafe57
remove a noise (#647) 2020-07-02 06:44:52 -04:00
CNCF-bot 98486e0dcc Update to a new version [skip ci] 2020-07-02 01:01:08 +00:00
Andrey Kozlov b188515184
sort cities by state first, name last, close #610 (#646) 2020-07-01 20:52:09 -04:00
CNCF-bot 0b1a9fb6f3 Update to a new version [skip ci] 2020-07-01 14:32:54 +00:00
Jordi Noguera 893c58ee5c
Use Github API to fetch contributors count [Fix #643] (#645) 2020-07-01 10:24:35 -04:00
CNCF-bot 077b890e52 Update to a new version [skip ci] 2020-07-01 13:02:32 +00:00
Jordi Noguera b121ef108f
Throw error when there's a circular dependency on Crunchbase (#644) 2020-07-01 08:54:05 -04:00
CNCF-bot 1e168dcb20 Update to a new version [skip ci] 2020-06-30 18:56:19 +00:00
Andrey Kozlov 8e9690cbc6
weekly update, #75 (#637)
* weekly update, #75

* check that all images are properly processed

* ensure that we can process CNCF images locally

* fix

* fix

* fix

* fix

* test if lfedge is rendered properly

* use lfph

* fix

* test

* test

* latest version

* debug

* remove retry

* debug

* test

* debug more

* update

* debug

* more debug info

* check that ascreenshot hangs

* timeout on a screenshot

* debug

* ensure that netlify can process all lfph images

* remove unnecessary changes

* updates
2020-06-30 14:47:56 -04:00
CNCF-bot 70bc49b666 Update to a new version [skip ci] 2020-06-30 16:21:55 +00:00
Jordi Noguera 748b6f9ffa
Add FINOS landscape (#641) 2020-06-30 12:13:11 -04:00
CNCF-bot e79c67cd20 Update to a new version [skip ci] 2020-06-30 15:29:50 +00:00
Jordi Noguera 11d8c16b0f
Use right font [Fix #636] (#640)
* Use right font [Fix #636]

* Introduce back Roboto

* Roboto is already default font in Material UI

* Serve Roboto font
2020-06-30 11:21:11 -04:00
Andrey Kozlov 240183fa1e do not fetch images in parallel 2020-06-29 14:12:50 +01:00
Andrey Kozlov 41103b49d5 svg-autocrop latest 2020-06-29 13:48:10 +01:00
CNCF-bot 480e059a04 Update to a new version [skip ci] 2020-06-26 22:48:48 +00:00
Andrey Kozlov e5ab6efd69 when a local build fails - give a remote one a chance 2020-06-26 23:40:41 +01:00
CNCF-bot 28eb050557 Update to a new version [skip ci] 2020-06-22 15:22:51 +00:00
Jordi Noguera 144b63b7a4
Lighthouse improvements [#575] (#633)
* Lighthouse improvements [#575]

* Load fonts from CDN

* Fix Typo

* Use system fonts
2020-06-22 11:15:11 -04:00
CNCF-bot 0f66d6e640 Update to a new version [skip ci] 2020-06-21 17:05:36 +00:00
Andrey Kozlov 9a58d69c18 Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-21 17:58:16 +01:00
Andrey Kozlov d44d5a7d0d do not run multiple svg-autocrop on our auto updater 2020-06-21 17:58:05 +01:00
CNCF-bot 631fcbfca6 Update to a new version [skip ci] 2020-06-21 13:13:04 +00:00
Andrey Kozlov b67284cd2f Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-21 14:05:36 +01:00
Andrey Kozlov c9f33597f6 fail on unhandled rejections 2020-06-21 14:05:25 +01:00
CNCF-bot 47be574ef9 Update to a new version [skip ci] 2020-06-21 12:20:08 +00:00
Andrey Kozlov 4e98cfddc3 Do not run svg-autocrop in parallel on a build server 2020-06-21 13:12:35 +01:00
CNCF-bot fe29e8820e Update to a new version [skip ci] 2020-06-20 20:10:50 +00:00
Andrey Kozlov 1b370ba5c8 fix issues with a puppeteer 2020-06-20 21:03:23 +01:00
CNCF-bot 013d5cddb3 Update to a new version [skip ci] 2020-06-20 14:28:45 +00:00
Andrey Kozlov cd4c2c212e
add "commits" to Y axis in a chart, close #552 (#631)
* add "commits" to Y axis in a chart, close #552

* remove a bad attempt

* remove extra parts

* empty line
2020-06-20 09:23:05 -04:00
CNCF-bot fddbd126e5 Update to a new version [skip ci] 2020-06-20 02:00:33 +00:00
Andrey Kozlov b73654b32d
weekly update, #75 (#630)
* weekly update, #75

* keep a history 4.10.1
2020-06-19 21:51:45 -04:00
CNCF-bot 2bde22b481 Update to a new version [skip ci] 2020-06-19 12:44:46 +00:00
CNCF-bot 5f3cf4b22e 1.0.442 2020-06-19 12:44:46 +00:00
Andrey Kozlov 3b474c69cf
626 - modify puppeteer for netlify (#627)
* test

* debug

* debug

* debug

* debug

* debug

* debug

* one more attempt

* do not reuse a browser

* fix

* use old puppeteer for rendering a landscape

* test this hack

* prepare to merge

* fix

* 2.0.11

* ready to merge
2020-06-19 08:36:09 -04:00
CNCF-bot 2642219e0f Update to a new version [skip ci] 2020-06-18 22:39:12 +00:00
Andrey Kozlov 2bb09285c0 Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-18 23:30:28 +01:00
Andrey Kozlov 9e23c85dbb wrong hook for a cncf 2020-06-18 21:53:22 +01:00
CNCF-bot 17ee06621b Update to a new version [skip ci] 2020-06-18 19:22:17 +00:00
Andrey Kozlov d236e62764 fix an iframe resizer 2020-06-18 20:13:17 +01:00
CNCF-bot 6052a61908 Update to a new version [skip ci] 2020-06-17 13:06:47 +00:00
Andrey Kozlov 15761cb93c
565 yarn2 (#615)
* using yarn2, close #565

* update a netlify script

* disable progress bar

* fixes

* fix

* publish as beta

* 2.0.0-alpha.0

* 2.0.0-alpha.1

* fix

* 2.0.0

* fix

* publish yarn.lock too

* 2.0.1

* one more fix

* fix

* ensure that we install a latest yarn

* mention that we need to install a latest version of yarn

* check yarn version on Netlify

* try to use yarn from npm

* use yarn from npm

* fix a local build for netlify

* caching

* 2.0.2

* update readme

* 2.0.4

* merge a conflict

* fixes

* fix for yarn cache

* 2.0.5

* skip .pnp.js copy

* update babelrc

* 2.0.6

* suppress output from yarn when all is fine

* run jest tests one by one

* 2.0.7

* check if this helps locally

* 2.0.8

* prepre to merge

* remove nvm noise

* less noise

* hide curl progress
2020-06-17 13:58:05 +01:00
CNCF-bot b8a6f5fba8 Update to a new version [skip ci] 2020-06-17 11:47:11 +00:00
Jordi Noguera e944ac0a33
Automatically remove unnecessary stock tickers [Fix #623] (#625) 2020-06-17 07:29:15 -04:00
CNCF-bot e5bb0b1785 Update to a new version [skip ci] 2020-06-17 11:28:45 +00:00
Jordi Noguera 8cc7893384
Handle empty repos [Fix #622] (#624) 2020-06-17 07:21:39 -04:00
CNCF-bot c7f5bc5964 Update to a new version [skip ci] 2020-06-16 13:10:48 +00:00
Jordi Noguera 504e4bc191
Auto-update redirects [Fix #618][Fix #620] (#621)
* Auto-update redirects [Fix #618][Fix #620]

* Normalize redirected URL
2020-06-16 09:03:40 -04:00
CNCF-bot 1d8d7bda9e Update to a new version [skip ci] 2020-06-16 05:32:34 +00:00
Jordi Noguera 729a44880b Fix check links log format 2020-06-16 07:25:23 +02:00
CNCF-bot 3536009e2e Update to a new version [skip ci] 2020-06-15 12:50:42 +00:00
Jordi Noguera 83d6245ed0
Check URLs with curl [Fix #584] (#617) 2020-06-15 08:43:47 -04:00
CNCF-bot bfedb648b8 Update to a new version [skip ci] 2020-06-15 10:53:36 +00:00
Jordi Noguera a70a40d822
Fix null stock tickers not being removed (#616) 2020-06-15 06:46:14 -04:00
CNCF-bot 68619fe0aa Update to a new version [skip ci] 2020-06-13 07:38:02 +00:00
Andrey Kozlov 51925ea0c1 fix webpack config for development 2020-06-13 08:30:53 +01:00
CNCF-bot 9daa4df629 Update to a new version [skip ci] 2020-06-12 11:22:35 +00:00
Jordi Noguera 8d4f356abc
Improvements to finding delisted stocks [Fix #7] (#613)
* Correctly detect RHT as delisted

* Automatically remove tickers set to null when the stock returned from Crunchbase is valid
2020-06-12 07:15:40 -04:00
CNCF-bot 4f2ec7e824 Update to a new version [skip ci] 2020-06-11 20:46:47 +00:00
Jordi Noguera bfe4baf8df
Use crunchbase to determine if stock has been delisted [Fix #7] (#612)
* Use crunchbase to determine if stock has been delisted [Fix #7]

* Add more exchanges
2020-06-11 16:39:42 -04:00
CNCF-bot 72a80fa126 Update to a new version [skip ci] 2020-06-11 12:04:18 +00:00
Jordi Noguera bb6f65d17b Update hook for LFAI 2020-06-11 13:49:02 +02:00
Andrey Kozlov 238d904851
weekly updates, #75 (#611)
* wip

* more progress

* fix an ejs loader

* return back a puppeteer 3.0.4

* upgrade to puppeteer 3.3.0

* update an svg-autocrop
2020-06-11 07:48:06 -04:00
CNCF-bot 63834084d7 Update to a new version [skip ci] 2020-06-11 11:45:57 +00:00
Jordi Noguera cc0e1db6c3
Allow project_org option in item [Fix #582] (#608)
* Allow project_org option in item [Fix #582]

* Combine repo_url and project_org
2020-06-11 07:37:23 -04:00
CNCF-bot 941cb479a3 Update to a new version [skip ci] 2020-06-11 11:03:43 +00:00
Jordi Noguera 5639065ddf Show landscape publish date 2020-06-11 12:56:22 +02:00
CNCF-bot 272ae91a12 Update to a new version [skip ci] 2020-06-11 10:30:13 +00:00
Jordi Noguera 1a558c8be8 Allow requests from landscapes.dev 2020-06-11 12:23:07 +02:00
CNCF-bot 4f54468711 Update to a new version [skip ci] 2020-06-10 14:36:26 +00:00
Jordi Noguera 0ea2609c69 Add favicon 2020-06-10 16:29:49 +02:00
CNCF-bot d68b369589 Update to a new version [skip ci] 2020-06-10 13:09:03 +00:00
Andrey Kozlov 14f8b9d352 Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-10 13:50:38 +01:00
Andrey Kozlov 62d006f7c6 pass more env variables to the remote build 2020-06-10 13:50:28 +01:00
CNCF-bot c433796959 Update to a new version [skip ci] 2020-06-10 12:50:20 +00:00
Andrey Kozlov d885def448 fix robots 2020-06-10 13:42:24 +01:00
CNCF-bot acb38458cd Update to a new version [skip ci] 2020-06-09 23:58:18 +00:00
Andrey Kozlov 732be2b034 kill local processes after a build 2020-06-10 00:51:40 +01:00
CNCF-bot 5f49644435 Update to a new version [skip ci] 2020-06-09 02:00:09 +00:00
Andrey Kozlov 68fb9eabe4
update svg-autocrop to a version which addresses an ibm logo, close #293 (#607) 2020-06-08 21:53:39 -04:00
CNCF-bot 50fe0ecdd3 Update to a new version [skip ci] 2020-06-08 13:25:24 +00:00
Andrey Kozlov adfac63435
update autocrop, close #557 (#606) 2020-06-08 09:18:54 -04:00
CNCF-bot 7c6bc21a8b Update to a new version [skip ci] 2020-06-08 12:47:56 +00:00
Andrey Kozlov f018384720 fix 2020-06-08 13:41:20 +01:00
Andrey Kozlov b591e6da62 forgot to cleaer a timeOut 2020-06-08 13:39:28 +01:00
CNCF-bot 4912471754 Update to a new version [skip ci] 2020-06-06 21:16:44 +00:00
Andrey Kozlov efe3640447 Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-06 22:09:58 +01:00
Andrey Kozlov 88c2a79eba add a timeout for running a given landscape. add a 2 minute timeout to git clone 2020-06-06 22:09:38 +01:00
CNCF-bot 82bb42b33d Update to a new version [skip ci] 2020-06-06 19:28:00 +00:00
Dan Kohn d4e2655b98 Change title
Signed-off-by: Dan Kohn <dan@dankohn.com>
2020-06-06 15:20:57 -04:00
Andrey Kozlov ff0435c7b1 Merge branch 'master' into timeout 2020-06-06 18:41:02 +01:00
CNCF-bot 6a8dd50f19 Update to a new version [skip ci] 2020-06-06 13:11:26 +00:00
Andrey Kozlov 1ee1123c65 Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-06 14:04:37 +01:00
Andrey Kozlov d15428e79b start reporting local build output as soon as we find that the remote one failed 2020-06-06 14:04:26 +01:00
CNCF-bot 78a4d17f83 Update to a new version [skip ci] 2020-06-06 12:23:32 +00:00
Andrey Kozlov 84c810c2c7 Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-06 13:16:51 +01:00
Andrey Kozlov 1e8b609490 do not forget to pass GA 2020-06-06 13:16:42 +01:00
Andrey Kozlov 03a0dc747c timeout 2020-06-06 13:13:41 +01:00
CNCF-bot edd4e5e1da Update to a new version [skip ci] 2020-06-05 19:56:01 +00:00
Andrey Kozlov b29fcca0f0 Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-05 20:49:38 +01:00
Andrey Kozlov c40106ce70 cleanup files older than one day 2020-06-05 20:49:26 +01:00
CNCF-bot 0cd46d8e03 Update to a new version [skip ci] 2020-06-05 16:49:50 +00:00
Dan Kohn 24b18c6670 Removing FINOS landscape
Signed-off-by: Dan Kohn <dan@dankohn.com>
2020-06-05 12:27:14 -04:00
Dan Kohn 5773dbe725 Add FINOS and remove Lumberyard for now
Signed-off-by: Dan Kohn <dan@dankohn.com>
2020-06-05 12:23:36 -04:00
Andrey Kozlov 360a7d67b7
open a browser after starting a dev or a production server (#603) 2020-06-05 12:04:37 -04:00
Dan Kohn b50d2dbd22 Add Lumberyard landscape
Signed-off-by: Dan Kohn <dan@dankohn.com>
2020-06-05 11:32:35 -04:00
CNCF-bot 4be93d6d43 Update to a new version [skip ci] 2020-06-05 13:30:31 +00:00
Andrey Kozlov 585c2f8d9a 1.0.412 2020-06-05 14:23:52 +01:00
Andrey Kozlov c1ea381ef5 fix 2020-06-05 14:23:44 +01:00
Andrey Kozlov 518b0b89a8 1.0.411 2020-06-05 14:22:45 +01:00
Andrey Kozlov 3e02fc7ddc 1.0.410 2020-06-05 14:22:23 +01:00
Andrey Kozlov 035c2f44e1 fix 2020-06-05 14:14:29 +01:00
Andrey Kozlov 661404961e should be able to publish a new package 2020-06-05 13:17:18 +01:00
Andrey Kozlov 616a1f97fd 1.0.409 2020-06-05 13:13:40 +01:00
Jordi Noguera f7d63087d6
Add organization to item [Fix #600] (#601) 2020-06-05 07:35:26 -04:00
Jordi Noguera 84723b13c2
Automatically add exchange suffix to stock ticker (#598) 2020-06-04 10:38:58 -04:00
Jordi Noguera b3a09deeed Remove console.log [skip ci] 2020-06-04 12:52:18 +02:00
Andrey Kozlov 5caf7d1786
allow non required landscapes to fail, close #594 (#595)
* allow non required landscapes to fail, close #594

* report the required landscape has failed

* do not require lfedge, openjsf, presto and ucf
2020-06-03 20:30:05 -04:00
Andrey Kozlov f9e3fb9538 one more fix 2020-06-03 12:14:38 +01:00
Andrey Kozlov 43fe1f756b fix 2020-06-03 11:57:16 +01:00
Andrey Kozlov 302dcef106 show a list of processes 2020-06-03 11:52:54 +01:00
Andrey Kozlov 59acb07208 wait till the build is done 2020-06-03 11:49:12 +01:00
Andrey Kozlov 68391ae848 use rsync to copy the directory content 2020-06-03 09:57:41 +01:00
Andrey Kozlov 9ae818c6ac do not copy .git folder to the copy for a local build 2020-06-03 08:34:28 +01:00
Andrey Kozlov 6bdf00cc81 fix how to run a copy with a netlify 2020-06-03 08:31:54 +01:00
Andrey Kozlov c568fcaecf just make a copy in a home folder when building in netlify 2020-06-03 08:07:37 +01:00
Andrey Kozlov ac6d7d12dc fix 2020-06-03 08:01:59 +01:00
Andrey Kozlov 10dc404bf6 make a copy for a local build 2020-06-03 01:13:41 +01:00
Andrey Kozlov 56a6fbb232 Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-02 22:28:48 +01:00
Andrey Kozlov 9898b2845b install the build both into the `dist` and `netlify/dist` folders 2020-06-02 22:28:34 +01:00
CNCF-bot d3d9ef5fdc Update to a new version [skip ci] 2020-06-02 20:58:35 +00:00
Andrey Kozlov 1ff3d54298 Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-02 21:52:14 +01:00
Andrey Kozlov 02cb3eb444 remote build as a defualt one, local build as a backup plan 2020-06-02 21:51:58 +01:00
CNCF-bot 4d749ade0a Update to a new version [skip ci] 2020-06-02 15:23:21 +00:00
Jordi Noguera f7f8dbb2c7
Check project membership; Fix #495 (#521) 2020-06-02 17:17:07 +02:00
CNCF-bot 34555b7cd7 Update to a new version [skip ci] 2020-06-02 14:51:23 +00:00
Jordi Noguera d7f780d771 Don't post check links errors to slack channel 2020-06-02 16:45:03 +02:00
CNCF-bot 657fb59880 Update to a new version [skip ci] 2020-06-02 14:10:29 +00:00
Jordi Noguera f9685d8071
Make some landscapes required when building on Netlify (#554) 2020-06-02 15:58:40 +02:00
CNCF-bot b93c58af64 Update to a new version [skip ci] 2020-06-02 13:51:08 +00:00
Andrey Kozlov 34eecbfcce Merge remote-tracking branch 'origin/master' into tmp 2020-06-02 14:30:26 +01:00
Andrey Kozlov 5c2b123887 allow to disable node_modules caching 2020-06-02 14:30:07 +01:00
CNCF-bot 0128fa3f70 Update to a new version [skip ci] 2020-06-02 13:10:36 +00:00
Haardik Dharma 30ac70428e
Fix broken links. (#581) 2020-06-02 08:40:52 -04:00
Andrey Kozlov 1f0c6657a8
no more browsersync, close #590 (#592) 2020-06-02 08:40:37 -04:00
Andrey Kozlov f1cb07b159 Merge branch 'master' into 590-fix-npm-audit-issues 2020-06-02 13:35:39 +01:00
Andrey Kozlov a226e9bc8a Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-02 13:35:06 +01:00
Andrey Kozlov 5638df91d4 a bit more cleanup 2020-06-02 13:34:57 +01:00
Jordi Noguera 000c8f4c96
Show preview in deploy PR [Fix #587] (#591) 2020-06-02 08:34:02 -04:00
Andrey Kozlov d56951be79 no more browsersync, close #590 2020-06-02 13:32:09 +01:00
CNCF-bot dce953e0bb Update to a new version [skip ci] 2020-06-02 12:00:46 +00:00
Jordi Noguera 41fdf486de Delete old migrations 2020-06-02 13:56:41 +02:00
Jordi Noguera e00072cb80 Retry autocrop 2020-06-02 13:56:41 +02:00
CNCF-bot 4fe1976c18 Update to a new version [skip ci] 2020-06-02 11:21:22 +00:00
Andrey Kozlov 58f31a97df Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-02 12:17:01 +01:00
Andrey Kozlov 12b7191d72 fix landscapes.dev which share this repo 2020-06-02 12:16:48 +01:00
CNCF-bot 9de26ba618 Update to a new version [skip ci] 2020-06-02 09:52:57 +00:00
Andrey Kozlov c40affdc54 test a change to package.json 2020-06-02 10:33:57 +01:00
CNCF-bot 7624b12ffc Update to a new version [skip ci] 2020-06-02 09:31:16 +00:00
Andrey Kozlov 617183e460 fix 2020-06-02 10:23:17 +01:00
Andrey Kozlov a33f32dafe fix 2020-06-02 10:20:09 +01:00
Andrey Kozlov 7aa1d03890 fix 2020-06-02 10:16:39 +01:00
Andrey Kozlov af08a0b4ba Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-02 10:10:58 +01:00
Andrey Kozlov 558292a733 fix 2020-06-02 10:10:47 +01:00
CNCF-bot 54f17571e3 Update to a new version [skip ci] 2020-06-02 08:56:55 +00:00
Andrey Kozlov 4bff29858f Merge branch 'master' of github.com:cncf/landscapeapp 2020-06-02 09:48:34 +01:00
Andrey Kozlov f7b221ff78 fix 2020-06-02 09:48:23 +01:00
Andrey Kozlov fe9a6796e4 fixes 2020-06-02 09:44:54 +01:00
CNCF-bot ae1bcb2a03 Update to a new version [skip ci] 2020-06-02 01:26:04 +00:00
Andrey Kozlov 3f2924954c fix 2020-06-02 02:22:18 +01:00
Andrey Kozlov 8032f3653c fix 2020-06-02 02:19:29 +01:00
Andrey Kozlov 246644f177 Revert "Revert "typo""
This reverts commit 919ea51223.
2020-06-02 02:06:56 +01:00
Andrey Kozlov a76273d5db Revert "Revert "75 weekly 2020 05 30 (#580)""
This reverts commit 2699a8bc38.
2020-06-02 02:06:54 +01:00
Dan Kohn 2699a8bc38 Revert "75 weekly 2020 05 30 (#580)"
This reverts commit ac3c3b7d2b.
2020-06-01 20:41:18 -04:00
Dan Kohn 919ea51223 Revert "typo"
This reverts commit 3de8010e9c.
2020-06-01 20:41:06 -04:00
Andrey Kozlov 3de8010e9c typo 2020-06-02 01:21:59 +01:00
CNCF-bot 9161ca703d Update to a new version [skip ci] 2020-06-02 00:04:09 +00:00
Andrey Kozlov ac3c3b7d2b
75 weekly 2020 05 30 (#580)
* Revert "Revert "Weekly update (#547)""

This reverts commit a119e3a352.

* properly using cache - avoid npm install if we packages have not changed

* fix

* fix

* fix

* fix

* fix

* fix

* more progress

* bypass netlify garbage

* fix

* fix environment

* fix

* fix

* some progress

* wip

* fix

* debug

* fix

* fix

* fix possible issues with ssh

* show docker command

* remove cache

* show what we have in cache

* debug

* fix

* fix

* almost there

* debug a build for a master branch

* fix if it was a same hash somehow

* return back a normal version

* check how this will work

* return back a working puppeteer version

* prepare to change how daily update works

* small fixes

* fix for different nodejs versions

* show local commands in debug mode

* fix

* Revert "fix"

This reverts commit 34a172cff2.

* add the readme file about my tricks with building the project

* offer a quick way to clear a cache folder on our build server, if that is ever required

* Update README.md

* allow to run a build locally

* use a BUILD_SERVER variable

* fix

* fix how everything is returned back to the dist

* fix when a build wants to pick up dist/ from a netlify folder

* one more fix

* embed a script to run everything locally

* fix

* update a local build

* update readme

* check if our puppeteer fails too often

* fix puppeteer, make tests without console output
2020-06-01 19:11:47 -04:00
CNCF-bot d5995e999d Update to a new version [skip ci] 2020-06-01 16:01:44 +00:00
Jordi Noguera 03bc984ea3
Only report errors to slack channel [Fix #568] (#583) 2020-06-01 16:56:01 +01:00
CNCF-bot dbee3ab99a Update to a new version [skip ci] 2020-06-01 14:43:17 +00:00
Jordi Noguera 09c23c3605
Fix member items background color (#588) 2020-06-01 16:37:26 +02:00
CNCF-bot 7438813547 Update to a new version [skip ci] 2020-06-01 13:32:10 +00:00
John Mertic 0507df8f6f
Add lf-landscape to landscapes.yml (#586)
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2020-06-01 09:25:44 -04:00
CNCF-bot 691d433d3b Update to a new version [skip ci] 2020-06-01 11:13:45 +00:00
Jordi Noguera a421fb83ef
Use darker gray for closed source [Fix #577] (#585) 2020-06-01 06:56:17 -04:00
CNCF-bot 6848fca459 Update to a new version [skip ci] 2020-05-29 23:39:45 +00:00
Andrey Kozlov c50775bc36 Revert "Revert "659 - speed up a build on for a landscapeapp (#573)""
This reverts commit a4c6be8899.
2020-05-30 00:21:27 +01:00
Dan Kohn a4c6be8899 Revert "659 - speed up a build on for a landscapeapp (#573)"
This reverts commit 488b90c3ed.
2020-05-29 19:19:30 -04:00
CNCF-bot d29b92a024 Update to a new version [skip ci] 2020-05-29 20:11:04 +00:00
Andrey Kozlov 488b90c3ed
659 - speed up a build on for a landscapeapp (#573)
* check if this allows to install packages faster

* cache npm install

* update a script

* fix

* fix

* test if this works

* try to spot an error

* fix

* fix

* fix

* fix

* minor fix

* a fix

* support different docker images for a build

* oops

* try npm install instead

* run tests, renderLandscape, checkLandscape and prerender with a retry because of flaky chrome

* give a second chance to tasks

* simulate an error

* 3 chances to retry

* more fixes

* use a current nodejs in .babelrc

* retry a build if ssh fails
2020-05-29 16:03:44 -04:00
CNCF-bot a276a2f100 Update to a new version [skip ci] 2020-05-28 23:25:13 +00:00
Jordi Noguera 53c3bbe6f8
Report errors when running npm run update [Fix #568] (#574) 2020-05-29 00:11:18 +01:00
CNCF-bot b1e8eaa641 Update to a new version [skip ci] 2020-05-28 14:21:08 +00:00
Andrey Kozlov 529fd3ae8d Merge branch 'master' of github.com:cncf/landscapeapp 2020-05-28 14:57:00 +01:00
Andrey Kozlov a119e3a352 Revert "Weekly update (#547)"
This reverts commit 85a97da2da.
2020-05-28 14:56:25 +01:00
CNCF-bot 0a2a2478bb Update to a new version [skip ci] 2020-05-28 13:19:38 +00:00
CNCF-bot 70a14e0f87 Update to a new version [skip ci] 2020-05-28 13:05:15 +00:00
Andrey Kozlov 85a97da2da
Weekly update (#547)
* Revert "Revert "weekly update, #75""

This reverts commit c7b7d0d173.

* weekly update

* wi
p;

* more updates

* test

* test

* check

* get it working

* and even more progress

* fixing

* downgrade to puppeteer@3.0.4

* update packages, use svg-autocrop with a puppeteer version 3.0.4
2020-05-28 08:52:37 -04:00
Jordi Noguera 67449e947d
Convert market caps to dollars [Fix #562] (#572) 2020-05-28 08:51:42 -04:00
Jordi Noguera fa48070766 Use imageLinkTo for netlify badge [skip ci] 2020-05-28 10:03:08 +02:00
CNCF-bot b6dd108602 Update to a new version [skip ci] 2020-05-28 03:57:28 +00:00
Jordi Noguera a768031fa1
Support additional repos [Fix #55] (#570) 2020-05-27 14:45:22 -04:00
CNCF-bot 73da8ee445 Update to a new version [skip ci] 2020-05-26 19:26:20 +00:00
Jordi Noguera 8d85ce183f Add # of tweets to landscapes.foundation 2020-05-26 19:24:09 +02:00
CNCF-bot aebb769a54 Update to a new version [skip ci] 2020-05-26 16:56:17 +00:00
Dan Kohn 431e7e42c7 Add Presto and alphabetize
Signed-off-by: Dan Kohn <dan@dankohn.com>
2020-05-26 12:44:08 -04:00
CNCF-bot 93040a0082 Update to a new version [skip ci] 2020-05-26 12:47:57 +00:00
CNCF-bot b9961e5e37 Update to a new version [skip ci] 2020-05-25 15:54:04 +00:00
Dan Kohn 8d64943ee4
Typo [skip ci] 2020-05-25 11:35:40 -04:00
Dan Kohn 3b59d454d6
Add install link [skip ci] 2020-05-25 11:18:02 -04:00
Jordi Noguera 99cadae614 Couple tweaks for landscapes.dev 2020-05-25 14:53:49 +02:00
CNCF-bot a431795c2e Update to a new version [skip ci] 2020-05-25 11:06:18 +00:00
Jordi Noguera 415240e841 Fix scrolling for landscapes.dev 2020-05-25 12:54:34 +02:00
CNCF-bot e75a431ae4 Update to a new version [skip ci] 2020-05-25 10:42:15 +00:00
Andrey Kozlov 7a071576e2 fix for 14.3\ 2020-05-25 11:31:34 +01:00
Dan Kohn d594a3fd1c
Update API key name [skip ci] 2020-05-24 22:27:14 -04:00
CNCF-bot b6ee951e62 Update to a new version [skip ci] 2020-05-24 20:33:44 +00:00
Andrey Kozlov 12268c6da6
558 use crunchbase v4 (#567)
* wip

* more progress

* wip

* some info is received from both API

* compare old and new api on crunchbase

* wip, --skip-ci

* fetch all company information via v4

* polishing crunchbase V4 api

* almost identical output for V3 and V4

* require api key v4 for crunchbase

* typo

* run everything on medium level

* pass a key, enable only crunchbase

* remove V3 api client

* remove old CRUNCHBASE_KEY usage

* do not use CRUNCHBASE_KEY anywhere

* typo

* disable crunchbase full fetch on an easy level
2020-05-24 16:23:32 -04:00
Jordi Noguera da7a5acf5c UI improvements to landscapes-dev 2020-05-23 15:55:25 +02:00
Jordi Noguera 09291b3b26
Improvements to npm run update (#564) 2020-05-22 19:57:38 -04:00
CNCF-bot 17ad97f044 Update to a new version [skip ci] 2020-05-21 13:57:37 +00:00
Jordi Noguera 6f7cc00f46 Fix vertical category click handler 2020-05-21 15:45:44 +02:00
CNCF-bot 2bba6349ac Update to a new version [skip ci] 2020-05-21 13:18:47 +00:00
Jordi Noguera 1146a74be6
Automatically calculate optimal full screen size (#556) 2020-05-21 14:07:26 +01:00
Dan Kohn 2669431ad2
Add environment variable [skip ci] 2020-05-20 12:34:53 -04:00
Dan Kohn 88e3a23680
Add lfph landscape 2020-05-20 07:28:42 -04:00
Jordi Noguera a5c8025f1a Clean up landscapes.dev 2020-05-13 16:06:02 +02:00
Jordi Noguera 41d93ca3f6 Add landscapes.dev 2020-05-12 20:21:58 +02:00
CNCF-bot 4051911c63 Update to a new version [skip ci] 2020-05-08 13:58:32 +00:00
Jordi Noguera eb4df8a5d0
Improve spacing of items (#553) 2020-05-08 14:47:36 +01:00
CNCF-bot 9cae78a820 Update to a new version [skip ci] 2020-04-27 12:51:50 +00:00
Jordi Noguera 0cac8d58ce
Fix Firefox resizing (#550) 2020-04-27 08:42:33 -04:00
CNCF-bot 66a5463f04 Update to a new version [skip ci] 2020-04-24 16:58:46 +00:00
Jordi Noguera c18bc2741a
Use CSS scale to zoom landscape (#549) 2020-04-24 17:49:25 +01:00
CNCF-bot ec1404ba56 Update to a new version [skip ci] 2020-04-21 10:08:23 +00:00
Jordi Noguera 797f3499ee
Point lf-edge to new org (#548) 2020-04-21 11:59:11 +02:00
CNCF-bot e2a6ac2600 Update to a new version [skip ci] 2020-04-17 04:07:01 +00:00
Jordi Noguera 3162f0c58a
Fix filtering by organization test; Fix #539 (#542) 2020-04-16 23:57:39 -04:00
CNCF-bot 965268de04 Update to a new version [skip ci] 2020-04-14 23:00:16 +00:00
ZeusTheTrueGod c7b7d0d173 Revert "weekly update, #75"
This reverts commit 692332d061.
2020-04-11 00:45:23 +01:00
ZeusTheTrueGod 692332d061 weekly update, #75 2020-04-11 00:38:38 +01:00
CNCF-bot 4fe741ec24 Update to a new version [skip ci] 2020-04-07 17:58:08 +00:00
Andrey Kozlov 5a31d1a4fe
hide market cap and funding amount from the UI when a specific landscape requires it. close #544 (#545) 2020-04-07 13:48:50 -04:00
CNCF-bot f851cf5095 Update to a new version [skip ci] 2020-04-03 13:57:50 +00:00
Jordi Noguera c4cbe0aff9
Upgrade autocrop (#543) 2020-04-03 15:48:33 +02:00
CNCF-bot 7512c7e83c Update to a new version [skip ci] 2020-04-01 23:43:48 +00:00
Andrey Kozlov 6583f7e2b3
weekly update, #75 (#541)
* weekly update, #75

* more updates
2020-04-01 19:34:36 -04:00
CNCF-bot f18f305c77 Update to a new version [skip ci] 2020-03-19 23:26:15 +00:00
Andrey Kozlov 4135c41a92
#75, weekly update (#538)
* #75, weekly update

* support a new version for a sitemap library

* bug fix
2020-03-19 19:05:20 -04:00
CNCF-bot 3b408368c7 Update to a new version [skip ci] 2020-03-19 23:03:21 +00:00
ZeusTheTrueGod 9e40968809 Merge branch 'master' of github.com:cncf/landscapeapp 2020-03-19 22:52:19 +00:00
ZeusTheTrueGod 7c86b56b28 merge a PR from jmertic to handle empty logos properly 2020-03-19 22:52:04 +00:00
CNCF-bot 7d6b07675f Update to a new version [skip ci] 2020-03-19 21:45:55 +00:00
ZeusTheTrueGod 9db9fc43d2 support private repositories 2020-03-19 20:31:57 +00:00
CNCF-bot 509c360937 Update to a new version [skip ci] 2020-03-14 01:44:40 +00:00
Andrey Kozlov 42f7d11e69
update redirects, close #534 (#535)
* update redirects, close #534

* a new version

* duplicate the rule to _redirects
2020-03-13 21:12:11 -04:00
CNCF-bot 185f41578c Update to a new version [skip ci] 2020-03-13 00:31:29 +00:00
Andrey Kozlov d600513e92
weekly update, #75 (#533)
* weekly update, #75

* return back date-io version, also npm audit fix
2020-03-12 20:18:01 -04:00
CNCF-bot c438d600c9 Update to a new version [skip ci] 2020-02-27 16:07:06 +00:00
Jordi Noguera 8476c85e97
Show acquisitions; Fix #302 (#531) 2020-02-27 21:26:44 +05:30
CNCF-bot 4270549acc Update to a new version [skip ci] 2020-02-27 06:19:21 +00:00
Andrey Kozlov 29d9e138ff
weekly update, #75 (#530) 2020-02-27 08:26:41 +05:30
CNCF-bot 32a7104e84 Update to a new version [skip ci] 2020-02-25 22:08:48 +00:00
Andrey Kozlov c1f0c658cf
remove hardcoded value, close #509 (#528)
* remove hardcoded value, close #509

* use a proper prefix

* fix an issue with a prefix
2020-02-26 03:29:09 +05:30
CNCF-bot d53e3cc1b0 Update to a new version [skip ci] 2020-02-25 14:11:12 +00:00
Jordi Noguera 716e279e8e Add acquisitions to processed landscape 2020-02-25 14:35:51 +01:00
CNCF-bot 3407d782dd Update to a new version [skip ci] 2020-02-24 11:53:57 +00:00
Jordi Noguera 41b65cd6fc
Fix timeouts; Fix #524 (#527) 2020-02-24 17:11:56 +05:30
CNCF-bot 1bdb74e303 Update to a new version [skip ci] 2020-02-22 13:39:44 +00:00
Andrey Kozlov 6de5a32562
close #506, fix latest commit date (#526)
* do not try to report a fatal error to github when running from an update server

* add a timeout for a github client

* keep only required changes

* ensure that we show the merge date, not the commit date. close #506
2020-02-22 18:49:06 +05:30
CNCF-bot ac50fec2ff Update to a new version [skip ci] 2020-02-20 09:29:27 +00:00
Andrey Kozlov 912a31c782
weekly update, #75 (#523) 2020-02-20 14:49:29 +05:30
CNCF-bot 1d179bb28a Update to a new version [skip ci] 2020-02-19 11:22:40 +00:00
Jordi Noguera 367dc92b19
Support Markdown Emoji; Fix #328 (#522) 2020-02-19 16:43:33 +05:30
CNCF-bot dcf1ee220d Update to a new version [skip ci] 2020-02-19 08:24:40 +00:00
Jordi Noguera 66e4c46c99
Use date-fns instead of moment; Fix #502 (#520) 2020-02-19 13:39:31 +05:30
CNCF-bot 497493b47f Update to a new version [skip ci] 2020-02-17 22:53:30 +00:00
Andrey Kozlov f9674053d1
506 fix latest commit date (#519)
* do not try to report a fatal error to github when running from an update server

* add a timeout for a github client

* keep only required changes
2020-02-17 22:40:58 +00:00
CNCF-bot 2784a6678d Update to a new version [skip ci] 2020-02-15 00:22:32 +00:00
Andrey Kozlov eb2eae0b2a
weekly updates, #75 (#518) 2020-02-14 19:13:39 -05:00
CNCF-bot bf8ec07b7b Update to a new version [skip ci] 2020-02-11 00:48:23 +00:00
Andrey Kozlov fe1da0733d
fix tweet button url, close #516 (#517) 2020-02-10 19:40:18 -05:00
CNCF-bot afa0244bb2 Update to a new version [skip ci] 2020-02-08 23:25:55 +00:00
Andrey Kozlov cd794888a5
increase a tweet button height, close #514 (#515)
* increase a tweet button height

* empty
2020-02-09 07:17:16 +08:00
CNCF-bot c8fd20f194 Update to a new version [skip ci] 2020-02-02 23:29:56 +00:00
Andrey Kozlov 7cb08e98b9
weekly update, #75 (#512) 2020-02-03 07:20:52 +08:00
Dan Kohn 14aa4d88d5
Update OpenJSF URL 2020-01-29 16:58:39 -05:00
CNCF-bot 4e68943786 Update to a new version [skip ci] 2020-01-29 00:07:18 +00:00
ZeusTheTrueGod 24483cc177 update to latest svg-autocrop 2020-01-28 23:59:00 +00:00
CNCF-bot c2a8f24179 Update to a new version [skip ci] 2020-01-27 01:14:51 +00:00
Andrey Kozlov b70237268d weekly update, #75 (#508) 2020-01-27 09:06:11 +08:00
CNCF-bot 5ec2f1c167 Update to a new version [skip ci] 2020-01-24 17:16:27 +00:00
CNCF-bot 9c4c018471 Update to a new version [skip ci] 2020-01-22 14:21:38 +00:00
Andrey Kozlov e89824d668 suppress annoying warnings, close #497 (#503)
* suppress annoying warnings, close #497

* typo

* use a standard jest reporter
2020-01-22 22:14:09 +08:00
Andrey Kozlov 07e8ad2038 remove webpack noise, close #504 (#505) 2020-01-22 22:13:41 +08:00
CNCF-bot 15a56a1497 Update to a new version [skip ci] 2020-01-20 18:14:34 +00:00
Andrey Kozlov 02d6512264 ignore changes < $100, close #499 (#501) 2020-01-21 02:06:24 +08:00
CNCF-bot 4fe37c0678 Update to a new version [skip ci] 2020-01-15 23:25:56 +00:00
Andrey Kozlov 1ca7fa15ad weekly updates, #75 (#494)
* weekly updates, #75

* update to html webpack plugin to 4 beta

* one more update
2020-01-16 07:18:19 +08:00
ZeusTheTrueGod 68da37ac11 fix for a daily update 2020-01-10 22:50:55 +00:00
CNCF-bot d1c2521052 Update to a new version [skip ci] 2020-01-02 14:42:27 +00:00
Jordi Noguera 0d5d2ca502 Upgrade to Node 13; Fix #477 (#493) 2020-01-03 01:34:21 +11:00
CNCF-bot ff5beef01d Update to a new version [skip ci] 2019-12-22 20:44:06 +00:00
Andrey Kozlov bf90875271 update packages, #75 (#492) 2019-12-23 07:36:08 +11:00
CNCF-bot d97c52b99a Update to a new version [skip ci] 2019-12-13 21:30:04 +00:00
Andrey Kozlov d6287489cb weekly updates, #75 (#489) 2019-12-14 08:22:05 +11:00
CNCF-bot 434e7e0519 Update to a new version [skip ci] 2019-12-10 09:31:40 +00:00
Jordi Noguera 0484acf5b6 Generate fewer favicons; Fix #366 (#488)
* Generate fewer favicons; Fix #366

* Disable apple icons
2019-12-10 18:23:47 +09:00
CNCF-bot 5dd68f60e0 Update to a new version [skip ci] 2019-12-09 18:47:13 +00:00
Jordi Noguera f0ca70f387 Automatically check accessibility (#484)
* Automatically check accessibility

* Disable ghost mode on ci server

* Remove unused npm task
2019-12-09 10:39:28 -08:00
CNCF-bot 0e53dac121 Update to a new version [skip ci] 2019-12-07 14:42:15 +00:00
Andrey Kozlov f9c9b2afd7 weekly updates, #75 (#485) 2019-12-07 06:34:23 -08:00
CNCF-bot 5d655eff64 Update to a new version [skip ci] 2019-12-06 15:44:55 +00:00
Jordi Noguera cddf8efafd Add rel='noopener noreferrer' to outbound links; Fix #483 (#486) 2019-12-06 07:35:43 -08:00
CNCF-bot aa6933fafb Update to a new version [skip ci] 2019-12-03 04:51:31 +00:00
Andrey Kozlov d34ce88d90 switch to favicons-webpack-plugin, close #478 (#480) 2019-12-02 20:43:48 -08:00
CNCF-bot 1fd979d4a6 Update to a new version [skip ci] 2019-12-02 14:52:04 +00:00
Jordi Noguera 203525c0b7 Fix vertical links; Fix #479 (#481) 2019-12-02 06:45:16 -08:00
CNCF-bot 444d0f3056 Update to a new version [skip ci] 2019-12-01 19:14:55 +00:00
Dan Kohn b8faba471d Empty commit to trigger new NPM push
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-12-01 14:07:51 -05:00
Dan Kohn b0843f7981
Add OpenJSF landscape [skip ci] 2019-11-30 20:39:39 -05:00
CNCF-bot 6e9edfb253 Update to a new version [skip ci] 2019-11-29 16:50:59 +00:00
Jordi Noguera 6d22f31244 Improve accessibility (#474) 2019-11-29 08:44:07 -08:00
CNCF-bot 503fd08d90 Update to a new version [skip ci] 2019-11-26 23:42:00 +00:00
Andrey Kozlov f73466e435 do not report errors to github without a PR, close #464 (#473) 2019-11-26 15:34:18 -08:00
CNCF-bot a85abcddd7 Update to a new version [skip ci] 2019-11-26 12:30:43 +00:00
Andrey Kozlov 333a73b0fa npm audit fix (#471) 2019-11-26 04:23:59 -08:00
CNCF-bot ef2a17f399 Update to a new version [skip ci] 2019-11-25 16:55:18 +00:00
Jordi Noguera c9c407aebb Throw exception if we get infinite loop when fetching Crunchbase parents; Fix #467 (#470) 2019-11-25 08:45:51 -08:00
CNCF-bot 9b8750bb08 Update to a new version [skip ci] 2019-11-25 16:42:24 +00:00
Andrey Kozlov 9873f96d12 weekly updates, #75 (#469) 2019-11-25 08:31:49 -08:00
Dan Kohn 1e464f179a
Clarify SVG with text directions [skip ci] 2019-11-23 17:34:23 -05:00
Dan Kohn 7e1d2ad9a3
Clarifications [skip ci] 2019-11-22 23:40:04 -05:00
CNCF-bot c5dc1d9226 Update to a new version [skip ci] 2019-11-17 01:21:05 +00:00
Andrey Kozlov a909f3fcff update packages, #75 (#463) 2019-11-16 20:14:28 -05:00
CNCF-bot dce76fce1e Update to a new version [skip ci] 2019-11-15 15:01:15 +00:00
Andrey Kozlov 3f1ef1ca6b 251 prerender (#458)
* wip

* more progress

* wip

* more progress

* test what we can get on netlify

* support landscapeapp

* get rid of http link

* just png

* Revert "just png"

This reverts commit 3ff72f2fed.

* just optimize fonts

* embed font

* lazy load svg in google

* load images only when they are visible

* remove amount of elements on a page

* smooth scroll for iphone

* do not flash the scroller

* hide zoom buttons till everything is ready, less scroll flickering

* ensure that items are clickable even until full javascript had been attached

* run integration tests again on a prerendered page

* run a test on a appUrl to force a prerendered page

* embed css in prerendered page

* cleanup

* typo
2019-11-15 09:54:13 -05:00
CNCF-bot 06c7e36fa9 Update to a new version [skip ci] 2019-11-13 17:32:21 +00:00
Jordi Noguera e7b5c43828 Fail immediately if settings don't match; Fix #393 (#462) 2019-11-13 12:26:35 -05:00
CNCF-bot a02972ed76 Update to a new version [skip ci] 2019-11-11 11:04:41 +00:00
Jordi Noguera d892972f2f Reduce size of image previews; Fix #456 (#459) 2019-11-11 05:59:00 -05:00
Dan Kohn d5ae3019fa
Small corrections [skip ci] 2019-11-09 16:43:02 -05:00
CNCF-bot 4b0add41bf Update to a new version [skip ci] 2019-11-08 15:27:06 +00:00
Jordi Noguera 19806cfe15
Update dependencies (#457) 2019-11-08 16:20:42 +01:00
CNCF-bot 515050e4fb Update to a new version [skip ci] 2019-11-08 15:11:08 +00:00
Jordi Noguera d56859f320 Remove hardcoded settings from CNCF landscape; Fix #273 (#455)
* Remove hardcoded settings from CNCF landscape; Fix #273

* Rename isEndUserSupporter

* Move unnamed organization to settings
2019-11-08 16:04:16 +01:00
CNCF-bot d801d3912b Update to a new version [skip ci] 2019-11-07 17:23:54 +00:00
Andrey Kozlov 3ed49d18b9 387 fix ascii filenames (#454)
* do not allow non ascii characters in file names, close #387

* ensure there are no wrong characters in hosted_logos in landscape.yml

* rename files in hosted_logos folder when required

* change data in a cache too
2019-11-07 18:17:15 +01:00
Dan Kohn fbd8f233be
Update local install directions [skip ci] 2019-11-06 11:02:27 -05:00
CNCF-bot 2f3796faf5 Update to a new version [skip ci] 2019-11-05 21:13:28 +00:00
Andrey Kozlov 65dd9e13b3 modify instruction how to work with multiple landscapes from a landsc… (#453)
* modify instruction how to work with multiple landscapes from a landscapeapp folder, close #451

* tell how to run this from a project folder

* a proper y function
2019-11-05 22:06:16 +01:00
CNCF-bot f246cfdd66 Update to a new version [skip ci] 2019-11-04 16:54:01 +00:00
Andrey Kozlov 3a22df0971 fix truncated badge; closes #440 (#449)
* add grouping by a primary language, close #445

* encode language so C++ and C# work correctly

* properly filter by no language

* make languages in a chart legend clickable, close #446

* use grouping=no instead of grouping=language when selecting a language from a chart legend

* Ignore languages from Other part of a legend

* fix truncated license badge, close #440

* increase the allowed width a bit
2019-11-04 17:47:52 +01:00
CNCF-bot f6a96c83e5 Update to a new version [skip ci] 2019-11-02 20:45:54 +00:00
Andrey Kozlov 068c9e0ac1 add grouping by a primary language, close #445 (#448)
* add grouping by a primary language, close #445

* encode language so C++ and C# work correctly

* properly filter by no language

* make languages in a chart legend clickable, close #446

* use grouping=no instead of grouping=language when selecting a language from a chart legend

* Ignore languages from Other part of a legend
2019-11-02 21:39:43 +01:00
CNCF-bot 5934f2a796 Update to a new version [skip ci] 2019-11-02 06:27:53 +00:00
Andrey Kozlov b45e965720 do not wait 10 seconds, just wait for no more connections on rendering, close #324 (#443) 2019-11-02 07:22:02 +01:00
CNCF-bot 76a1361acf Update to a new version [skip ci] 2019-11-01 23:16:28 +00:00
Andrey Kozlov ce7ee271e4 weekly updates, #75 (#447) 2019-11-02 00:09:33 +01:00
CNCF-bot bc914d252d Update to a new version [skip ci] 2019-11-01 16:14:02 +00:00
CNCF-bot 4c01a094d3 Update to a new version [skip ci] 2019-11-01 16:01:30 +00:00
Andrey Kozlov 4f666cb375 support language in the url, close #434 (#444) 2019-11-01 13:11:43 +01:00
Jordi Noguera abb6086791 Jordi 354 3rd party fetching improvements; Fix #354, Fix #353 (#442)
* Don't make repeat requests to Crunchbase

* Refactor requests to 3rd party APIs to only be retried on 429

* Extract api clients

* Fix search number of tweets
2019-11-01 12:57:55 +01:00
CNCF-bot f0c111cfef Update to a new version [skip ci] 2019-10-29 20:32:47 +00:00
Andrey Kozlov bd789f2a1c sort by commits, close #433 (#441) 2019-10-29 21:25:58 +01:00
CNCF-bot 42fcb250f5 Update to a new version [skip ci] 2019-10-29 18:26:45 +00:00
Jordi Noguera f14554b925 Change CNCF Subsidiary Project URL; Fix #419 (#439) 2019-10-29 16:29:50 +01:00
CNCF-bot 7ddde544ef Update to a new version [skip ci] 2019-10-29 00:27:29 +00:00
Andrey Kozlov fcf8454e4c Add charts (#417); closes #135; closes #16
* add github colors

* a first chiart

* test without that lfedge

* more progress

* A working version

* increase height a bit

* extract legend to a separate component

* wip

* return back lfedge

* make a legend even better

* update a tooltip

* handle text overflow

* replace 0% with <1%

* make a grid of badges

* project and parent tags

* add other option

* remove chartist

* more progress

* weekly participation

* even better commits activity

* more progress on a layout

* keep working on a layout

* more progress on a layout in chrome

* more changes

* more fixes

* get rid of extra code

* fix fonts and margins of a pie chart

* reduce spacing even more

* update the bar chart

* add proper labels for a bar chart

* chop the last week

* better align labels

* more fixes

* one more fix to the layout

* fix an empty label

* keep only integer numbers on the Y axis

* remove In progress from practices

* fix labels for iPhone

* more fixes

* handle a case when a height is too small

* one more layout fix

* hide charts in the embed mode

* properly display tags in the embedded mode
2019-10-29 01:20:49 +01:00
CNCF-bot be53f43530 Update to a new version [skip ci] 2019-10-29 00:07:06 +00:00
Jordi Noguera 82d0f01b31 Validate all membership subcategories have corresponging membership in settings; Fix #389 (#437) 2019-10-29 00:59:23 +01:00
CNCF-bot 8949aae905 Update to a new version [skip ci] 2019-10-28 23:36:58 +00:00
Andrey Kozlov 00c9f976c5 update packages, #75 (#438) 2019-10-29 00:30:10 +01:00
CNCF-bot bf3cfd894b Update to a new version [skip ci] 2019-10-28 15:49:49 +00:00
Dan Kohn 1bd50cba34
Explain Crunchbase requirement [skip ci] 2019-10-28 11:36:49 -04:00
Jordi Noguera d565505f90 Fix missing icon from manifest; Fix #360 (#436) 2019-10-28 16:31:22 +01:00
CNCF-bot 1b7fb0833b Update to a new version [skip ci] 2019-10-28 11:37:39 +00:00
Jordi Noguera 848f5c0ef5 Fix contributor count; Fix #395 (#435) 2019-10-28 12:31:30 +01:00
CNCF-bot 58960da251 Update to a new version [skip ci] 2019-10-25 00:48:47 +00:00
Andrey Kozlov a958f02a11 fix layout for a sponsor badge, close #428 (#430) 2019-10-25 02:26:47 +02:00
CNCF-bot a24552fc9f Update to a new version [skip ci] 2019-10-24 18:04:44 +00:00
Andrey Kozlov 9f1dc2c6d5
Fetch charts data, #135 (#429)
* Fetch charts data, #135

* do not ignore GITHUB cache every time
2019-10-24 18:58:18 +01:00
CNCF-bot f331d92eea Update to a new version [skip ci] 2019-10-23 16:06:24 +00:00
ZeusTheTrueGod c08f0b754b Merge branch 'master' of github.com:cncf/landscapeapp 2019-10-23 16:39:46 +01:00
ZeusTheTrueGod bb447e8565 do not sure downloading process 2019-10-23 16:39:33 +01:00
CNCF-bot d6a3509eb8 Update to a new version [skip ci] 2019-10-23 15:05:21 +00:00
ZeusTheTrueGod 4682993f30 handle an issue when nodejs download is slow 2019-10-23 15:40:04 +01:00
ZeusTheTrueGod 27e648a56c update nodejs version 2019-10-23 15:28:41 +01:00
Jordi Noguera 065d9bafa6 Add back parent tag; Fix #425 (#426) 2019-10-23 09:57:44 -04:00
CNCF-bot 6517503207 Update to a new version [skip ci] 2019-10-21 23:53:45 +00:00
Andrey Kozlov d43ebd8cf2 install a latest caniuse, close #374 (#424) 2019-10-21 19:24:58 -04:00
CNCF-bot 66c206f46d Update to a new version [skip ci] 2019-10-21 14:35:26 +00:00
Andrey Kozlov 40da04b937 remove extra fields, close #415 (#423)
* remove extra fields, close #415

* adding a prune entry

* updated an error message

* ignore http/https on twitter
2019-10-21 10:29:04 -04:00
CNCF-bot 3c5735930f Update to a new version [skip ci] 2019-10-21 08:22:50 +00:00
Andrey Kozlov 12dcc98c1e escape cncf bot messages, both html and markdown, close #414 (#422) 2019-10-21 04:16:41 -04:00
Andrey Kozlov af85df80a4 help Dan to run his `yf` script without issue, close #416 (#421) [skip ci] 2019-10-21 03:56:57 -04:00
CNCF-bot d765d01759 Update to a new version [skip ci] 2019-10-20 18:38:06 +00:00
Andrey Kozlov 05f31f8df1 move member tag to the project title. close #376 (#420)
* move member tag to the project title. close #376

* return a proper info

* relocate a badge

* and one more fix
2019-10-20 14:32:14 -04:00
Dan Kohn b920840be9
Update instructions [skip ci] 2019-10-19 16:26:07 -04:00
CNCF-bot 66519be18b Update to a new version [skip ci] 2019-10-19 17:53:27 +00:00
Dan Kohn 17ca3ccfdd
Update intro [slip ci] 2019-10-19 13:47:29 -04:00
Dan Kohn 5920482ce0
Strengthen logo advice [skip ci] 2019-10-17 12:54:03 -04:00
CNCF-bot 09b413ea2a Update to a new version [skip ci] 2019-10-17 13:57:20 +00:00
ZeusTheTrueGod 1fb3381f5c Merge branch 'master' of github.com:cncf/landscapeapp 2019-10-17 14:50:21 +01:00
ZeusTheTrueGod b7af4121c3 report crunhcbase errors before membership is calculated, close #413 2019-10-17 14:50:11 +01:00
CNCF-bot 3a5e7d951d Update to a new version [skip ci] 2019-10-17 09:16:03 +00:00
ZeusTheTrueGod 1c00c1ca35 Merge branch 'master' of github.com:cncf/landscapeapp 2019-10-17 10:09:23 +01:00
ZeusTheTrueGod 4a4a68defe properly report a message, close #413 2019-10-17 10:09:13 +01:00
Dan Kohn c2f1e059c0
Add new entry info [skip ci] 2019-10-16 20:27:23 -04:00
CNCF-bot df9b613565 Update to a new version [skip ci] 2019-10-16 21:18:08 +00:00
Andrey Kozlov 1383b39b4f full error message about crunchbase issue, close #406 (#411)
* full error message about crunchbase issue, close #406

* debug why there are no messages in PR
2019-10-16 17:11:32 -04:00
John Mertic 4fd7c04ecf Add examples of embedding (#412) [skip ci]
* Add examples of embedding

Signed-off-by: John Mertic <jmertic@linuxfoundation.org>

* Correct HTML and JS

* Correct URL
2019-10-16 13:43:05 -04:00
CNCF-bot c7cfb0f524 Update to a new version [skip ci] 2019-10-16 13:46:45 +00:00
ZeusTheTrueGod c0a2c1967c Add a README section about weekly updates 2019-10-16 14:40:34 +01:00
CNCF-bot 4cd9412d02 Update to a new version [skip ci] 2019-10-16 11:33:16 +00:00
Andrey Kozlov b63dc269c7
75 updates 2019 10 16 (#410)
* weekly updates, #75

* one more attempt to update
2019-10-16 12:26:14 +01:00
CNCF-bot f16368c662 Update to a new version [skip ci] 2019-10-16 11:14:39 +00:00
Dan Kohn 1499f48180 Revert "weekly updates, #75 (#407)"
This reverts commit 79c59ff111.
2019-10-16 06:57:38 -04:00
Jordi Noguera f01e5c8d71 Shorten card URLs; Fix #402 (#409) 2019-10-16 06:50:35 -04:00
CNCF-bot 22501a9f69 Update to a new version [skip ci] 2019-10-16 10:40:40 +00:00
Jordi Noguera af417ab5ab Fix LF link; Fix #405 (#408) 2019-10-16 06:30:49 -04:00
CNCF-bot 687247b25c Update to a new version [skip ci] 2019-10-16 10:22:46 +00:00
Andrey Kozlov 79c59ff111 weekly updates, #75 (#407) 2019-10-16 06:15:23 -04:00
CNCF-bot b894c55c4b Update to a new version [skip ci] 2019-10-15 17:32:08 +00:00
Andrey Kozlov 8638288490 replace new lines with space, close #396 (#404)
* replace new lines with space, close #396

* test what goes wrong

* one more attempt

* test if that is broken because of zoom

* forgot to remove one thing

* use different ways to render a text in a landscape depending if this is a browser or a pdf

* pdf is not a first parameter in the url to render a pdf doc
2019-10-15 13:25:56 -04:00
CNCF-bot 3873e1f4fd Update to a new version [skip ci] 2019-10-15 11:38:14 +00:00
Andrey Kozlov 58fe02891f make grey background for large items too, close #397 (#403)
* make grey background for large items too, close #397

* fix for a membership

* fix
2019-10-15 07:32:11 -04:00
CNCF-bot 04fa42eaff Update to a new version [skip ci] 2019-10-14 15:21:49 +00:00
Andrey Kozlov ab4baa0244 Report data issues back to the landscape pull request. close #9. (#392)
* read env vars

* add a function to report a fatal error

* more changes

* debug uri

* more debug

* more attempts to get it working

* more attempts to get it working

* more attempts to get it working

* a fix

* catch more issues with missing images

* fix

* report layout errors

* fix

* update yaml2json to report fatal errors

* fix

* fixes

* report an error when yaml2json fails with an exception

* return back a build.sh

* report to github when a test error occurs
2019-10-14 11:15:41 -04:00
CNCF-bot f86b05bceb Update to a new version [skip ci] 2019-10-13 21:11:06 +00:00
ZeusTheTrueGod 77d2fc4ec9 Merge branch 'master' of github.com:cncf/landscapeapp 2019-10-13 22:04:54 +01:00
ZeusTheTrueGod 155118c2ad help Dan to get it working again, probably close #394, but not sure yet 2019-10-13 22:04:41 +01:00
CNCF-bot f57b88185f Update to a new version [skip ci] 2019-10-12 20:10:07 +00:00
ZeusTheTrueGod d92468a658 do not run extra setup on our netlify docker image 2019-10-12 21:03:40 +01:00
CNCF-bot 1e47799993 Update to a new version [skip ci] 2019-10-10 09:22:42 +00:00
ZeusTheTrueGod 2b6e063292 Merge branch 'master' of github.com:cncf/landscapeapp 2019-10-10 10:13:18 +01:00
ZeusTheTrueGod 72eb59168b show output when building a single landscape 2019-10-10 10:13:06 +01:00
CNCF-bot 7f3439a7c7 Update to a new version [skip ci] 2019-10-10 08:59:04 +00:00
ZeusTheTrueGod 4a59d6547c Merge branch 'master' of github.com:cncf/landscapeapp 2019-10-10 09:50:23 +01:00
ZeusTheTrueGod 9c43d33835 Run tasks in parallel on packet, but one by one on CircleCI 2019-10-10 09:50:12 +01:00
CNCF-bot b760175958 Update to a new version [skip ci] 2019-10-10 06:42:03 +00:00
ZeusTheTrueGod f99593ef5b Add a timeout for parallel tasks 2019-10-10 07:32:51 +01:00
ZeusTheTrueGod f187600f36 Revert "Revert "hide npm logs when all is fine""
This reverts commit e9d0ab1930.
2019-10-10 07:16:11 +01:00
ZeusTheTrueGod 6834063ac0 Revert "Revert "try to speed up builds, #379 (#383)""
This reverts commit af1b05377b.
2019-10-10 07:15:58 +01:00
CNCF-bot 7edfab34c7 Update to a new version [skip ci] 2019-10-09 23:15:57 +00:00
Dan Kohn af1b05377b Revert "try to speed up builds, #379 (#383)"
This reverts commit 61af7ad722.
2019-10-09 19:01:45 -04:00
Dan Kohn e9d0ab1930 Revert "hide npm logs when all is fine"
This reverts commit 5179c04555.
2019-10-09 19:01:32 -04:00
CNCF-bot 2fbe61cfaa Update to a new version [skip ci] 2019-10-09 21:30:41 +00:00
ZeusTheTrueGod 5179c04555 hide npm logs when all is fine 2019-10-09 22:18:45 +01:00
Andrey Kozlov 61af7ad722
try to speed up builds, #379 (#383)
* try to speed up builds, #379

* minor fix for an empty branch var

* run on a remote server

* prepare to test on netlify

* fix

* fix

* disable lfenergy to test if this works

* quite output of git clone

* do not show npm logs

* properly pass env vars

* return lf energy

* specify how we parallel our builds

* get rid of netlify key in landscapes.yml

* put npm ci inside a netlify docker image
2019-10-09 22:14:10 +01:00
CNCF-bot bfc921efbb Update to a new version [skip ci] 2019-10-08 23:36:57 +00:00
Jordi Noguera 9cfff1faf7 Allow filtering by multiple parents; Fixes #382 (#385) 2019-10-08 16:22:56 -07:00
CNCF-bot 68cddbbac5 Update to a new version [skip ci] 2019-10-08 15:00:21 +00:00
Andrey Kozlov 6700f629f5
fix for a text zoom, close #378 (#384)
* fix for a text zoom, close #378

* get rid of commented code
2019-10-08 15:43:02 +01:00
Dan Kohn 79112af641
Add tweet directions [skip ci] 2019-10-05 13:43:48 -04:00
Dan Kohn 5119f435fc
Add LF Energy [skip ci] 2019-10-05 12:49:33 -04:00
CNCF-bot bce6d90e6b Update to a new version [skip ci] 2019-10-04 23:35:33 +00:00
Andrey Kozlov 38547a5178 add a maxBuffer arg to spawn, close #375 (#381)
* add a maxBuffer arg to spawn, close #375

* get it working on new node
2019-10-04 16:21:53 -07:00
Dan Kohn 52352d3d60
Add directions for developing across directories [skip ci] 2019-10-04 19:15:11 -04:00
CNCF-bot 349427322e Update to a new version [skip ci] 2019-10-03 23:25:23 +00:00
Dan Kohn 29259bd6f7
Add UCF landscape 2019-10-03 19:11:24 -04:00
Dan Kohn f2cbfe7c6c
Correct GitHub IDs [skip ci] 2019-10-03 18:06:15 -04:00
Dan Kohn 5c221d6c4d
Update directions 2019-10-03 17:44:17 -04:00
CNCF-bot 240a9874f6 Update to a new version [skip ci] 2019-10-02 20:02:01 +00:00
Andrey Kozlov fcb6d102fa fix an issue with a zoom, close #350 (#377) 2019-10-03 03:48:05 +08:00
CNCF-bot 3582fc3db7 Update to a new version [skip ci] 2019-10-01 13:48:00 +00:00
CNCF-bot f3a1257322 Update to a new version [skip ci] 2019-10-01 13:35:03 +00:00
Andrey Kozlov 3f8b3d3ca4 fix an error message in copy-iframe-resizer, close #340 (#372) 2019-10-01 21:09:02 +08:00
Jordi Noguera 89b1e8676a Refactor no-index/canonical logic; Close #279 (#370) 2019-10-01 21:05:11 +08:00
CNCF-bot e6e09b0209 Update to a new version [skip ci] 2019-09-30 15:40:28 +00:00
Jordi Noguera 5b58de4d7e Manually assign Tweet count; Closes #369 (#373) 2019-09-30 23:24:31 +08:00
CNCF-bot c0d3939fe8 Update to a new version [skip ci] 2019-09-30 13:59:09 +00:00
Jordi Noguera ae6415d054 Fix logo positioning; Fixes #364 (#371) 2019-09-30 21:42:07 +08:00
CNCF-bot 63bca77074 Update to a new version [skip ci] 2019-09-29 12:55:20 +00:00
Andrey Kozlov f376fa3d17 do not support old googlebot, close #217 (#367) 2019-09-29 20:43:32 +08:00
CNCF-bot 6ec1d82eb8 Update to a new version [skip ci] 2019-09-28 08:06:40 +00:00
ZeusTheTrueGod ec63c2ed70 fix 2019-09-28 08:43:49 +01:00
ZeusTheTrueGod db3b737f3e Merge branch 'master' of github.com:cncf/landscapeapp 2019-09-28 08:34:18 +01:00
ZeusTheTrueGod e1c1aa147d allow retry attempts 2019-09-28 08:34:05 +01:00
CNCF-bot c089f132ab Update to a new version [skip ci] 2019-09-27 22:52:01 +00:00
ZeusTheTrueGod 7b690a906d a new landscape 2019-09-27 23:36:30 +01:00
CNCF-bot c33714d5f4 Update to a new version [skip ci] 2019-09-26 13:43:26 +00:00
CNCF-bot d5f6fa85fd Update to a new version [skip ci] 2019-09-26 13:26:21 +00:00
Jordi Noguera 3aee2c7798 Update dependencies (#359)
* Update dependencies

* Add default to to InternalLink
2019-09-26 20:56:08 +08:00
Jordi Noguera 21c8f3a17a Use GitHub API to find latest commit; Fixes #310 (#362) 2019-09-26 20:54:33 +08:00
CNCF-bot 7a63501d89 Update to a new version [skip ci] 2019-09-26 12:25:15 +00:00
Jordi Noguera 7850696914 Reset tweet counts; Closes #344 (#361) 2019-09-26 20:12:21 +08:00
CNCF-bot 8b82903eae Update to a new version [skip ci] 2019-09-26 10:00:26 +00:00
Andrey Kozlov bb32c95d09 Use landscapes.yml as a list of landscapes to build in netlify. Close #298 (#356)
* test if this works

* adding a new hook

* take slack channel from global settings

* fix
2019-09-26 11:46:41 +02:00
CNCF-bot ce3f0b4708 Update to a new version [skip ci] 2019-09-25 15:19:00 +00:00
Jordi Noguera 0e2db1ddf3 Allow duplicate repos; Close 314 (#358) 2019-09-25 17:03:01 +02:00
CNCF-bot 3da0395fa1 Update to a new version [skip ci] 2019-09-25 12:01:03 +00:00
Jordi Noguera 9c321dfc4a Replace LFDL with LFAI; Close #244 (#357) 2019-09-25 13:47:11 +02:00
CNCF-bot 329f815019 Update to a new version [skip ci] 2019-09-25 07:47:58 +00:00
Jordi Noguera 70097376dc Fix mobile zooming; Fix #345 (#351)
* Fix mobile zooming; Fix #345

* Set overflow scroll to both html and body

* Fix regression in fullscreen mode

* Fix scrolling issue with mobile Chrome

* Remove unused zoomedIn state

* Fix position of twitter buttons when zoomed in
2019-09-25 09:34:15 +02:00
CNCF-bot 3f8a88f1d2 Update to a new version [skip ci] 2019-09-24 23:54:17 +00:00
Jordi Noguera 5802fffc30 Clean up console output; Close #330 (#355) 2019-09-25 01:37:08 +02:00
CNCF-bot 7dde9ce63c Update to a new version [skip ci] 2019-09-24 12:10:59 +00:00
Andrey Kozlov ae9128c84a get rid of special iphone trick, close #136 (#338)
* trying to get rid of special iphone trick, close #136

* disable scrolling via shadow

* more fixes for iPhone

* special fix for a landscape mode
2019-09-24 13:53:30 +02:00
CNCF-bot e622ed6787 Update to a new version [skip ci] 2019-09-22 20:38:36 +00:00
ZeusTheTrueGod b998672b58 more repos 2019-09-21 21:30:14 +01:00
ZeusTheTrueGod e56f293f32 do not show SLACK_CHANNEL 2019-09-21 15:39:42 +01:00
ZeusTheTrueGod e9c7ae14a2 add lfedge 2019-09-21 14:58:22 +01:00
ZeusTheTrueGod 82fd518b3b add lfai 2019-09-20 21:19:03 +01:00
ZeusTheTrueGod 5e20a216ab log output to the file 2019-09-20 21:17:13 +01:00
ZeusTheTrueGod d3f82b1962 Merge remote-tracking branch 'origin/master' into 298-single-update-server 2019-09-20 15:39:01 +01:00
CNCF-bot 97cf8c22f3 Update to a new version [skip ci] 2019-09-20 00:44:18 +00:00
ZeusTheTrueGod c31bba7ba7 Merge branch 'master' into 298-single-update-server 2019-09-19 22:33:06 +01:00
ZeusTheTrueGod 53439c2b9f Merge branch 'master' of github.com:cncf/landscapeapp 2019-09-19 22:32:41 +01:00
ZeusTheTrueGod d1f500d6e4 fix when crunchbase parents field is not set 2019-09-19 22:32:30 +01:00
Dan Kohn 7c3526c2c7 Update directions [skip ci]
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-09-19 17:03:45 -04:00
ZeusTheTrueGod 05d6f48b8c handle a case when there are no links 2019-09-19 19:53:41 +01:00
ZeusTheTrueGod 795cea3022 update a slack channel detection 2019-09-19 19:00:04 +01:00
ZeusTheTrueGod 67a39fe733 more progress 2019-09-19 18:56:00 +01:00
ZeusTheTrueGod a4303f71cd enable reporting to slack 2019-09-19 14:50:46 +01:00
ZeusTheTrueGod f39da532aa enable reporting to slack 2019-09-19 14:49:59 +01:00
ZeusTheTrueGod bb4d4366d1 fix for getting a secret 2019-09-19 11:38:13 +01:00
ZeusTheTrueGod 59bd73d0d4 mask secrets 2019-09-19 11:36:50 +01:00
ZeusTheTrueGod 566f0afb37 mask secrets 2019-09-19 11:33:02 +01:00
Dan Kohn dd7a3095df Update directions [skip ci]
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-09-19 05:29:24 -04:00
ZeusTheTrueGod b8eb2661b3 update landscapes.sh 2019-09-18 22:04:07 +01:00
ZeusTheTrueGod 008e36ba93 update landscapes.sh 2019-09-18 18:21:34 +01:00
ZeusTheTrueGod 52333fba85 update a package.json 2019-09-18 18:20:14 +01:00
ZeusTheTrueGod 560e474690 more progress 2019-09-18 18:17:56 +01:00
ZeusTheTrueGod 44d3c1b596 more progress on a single server 2019-09-18 10:12:08 +01:00
ZeusTheTrueGod a40ce894c9 WIP 2019-09-17 20:46:21 +01:00
CNCF-bot 6063276daa Update to a new version [skip ci] 2019-09-16 15:37:04 +00:00
Jordi Noguera a452feea5e
Fix broken layout in embedded twitter timeline; Fix #331 (#343)
* Fix broken layout in embedded twitter timeline; Fix #331

* Only set twitter embed iframe style on safari ios
2019-09-16 17:24:19 +02:00
CNCF-bot 81402f200b Update to a new version [skip ci] 2019-09-16 11:42:32 +00:00
John Mertic fc95ab5eb2 Refactored list of landscapes into ADOPTERS.md file and add some extra bash_profile aliases. (#342)
* Refactor out landscape examples into an ADOPTERS.md file

Signed-off-by: John Mertic <jmertic@linuxfoundation.org>

* Added some additional commands for the bash profile and refactored out the landscape images to the ADOPTERS.md file

Signed-off-by: John Mertic <jmertic@linuxfoundation.org>

* Fixed link

Signed-off-by: John Mertic <jmertic@linuxfoundation.org>

* Fix yc to yp
2019-09-16 07:25:46 -04:00
CNCF-bot ef24727335 Update to a new version [skip ci] 2019-09-12 18:08:13 +00:00
Jordi Noguera 88d82396a3 Add label for Linux foundation projects; Fixes #248 (#329)
* Add parents from crunchbase

* Add parent tag to modal

* Set organization crunchbase slugs in lookups

* Force fetching parents from crunchbase

* Generate crunchbase slugs from project.crunchbase and project.crunchbase_data.parents

* Move ParentTag underneath ProjectTag

* Parent label settings comes from crunchbase_and_children from settings.yml

* Parent filter also applies to landscape
2019-09-12 19:53:32 +02:00
CNCF-bot d99c569544 Update to a new version [skip ci] 2019-09-12 12:32:34 +00:00
Jordi Noguera 85d6bd0ea3 Revert Sidebar Menus Spacing Regression; Fixes #226 (#333) 2019-09-12 14:16:19 +02:00
CNCF-bot f86af3798e Update to a new version [skip ci] 2019-09-11 20:48:19 +00:00
ZeusTheTrueGod 660eef6717 keep netlify builds fast enough 2019-09-11 21:32:29 +01:00
CNCF-bot ea623493be Update to a new version [skip ci] 2019-09-11 16:59:13 +00:00
Andrey Kozlov 33211997f2 318 update membership logic (#325)
* a first implementation to use subsidiary projects only. Also calculate parent ids

* more changes, adding an info which membership was assigned and why

* more progress

* test how this works on netlify

* typo and fix

* test on all 6 landscapes

* update a message

* return back landscape rendering and do not fetch all the crunchbase
2019-09-11 18:29:55 +02:00
CNCF-bot da98d5bc6f Update to a new version [skip ci] 2019-09-09 16:41:55 +00:00
Jordi Noguera d97ce6c3d1 Improvements to CSS responsiveness; Fixes #246 (#327)
* Improvements to CSS responsiveness; Fixes #246

* Update CSS breakpoint comment
2019-09-09 12:17:20 -04:00
CNCF-bot d4561cbf3a Update to a new version [skip ci] 2019-09-04 12:14:38 +00:00
Jordi Noguera 293a233926 Get Sandbox Label from settings.yml (#320)
* Get Sandbox Label from settings.yml

* Handle empty project
2019-09-04 07:44:42 -04:00
Jordi Noguera 4f779860c5 Sort Antarctica Last (#323) 2019-09-04 07:44:07 -04:00
Jordi Noguera 540b418e7e Clean up unused dependencies (#322) 2019-09-04 07:27:19 -04:00
CNCF-bot 680996bc20 Update to a new version [skip ci] 2019-09-03 02:34:38 +00:00
Andrey Kozlov 90c8ec1a7a 284 how to autoupdate landscape (#292)
* Add notes how to add a new landscape to the autoupdater

* changes to the README

* return back vulnerability reporting

* update info about google verification

* update text
2019-09-02 21:49:57 -04:00
Jordi Noguera 5e6c407858 Fix npm warnings (#312) 2019-09-02 21:49:29 -04:00
Jordi Noguera f4ecc1f9a3 Revert loglevel=silent (#319) 2019-09-02 21:49:09 -04:00
CNCF-bot 6c025ed87f Update to a new version [skip ci] 2019-09-02 15:56:38 +00:00
ZeusTheTrueGod 95e98adb4e fix an issue with suborganizations having a priority over main organization when deciding about membership 2019-09-02 16:31:29 +01:00
CNCF-bot 0bd906bfc2 Update to a new version [skip ci] 2019-09-02 12:40:31 +00:00
Jordi Noguera 0c06c8d549 Validate twitter URLS start with https://twitter.com in landscape.yml; closes #195 (#311)
* Validate twitter URLS start with https://twitter.com in landscape.yml

* Remove query string from twitter URLs

* When twitter is set to null ignore twitter url from crunchbase
2019-09-02 08:11:12 -04:00
CNCF-bot f34384c289 Update to a new version [skip ci] 2019-08-31 14:25:23 +00:00
Andrey Kozlov fccd0ca0f7
require a membership category instead of members.yml, close #260 (#304)
* require a membership category instead of members.yml, close #260

* test if I can build all 6 landscapes

* use a special branch

* switch to proper branches for testing purpose

* debug remaining repos

* fix first time landscapes

* one more attempt to build

* typo

* enable all landscapes

* do not use my fork for omp

* update acquisited members

* fix funding calculations

* make a full build
2019-08-31 15:01:58 +01:00
CNCF-bot a7ab1a9745 Update to a new version [skip ci] 2019-08-29 16:07:43 +00:00
Jordi Noguera 6735bc1124 Set npm loglevel to silent (#313)
I'm unclear whether that file will carry over to the individual landscapes. If it doesn't, it might make sense to have those be silent, but not this one.
2019-08-29 11:54:27 -04:00
CNCF-bot 38ad3156ca Update to a new version [skip ci] 2019-08-28 23:21:51 +00:00
Jordi Noguera 1654d81b3b Improvements to fetching data from github API (#308)
* Fetch list of releases in order to fetch latest release

* Use API to fetch repo's first commit date

* Use `async/await` instead of `then`

* Remove unused methods

* Use `makeApiRequest` in `getReleaseDate`

* Convert another `then` to `await/async`
2019-08-28 19:10:30 -04:00
Dan Kohn 93fbaee70a
Add API Key info [skip ci] 2019-08-27 12:32:54 -04:00
CNCF-bot e230fbe83c Update to a new version [skip ci] 2019-08-27 15:24:39 +00:00
Jordi Noguera 062a80e240 Fix URL shortening when filtering; fixes #218 (#303)
* Revert "Revert "Fix URL shortening when filtering; fixes #218 (#300)""

This reverts commit 75397fa09b.

* Generalize test for any landscape

* Load projects from data.json

* Add script to test all landscapes
2019-08-27 08:11:50 -07:00
John Mertic c8b45ca073 Add image advice [skip ci]
Signed-off-by: John Mertic <jmertic@linuxfoundation.org>
2019-08-27 08:09:35 -07:00
Dan Kohn 6d9acea214
Naming advice [skip ci] 2019-08-26 07:52:15 -04:00
CNCF-bot 0de8785469 Update to a new version [skip ci] 2019-08-24 15:30:31 +00:00
Dan Kohn 1c387b7d49
Image format advice 2019-08-24 11:19:08 -04:00
CNCF-bot 852aa64736 Update to a new version [skip ci] 2019-08-22 15:32:05 +00:00
Jordi Noguera d38a413284 Support googlebot=yes on query string; closes #283 (#296)
* #283 Support googlebot=yes on query string

* googlebot=yes can be anywhere in the URL

* Preserve googlebot in URL
2019-08-22 08:17:34 -07:00
CNCF-bot 156ff3b064 Update to a new version [skip ci] 2019-08-21 18:02:04 +00:00
Dan Kohn 75397fa09b Revert "Fix URL shortening when filtering; fixes #218 (#300)"
This reverts commit 1f0ca842d4.
2019-08-21 13:47:07 -04:00
CNCF-bot 03b9346b29 Update to a new version [skip ci] 2019-08-21 15:47:43 +00:00
Jordi Noguera 4883676a78 Sort open_source in landscape.yml (#301) 2019-08-21 08:19:54 -07:00
Jordi Noguera 1f0ca842d4 Fix URL shortening when filtering; fixes #218 (#300)
* Backfill tests

* Revert "Revert "#218 Fix URL filter params grouping (#295)""

This reverts commit 36f0a39150.

* Make sure filtering by organization does not break

* Move grouping logic to relation field
2019-08-21 08:19:26 -07:00
CNCF-bot 2e3b1e6bcf Update to a new version [skip ci] 2019-08-20 23:18:02 +00:00
ZeusTheTrueGod f6b3207957 ensure that we have build hooks for all 5 platforms 2019-08-21 00:06:18 +01:00
CNCF-bot b6ac5cf918 Update to a new version [skip ci] 2019-08-20 17:14:47 +00:00
Jordi Noguera 36f0a39150 Revert "#218 Fix URL filter params grouping (#295)"
This reverts commit 1ca71a64c4.
2019-08-20 19:01:38 +02:00
CNCF-bot bd4ee39e59 Update to a new version [skip ci] 2019-08-19 19:34:58 +00:00
Jordi Noguera 74baf83044 #269 Add option for non-open source projects in landscape.yml (#297)
* Add option for non-open source projects in landscape.yml

* Remove console.log
2019-08-19 15:10:24 -04:00
Jordi Noguera 1ca71a64c4 #218 Fix URL filter params grouping (#295) 2019-08-19 15:09:45 -04:00
CNCF-bot 0f9f43fdda Update to a new version [skip ci] 2019-08-19 17:02:23 +00:00
Jordi Noguera 14c6811bf3 Fix double arrows appearing on modals on mobile (#294) 2019-08-19 12:48:37 -04:00
CNCF-bot 46ce2f9e12 Update to a new version [skip ci] 2019-08-15 02:00:46 +00:00
Andrey Kozlov 296d72b251 treat "true" as "yes" in urls, close #242 (#291)
* treat "true" as "yes" in urls, close #242

* debug

* fix redirect protection

* a better fix
2019-08-14 21:46:24 -04:00
CNCF-bot 2a4c234ef6 Update to a new version [skip ci] 2019-08-14 06:42:19 +00:00
CNCF-bot 44903822d7 Update to a new version [skip ci] 2019-08-13 20:45:20 +00:00
CNCF-bot ba4bd5c75d Update to a new version [skip ci] 2019-08-13 20:14:59 +00:00
Dan Kohn 4f466ba347
Recommend copying instead of forking 2019-08-13 15:58:46 -04:00
CNCF-bot f05898425d Update to a new version [skip ci] 2019-08-11 23:21:12 +00:00
Andrey Kozlov 46ff64600a get rid of query parameters in a linkedin url, close #275 (#290) 2019-08-11 19:08:33 -04:00
CNCF-bot edbdbee647 Update to a new version [skip ci] 2019-08-11 01:26:28 +00:00
Andrey Kozlov 0512e7380f get rid of preview.json, close #216 (#288) 2019-08-10 21:14:11 -04:00
CNCF-bot 780f1430fc Update to a new version [skip ci] 2019-08-09 20:51:41 +00:00
Andrey Kozlov 1034a4edc7 (DO NOT MERGE) check if weekly updates are ok, #75 (#287)
* check if weekly updates are ok

* fix a layout issue
2019-08-09 16:40:05 -04:00
CNCF-bot 03e2b66234 Update to a new version [skip ci] 2019-08-09 03:18:59 +00:00
Dan Kohn 8b91facb66
Add QR code instructions [skip-ci] 2019-08-08 23:07:39 -04:00
CNCF-bot 46ff98fd9f Update to a new version [skip ci] 2019-08-07 21:51:05 +00:00
Andrey Kozlov 9ba5d0306e remove extra space in a select popup, close #226 (#286)
* remove extra space in a select popup, close #226

* reduce 32px height to 26px height
2019-08-07 17:37:04 -04:00
CNCF-bot 1428b7865c Update to a new version [skip ci] 2019-08-07 21:14:29 +00:00
Andrey Kozlov a48bc124cf move non open source to the top, close #259 (#285) 2019-08-07 16:59:52 -04:00
CNCF-bot 337b07d381 Update to a new version [skip ci] 2019-08-06 18:36:25 +00:00
Andrey Kozlov 3312f386e8 put content before tags for a googlebot, close #263 (#282)
* put content before tags for a googlebot, close #263

* put description a bit above for the googlebot
2019-08-06 14:25:29 -04:00
CNCF-bot de80939613 Update to a new version [skip ci] 2019-08-05 22:01:36 +00:00
Andrey Kozlov 9a2af23681 support subsidiary project, treat it as a member project, close #271 (#281)
* support subsidiary project, treat it as a member project

* empty
2019-08-05 17:50:20 -04:00
CNCF-bot c776bcfc55 Update to a new version [skip ci] 2019-08-04 15:59:39 +00:00
CNCF-bot f8fd81f4be Update to a new version [skip ci] 2019-08-04 15:25:10 +00:00
Dan Kohn f92178ef6a
Add new landscape directions 2019-08-04 11:13:24 -04:00
CNCF-bot 8b9da28907 Update to a new version [skip ci] 2019-08-03 22:46:17 +00:00
CNCF-bot 354bb89cc4 Update to a new version [skip ci] 2019-08-03 22:34:42 +00:00
ZeusTheTrueGod a56e42d4c9 demo 2019-08-03 23:23:45 +01:00
CNCF-bot f42e49b272 Update to a new version [skip ci] 2019-08-03 21:08:18 +00:00
CNCF-bot 7953984149 Update to a new version [skip ci] 2019-08-03 20:24:10 +00:00
CNCF-bot a874101716 Update to a new version [skip ci] 2019-08-03 18:49:46 +00:00
Andrey Kozlov a8a527737c adding a canonical link to all indexed pages, close #264 (#278) 2019-08-03 14:37:08 -04:00
CNCF-bot 0c210ac0f0 Update to a new version [skip ci] 2019-08-02 21:07:51 +00:00
ZeusTheTrueGod 9bea52b905 update CNCF server 2019-08-02 21:53:31 +01:00
CNCF-bot ee5f1c4669 Update to a new version [skip ci] 2019-08-01 21:24:29 +00:00
ZeusTheTrueGod 9e3c23be51 Merge branch 'master' of github.com:cncf/landscapeapp 2019-08-01 22:11:09 +01:00
ZeusTheTrueGod af2f8e3adf try to kill chrome before checking links 2019-08-01 22:10:50 +01:00
CNCF-bot 143ea20869 Update to a new version [skip ci] 2019-08-01 17:30:40 +00:00
ZeusTheTrueGod 92da5608d6 Merge branch 'master' of github.com:cncf/landscapeapp 2019-08-01 18:19:33 +01:00
ZeusTheTrueGod 5cf29ed9a9 attempt to fix a CNCF bot 2019-08-01 18:19:18 +01:00
CNCF-bot ee9fbaeee2 Update to a new version [skip ci] 2019-07-31 22:33:23 +00:00
Andrey Kozlov dc60e5167a hide internal links when a googlebot is used, close #274 (#276) 2019-07-31 18:22:28 -04:00
CNCF-bot 365f70f96d Update to a new version [skip ci] 2019-07-30 21:56:51 +00:00
Andrey Kozlov 5b5eebaaa0 properly handle enduser=no in url, close #265 (#272) 2019-07-30 17:42:12 -04:00
CNCF-bot f7fff53599 Update to a new version [skip ci] 2019-07-30 21:06:31 +00:00
Andrey Kozlov 5daa64d81b add /format=xxx to a noindex exception, close #252 (#270) 2019-07-30 16:54:10 -04:00
CNCF-bot 8b5cac88ef Update to a new version [skip ci] 2019-07-29 21:33:48 +00:00
Andrey Kozlov 4fc2254cff return back pdfs to sitemap, close #266 (#267)
* return back sitemaps

* empty
2019-07-29 17:18:21 -04:00
CNCF-bot 95f5aa37d8 Update to a new version [skip ci] 2019-07-29 21:17:08 +00:00
Dan Kohn 524557e642
Delete PULL_REQUEST_TEMPLATE.md 2019-07-29 16:32:37 -04:00
CNCF-bot 6b07f2762b Update to a new version [skip ci] 2019-07-26 02:45:26 +00:00
Andrey Kozlov cb886da3f3 change the way how sitemap is generated, close #255 (#261) 2019-07-25 22:31:55 -04:00
CNCF-bot 20ea9bb930 Update to a new version [skip ci] 2019-07-25 17:27:40 +00:00
Dan Kohn ad61754def
LFDL -> LFAI 2019-07-25 13:13:07 -04:00
CNCF-bot 88a3d7d15e Update to a new version [skip ci] 2019-07-24 18:38:52 +00:00
Dan Kohn c2f3a3e879 Remove strange "pf" text
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-07-24 14:27:07 -04:00
CNCF-bot c8662d02f9 Update to a new version [skip ci] 2019-07-23 23:47:57 +00:00
Andrey Kozlov 0503872e54 redirect to / for wrong urls, close #210 (#256) 2019-07-23 19:35:26 -04:00
CNCF-bot 9be80af33b Update to a new version [skip ci] 2019-07-23 22:26:36 +00:00
Andrey Kozlov 0932b023c8 fix sitemap so it adds a proper landscape prefix, close #249 (#253)
* fix sitemap so it adds a proper landscape prefix, close #249

* run sitemap within CI server

* WIP: do not use puppeteer, share a code between a server and a client

* add serverside lookup for webpack lookups

* typo fix

* do not put sitemap inside the CI session

* add a noindex support

* redirect improper selected= urls, require a proper tab in the url
2019-07-23 18:14:32 -04:00
CNCF-bot a3f0d93b8b Update to a new version [skip ci] 2019-07-20 05:32:45 +00:00
Dan Kohn c29e53a528 Use Netlify redirects on /node_modules/*; closes #228
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-07-20 01:19:41 -04:00
CNCF-bot ffe89f8991 Update to a new version [skip ci] 2019-07-20 05:01:45 +00:00
Dan Kohn edfbbfb5ff
Add redirects (#250)
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-07-20 13:48:55 +09:00
CNCF-bot b4e8a9a200 Update to a new version [skip ci] 2019-07-18 01:04:38 +00:00
Dan Kohn b2cfa4d45b
Add members landscape 2019-07-17 20:53:14 -04:00
CNCF-bot 8b23877816 Update to a new version [skip ci] 2019-07-17 23:14:35 +00:00
Andrey Kozlov 261735813f update, #75 (#243) 2019-07-17 19:03:44 -04:00
CNCF-bot 7ab8544bc1 Update to a new version [skip ci] 2019-07-15 18:59:10 +00:00
Andrey Kozlov 63c672eb98 Do not duplicate Antarctica, close #235 (#238) 2019-07-15 14:39:10 -04:00
Andrey Kozlov c61514c9be Use a default label for enduser: true entries when special label not provided, close #236 (#239)
* Use a default label for enduser: true entries when special label not provided, close #236

* test
2019-07-15 14:36:38 -04:00
Andrey Kozlov ff1ec98164 push non public entries to the end in the card mode, close #234 (#237) 2019-07-15 14:27:08 -04:00
CNCF-bot 1f2b46611f Update to a new version [skip ci] 2019-07-12 23:07:29 +00:00
ZeusTheTrueGod 2f300f80e3 Merge branch 'master' of github.com:cncf/landscapeapp 2019-07-12 23:56:25 +01:00
ZeusTheTrueGod 41ada8be8d support enduser for removequotes command 2019-07-12 23:56:18 +01:00
CNCF-bot 09b4000571 Update to a new version [skip ci] 2019-07-12 22:48:32 +00:00
ZeusTheTrueGod bded359ea0 Merge branch 'master' of github.com:cncf/landscapeapp 2019-07-12 23:38:41 +01:00
ZeusTheTrueGod edaba47e34 fix for removing quotes 2019-07-12 23:38:32 +01:00
CNCF-bot 5be27cd28b Update to a new version [skip ci] 2019-07-12 21:58:41 +00:00
CNCF-bot d85119f9f5 Update to a new version [skip ci] 2019-07-12 21:45:00 +00:00
ZeusTheTrueGod 7b9f742a59 Merge branch 'master' of github.com:cncf/landscapeapp 2019-07-12 22:34:34 +01:00
ZeusTheTrueGod ca8e0ef194 one more attempt 2019-07-12 22:34:23 +01:00
CNCF-bot 52cefac8d1 Update to a new version [skip ci] 2019-07-12 21:18:08 +00:00
ZeusTheTrueGod 70e885a8c8 Merge branch 'master' of github.com:cncf/landscapeapp 2019-07-12 22:08:33 +01:00
ZeusTheTrueGod 0127dee702 one more attempt with theme 2019-07-12 22:05:10 +01:00
CNCF-bot 06bdcf0096 Update to a new version [skip ci] 2019-07-12 21:00:00 +00:00
ZeusTheTrueGod c683f55e8a Merge branch 'master' of github.com:cncf/landscapeapp 2019-07-12 21:51:02 +01:00
ZeusTheTrueGod dae4aa98fd add an important css style 2019-07-12 21:50:49 +01:00
CNCF-bot 08905f0a9a Update to a new version [skip ci] 2019-07-12 20:02:37 +00:00
ZeusTheTrueGod f540eb7d86 reduce padding for a mobile abbr mode 2019-07-12 20:52:07 +01:00
CNCF-bot 2b9402f723 Update to a new version [skip ci] 2019-07-11 22:34:33 +00:00
ZeusTheTrueGod 693817db0b urgent fix 2019-07-11 23:24:20 +01:00
CNCF-bot e45bc657e0 Update to a new version [skip ci] 2019-07-11 20:31:54 +00:00
Andrey Kozlov ed3f86a4c9
support abbreviation, #223 (#233) 2019-07-11 21:22:19 +01:00
CNCF-bot 410bf69a62 Update to a new version [skip ci] 2019-07-10 22:11:31 +00:00
Andrey Kozlov 4bbca02712 Add support for a members landscape; works on #223
* some progress

* more progress

* force

* empty

* more progress

* more progress

* wip

* empty

* render members

* empty

* empty

* support an end user filter

* Show all end user supporters too

* empty

* empty

* empty

* show a proper badge for end user members

* empty

* Empty

* allow to hide top right header

* Empty commit to trigger build

Signed-off-by: Dan Kohn <dan@dankohn.com>

* support special https://www.cncf.io

* more changes to the special organizations

* properly handle membership for animals

* try a master branch
2019-07-10 18:00:27 -04:00
CNCF-bot 09c0985da1 Update to a new version [skip ci] 2019-07-01 21:10:27 +00:00
Andrey Kozlov 7e14ce8c73 less space between example filters, close #215 (#229)
* less space between example filters

* empty
2019-07-02 05:01:14 +08:00
CNCF-bot 8138ba80f2 Update to a new version [skip ci] 2019-06-21 22:55:58 +00:00
Andrey Kozlov 21748fff2b
Dev 219 hide license (#221)
* weekly updates, #75

* hide license for specified companies in a dialog, #219

* use a specific cncf branch

* use a master branch of cncf
2019-06-21 23:46:46 +01:00
CNCF-bot 45c3cdc697 Update to a new version [skip ci] 2019-06-21 13:45:51 +00:00
Dan Kohn bbb89d5036
Update links 2019-06-21 09:37:52 -04:00
CNCF-bot c6f2b722bf Update to a new version [skip ci] 2019-06-18 18:58:30 +00:00
ZeusTheTrueGod 9158bd0cd4 Revert "ensure that everything loads in a local dev"
This reverts commit 144b8fee34.
2019-06-18 19:42:35 +01:00
ZeusTheTrueGod 93cb27a39c Revert "more progress with updates"
This reverts commit a3cf113e0c.
2019-06-18 19:42:33 +01:00
ZeusTheTrueGod eef9bdc669 Revert "more upgrades"
This reverts commit 46bf6be242.
2019-06-18 19:42:32 +01:00
ZeusTheTrueGod 46bf6be242 more upgrades 2019-06-18 19:26:28 +01:00
ZeusTheTrueGod a3cf113e0c more progress with updates 2019-06-18 19:23:52 +01:00
ZeusTheTrueGod 144b8fee34 ensure that everything loads in a local dev 2019-06-18 18:46:35 +01:00
CNCF-bot 99f6861262 Update to a new version [skip ci] 2019-06-07 21:51:26 +00:00
Andrey Kozlov 24674afc6f updating packages, #75 (#214) 2019-06-07 17:42:01 -04:00
CNCF-bot 07959b8236 Update to a new version [skip ci] 2019-05-31 20:30:47 +00:00
ZeusTheTrueGod e27b5d2e53 updating latest npm install 2019-05-31 21:21:14 +01:00
CNCF-bot c7b0a4ae54 Update to a new version [skip ci] 2019-05-30 20:50:09 +00:00
Andrey Kozlov ee0bddc479
75 updates 2019 05 29 (#213)
* check if interactive update works, #75

* do not display git diff output because it blocks the netlify
2019-05-30 21:39:43 +01:00
CNCF-bot 7cf709ff94 Update to a new version [skip ci] 2019-05-29 22:29:08 +00:00
Dan Kohn 921d002ea7 Revert "check if interactive update works, #75 (#212)"
This reverts commit 745a090ced.
2019-05-29 18:14:39 -04:00
CNCF-bot 6b04201394 Update to a new version [skip ci] 2019-05-29 21:57:22 +00:00
Andrey Kozlov 745a090ced check if interactive update works, #75 (#212) 2019-05-29 23:41:58 +02:00
CNCF-bot bb38b93346 Update to a new version [skip ci] 2019-05-15 20:26:23 +00:00
Andrey Kozlov 0bd0719054 Support members section in landscape.yml; closes #200
* work in progress

* fix

* support a logo-mode with embed=yes

* adding a title

* use a master branch of cncf

* get rid of extra logs
2019-05-15 16:10:28 -04:00
CNCF-bot fde0adf889 Update to a new version [skip ci] 2019-05-13 08:20:35 +00:00
ZeusTheTrueGod d253125312 report bot update results when something goes wrong 2019-05-13 09:07:38 +01:00
CNCF-bot fa6c04c736 Update to a new version [skip ci] 2019-05-07 18:58:06 +00:00
Dan Kohn 1919dd7d01 Revert "updating packages, #75 (#208)"
This reverts commit fb3ab08c40.
2019-05-07 14:48:09 -04:00
CNCF-bot 74d0bfaf6d Update to a new version [skip ci] 2019-05-07 13:48:22 +00:00
Andrey Kozlov fb3ab08c40 updating packages, #75 (#208) 2019-05-07 09:38:29 -04:00
CNCF-bot e7bf65399b Update to a new version [skip ci] 2019-04-17 21:16:31 +00:00
Andrey Kozlov b430b4d5df #75 weekly update (#205)
* test if it works

* fixes
2019-04-17 14:06:16 -07:00
CNCF-bot 0dd3b7ebdc Update to a new version [skip ci] 2019-04-12 21:52:11 +00:00
ZeusTheTrueGod ca642b34a9 Merge branch 'master' of github.com:cncf/landscapeapp 2019-04-12 22:39:27 +01:00
ZeusTheTrueGod 0238829c66 fix for a release date fetch 2019-04-12 22:30:43 +01:00
CNCF-bot ee7040c5bb Update to a new version [skip ci] 2019-04-11 20:19:55 +00:00
ZeusTheTrueGod fdabd9ac17 Merge branch 'master' of github.com:cncf/landscapeapp 2019-04-11 21:10:35 +01:00
ZeusTheTrueGod a5a76fdf58 skip lf-edge dashboard for now 2019-04-11 21:10:19 +01:00
CNCF-bot c1b4aade1d Update to a new version [skip ci] 2019-04-10 21:41:00 +00:00
CNCF-bot fb3c0f6829 Update to a new version [skip ci] 2019-04-10 20:44:11 +00:00
ZeusTheTrueGod 6cb1e7f581 provide a github key for a release date 2019-04-10 21:27:23 +01:00
CNCF-bot 41be9b73a6 Update to a new version [skip ci] 2019-04-08 21:26:49 +00:00
Andrey Kozlov de3fefaf9c 198 better crunchbase errors (#202)
* report was exactly is wrong with a ticker

* second commit

* fix typo
2019-04-08 14:13:40 -07:00
CNCF-bot beb7045a4b Update to a new version [skip ci] 2019-03-28 20:21:51 +00:00
Andrey Kozlov 0ad874770e fetch release info via api, close #199 (#201)
* fetch release info via api

* a test file
2019-03-28 16:09:15 -04:00
CNCF-bot aea8409f61 Update to a new version [skip ci] 2019-03-18 20:57:37 +00:00
Andrey Kozlov aff9245e11 closes #182: avoid network timeouts (#197)
* research phantomjs as a workaround

* more checks

* try to get everything working with puppeteer

* get rid of phantom

* after npm install

* latest version
2019-03-18 16:45:58 -04:00
CNCF-bot 8d234d7236 Update to a new version [skip ci] 2019-03-18 17:36:13 +00:00
Andrey Kozlov f6aad80432 fix http:// and www. redirects (#196) 2019-03-18 13:21:11 -04:00
CNCF-bot 97d22e47c9 Update to a new version [skip ci] 2019-03-17 21:00:46 +00:00
Andrey Kozlov 47a6ddc517 ban spaces in certain fields, close #172 (#194) 2019-03-17 16:47:08 -04:00
CNCF-bot e9bca7e9f9 Update to a new version [skip ci] 2019-03-17 16:29:15 +00:00
Andrey Kozlov 88d7e81151 190 fail on empty crunchbase city (#192)
* fail on empty crunchbase city, close #190

* disable crunchbase cache

* Revert "disable crunchbase cache"

This reverts commit 2a9aa9800d.

* get rid of typo
2019-03-17 12:15:53 -04:00
CNCF-bot 41d8380e08 Update to a new version [skip ci] 2019-03-14 23:13:01 +00:00
Andrey Kozlov 50ab91e110 update packages, close #75 (#191) 2019-03-14 18:53:36 -04:00
CNCF-bot 13cdf8b6dd Update to a new version [skip ci] 2019-03-08 21:42:38 +00:00
Andrey Kozlov 81cd5875e1 strict validation of landscape.yml, fatal error on wrong github url, close #188 (#189) 2019-03-08 22:29:01 +01:00
CNCF-bot b92eff77cf Update to a new version [skip ci] 2019-03-07 22:00:47 +00:00
ZeusTheTrueGod 9fdf3afec9 Merge branch 'master' of github.com:cncf/landscapeapp 2019-03-07 21:45:33 +00:00
ZeusTheTrueGod f5cb571f2c one more attempt 2019-03-07 21:45:18 +00:00
CNCF-bot 9d46f89fd5 Update to a new version [skip ci] 2019-03-07 21:40:05 +00:00
ZeusTheTrueGod faebe8fe09 Merge branch 'master' of github.com:cncf/landscapeapp 2019-03-07 21:32:03 +00:00
ZeusTheTrueGod 75aa4300aa suppress npm notice 2019-03-07 19:45:51 +00:00
CNCF-bot 76e06e8235 Update to a new version [skip ci] 2019-03-07 19:13:19 +00:00
ZeusTheTrueGod e5ede7ee48 one more log 2019-03-07 18:58:45 +00:00
ZeusTheTrueGod b52e9e2ead Merge branch 'master' of github.com:cncf/landscapeapp 2019-03-07 18:57:36 +00:00
ZeusTheTrueGod 4264a4c1a9 build only with lf-edge 2019-03-07 18:57:23 +00:00
CNCF-bot 3272c4ff8c Update to a new version [skip ci] 2019-03-07 10:06:31 +00:00
ZeusTheTrueGod aec5d9402d add lf-edge to the list of dashboards 2019-03-07 09:48:16 +00:00
CNCF-bot 68eec8c933 Update to a new version [skip ci] 2019-03-05 22:46:57 +00:00
Andrey Kozlov 4bd724f230 update a summary calculator, close #179 (#187)
* update a summary calculator

* another attempt to match summary and export
2019-03-05 23:30:38 +01:00
Dan Kohn 16c00835b8 Revert "weekly update, #75 (#186)"
This reverts commit d42770681b.
2019-03-05 17:27:19 -05:00
CNCF-bot 2b90806e0c Update to a new version [skip ci] 2019-03-05 21:26:48 +00:00
Andrey Kozlov d42770681b weekly update, #75 (#186) 2019-03-05 22:16:56 +01:00
CNCF-bot 8456a554d4 Update to a new version [skip ci] 2019-03-04 19:07:42 +00:00
Andrey Kozlov fcae976b16 optimize project specific images every day, close #170 (#175)
* optimize project specific images every day, close #170

* remove daily autoupdate

* adding a command to the package.json
2019-03-04 19:59:41 +01:00
CNCF-bot 41369c8b12 Update to a new version [skip ci] 2019-03-01 20:33:22 +00:00
Andrey Kozlov e560dea9ff fix netlify logs, close #183 (#184)
* test

* testing crunchbase output

* one more attempt

* and one more aettempt

* one more fix

* and more progress

* gogogo

* decrease a line width

* Delete 1.js
2019-03-01 21:24:37 +01:00
CNCF-bot 1e268f7678 Update to a new version [skip ci] 2019-02-27 21:20:03 +00:00
Andrey Kozlov 2e98e3ed73 fix csv export, close #179 (#181)
* fix csv export, close #179

* more progress, but still improper number of rows

* final fix for returning correct items
2019-02-27 22:08:24 +01:00
CNCF-bot 4cb0d7d948 Update to a new version [skip ci] 2019-02-26 15:02:37 +00:00
Andrey Kozlov 41424d590c reset zoom too when trying to reset everything, close #176 (#180) 2019-02-26 15:53:43 +01:00
CNCF-bot 282c267755 Update to a new version [skip ci] 2019-02-24 14:56:15 +00:00
ZeusTheTrueGod e169cf9538 changes to the update server, allow to use a single update server 2019-02-24 09:16:15 +00:00
CNCF-bot ebbe30a177 Update to a new version [skip ci] 2019-02-23 21:18:41 +00:00
ZeusTheTrueGod d0a03bd5e3 allow empty items for lf-edge 2019-02-23 21:09:26 +00:00
CNCF-bot c6aa2d0f33 Update to a new version [skip ci] 2019-02-22 03:29:43 +00:00
Andrey Kozlov 7bdea34a5b remove a babel warning, close #155 (#174) 2019-02-22 11:19:36 +08:00
CNCF-bot 3cd876c5d8 Update to a new version [skip ci] 2019-02-21 14:13:32 +00:00
Andrey Kozlov 7dfb71e0e7 fix a tweet button in a portrait mode, close #162 (#171)
* fix a tweet button in a portrait mode, close #162

* fix layout
2019-02-21 22:04:01 +08:00
CNCF-bot 367dd3ed7b Update to a new version [skip ci] 2019-02-19 23:54:10 +00:00
Andrey Kozlov 522b02b981 prevent false positives from reporting, close #172 (#173) 2019-02-20 07:43:54 +08:00
CNCF-bot 32e9405766 Update to a new version [skip ci] 2019-02-17 21:58:22 +00:00
Andrey Kozlov 976bd2898d
159 fix summary text (#168)
* update a summary text, close #159

* Do not ignore stars
2019-02-17 21:50:00 +00:00
CNCF-bot 9b80dd2bba Update to a new version [skip ci] 2019-02-17 21:40:24 +00:00
Andrey Kozlov d1e90715e9 update a summary text, close #159 (#167) 2019-02-18 05:31:09 +08:00
CNCF-bot df670f3be0 Update to a new version [skip ci] 2019-02-16 23:17:23 +00:00
Andrey Kozlov fecc133e7a update dependencies, #75 (#166) 2019-02-17 07:08:41 +08:00
CNCF-bot c69d59e64c Update to a new version [skip ci] 2019-02-15 20:17:47 +00:00
ZeusTheTrueGod 1b9fcdd0cb fix false positives 2019-02-15 20:07:50 +00:00
CNCF-bot 5a91c2fc8b Update to a new version [skip ci] 2019-02-15 18:12:55 +00:00
ZeusTheTrueGod 94e281777a ignore location hash part, check an url via curl when puppeteer returns an error 2019-02-15 18:03:03 +00:00
CNCF-bot bdabd1e833 Update to a new version [skip ci] 2019-02-14 19:00:25 +00:00
ZeusTheTrueGod 43856f2159 allow to retry 2019-02-14 18:50:42 +00:00
CNCF-bot b8d1f2f74d Update to a new version [skip ci] 2019-02-14 18:45:49 +00:00
ZeusTheTrueGod 736eb0714b fix a typo 2019-02-14 18:34:58 +00:00
CNCF-bot 6bd8dba853 Update to a new version [skip ci] 2019-02-14 14:51:50 +00:00
ZeusTheTrueGod 7f277b88c8 just ignore certificate errors 2019-02-14 14:41:59 +00:00
CNCF-bot 6c11d551d5 Update to a new version [skip ci] 2019-02-14 12:49:28 +00:00
ZeusTheTrueGod 6852f45ee8 attempt to avoid few false positives 2019-02-14 12:39:10 +00:00
CNCF-bot cd4b2bae69 Update to a new version [skip ci] 2019-02-14 10:23:37 +00:00
ZeusTheTrueGod 32973757ba ignore https in puppeteer 2019-02-14 10:14:02 +00:00
CNCF-bot 1a20daf0ab Update to a new version [skip ci] 2019-02-14 10:08:34 +00:00
ZeusTheTrueGod 0f8196a8fe fixes 2019-02-14 10:00:00 +00:00
CNCF-bot f35b69b448 Update to a new version [skip ci] 2019-02-13 21:15:19 +00:00
ZeusTheTrueGod cb0f4a83b0 puppeteer fixes 2019-02-13 21:04:44 +00:00
CNCF-bot 3bf56d7f2d Update to a new version [skip ci] 2019-02-13 20:43:29 +00:00
Andrey Kozlov 2b063df4a3
160 fix check links again (#164)
* detect javascript redirects

* reporting check-links to slack

* update  a script for an update server
2019-02-13 20:33:52 +00:00
CNCF-bot bd7bf326f8 Update to a new version [skip ci] 2019-02-12 23:36:15 +00:00
Andrey Kozlov 16a2db6e5d fix error message in check-links, close #152 (#161) 2019-02-12 18:25:41 -05:00
CNCF-bot bdebab2779 Update to a new version [skip ci] 2019-02-12 17:27:46 +00:00
Andrey Kozlov d5f4cf144b Renaming Share to Tweet, close #153 (#158)
* Renaming Share to Tweet, clsoe #153

* empty
2019-02-12 12:17:29 -05:00
CNCF-bot 04d329fb74 Update to a new version [skip ci] 2019-02-12 06:42:42 +00:00
ZeusTheTrueGod 50b782e232 fix padding for a mobile embed; close #150 2019-02-12 06:34:19 +00:00
CNCF-bot f152ecb804 Update to a new version [skip ci] 2019-02-12 01:13:57 +00:00
Andrey Kozlov 303146fc2e detect orientation change in a modal dialog, close #156 (#157) 2019-02-11 20:04:32 -05:00
CNCF-bot 6b6140d0c2 Update to a new version [skip ci] 2019-02-11 01:34:59 +00:00
Andrey Kozlov 73c6997e16 fix iphone layout, close #149 (#154) 2019-02-10 20:25:20 -05:00
CNCF-bot 525271fd3b Update to a new version [skip ci] 2019-02-09 21:50:22 +00:00
Andrey Kozlov e68c7ae677 remove zoom=NaN, close #142 (#151) 2019-02-09 16:41:34 -05:00
CNCF-bot 268aac5ada Update to a new version [skip ci] 2019-02-09 20:11:15 +00:00
CNCF-bot a1e1316cd1 Update to a new version [skip ci] 2019-02-09 20:01:28 +00:00
Andrey Kozlov 9bc14b581e weekly updates, #75 (#147) 2019-02-09 14:44:52 -05:00
Andrey Kozlov 54a7fcb264 141 fix projet typo (#148)
* use node 11.9

* fix a typo

* Use name instead of Project
2019-02-09 14:44:36 -05:00
CNCF-bot 684a760feb Update to a new version [skip ci] 2019-02-08 10:54:21 +00:00
ZeusTheTrueGod 296c816b93 ensure that we use a latest npm version, close #145 2019-02-08 10:39:58 +00:00
CNCF-bot c485f450d6 Update to a new version [skip ci] 2019-02-07 18:30:25 +00:00
Andrey Kozlov 4a219e447e adding a tweet button, close #130 (#131)
* a simple tweet button

* using a custom text

* playing with that twitter button

* a script to search only latest tweets

* wip

* provide a window.tweets lookup

* keep twitter section in landscape.yml on yarn fetch

* add a count box

* draw a number only after twitter is loaded

* a bit better looking tweet button

* fix

* updating  a layout of tweet buttons

* more twitter buttons

*  a bit more fixes

* convert a tweet button to an icon on a small width

* handle narrow window a bit better

* a fix for a card mode on a narrow screen

* attempting to make a selected item in mobile landscape scrollable

* update a twitter button

* and a bit better layout

* more fixes

* and one more fix to make it looking good with a narrow screen

* forgot a file

* remove default values from number of tweets calculation
2019-02-07 13:21:52 -05:00
CNCF-bot c50a706b9e Update to a new version [skip ci] 2019-02-06 14:17:20 +00:00
ZeusTheTrueGod 17be0a9132 typo fix 2019-02-06 14:08:36 +00:00
CNCF-bot 293de7756e Update to a new version [skip ci] 2019-02-06 13:59:31 +00:00
Andrey Kozlov 659faed16b
add a dom content loaded wrapper (#146) 2019-02-06 13:50:59 +00:00
CNCF-bot 5d7acd1569 Update to a new version [skip ci] 2019-02-06 13:24:26 +00:00
Dan Kohn 182d7e3e74 npm update
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-02-06 08:15:03 -05:00
CNCF-bot 0f43214541 Update to a new version [skip ci] 2019-02-04 16:22:39 +00:00
Dan Kohn 731ded3e67 Update directions
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-02-04 11:09:30 -05:00
Dan Kohn 83d49692a1 Update Readme directions
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-02-04 11:00:32 -05:00
Dan Kohn e07d13fe7d Add npm latest
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-02-04 10:56:09 -05:00
CNCF-bot bbc826d71d Update to a new version [skip ci] 2019-02-04 12:02:56 +00:00
Andrey Kozlov efaa77b589 get rid of yahoo-finance, close #139 (#140)
* get rid of yahoo-finance

* test again

* enabling caching again
2019-02-04 06:52:48 -05:00
CNCF-bot 9849e90bd2 Update to a new version [skip ci] 2019-02-04 09:17:40 +00:00
ZeusTheTrueGod cf1ea731c5 brew install node in INSTALL.md 2019-02-04 09:09:30 +00:00
CNCF-bot ed0792ef55 Update to a new version [skip ci] 2019-02-04 08:51:16 +00:00
ZeusTheTrueGod 38da8f535e specify an exact version of terser 2019-02-04 08:42:27 +00:00
CNCF-bot a58d4d9c93 Update to a new version [skip ci] 2019-02-04 08:35:32 +00:00
ZeusTheTrueGod 2194ac1d77 fix an npm shrinkwrap, so it is made by a same version of npm which we use on CI 2019-02-04 08:26:49 +00:00
CNCF-bot 9c2b54cecb Update to a new version [skip ci] 2019-02-04 08:09:37 +00:00
ZeusTheTrueGod f6e1c1a445 show git diff 2019-02-04 08:01:10 +00:00
CNCF-bot 751722880c Update to a new version [skip ci] 2019-02-03 23:42:50 +00:00
ZeusTheTrueGod d230ecf37a test again 2019-02-03 23:31:51 +00:00
Dan Kohn 4b3b1c3ad1 Run npm audit fix
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-02-03 18:22:24 -05:00
ZeusTheTrueGod dd10b4f55b try an npm ci 2019-02-03 22:57:24 +00:00
ZeusTheTrueGod 12e17046c3 view a git diff 2019-02-03 22:55:48 +00:00
ZeusTheTrueGod 8e3ca2e7f5 test if this works 2019-02-03 22:48:55 +00:00
Andrey Kozlov 13bd5f38d0 134 npm shrinkwrap (#138)
* test if this works

* ensure that yarn is not used or mentioned anywhere

* a fix
2019-02-03 16:57:16 -05:00
CNCF-bot cd6d09fd9e Update to a new version [skip ci] 2019-02-03 19:30:00 +00:00
ZeusTheTrueGod 5f31617661 fix for best practices 2019-02-03 19:20:55 +00:00
CNCF-bot 57904dfc6f Update to a new version [skip ci] 2019-02-03 17:17:15 +00:00
Andrey Kozlov f57a39eac7 skip an initial part of log where yarn modules are installed, close #63 (#137) 2019-02-03 12:08:59 -05:00
CNCF-bot a8ba03aaec Update to a new version [skip ci] 2019-02-03 11:09:11 +00:00
ZeusTheTrueGod ed48279265 test 2019-02-03 11:01:36 +00:00
CNCF-bot d0f5663756 Update to a new version [skip ci] 2019-02-02 21:29:18 +00:00
ZeusTheTrueGod 01b31fb0a0 forcing a terser version of 3.14.1 2019-02-02 21:20:19 +00:00
ZeusTheTrueGod 2109d2908b Revert "Revert "weekly update dependencies, #75 (#132)""
This reverts commit 98d4944ee5.
2019-02-02 21:20:19 +00:00
CNCF-bot 8519bbe24f Update to a new version [skip ci] 2019-02-02 19:59:54 +00:00
ZeusTheTrueGod 98d4944ee5 Revert "weekly update dependencies, #75 (#132)"
This reverts commit 01184087f5.
2019-02-02 19:51:07 +00:00
CNCF-bot 1dc74e2ad3 Update to a new version [skip ci] 2019-02-02 12:42:04 +00:00
Andrey Kozlov 01184087f5 weekly update dependencies, #75 (#132) 2019-02-02 07:30:12 -05:00
CNCF-bot 3f43fbfd43 Update to a new version [skip ci] 2019-02-02 10:16:30 +00:00
ZeusTheTrueGod 21e781aae8 properly report a category with a bad layout 2019-02-02 10:08:06 +00:00
CNCF-bot 301f098ae1 Update to a new version [skip ci] 2019-01-31 22:38:28 +00:00
Dan Kohn c8eed5abc6 Disallow node_modules anywhere in robots.txt
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-31 17:29:05 -05:00
CNCF-bot 25442028d9 Update to a new version [skip ci] 2019-01-31 20:44:46 +00:00
Andrey Kozlov bc52adc340 add a noindex meta for anything but / and /selected=..., close #128 (#129)
* add a noindex meta for anything but / and /selected=..., close #128

* enable or disable meta tag when url changes

* do not add a second tag
2019-01-31 15:36:57 -05:00
CNCF-bot 5962fcd7a6 Update to a new version [skip ci] 2019-01-31 16:47:41 +00:00
Andrey Kozlov 23dce75bb1 Fix intermittent tests, close #119 (#127)
* increase timeout and test 100 times

* typo

* running jest multiple times to reproduce

* fix

* multiple attempts to create a browser and navigate to the initial page
2019-01-31 11:39:37 -05:00
CNCF-bot 054e1db510 Update to a new version [skip ci] 2019-01-30 23:46:27 +00:00
Andrey Kozlov b123e94808 use N/A for grouping in landscape mode, close #125 (#126)
* use N/A for grouping in landscape mode, close #125

* forgot a file, as usually
2019-01-30 18:37:51 -05:00
CNCF-bot 811f0a5dee Update to a new version [skip ci] 2019-01-30 19:20:13 +00:00
Andrey Kozlov 37eba15e5f landscape logo should navigate you to /, close #122 (#124)
* reset filters should navigate you to /, close #122

* fix for the landscapeapp deployment

* two separate command: reset filters and reset all parameters
2019-01-30 14:13:14 -05:00
CNCF-bot 7bd80695cc Update to a new version [skip ci] 2019-01-30 17:21:19 +00:00
Andrey Kozlov 001dd6247f 3 attempts to publish; closes #121 (#123) 2019-01-30 11:52:04 -05:00
CNCF-bot bd7d198e1e Update to a new version [skip ci] 2019-01-30 01:19:31 +00:00
CNCF-bot 07752902f3 Update to a new version [skip ci] 2019-01-30 01:08:17 +00:00
Dan Kohn 1cbf0fbf90
Add Netlify badge 2019-01-29 19:19:32 -05:00
CNCF-bot b25e0a5b72 Update to a new version [skip ci] 2019-01-29 23:08:13 +00:00
CNCF-bot 5376f8a30b Update to a new version [skip ci] 2019-01-29 22:56:08 +00:00
ZeusTheTrueGod 186bb06aba fixing bugs 2019-01-29 22:48:27 +00:00
CNCF-bot cf5c761365 Update to a new version [skip ci] 2019-01-29 22:26:48 +00:00
Andrey Kozlov 9428cfb198 using a hosted version of iframe resizer in a parent window, close #114 (#120)
* using a hosted version of iframe resizer in a parent window

* moving part of an iframe management code to its own javascript file

* a test for an embed mode

* store a single file

* fixes
2019-01-29 17:17:32 -05:00
CNCF-bot d5df13471d Update to a new version [skip ci] 2019-01-29 17:03:29 +00:00
Andrey Kozlov cb394f8bd8 Ignore the category filter for a summary when in a landscape mode, close #115 (#118) 2019-01-29 11:56:27 -05:00
CNCF-bot 9c81809b6b Update to a new version [skip ci] 2019-01-29 03:56:32 +00:00
Dan Kohn 3838617889 Fix embedding example
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-28 22:47:34 -05:00
CNCF-bot b1ecee6df6 Update to a new version [skip ci] 2019-01-28 23:36:46 +00:00
Andrey Kozlov 82fbacc06a default card mode, close #97 (#111)
* first version

* update tests

* allow to specify tabs order from settings.yml

* trigger

* update an example embed.html
2019-01-28 18:30:35 -05:00
CNCF-bot b383992db3 Update to a new version [skip ci] 2019-01-28 16:29:55 +00:00
CNCF-bot 609de9f107 Update to a new version [skip ci] 2019-01-28 15:50:29 +00:00
Andrey Kozlov b4157acc8a fix an embed mode, close #112 (#113) 2019-01-28 10:43:59 -05:00
CNCF-bot 583ea4442e Update to a new version [skip ci] 2019-01-26 22:28:05 +00:00
Andrey Kozlov 0d41750975 updating to the latest svg-autocrop (#110) 2019-01-26 17:18:51 -05:00
CNCF-bot 9293eba9f5 Update to a new version [skip ci] 2019-01-26 21:18:07 +00:00
ZeusTheTrueGod 9d63dc29a4 latest changes to the update server setup 2019-01-26 21:11:26 +00:00
CNCF-bot 383845a08b Update to a new version [skip ci] 2019-01-26 15:59:56 +00:00
Andrey Kozlov 24ea4e3952
add .nvmrc, copy .nvmrc from an upstream to downstreams on daily updates, close #74 (#107) 2019-01-26 15:49:57 +00:00
CNCF-bot ec589362d6 Update to a new version [skip ci] 2019-01-26 12:18:30 +00:00
Andrey Kozlov 4267e186ac Weekly NPM update, #75 (#104) 2019-01-26 07:07:35 -05:00
CNCF-bot 62c16fa823 Update to a new version [skip ci] 2019-01-25 15:19:55 +00:00
Andrey Kozlov f2dc5720d7 fix a flaky test; close #102 (#103) 2019-01-25 10:11:24 -05:00
CNCF-bot b6ef518c18 Update to a new version [skip ci] 2019-01-25 11:06:22 +00:00
Dan Kohn 059dc29f8c Add sitemap to robots.txt
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-25 05:58:54 -05:00
CNCF-bot 8dec3c31e5 Update to a new version [skip ci] 2019-01-24 23:53:11 +00:00
CNCF-bot 99a0f49b0f Update to a new version [skip ci] 2019-01-24 23:35:56 +00:00
Andrey Kozlov 20e443a0cc pass "logo" as a part of a title from the landscapeapp, not as a part of an svg-autocrop module (#96) 2019-01-24 18:28:36 -05:00
CNCF-bot 76b4b255ef Update to a new version [skip ci] 2019-01-24 20:41:08 +00:00
Dan Kohn a32a41d51f More robots fixes
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-24 15:34:05 -05:00
CNCF-bot aab5baa476 Update to a new version [skip ci] 2019-01-24 14:57:58 +00:00
Andrey Kozlov 7f557df384 redirect to home on wrong selected item; closes #86 (#101)
* redirect to / for wrong selected item url, close #86

* just ignore the selected parameter and push the new url

* better handling parameters

* history fix; static images fix

* check url parameters only once, on a first load
2019-01-24 09:51:37 -05:00
CNCF-bot 26d6c46019 Update to a new version [skip ci] 2019-01-24 01:29:05 +00:00
Dan Kohn c2055430f5 Revert "redirect to / for wrong selected item url, close #86 (#98)"
This reverts commit 8d78a897b5.
2019-01-23 18:58:00 -05:00
CNCF-bot 8403b0b6c4 Update to a new version [skip ci] 2019-01-23 22:40:37 +00:00
Andrey Kozlov 8d78a897b5 redirect to / for wrong selected item url, close #86 (#98)
* redirect to / for wrong selected item url, close #86

* just ignore the selected parameter and push the new url

* better handling parameters
2019-01-23 17:34:29 -05:00
CNCF-bot eaded49a19 Update to a new version [skip ci] 2019-01-22 19:21:26 +00:00
Andrey Kozlov 5d52fe348b do not put the error text to the screen, close #84 (#95) 2019-01-22 14:13:35 -05:00
CNCF-bot 30827fb2c1 Update to a new version [skip ci] 2019-01-21 23:21:05 +00:00
Andrey Kozlov c98431ef41 allow to internalize images, close #17 (#93) 2019-01-21 18:15:04 -05:00
CNCF-bot dfdbd67991 Update to a new version [skip ci] 2019-01-21 19:37:19 +00:00
Andrey Kozlov 8645c07165 a partial upgrade to check that nothing is broken (#91)
* a partial upgrade to check that nothing is broken

* a second part of the upgrade
2019-01-21 14:29:27 -05:00
CNCF-bot df4d5a509d Update to a new version [skip ci] 2019-01-20 12:42:40 +00:00
CNCF-bot 120e48ccdf Update to a new version [skip ci] 2019-01-20 12:36:14 +00:00
Dan Kohn f005302f51
Update ISSUE_TEMPLATE.md 2019-01-20 07:30:06 -05:00
Dan Kohn 89d8f4a049
Update ISSUE_TEMPLATE.md 2019-01-20 07:29:51 -05:00
CNCF-bot 79c8b2ce04 Update to a new version [skip ci] 2019-01-18 22:14:51 +00:00
CNCF-bot 7dea886935 Update to a new version [skip ci] 2019-01-18 22:03:04 +00:00
Andrey Kozlov 3cd19f9a8f handle an edge case when there are zero contributors (#89) 2019-01-18 16:53:22 -05:00
Andrey Kozlov 601b726d61 use svg autocrop module, close #15 (#87)
* use our npm package

* removing extra checks

* one more update

* upgrade svg autocrop version

* using a latest svg-autocrop version

* update to the latest version
2019-01-18 16:47:56 -05:00
CNCF-bot 310469f203 Update to a new version [skip ci] 2019-01-17 12:39:32 +00:00
Dan Kohn 9c4c84ec63 Allow favicon in robots.txt
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-17 07:32:18 -05:00
CNCF-bot 325319e279 Update to a new version [skip ci] 2019-01-15 02:46:52 +00:00
Dan Kohn 3539bfaaa5
Get title from settings (#88)
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-14 21:40:00 -05:00
CNCF-bot b2c3c9fea4 Update to a new version [skip ci] 2019-01-13 19:06:32 +00:00
Dan Kohn 3a2295568f
Add Netlify badge 2019-01-13 13:59:40 -05:00
CNCF-bot dff56eedaa Update to a new version [skip ci] 2019-01-13 15:24:51 +00:00
Dan Kohn 91795e3d5f
Update badge 2019-01-13 10:18:15 -05:00
CNCF-bot e9a596c08c Update to a new version [skip ci] 2019-01-13 15:14:54 +00:00
Dan Kohn 9eaea14e00
Add dependency status 2019-01-13 10:08:24 -05:00
CNCF-bot cdbde95525 Update to a new version [skip ci] 2019-01-13 14:01:12 +00:00
Dan Kohn 1b6b76746a Update keywords
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-13 08:50:42 -05:00
CNCF-bot 781ac6c6b4 Update to a new version [skip ci] 2019-01-12 23:42:48 +00:00
Dan Kohn 24619dd5f1
Add npm badge 2019-01-12 18:37:00 -05:00
CNCF-bot c839666b28 Update to a new version [skip ci] 2019-01-12 14:24:04 +00:00
Dan Kohn b2ea8586b5 Allow more files in robots.txt
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-12 09:17:33 -05:00
CNCF-bot 149eef6613 Update to a new version [skip ci] 2019-01-12 13:38:04 +00:00
Dan Kohn bd716d5b67 Allow js and css in robots.txt
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-12 08:31:52 -05:00
CNCF-bot 8cbde49de2 Update to a new version [skip ci] 2019-01-11 21:00:54 +00:00
Dan Kohn 2eab53e900 Adjust robots.txt rules
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-11 15:54:43 -05:00
CNCF-bot c8e346f209 Update to a new version [skip ci] 2019-01-09 04:04:12 +00:00
Dan Kohn 42e2e79189 Switch robots.txt to whitelist; close #82
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-08 22:57:36 -05:00
CNCF-bot 64a817b871 Update to a new version [skip ci] 2019-01-06 22:35:55 +00:00
Andrey Kozlov 8df911ef8d update a sitemap, close #3 (#81)
* update a sitemap

* remove non required license

* add pdfs to the sitemap
2019-01-06 17:30:01 -05:00
CNCF-bot 903c7c9e53 Update to a new version [skip ci] 2019-01-05 17:39:30 +00:00
Dan Kohn 622f4c6fa5 Disallow bestpractices from robots.txt
Signed-off-by: Dan Kohn <dan@dankohn.com>
2019-01-05 12:33:12 -05:00
CNCF-bot 66489e75a6 Update to a new version [skip ci] 2019-01-05 17:20:30 +00:00
Andrey Kozlov cf462a61cd fixing googlebot rendering (#76)
* try if it renders properly

* force a build

* return back exclude

* speed up a debug build and validate search console

* trying to verify

* update robots

* wip

* check if that is an optimization

* attempt to explicitly specify chrome 41

* and one more attempt

* a simple debugger

* test if this works or not

* one more attempt to get it working

* almost done

* add errors only when it is a google bot

* prepare to merge
2019-01-05 12:14:40 -05:00
CNCF-bot d67ae434b0 Update to a new version [skip ci] 2019-01-04 17:16:31 +00:00
CNCF-bot 17c495f518 Update to a new version [skip ci] 2019-01-04 16:24:06 +00:00
CNCF-bot b0fd649bef Update to a new version [skip ci] 2019-01-04 15:59:11 +00:00
Andrey Kozlov 6e84553968 forgot to store a hash (#78) 2019-01-04 10:43:23 -05:00
CNCF-bot be1eee385f Update to a new version [skip ci] 2019-01-03 19:13:27 +00:00
Dan Kohn 7cdd96995c
Add best practices badge 2019-01-03 13:59:48 -05:00
Dan Kohn 7b16c0ed1b
Update PULL_REQUEST_TEMPLATE.md 2019-01-03 13:57:48 -05:00
CNCF-bot 1fbcf137c0 Update to a new version [skip ci] 2019-01-03 16:11:05 +00:00
CNCF-bot 53c32ba945 Update to a new version [skip ci] 2019-01-02 20:42:07 +00:00
ZeusTheTrueGod 9f59f726fb use a read only remote to fetch data for the funding history 2019-01-02 20:21:52 +00:00
ZeusTheTrueGod 7e3dd29383 check if chrome 41 support helps 2019-01-02 19:26:24 +00:00
CNCF-bot 87755f8760 Update to a new version [skip ci] 2019-01-02 16:54:18 +00:00
ZeusTheTrueGod 237bbe374f urgent fix to ensure that landscape elements are filtered properly 2019-01-02 16:47:11 +00:00
CNCF-bot 3747f8b999 Update to a new version [skip ci] 2019-01-01 21:28:32 +00:00
Andrey Kozlov 7dd3bb44fa 66 fix redux updates (#70)
* disallow robots

* a small fix

* add a user agent line first

* two lines instead of one

* check why everything updates

* fix, but with a workaround

* wip

* do not rerender presets every time

* a final fix
2019-01-01 16:21:09 -05:00
CNCF-bot 9ac84eac63 Update to a new version [skip ci] 2018-12-29 22:08:24 +00:00
Andrey Kozlov 859c159054
64 disallow robots (#69)
* disallow robots

* a small fix

* add a user agent line first

* two lines instead of one
2018-12-29 22:02:12 +00:00
CNCF-bot 7c94fbfc47 Update to a new version [skip ci] 2018-12-29 21:33:12 +00:00
Andrey Kozlov 7274170ab4 disallow robots, close #64 (#68)
* disallow robots

* a small fix

* add a user agent line first
2018-12-29 16:26:42 -05:00
CNCF-bot c07b4b3d94 Update to a new version [skip ci] 2018-12-28 20:55:54 +00:00
Andrey Kozlov 99e27d08a9 better relative paths, close #65 (#67)
* better relative paths

* update specs
2018-12-28 15:49:45 -05:00
CNCF-bot c298e591df Update to a new version [skip ci] 2018-12-27 17:15:59 +00:00
ZeusTheTrueGod 1dc71fcf6b typo 2018-12-27 17:07:50 +00:00
CNCF-bot f32516f983 Update to a new version [skip ci] 2018-12-27 13:26:21 +00:00
Andrey Kozlov 85c96f1580
59 fix relative url (#61)
* fix relative urls, close #59

* more relative urls
2018-12-27 13:19:07 +00:00
CNCF-bot 1d86fe8a63 Update to a new version [skip ci] 2018-12-27 13:18:26 +00:00
Andrey Kozlov c2dc2dc947 fix relative urls, close #59 (#60) 2018-12-27 08:11:08 -05:00
CNCF-bot 71371298ba Update to a new version [skip ci] 2018-12-26 19:32:43 +00:00
ZeusTheTrueGod b5c2921387 and one more fix for an update server 2018-12-26 19:25:43 +00:00
CNCF-bot 244d873d7a Update to a new version [skip ci] 2018-12-26 19:15:28 +00:00
ZeusTheTrueGod e117dc6215 one more fix for an update server 2018-12-26 19:06:54 +00:00
Andrey Kozlov 475d4b2f1e Close #41 yarn upgrade (#51)
* Revert "Revert "all packages have been updated""

This reverts commit 9867beba7d.

* test

* wip: switch to connected-react-router

* partial upgrade, 5.0.1 for connected-react-router

* a bit more updates

* wip

* make everything working properly with the latest connected-react-router

* kill old ci servers

* remove >1%

* wip

* final config changes

* more progress

* small fix to prevent an endless loop in a router

* this should fail quickly on netlify servers

* return back the bundle optimization

* final fixes
2018-12-26 13:58:45 -05:00
ZeusTheTrueGod 1200b3d796 typo 2018-12-26 18:52:45 +00:00
CNCF-bot 403b5a60f4 Update to a new version [skip ci] 2018-12-25 11:40:44 +00:00
ZeusTheTrueGod b062cfa84b fix for puppeteer args 2018-12-25 11:30:42 +00:00
ZeusTheTrueGod 10be41b3df stop CI server from a previous run 2018-12-25 11:27:46 +00:00
CNCF-bot f15d890dfc Update to a new version [skip ci] 2018-12-25 06:39:35 +00:00
ZeusTheTrueGod 9d6cb8be6d accidentely removed yarn build 2018-12-25 06:33:16 +00:00
CNCF-bot fb40ae08ab Update to a new version [skip ci] 2018-12-25 03:53:40 +00:00
Dan Kohn b36ba23037
Fix URL 2018-12-24 22:42:37 -05:00
Dan Kohn 20a2bb0375
Small improvements 2018-12-24 22:41:30 -05:00
CNCF-bot 7363457c38 Update to a new version [skip ci] 2018-12-24 11:10:06 +00:00
Andrey Kozlov 909695d83a ensure that active preset is highlighted, close #55 (#57)
* ensure that active preset is highlighted, close #55

* fix
2018-12-24 06:04:25 -05:00
CNCF-bot c8f76cac53 Update to a new version [skip ci] 2018-12-23 20:50:37 +00:00
Andrey Kozlov 7367af5d72 rename cncf/lfdl to project and landscape to the category in url parameters, close #4 (#54)
* rename cncf/lfdl to project and landscape to the category in url parameters

* update robots
2018-12-23 15:44:49 -05:00
CNCF-bot 6c54e3fdcc Update to a new version [skip ci] 2018-12-23 19:13:33 +00:00
ZeusTheTrueGod a0e06c55d9 Remove need of ./hosted_logos, close #48 2018-12-23 19:06:53 +00:00
CNCF-bot 4c61916fea Update to a new version [skip ci] 2018-12-23 16:53:09 +00:00
ZeusTheTrueGod 7b99e62879 use node 11.x on update servers, close #5 2018-12-23 16:46:48 +00:00
CNCF-bot 857afffc16 Update to a new version [skip ci] 2018-12-23 16:38:28 +00:00
ZeusTheTrueGod 627adcd57a use info@cncf.io as an email for a cncf-bot 2018-12-23 16:32:32 +00:00
CNCF-bot 0cdc1e25d5 Update to a new version [skip ci] 2018-12-23 14:23:01 +00:00
Andrey Kozlov 437abac28d sort members.yml on yarn remove-quotes, close #47 2018-12-23 06:17:20 -08:00
CNCF-bot e7cb6ec945 Update to a new version [skip ci] 2018-12-23 13:34:04 +00:00
ZeusTheTrueGod c4a9f1c216 remove extra debug messages, close #49 2018-12-23 13:25:00 +00:00
ZeusTheTrueGod addc1a3876 one more fix for an update server setup 2018-12-23 13:20:11 +00:00
CNCF-bot d1b593c1b1 Update to a new version [skip ci] 2018-12-23 13:02:20 +00:00
ZeusTheTrueGod fcfaab25bf typo: yarn update => yarn upgrade 2018-12-23 12:55:41 +00:00
CNCF-bot cd319a3f36 Update to a new version [skip ci] 2018-12-23 04:01:07 +00:00
Dan Kohn 7dea389dc6
Update description 2018-12-22 22:55:25 -05:00
CNCF-bot e165464a59 Update to a new version [skip ci] 2018-12-22 18:53:15 +00:00
ZeusTheTrueGod 9d508d6837 test 2018-12-22 18:46:13 +00:00
ZeusTheTrueGod 6c84caa945 update yarn open:dist 2018-12-22 09:03:22 +00:00
CNCF-bot 858a09475d Update to a new version [skip ci] 2018-12-22 08:53:12 +00:00
ZeusTheTrueGod 9867beba7d Revert "all packages have been updated"
This reverts commit 56484c75e5.
2018-12-22 08:46:55 +00:00
ZeusTheTrueGod 56484c75e5 all packages have been updated 2018-12-22 07:31:25 +00:00
CNCF-bot 3cc323f877 Update to a new version [skip ci] 2018-12-21 20:17:04 +00:00
Dan Kohn ed6f180b9c
Merge pull request #50 from cncf/46-footer-from-settings
take footer text from the settings.yml, close #46
2018-12-21 12:03:36 -08:00
ZeusTheTrueGod ef1a3b6c74 take footer text from the settings.yml, close #46 2018-12-21 19:24:07 +00:00
ZeusTheTrueGod a2cc207e1f remove non required debug messages 2018-12-21 19:17:05 +00:00
CNCF-bot d782aecf68 Update to a new version [skip ci] 2018-12-21 18:29:48 +00:00
Dan Kohn ab7bc4ed86 Update Readme
Signed-off-by: Dan Kohn <dan@dankohn.com>
2018-12-21 12:05:58 -05:00
Dan Kohn a4a40c77c8 Change Bot name
Signed-off-by: Dan Kohn <dan@dankohn.com>
2018-12-21 11:10:22 -05:00
ZeusTheTrueGod 76d89541f0 update webpack.config.dev.js 2018-12-21 15:58:01 +00:00
Netlify Publisher ab4e91c7ef Update to a new version [skip ci] 2018-12-21 09:50:54 +00:00
Andrey Kozlov 7a88ae8582
check categories in settings.yml, close #42 (#43)
* guarantee that we do not allow improper categories in settings.yml, close #42

* check only a main landscape

* add a dynamic test of a big picture

* update a test
2018-12-21 09:44:14 +00:00
Netlify Publisher f5b4d17dbe Update to a new version [skip ci] 2018-12-20 21:52:43 +00:00
Dan Kohn f73edef48e
Merge pull request #40 from cncf/6-sort-keys
reorder keys in settings.yml, close #6
2018-12-20 13:41:42 -08:00
Dan Kohn 9122049ae6
Merge pull request #38 from cncf/32-favicon-to-funding
adding a favicon to funding, close #32
2018-12-20 13:40:00 -08:00
ZeusTheTrueGod 3f675e1a43 reorder keys in settings.yml, close #6 2018-12-20 21:33:14 +00:00
ZeusTheTrueGod fd4b8fd7c2 adding a favicon to funding, close #32 2018-12-20 19:41:32 +00:00
Netlify Publisher 93fb39b643 Update to a new version [skip ci] 2018-12-20 18:24:42 +00:00
ZeusTheTrueGod 8464154a6e trigger builds of children projects 2018-12-20 18:17:10 +00:00
ZeusTheTrueGod 20585dbe45 update the repo info 2018-12-20 18:17:10 +00:00
Netlify Publisher 577d16aaf3 Update to a new version [skip ci] 2018-12-20 17:33:30 +00:00
ZeusTheTrueGod 5ec13fb3be change the minimum width to 80 instead of 100 for a subcategory 2018-12-20 17:25:44 +00:00
Netlify Publisher 0ca5fd8e14 Update to a new version [skip ci] 2018-12-20 13:00:24 +00:00
Dan Kohn 856f018c0b Disallow version in robots.txt
Signed-off-by: Dan Kohn <dan@dankohn.com>
2018-12-20 07:53:49 -05:00
Netlify Publisher 42ee7bce44 Update to a new version [skip ci] 2018-12-20 06:09:03 +00:00
ZeusTheTrueGod 0773bbefe9 swtich all apps to the master branch 2018-12-20 06:02:18 +00:00
Netlify Publisher 9a82eda500 Update to a new version [skip ci] 2018-12-20 05:50:23 +00:00
Andrey Kozlov cc7e704232
testing the branch(it should not autopublish) (#34) 2018-12-20 05:45:17 +00:00
Netlify Publisher 910c63ea95 Update to a new version [skip ci] 2018-12-19 21:19:53 +00:00
ZeusTheTrueGod e65e608d7b use a master branch for cncf 2018-12-19 21:14:17 +00:00
Netlify Publisher 1cebd7cd18 Update to a new version [skip ci] 2018-12-19 19:54:22 +00:00
ZeusTheTrueGod b2756d7d05 force push tags after normal push of a master branc 2018-12-19 19:47:37 +00:00
Netlify Publisher 3a636b3282 Update to a new version [skip ci] 2018-12-19 19:42:52 +00:00
ZeusTheTrueGod 77098bc887 force push tags 2018-12-19 19:35:36 +00:00
Netlify Publisher db170cacb0 Update to a new version [skip ci] 2018-12-19 18:06:46 +00:00
ZeusTheTrueGod 7226658183 get rid of extra config 2018-12-19 17:55:41 +00:00
ZeusTheTrueGod 5dcfae1646 update jest config 2018-12-19 17:54:25 +00:00
Netlify Publisher 2f986a4f6e Update to a new version [skip ci] 2018-12-19 16:23:07 +00:00
ZeusTheTrueGod 24b574dd53 reference typeface roboto as a node module 2018-12-19 16:16:57 +00:00
Netlify Publisher 0e08a4ea8a Update to a new version [skip ci] 2018-12-19 15:28:32 +00:00
ZeusTheTrueGod 46e1856381 resolve to project node_modules first, because modules are flattened 2018-12-19 15:22:36 +00:00
Netlify Publisher c44943c06d Update to a new version [skip ci] 2018-12-19 13:22:34 +00:00
Dan Kohn 14192dff5b Disallow zoom in robots.txt
Signed-off-by: Dan Kohn <dan@dankohn.com>
2018-12-19 08:16:54 -05:00
Netlify Publisher c44f69f9a3 Update to a new version [skip ci] 2018-12-19 06:34:09 +00:00
ZeusTheTrueGod 3c0ed76b4d do not exclude interactive landscape node module 2018-12-19 06:27:41 +00:00
Netlify Publisher 8034a369d4 Update to a new version [skip ci] 2018-12-19 03:54:05 +00:00
Dan Kohn 4c7ef8aa7c Robots.txt disallow funding.html
Signed-off-by: Dan Kohn <dan@dankohn.com>
2018-12-18 22:47:55 -05:00
Netlify Publisher 06e8d6e517 Update to a new version [skip ci] 2018-12-18 21:15:53 +00:00
293 changed files with 36271 additions and 19690 deletions

View File

@ -1,3 +0,0 @@
{
"presets": [ ["babel-preset-latest-node", {target: 10}] ]
}

1
.eslintignore Normal file
View File

@ -0,0 +1 @@
netlify/jsyaml.js

19
.eslintrc.js Normal file
View File

@ -0,0 +1,19 @@
module.exports = {
"extends": "eslint:recommended",
"root": true,
"env": {
"browser": true,
"commonjs": true,
"es2021": true,
"node": true
},
"parserOptions": {
"ecmaVersion": "latest"
},
"rules": {
"no-useless-escape": 0,
"no-prototype-builtins": 0,
"no-empty": 0,
"no-control-regex": 0
}
}

View File

@ -1,3 +1,5 @@
### Don't create an issue
### This is the upstream landscapeapp
If you see an error in the cards or missing ones, please don't create an issue here. Instead, edit landscape.yml (you can even do it via the GitHub web interface) and open a pull request. Then, review the preview staging server that's posted to your pull request and add a comment if your new or updated card looks correct and is ready to merge. Before going forward, please carefully review the sections of the Readme covering new entries, corrections, and logos: https://github.com/cncf/landscape/blob/master/README.md.
If you want to modify the content in the CNCF or LFAI landscapes, please make changes to those downstream repos:
* https://github.com/cncf/landscape
* https://github.com/lfai/lfai-landscape

View File

@ -1,13 +0,0 @@
### Pre-submission checklist:
*Please check each of these after submitting your pull request:*
* [ ] Are you only including a `repo_url` if your project is 100% open source? If so, you need to pick the single best GitHub repository for your project, not a GitHub organization.
* [ ] Is your project closed source or, if it is open source, does your project have at least 250 GitHub stars?
* [ ] Have you picked the single best (existing) category for your project?
* [ ] Does it follow the other guidelines from the [new entries](https://github.com/cncf/landscape#new-entries) section?
* [ ] Have you included a URL for your SVG or added it to `hosted_logos` and referenced it there?
* [ ] Does your logo clearly state the name of the project/product and follow the other logo [guidelines](https://github.com/cncf/landscape#logos)?
* [ ] Does your project/product name match the text on the logo?
* [ ] Have you verified that the Crunchbase data for your organization is correct (including headquarters and LinkedIn)?
* [ ] ~10 minutes after opening the pull request, the CNCF-Bot will post the URL for your staging server. Have you confirmed that it looks good to you and then added a comment to the PR saying "LGTM"?

14
.gitignore vendored
View File

@ -28,6 +28,8 @@ node_modules
#dist folder
dist
public
# IDEA/Webstorm project files
.idea
*.iml
@ -39,4 +41,14 @@ dist
.DS_Store
/cncf
/lfdl
/lfai
# Yarn, without .pnp.js
.yarn/*
!.yarn/releases
!.yarn/plugins
.pnp.*
.next
out
tmp

1
.nvmrc Normal file
View File

@ -0,0 +1 @@
v18.3

786
.yarn/releases/yarn-3.2.1.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
network-timeout 600000

3
.yarnrc.yml Normal file
View File

@ -0,0 +1,3 @@
enableProgressBars: false
yarnPath: .yarn/releases/yarn-3.2.1.cjs

23
ADOPTERS.md Normal file
View File

@ -0,0 +1,23 @@
## Cloud Native Landscape
[![Cloud Native Landscape](https://landscape.cncf.io/images/landscape.png)](https://landscape.cncf.io/images/landscape.png)
## Serverless Landscape
[![CNCF Serverless Landscape](https://landscape.cncf.io/images/serverless.png)](https://landscape.cncf.io/images/serverless.png)
## CNCF Member Landscape
[![CNCF Member Landscape](https://landscape.cncf.io/images/members.png)](https://landscape.cncf.io/images/members.png)
## LF Artificial Intelligence Landscape
[![LF Artificial Intelligence Landscape](https://landscape.lfai.foundation/images/landscape.png)](https://landscape.lfai.foundation/images/landscape.png)
## ASWF Landscape
[![ASWF Landscape](https://landscape.aswf.io/images/landscape.png)](https://landscape.aswf.io/images/landscape.png)
## Open Mainframe Landscape
[![Open Mainframe Landscape](https://landscape.openmainframeproject.org/images/landscape.png)](https://landscape.openmainframeproject.org/images/landscape.png)

View File

@ -2,28 +2,21 @@
## Install on Mac
1. Install [Homebrew](https://brew.sh/)
2. `brew install node yarn`
2. `brew install node`
3. `git clone git@github.com:cncf/landscape.git`
## Install on Linux
1. `git clone git@github.com:cncf/landscape.git`
2. Please follow [this script](https://github.com/cncf/landscape/blob/master/update_server/setup.bash) to install correct versions of `yarn`, `nodejs` and other packages on Linux.
2. Please follow [this script](https://github.com/cncf/landscapeapp/blob/HEAD/update_server/setup.bash) to install correct versions of `nodejs` and other packages on Linux.
## Local development
1. `git pull`
2. `yarn` (installs dependencies)
* `yarn open:src` (starts a development server) or
* `yarn build`, then `yarn open:dist` (compiles and opens a production build)
## Review build details
1. `yarn build`
1. `open dist/report.html`
Please follow the [directions](https://github.com/cncf/landscapeapp#installing-locally) to setup aliases for running your landscape.
## Updating data
After making your changes to `landscape.yml`, run `yarn fetch` to fetch any needed data and generate [processed_landscape.yml](processed_landscape.yml) and [data.json](https://github.com/cncf/landscape/blob/master/src/data.json).
After making your changes to `landscape.yml`, run `npm run fetch` to fetch any needed data and generate [processed_landscape.yml](https://github.com/cncf/landscape/blob/HEAD/processed_landscape.yml) and [data/items.json](https://landscape.cncf.io/data/items.json).
`yarn fetch` runs in 4 modes of increasingly aggressive downloading, with a default to easy. Reading data from the cache (meaning from processed_landscape.yml) means that no new data is fetched if the project/product already exists. The modes are:
`npm run fetch` runs in 4 modes of increasingly aggressive downloading, with a default to easy. Reading data from the cache (meaning from processed_landscape.yml) means that no new data is fetched if the project/product already exists. The modes are:
| Data cached | easy | medium | hard | complete |
|------------------------|--------|----------|--------|------------|
@ -37,9 +30,9 @@ After making your changes to `landscape.yml`, run `yarn fetch` to fetch any need
* **Hard** also fetches GitHub start dates. These should not change so this should not be necessary.
* **Complete** also re-fetches all images. This is problematic because images tend to become unavailable (404) over time, even though the local cache is fine.
Easy mode (the default) is what you should use if you update `landscape.yml` and want to see the results locally. The Netlify build server runs easy mode, which makes it possible to just commit a change to landscape.yml and have the results reflected in production. Run with `yarn fetch`.
Easy mode (the default) is what you should use if you update `landscape.yml` and want to see the results locally. The Netlify build server runs easy mode, which makes it possible to just commit a change to landscape.yml and have the results reflected in production. Run with `npm run fetch`.
Medium mode is what is run by the update server, with commits back to the repo. It needs to be run regularly to update last commit date, stars, and Crunchbase info. Run with `yarn update`.
Medium mode is what is run by the update server, with commits back to the repo. It needs to be run regularly to update last commit date, stars, and Crunchbase info. Run with `npm run update`.
Hard and complete modes should be unnecessary except in cases of possible data corruption. Even then, it's better to just delete any problematic entries from `processed_landscape.yml` and easy mode will recreate them with up-to-date information.
@ -50,6 +43,6 @@ If you can't find the right logo on the web, you can create a custom one and hos
1. Save the logo to `src/hosted_logos/`, for example, `src/hosted_logos/apex.svg`. Use lowercase spinal case (i.e., hyphens) for the name.
1. Update landscape.yml, for example, `logo: ./src/hosted_logos/apex.svg`. The location must start with`./src/hosted_logos`.
1. If you've updated the local logo since a previous commit, you need to delete the cached version in `src/logos/`. E.g., delete `src/logos/apex.svg`.
1. Update `processed_landscape.yml` with `yarn fetch`.
1. Update `processed_landscape.yml` with `npm run fetch`.
1. Commit and push. Double-check your work in the Netlify preview after opening a pull request.

383
README.md
View File

@ -1,5 +1,380 @@
Landscape App
# Landscapeapp
Local Development: every script and webpack thinks that project specific data is
stored in a $PROJECT_PATH variable, thus use that command for a development
export PROJECT_PATH=/Users/user/Documents/cncf
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/2434/badge)](https://bestpractices.coreinfrastructure.org/projects/2434) [![npm version](https://img.shields.io/npm/v/interactive-landscape.svg)](https://www.npmjs.com/package/interactive-landscape) [![Dependency Status](https://img.shields.io/david/cncf/landscapeapp.svg?style=flat-square)](https://david-dm.org/cncf/landscapeapp) [![Netlify Status](https://api.netlify.com/api/v1/badges/50d760a8-5b21-4319-aa01-2ad54e453fd6/deploy-status)](https://app.netlify.com/sites/landscapeapp/deploys)
- [Adding and managing landscape entries](#adding-and-managing-landscape-entries)
- [Logos](#logos)
- [SVGs Can't Include Text](#svgs-cant-include-text)
- [CloudConvert](#cloudconvert)
- [Adobe Illustrator](#adobe-illustrator)
- [Inkscape](#inkscape)
- [Crunchbase Requirement](#crunchbase-requirement)
- [External Data](#external-data)
- [Creating a New Landscape](#creating-a-new-landscape)
- [API Keys](#api-keys)
- [Installing Locally](#installing-locally)
- [Adding to a google search console](#adding-to-a-google-search-console)
- [Vulnerability reporting](#vulnerability-reporting)
- [Continuous Integration and NPM Publishing](#continuous-integration-and-npm-publishing)
- [Building an individual landscape](#building-an-individual-landscape)
- [Running "remotely" on our build server (fast and by default)](#running-remotely-on-our-build-server-fast-and-by-default)
- [Running "locally" on Netlify instances (if the remote server is broken)](#running-locally-on-netlify-instances-if-the-remote-server-is-broken)
- [Building this repo, `landscapeapp` on a Netlify](#building-this-repo-landscapeapp-on-a-netlify)
- [Setting up our build server to speed up Netlify builds](#setting-up-our-build-server-to-speed-up-netlify-builds)
- [Keeping Project Up to Date](#keeping-project-up-to-date)
- [Embed landscape in a web site](#embed-landscape-in-a-web-site)
- [Generating a Guide](#generating-a-guide)
The landscapeapp is an upstream NPM [module](https://www.npmjs.com/package/interactive-landscape) that supports building interactive landscape websites such as the [CNCF Cloud Native Landscape](https://landscape.cncf.io) ([source](https://github.com/cncf/landscape)) and the [LF Artificial Intelligence Landscape](https://landscape.lfai.foundation) ([source](https://github.com/lfai/lfai-landscape)). The application is under active development by [Andrey Kozlov](https://github.com/AndreyKozlov1984) and [Jordi Noguera](https://jordinl.com).
In addition to creating fully interactive sites, the landscapeapp builds static images on each update. See examples in [ADOPTERS.md](ADOPTERS.md). All current [Linux Foundation](https://linuxfoundation.org) landscapes are listed in [landscapes.yml](landscapes.yml).
## Adding and managing landscape entries
When creating new entries, the only 4 required fields are `name`, `homepage_url`, `logo`, and `crunchbase`.
```yaml
- item:
name: <entry name>
homepage_url: <website for entry>
# filename in hosted_logos folder. Put the svg file into the hosted_logos
folder and reference its name.
logo: <logo for entry>
crunchbase: <twitter for entry>
```
Additional keys that can be set are defined below:
```yaml
# url for the Twitter account; Only add if the value in Crunchbase is incorrect
twitter:
# url to the repo for the project; will fetch stats if it starts with https://github.com/. If you add a `repo_url` the card will be white instead of grey.
repo_url:
# url to the GitHub organization for the project; when using `repo_url`, `project_org` can be set pointing to an organization on GitHub, this will have the effect of pulling the information for all the repos belonging to that organization but using `repo_url` for information regarding license and best practices.
project_org:
# additional repos for the project; will fetch stats if they start with https://github.com/
additional_repos:
# Stock Ticker for the organization of the project/entry; normally pulls from Crunchbase but can be overridden here. For delisted and many foreign countries, you'll need to add `stock_ticker` with the value to look up on Yahoo Finance to find the market cap.
stock_ticker:
# description of the entry; if not set pulls from the GitHub repo description
description:
# default branch to reference if not the main one for the repo
branch:
# if the entry is a project hosted by the project, let's you set the maturity level. Should be a value in relations.values.children.id in settings.yml
project:
# url for the CII Best Practices entry if it's not directly mapped to the repo_url
url_for_bestpractices:
# set to false if a repo_url is given but the entry is a project that isn't open source
open_source:
# allows multiple entries with the same repo_url; set for each instance
allow_duplicate_repo:
# set to true if you are using an anonymous organization. You will also need anonymous_organization set in settings.yml
unnamed_organization:
```
For some of the key, there is some guidance as listed below.
### Logos
The most challenging part of creating a new landscape is finding SVG images for all projects and companies. These landscapes represent a valuable resource to a community in assembling all related projects, creating a taxonomy, and providing up-to-date logos, and unfortunately, there are no shortcuts.
Do *not* try to convert PNGs to SVGs. You can't automatically go from a low-res to a high-res format, and you'll just waste time and come up with a substandard result. Instead, invest your time finding SVGs and then (when necessary) having a graphic designer recreate images when high res ones are not available.
Tips for finding high quality images:
- Google images is often the best way to find a good version of the logo (but ensure it's the up-to-date version). Search for [grpc logo filetype:svg](https://www.google.com/search?q=grpc+logo&tbs=ift:svg,imgo:1&tbm=isch) but substitute your project or product name for grpc.
- Wikipedia also is a good source for high quality logos ( search in either the main [Wikipedia](https://en.wikipedia.org/w/index.php?sort=relevance&search=svg&title=Special%3ASearch&profile=advanced&fulltext=1&advancedSearch-current=%7B%7D&ns6=1) or [Wikipedia Commons](https://commons.wikimedia.org/w/index.php?sort=relevance&search=svg&title=Special%3ASearch&profile=advanced&fulltext=1&advancedSearch-current=%7B%7D&ns0=1&ns6=1&ns12=1&ns14=1&ns100=1&ns106=1) ).
- VectorLogoZone ( https://www.vectorlogo.zone/ )
- Also search for 'svg' in the GitHub for the project, as sometimes projects will embed them there.
For new landscapes of any size, you will probably need a graphic artist to rebuild some of the logos for you.
If the project is hosted/sponsored by an organization but doesn't have a logo, best practice is to use that organization's logo with the title of the project underneath ( [example](https://landscape.cncf.io/selected=netflix-eureka) ). You can use a tool such as [Inkscape](https://inkscape.org/) to add the text.
If you get an error with the image that it has a PNG embedded, you will need to find a different SVG that doesn't include a PNG or work with a graphic artist to rebuild the logo.
#### SVGs Can't Include Text
SVGs need to not rely on external fonts so that they will render correctly in any web browser, whether or not the correct fonts are installed. That means that all embedded text and tspan elements need to be converted to objects. Use of SVGs with embedded text will fail with an error. You can convert the SVGs as using one of the tools below.
##### CloudConvert
1. Go to https://cloudconvert.com/, and click 'Select File' and select the SVG file.
2. Next to 'Convert to', click the dropdown and select 'SVG'
3. There will be wrench icon that appears. Click that.
4. For the option 'Text To Path', select 'Yes' and then click 'Okay'
5. Click 'Convert' to do the conversion and the download the converted file.
##### Adobe Illustrator
1. Select all text
1. With the text selected, go to Object > Expand in the top menu
1. Export file by going to File > Export > Export As in top menu
1. Select SVG from the format drop down and make sure that "Use Artboards" is checked
1. This will open a SVG options box, make sure to set Decimal to 5 (that is the highest possible, so to ensure that sufficient detail is preserved)
1. Click Okay to export
##### Inkscape
1. Select the text
1. Ctrl+K (path combine)
1. Ctrl+J (dynamic offset)
1. Save
### Crunchbase Requirement
We require all landscape entries to include a [Crunchbase](https://www.crunchbase.com/) url. We use the Crunchbase API to fetch the backing organization and headquarters location and (if they exist), Twitter, LinkedIn, funding, parent organization, and stock ticker. For open source, non-affiliated projects, we will just create a nonprofit organization representing the project (if one doesn't already exist), and set the location to the lead developer.
Using an external source for this info saves effort in most cases, because most organizations are already listed. Going forward, the data is being independently maintained and updated over time.
If for certain reason Crunchbase should not be used - we rely on `organization: { name: 'My Organization Name' }` instead of a `crunchbase` field
#### Overriding industries from Crunchbase
To override industries returned from Crunchbase for a specific Crunchbase entry, add it to an `crunchbase_overrides` top-level entry on `landscape.yml`. For instance, the following will set `industries` for Linux Foundation to Linux and Cloud Computing:
```yaml
crunchbase_overrides:
https://www.crunchbase.com/organization/linux-foundation:
industries:
- Linux
- Cloud Computing
```
`crunchbase_overrides` must be a top-level key on `landscape.yml`, so it should be a sibling of `landscape`. That's to prevent having to override multiple items that share the same Crunchbase URL.
## External Data
The canonical source for all data is `landscape.yml`. Once a day, the landscapeapp update_server pulls data for projects and companies from the following sources:
* Project info from GitHub
* Funding info from [Crunchbase](https://www.crunchbase.com/)
* Market cap data from Yahoo Finance
* CII Best Practices Badge [data](https://bestpractices.coreinfrastructure.org/)
The update server enhances the source data with the fetched data and saves the result in `processed_landscape.yml` and as `data.json`, the latter of which is what the app loads to display data.
## Creating a New Landscape
If you want to create an interactive landscape for your project or organization:
1. Note ahead of time that the hardest part of building a landscape is getting hi-res images for every project. You *cannot* convert from a PNG or JPEG into an SVG. You need to get an SVG, AI, or EPS file. When those aren't available, you will need a graphic designer to recreate several images. Don't just use an auto-tracer to try to convert PNG to SVG because there is some artistry involved in making it look good. Please review this [primer](https://www.cncf.io/blog/2019/07/17/what-image-formats-should-you-be-using-in-2019/) on image formats.
2. Create a repo `youracronym-landscape` so it's distinct from other landscapes stored in the same directory. From inside your new directory, copy over files from a simpler landscape like https://github.com/graphql/graphql-landscape with `cp -r ../graphql-landscape/* ../graphql-landscape/.github ../graphql-landscape/.gitignore ../graphql-landscape/.npmrc ../graphql-landscape/.nvmrc .`.
3. If you're working with the [LF](https://www.linuxfoundation.org/), give admin privileges to the new repo to [dankohn](https://github.com/dankohn) and write privileges to [AndreyKozlov1984](https://github.com/AndreyKozlov1984), [jordinl83](https://github.com/jordinl83), and [CNCF-Bot](https://github.com/CNCF-Bot) and ping Dan after creating an account at [slack.cncf.io](https://slack.cncf.io). Alex Contini and Dan are available there to help you recreate SVGs based on a PNG of the company's logo, if necessary, and to fix other problems.
4. Set the repo to only support merge commits and turn off DCO support, since it doesn't work well with the GitHub web interface:
![image](https://user-images.githubusercontent.com/3083270/66166276-dd62ad00-e604-11e9-87db-fd9ae7a80d1a.png)
5. Edit `settings.yml` and `landscape.yml` for your topic.
6. [Generate](https://www.qrcode-monkey.com) a QR code, setting colors to black. Save as SVG and overwrite images/qr.svg.
7. Run `y reset-tweet-count` to start the count of tweets mentioning your landscape at zero.
8. Edit [landscapes.yml](landscapes.yml) to add your project.
### API Keys
You want to add the following to your `~/.bash_profile`. If you're with the LF, ask someone on CNCF [Slack](https://slack.cncf.io) for the Crunchbase and Twitter keys.
For the GitHub key, please go to https://github.com/settings/tokens and create a key (you can call it `personal landscape`) with *no* permissions. That is, don't click any checkboxes, because you only need to access public repos.
```sh
export CRUNCHBASE_KEY_4="key-here"
export TWITTER_KEYS=keys-here
export GITHUB_KEY=key-here
```
### Installing Locally
You can administer a landscape without ever needing to install the software locally. However, a local install is helpful for rapid development, as it reduces the 5 minute build time on Netlify to 10 seconds or less locally. In particular, you want a local install when you're reconfiguring the layout. We recommend installing one or more landscapes as sibling directories to the landscapeapp. Then, you want to install the npm modules for landscapeapp but not for any of the landscapes. Here are the [install](INSTALL.md) directions.
So, if you're in a directory called `dev`, you would do:
```sh
dev$ git clone git@github.com:cncf/landscapeapp.git
dev$ git clone git@github.com:cdfoundation/cdf-landscape.git
dev$ cd landscapeapp
dev$ npm install -g yarn@latest
dev$ yarn
```
### Adding to a google search console
Go to the google search console, add a new property, enter the url of the
given project, for example, https://landscape.cncf.io
Next, google will want to verify that it is your site, thus you need to choose
an `html tag verification` option and copy a secret code from it and put it to
the `settings.yml` of a given landscape project. Then commit the change to the default branch and
wait till Netlify deploys the default branch. The key is named `google_site_veryfication` and it is
somewhere around line 14 in settings.yml. After netlify successfully deploys
that dashboard, verify the html tag in a google console. Do not forget to add
Dan@linuxfoundation.org as someone who has a full access from a `Settings`
menu for a given search console.
## Vulnerability reporting
Please open an [issue](https://github.com/cncf/landscapeapp/issues/new) or, for sensitive information, email info@cncf.io.
## Continuous Integration and NPM Publishing
We have a sophisticated build system.
We build this landscapeapp repo together with every landscape after each commit
to the landscapeapp. A list of landscapes is stored in the landscapes.yml
An individual landscape is built on a PR to that landscape.
Details about building a repo on netlify:
### Building an individual landscape
To build an individual landscape, we use Netlify. Netlify has certain
issues with the performance and their caching algorithm is ineffective, thus in
order to produce the fastest build, these steps are done
Note, that script `netlify/landscape.js` from THIS repo is used to run an
individual build on every landscape.
A file netlify.toml specifies which commands are used and how to make a build.
We start from the `netlify` folder and then download the landscape.js script from the default branch
of a landscapeapp repo and then run a `node netlify/landscape.js`
script because otherwise, Netlify will run an unnecessary `npm install`
In order to make a build as fast as possible, we designed a way to run it on our
own build server. The problem is that Netlify uses very slow and cheap amazon
virtual machines, while our build server has a lot of CPUs and enough of RAM, that
allows further parallelization during build steps.
#### Running "remotely" on our build server (fast and by default)
When an environment variable BUILD_SERVER is set, the following steps will occur:
- the interactive-landscape package of the latest version is downloaded from npm
- a current checkout of an individual landscape with a `landscapeapp` in a
`package` folder is rsynced and sent to our build server
- we use a hash of .nvmrc + package.json + npm-shrinkwrap.json from the
`landscapeapp` repo as a key to cache `node_modules`, `~/.nvm` and `~/.npm` folders,
this way if the hash has not changed - we reuse existing node_modules without any
setup
- if a hash is different, we install node_modules and cache `~/.nvm`,
`~/.npm` and `node_modules` for further usage
- finally, we run a build on our remote server via ssh, and when the build is
done, the output is returned via rsync
Those extra steps allow us to run a build faster because we avoid an `npm install` step
almost every time and extra RAM and CPU allow running npm tasks `renderLandscape`,
`checkLandscape` and `jest` in parallel.
Still, if for certain reasons, remote solution stopped to work and we need to
restore the Netlify build process as soon as possible, BUILD_SERVER variable
should be set to empty in either a given landscape or in a shared variables
section. Usually, the build will fail for all the landscapes, thus renaming the
variable to BUILD_SERVER_1 in shared variables is the most efficient way.
One of the possible issues why remote builds would stop to work,
although let's hope that will never change, would be that a cache folder is broken, therefore
`ssh root@${BUILD_SERVER}` and then calling `rm -rf /root/build` on our build server will clear all the caches used for node_modules.
Then you need to trigger a Netlify build again.
#### Running "locally" on Netlify instances (if the remote server is broken)
Without BUILD_SERVER variable, the following steps are done, from a file netlify/netlify.sh
- the interactive-landscape package of the latest version is downloaded from npm
- we go to that folder
- we install node_modules via `npm install`
- we run `PROJECT_PATH=.. npm run` build from the interactive-landscape package
### Building this repo, `landscapeapp` on a Netlify
We want to ensure that we are making builds of all the landscapes, defined in
`landscapes.yml`
Netlify parameters are stored in the `notilfy.toml` file, and it runs the
`node netlify/landscapeapp.js` from the `netlify` folder.
First, we check if the hash of `.nvmrc`, `package.json` and `npm-shrinkwrap`
file already exists as a key of our cache on our remote server.
If it does exist, it means we can use this folder for `node_modules`, `.npm`
and `.nvm` folders for every individual landscape.
Then we use rsync to send the current checkout of a repo to our remote server
Then for every individual landscape, we run a `build.sh` file on a remote
server, in each own docker container for every landscape. That is done in parallel. The file `build.sh` checks out the
default branch of a given landscape and then runs `npm run build` with a
PROJECT_PATH pointed to the given landscape
When all builds had been finished, the output is returned to the `dist/${landscape.name}`
subfolder and logs are shown.
Then _redirects and _headers files are generated to allow us to view
individual landscapes from a Netlify build.
This repo is built only on our build server because Netlify has a 30 minutes timeout and we can not build individual landscapes there in parallel. Still,
if every build fails and there are no obvious reasons, it may help to clear a
node_modules cache: `ssh root@${BUILD_SERVER}` and then calling `rm -rf /root/build` and then running a new build on Netlify again
### Setting up our build server to speed up Netlify builds
If for some reasons our current server is lost or wiped, or we have to rent a different build server, these are required steps
1. Install docker on a new server. Just the latest docker, nothing else is
required
2. Generate a new pair of ssh keys, and add a public key to the
`/root/.ssh/authorized_keys` file
3. Take a private key without first and last lines, replace \n with space, and
add as a BUILDBOT_KEY variable to the shared variable on a Netlify website
4. Update the BUILD_SERVER shared variable on a Netlify website and provide
the IP address of the new build server
To just check that all is fine, go to the `netlify` folder on your computer,
checkout any branch you want or even make local changes, and run `node
landscapeapp.js`, do not forget to set all required variables, including the
BUILDBOT_KEY and BUILD_SERVER. The build should finish with the success and
copy generated files and folders to the `dist` folder in the root of the repo checkout
## Keeping Project Up to Date
We have an issue #75, where we update all out packages. This is how an update
is usually done:
1. Create a new folder like 75-update-2019-10-16
2. Run `ncu -u` which is same as `npm-check-updates -u`, do not forget to
install `npm install -g npm-check-updates`
3. Run `npm install` , commit and push and make a PR
4. Check that everything runs locally, i.e. `npm run open:src should still work
well`
5. Check that there are no layout issues on generated landscapes
6. Do not forget to read README about those npm packages, which are mentioned in
a red color, i.e. have a major update. They may require to implement certain
changes in our code.
## Embed landscape in a web site
You can embed the landscape in a website in a few different ways...
- If you want just a full static image of the landscape in landscape mode, you can do:
```
<!-- Embed ASWF landscape as a PNG -->
<img src="https://landscape.aswf.io/images/landscape.png" alt="Academy Software Foundation Landscape Image">
```
- If you want to embed the card mode for listing a category of entries ( for example members in a foundation or entries in a certain program ), you can do:
```
<!-- Embed list of all Open Mainframe Project members -->
<iframe src="https://landscape.openmainframeproject.org/category=open-mainframe-project-member-company&amp;format=logo-mode&amp;grouping=category&amp;embed=yes" frameborder="0" id="landscape" scrolling="no" style="width: 1px; min-width: 100%; opacity: 1; visibility: visible; overflow: hidden; height: 1717px;"></iframe>
<script src="https://landscape.openmainframeproject.org/iframeResizer.js"></script>
```
## Generating a Guide
A Guide can be generated by adding a file `guide.md`. `guide.md` will be mostly regular markdown with some custom behavior:
### No headings level 1 allowed
No [Headings](https://www.markdownguide.org/basic-syntax/#headings) level 1 allowed, use level 2 or higher.
### Linking a category from the landscape to a section on the guide
If a section on the guide refers to a category on the landscape, an info icon will be added on the category on the landscape and such icon will redirect to the entry on the guide for that category.
In order to associate the category and the section on the guide, the section on the guide should be wrapped between `<section data-category="$categoryId">` and `</section>`, where `$categoryId` is the id of the category.
Don't include a title for the section, a level 2 heading will be automatically generated using the name of the category.
### Linking a subcategory from the landscape to a section on the guide
If a section on the guide refers to a subcategory on the landscape, an info icon will be added on the subcategory on the landscape and such icon will redirect to the entry on the guide for that subcategory.
In order to associate the subcategory and the section on the guide, the section on the guide should be wrapped between `<section data-subcategory="$subcategoryId" data-buzzwords="$buzzword1,$buzzword2">` and `</section>`, where `$subcategoryId` is the id of the subcategory. Buzzwords is a comma-separated list of words that describe the subcategory, a table will be automatically generated at the bottom of the section including those buzzwords and the list of projects hosted by the organization. The cards with all the logos for that subcategory will also be included at the bottom of the section.
Don't include a title for the section, level 3 heading will be automatically generated using the name of the subcategory.
### Automatic generation of guide navigation
The guide will include a side-navigation generated automatically from all the headings levels 2 and 3 found on the guide. Level 3 headings will be nested under the closest level 2 heading above.

View File

@ -1,2 +1,9 @@
/*
X-Robots-Tag: all
Access-Control-Allow-Origin: *
/*.svg
Content-Type: image/svg+xml; charset=utf-8
/*.json
Content-Type: application/json; charset=utf-8

View File

@ -1 +0,0 @@
/* /index.html 200

9391
_yarn.lock Normal file

File diff suppressed because it is too large Load Diff

13
bin/execute-all Executable file
View File

@ -0,0 +1,13 @@
#!/usr/bin/env bash
set -eu
binpath=$(dirname $0)
landscapes=$($binpath/list-all)
for landscape in $landscapes
do
cmd="PROJECT_PATH=$landscape $1"
echo "Executing command: $cmd"
eval $cmd
done

4
bin/list-all Executable file
View File

@ -0,0 +1,4 @@
#!/usr/bin/env bash
parentdir=$(cd $(dirname "$0")/../..; pwd)
find $parentdir -maxdepth 2 -type f -name "landscape.yml" | xargs -n1 dirname

14
bin/pull-all Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env bash
set -eu
binpath=$(dirname $0)
landscapes=$($binpath/list-all)
for landscape in $landscapes
do
cd $landscape
git reset --hard
git checkout master
git pull
done

12
bin/test-all Executable file
View File

@ -0,0 +1,12 @@
#!/usr/bin/env bash
set -eu
binpath=$(dirname $0)
landscapes=$($binpath/list-all)
for landscape in $landscapes
do
kill -9 `ps ux | grep srcServer | grep -v grep | awk -F ' ' '{print $2}'` 2>/dev/null || true
(PROJECT_PATH=$landscape npm run open:src &) && sleep 10 && PROJECT_PATH=$landscape PORT=3000 npm run integration-test
done

View File

@ -1,20 +1,8 @@
set -e
rm -rf $2 || true
git clone https://github.com/$1 $2
timeout 120s git clone --quiet https://github.com/$1 $2
cd $2
git checkout origin/$3
git remote -v
cd ..
export PROJECT_PATH=$2
export PROJECT_PATH=$PWD/$2
PROJECT_NAME=$2 yarn build
mkdir -p dist
cp -r $2/dist dist/$2
rm -rf ./$2
echo "/$2/* /$2/index.html 200" >> dist/_redirects
echo "<div><a href="$2/"><h1>$2</h1></a></div>" >> dist/index.html

View File

@ -1,3 +1,3 @@
# Code of Conduct
We follow the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md).
We follow the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/HEAD/code-of-conduct.md).

View File

@ -0,0 +1,14 @@
[build]
base = "netlify"
publish = "dist"
command = "(wget --no-check-certificate --no-cache https://raw.githubusercontent.com/cncf/landscapeapp/master/netlify/landscape.js) && node landscape.js"
ignore = "false"
environment = { RUBY_VERSION = "2.6.2", NODE_VERSION="14.3" }
[functions]
directory = "functions"
[[redirects]]
from = "/api/*"
to = "/.netlify/functions/:splat"
status = 200

View File

@ -1,23 +0,0 @@
set -e
rm -rf dist || true
mkdir -p dist
bash build.sh LFDLFoundation/landscape lfdl 33-switch-to-upstream
bash build.sh cncf/landscape cncf 1015-try-upstream
# This will increase a version and publish to an npm
# If there is an existing package
if [ $BRANCH = "master" ]; then
git config --global user.email "info@cncf.io"
git config --global user.name "Netlify Publisher"
git remote rm github || true
git remote add github "https://$GITHUB_USER:$GITHUB_TOKEN@github.com/cncf/landscapeapp"
git fetch github
yarn version --patch
git commit -m 'Update to a new version [skip ci]' --allow-empty --amend
git branch -D tmp || true
git checkout -b tmp
git push github HEAD:master --tags
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc
yarn publish
fi

3
jest.config.js Normal file
View File

@ -0,0 +1,3 @@
module.exports = {
"verbose": true
}

19
landscapes.sh Normal file
View File

@ -0,0 +1,19 @@
# This is a main bash file to run on an update server every day.
# Our first goal is to ensure that all components are installed
git config --global user.email "info@cncf.io"
git config --global user.name "CNCF-Bot"
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
apt-get update
apt-get -y install build-essential gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget gawk aha nginx libgbm-dev
# Then we run our wrapper to process all landscapes
. ~/.nvm/nvm.sh
npm install
nvm install `cat .nvmrc`
nvm use
npm install -g npm
npm install -g yarn
yarn
yarn node tools/landscapes.js

83
landscapes.yml Normal file
View File

@ -0,0 +1,83 @@
ip: 147.75.72.237
landscapes:
# name: how we name a landscape project, used on a build server for logs and settings
# repo: a github repo for a specific landscape
# netlify: full | skip - do we build it on a netlify build or not
# hook: - id for a build hook, so it will be triggered after a default branch build
- landscape:
name: lfedge
repo: State-of-the-Edge/lfedge-landscape
hook: 5c80e31894c5c7758edb31e4
- landscape:
name: lfenergy
repo: lf-energy/lfenergy-landscape
hook: 606487bb9da603110d4b8139
- landscape:
name: lf
repo: jmertic/lf-landscape
hook: 606487123224e20fb8f3896e
- landscape:
name: dlt
repo: dltlandscape/dlt-landscape
hook: demo
- landscape:
name: aswf-landscape
repo: AcademySoftwareFoundation/aswf-landscape
hook: 608aa68eb6e5723d5d8a7e00
required: true
- landscape:
name: cdf
repo: cdfoundation/cdf-landscape
hook: 5d8e8ecbeb12d77369f06dba
required: true
- landscape:
name: finos-landscape
repo: finos/FINOS-landscape
hook: 5eda7140b186b66e915a15b8
- landscape:
name: hl-landscape
repo: hyperledger-landscape/hl-landscape
hook: 5d8b7e9b2571ad2a23a392b8
- landscape:
name: graphql
repo: graphql/graphql-landscape
hook: 5d5c7ccf64ecb5bd3d2592f7
required: true
- landscape:
name: lfai
repo: lfai/landscape
hook: 60648e5b74c76017210a2f53
required: true
- landscape:
name: lfph
repo: lfph/lfph-landscape
hook: 5ec5145565b543b0b01aa9d7
required: true
- landscape:
name: omp
repo: openmainframeproject/omp-landscape
hook: 6064862525138e14cfe87a39
- landscape:
name: openssf
repo: ossf/ossf-landscape
hook: 613768338a16cb9182b21c3d
- landscape:
name: presto
repo: prestodb/presto-landscape
hook: 5ecd46d9f5ea8819a9d610a6
- landscape:
name: tarscloud
repo: TarsCloud/TARS_landscape
hook: 5f0e8a006cae8a2b52061c81
- landscape:
name: ucf
repo: ucfoundation/ucf-landscape
hook: 5d96662e28b476477790dd8a
- landscape:
name: lfn
repo: lfnetworking/member_landscape
hook: 60788f5fa3cbd68181e3c209
- landscape:
name: riscv
repo: riscv-admin/riscv-landscape
hook: demo

BIN
landscapes_dev/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

194
landscapes_dev/index.html Normal file
View File

@ -0,0 +1,194 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Linux Foundation Landscapes </title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/png" href="/favicon.png" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/3.13.1/js-yaml.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.2/css/bulma.min.css">
<style>
html {
overflow: auto;
}
body .container {
padding-top: 2rem;
padding-bottom: 2rem;
}
.header {
margin: 0 0 1rem;
}
.header,
.main {
padding: 0 0.75rem;
}
table.table {
white-space: nowrap;
}
td.organization a,
td.status a {
float: left;
display: block;
}
td.organization a,
td.organization img,
.logo {
height: 30px;
}
.previews {
padding-top: 20px;
}
.preview-logo-wrapper {
display: flex;
justify-content: center;
margin-bottom: 4px;
}
td.status a,
td.status img {
height: 18px;
max-width: initial;
}
.table td {
vertical-align: middle;
}
</style>
</head>
<body>
<div class="container is-widescreen">
<div class="header is-clipped">
<h1 class="title is-marginless is-pulled-left">Linux Foundation Landscapes</h1>
<div class="is-pulled-right">
<a href="#" data-behavior="toggle" class="button is-light is-link">Show Previews</a>
<a href="#" class="is-hidden button is-light is-link" data-behavior="toggle">Show List</a>
</div>
</div>
<div class="main">
<table class="table is-fullwidth" data-behavior="toggle-target">
<thead>
<th>Organization</th>
<th>Landscape</th>
<th>Repo</th>
<th>Status</th>
<th># of Tweets</th>
<th>Published</th>
<th>Data Refreshed</th>
</thead>
<tbody></tbody>
</table>
<div class="is-hidden previews columns is-multiline" data-behavior="toggle-target"></div>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", () => {
const toggleTargets = document.querySelectorAll('[data-behavior="toggle"], [data-behavior="toggle-target"]')
document.querySelectorAll('[data-behavior="toggle"]').forEach(el => {
el.addEventListener('click', e => {
e.preventDefault()
toggleTargets.forEach(({ classList }) => classList.toggle('is-hidden'))
})
})
})
</script>
<script>
let reportsIp = null;
const fetchFile = async path => await (await fetch(`https://raw.githubusercontent.com/${path}`)).text()
const tableEl = document.querySelector("tbody")
const previewsEl = document.querySelector(".previews")
const linkTo = (url, title) => `<a target="_blank" href="${url}">${title}</a>`
const imageLinkTo = (url, src, alt) => linkTo(url, `<img src="${src}" alt="${alt}" />`)
const fetchLandscapeInfo = ({ repo, name }) => {
const rowEl = document.createElement("tr")
const dateTimeFormat = new Intl.DateTimeFormat('en', { month: 'short', day: '2-digit', hour: '2-digit', minute:'2-digit', hour12: false })
tableEl.append(rowEl)
const appendColumn = (args = {}) => {
let column = document.createElement('td')
column.setAttribute("class", args.className)
column.innerText = "Fetching..."
rowEl.append(column)
return column
}
const appendPreview = () => {
let preview = document.createElement('div')
preview.setAttribute("class", "preview column is-one-third-widescreen is-half-desktop is-full-tablet")
previewsEl.append(preview)
return preview
}
let organizationEl = appendColumn({ className: "organization" })
let landscapeEl = appendColumn()
let repoEl = appendColumn()
let statusEl = appendColumn({ className: "status" })
let numTweetsEl = appendColumn()
let publishedEl = appendColumn()
let updatedEl = appendColumn()
let previewEl = appendPreview()
repoEl.innerHTML = linkTo(`https://github.com/${repo}`, repo)
fetchFile(`${repo}/HEAD/settings.yml`)
.then(async settings => {
const { company_url, short_name, short_domain, website } = jsyaml.load(settings).global
organizationEl.innerHTML = imageLinkTo(company_url, `${website}/images/right-logo.svg`, short_name)
landscapeEl.innerHTML = linkTo(website, short_domain)
previewEl.innerHTML = `
<div class="preview-logo-wrapper">
<img src="${website}/images/right-logo.svg" class="logo" alt="${short_name}"/>
</div>
${imageLinkTo(website, `${website}/images/landscape_preview.png`, short_domain)}`
const landscapeIndex = await (await fetch(website)).text()
const publishedAt = landscapeIndex.match(/Updated:\s*([^"]*)/)[1]
publishedEl.innerHTML = publishedAt ? dateTimeFormat.format(new Date(publishedAt)) : 'UNKNOWN'
})
fetchFile(`${repo}/HEAD/README.md`)
.then(async readme => {
const statusUrl = readme.match(/https:\/\/api.netlify.com\/api\/v1\/badges[^)]*/)[0]
const deploysUrl = readme.match(/https:\/\/app.netlify.com\/sites[^)]*/)[0]
statusEl.innerHTML = imageLinkTo(deploysUrl, statusUrl, "Netlify Status")
})
fetchFile(`${repo}/HEAD/processed_landscape.yml`)
.then(processedLandscape => {
const { updated_at, twitter_options } = jsyaml.load(processedLandscape)
const updatedAt = updated_at ? new Date(updated_at) : null
const oneDayAgo = new Date() - 24 * 60 * 60 * 1000
const className = updatedAt && updatedAt > oneDayAgo ? '' : 'has-text-danger'
numTweetsEl.innerHTML = (twitter_options ? twitter_options.count : 0).toString()
updatedEl.innerHTML = `<div class="${className}">
<div> ${updated_at ? dateTimeFormat.format(updatedAt) : 'UNKNOWN' } </div>
<a href="http://${reportsIp}/${name}.html">VIEW DAILY AUTOUPDATE LOGS</a>
</div>`
})
}
fetchFile("cncf/landscapeapp/HEAD/landscapes.yml")
.then(function(data) {
const content = jsyaml.load(data);
reportsIp = content.ip;
content.landscapes.forEach(landscape => fetchLandscapeInfo(landscape));
})
</script>
</body>
</html>

13
netlify.md Normal file
View File

@ -0,0 +1,13 @@
We use netlify for builds and deploys.
For landscapeapp project we rely on parallel builds.
Netlify runs a build for a given PR on a landscapeapp.
The netlifyBuild.js file then uses rsync to xcopy the current folder to
our prepared packet server. On that packet server we run all the landscapes in
parallel using a netlify docker image. The output from each landscape is captured and returned back
to the Netlify cloud server. The dist folder is returned back to the cloud
server via rsync.
Most chances is that we will switch to a different build tool soon, so this is
an experimental approach to speedup netlify builds.

6
netlify.toml Normal file
View File

@ -0,0 +1,6 @@
[build]
ignore = "false"
environment = { RUBY_VERSION = "2.6.2", NODE_VERSION = "14.3" }
[functions]
directory = "netlify/functions"

32
netlify/generateIndex.js Normal file
View File

@ -0,0 +1,32 @@
module.exports = results => (`<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.2/css/bulma.min.css">
</head>
<body>
<section class="section">
<div class="container">
<div class="columns is-multiline">
${results.map(({ landscape, exitCode }) => {
return `
<div class="column is-one-third-widescreen is-half-desktop is-full-tablet">
<div style="display: flex; justify-content: center">
<img src="${landscape.name}/images/right-logo.svg" style="height: 35px"
alt="${landscape.name}"/>
</div>
${ exitCode === 0 ?
`<a href="${landscape.name}/" target="_blank" rel="noopener noreferrer">
<img src="${landscape.name}/images/landscape_preview.png"/>
</a>` :
`<div class="message is-danger is-large"><div class="message-body" style="border: none; text-align: center">FAILED</div></div>` }
</div>
`
}).join('')}
</div>
</div>
</section>
</body>
</html>
`)

3875
netlify/jsyaml.js Normal file

File diff suppressed because it is too large Load Diff

261
netlify/landscape.js Normal file
View File

@ -0,0 +1,261 @@
// We will execute this script from a landscape build,
// "prepublish": "cp yarn.lock _yarn.lock",
// "postpublish": "rm _yarn.lock || true"
const remote = `root@${process.env.BUILD_SERVER}`;
const dockerImage = 'netlify/build:focal';
const dockerHome = '/opt/buildhome';
const secrets = [
process.env.CRUNCHBASE_KEY_4, process.env.TWITTER_KEYS, process.env.GITHUB_TOKEN, process.env.GITHUB_USER, process.env.GITHUB_KEY
].filter( (x) => !!x);
const maskSecrets = function(x) {
let result = x;
const replaceAll = function(s, search, replacement) {
var target = s;
return target.split(search).join(replacement);
};
for (var secret of secrets) {
const safeString = secret.substring(0, 2) + '***' + secret.substring(secret.length -2);
result = replaceAll(result, secret, safeString);
}
return result;
}
for (var secret of secrets) {
console.info(maskSecrets(`We have a secret: ${secret}`));
}
const debug = function() {
if (process.env.DEBUG_BUILD) {
console.info.apply(console, arguments);
}
}
const runLocal = function(command, showProgress) {
// report the output once every 5 seconds
let lastOutput = { s: '', time: new Date().getTime() };
let displayIfRequired = function(text) {
if (showProgress) {
console.info(text);
}
lastOutput.s = lastOutput.s + text;
}
return new Promise(function(resolve) {
var spawn = require('child_process').spawn;
var child = spawn('bash', ['-lc',`set -e \n${command}`]);
let output = [];
child.stdout.on('data', function(data) {
const text = maskSecrets(data.toString('utf-8'));
output.push(text);
displayIfRequired(text);
//Here is where the output goes
});
child.stderr.on('data', function(data) {
const text = maskSecrets(data.toString('utf-8'));
output.push(text);
displayIfRequired(text);
//Here is where the error output goes
});
child.on('close', function(exitCode) {
lastOutput.done = true;
displayIfRequired('');
resolve({text: output.join(''), exitCode});
//Here you can get the exit code of the script
});
});
}
const runLocalWithoutErrors = async function(command) {
debug(command);
const result = await runLocal(command);
console.info(result.text);
if (result.exitCode !== 0) {
throw new Error(`Failed to execute ${command}, exit code: ${result.exitCode}`);
}
return result.text.trim();
}
const key = `
-----BEGIN OPENSSH PRIVATE KEY-----
${(process.env.BUILDBOT_KEY || '').replace(/\s/g,'\n')}
-----END OPENSSH PRIVATE KEY-----
`.split('\n').slice(1).join('\n');
require('fs').writeFileSync('/tmp/buildbot', key);
require('fs').chmodSync('/tmp/buildbot', 0o600);
const runRemote = async function(command, count = 3) {
const bashCommand = `
nocheck=" -o StrictHostKeyChecking=no "
ssh -i /tmp/buildbot $nocheck ${remote} << 'EOSSH'
set -e
${command}
EOSSH
`
const result = await runLocal(bashCommand, true);
if (result.exitCode === 255 && count > 0) {
console.info(`Attempts to retry more: ${count}`);
return await runRemote(command, count - 1);
}
return result;
};
const runRemoteWithoutErrors = async function(command) {
const result = await runRemote(command);
console.info(result.text.trim());
if (result.exitCode !== 0) {
throw new Error(`Failed to execute remote ${command}, exit code: ${result.exitCode}`);
}
}
const makeRemoteBuildWithCache = async function() {
await runLocalWithoutErrors(`
rm -rf packageRemote || true
git clone -b deploy --single-branch https://github.com/cncf/landscapeapp packageRemote
`);
//how to get a hash based on our files
const getHash = function() {
const crypto = require('crypto');
const p0 = require('fs').readFileSync('packageRemote/.nvmrc', 'utf-8').trim();
const p1 = crypto.createHash('sha256').update(require('fs').readFileSync('packageRemote/package.json')).digest('hex');
const p2 = crypto.createHash('sha256').update(require('fs').readFileSync('packageRemote/yarn.lock')).digest('hex');
const p3 = crypto.createHash('sha256').update(require('fs').readFileSync('packageRemote/.yarnrc.yml')).digest('hex');
return p0 + p1 + p2 + p3;
}
const getTmpFile = () => new Date().getTime().toString() + Math.random();
const nvmrc = require('fs').readFileSync('packageRemote/.nvmrc', 'utf-8').trim();
console.info(`node version:`, nvmrc);
// now our goal is to run this on a remote server. Step 1 - xcopy the repo
const folder = getTmpFile();
await runLocalWithoutErrors(`
rm -rf remoteDist || true
mkdir -p remoteDist
`);
await runRemoteWithoutErrors(`mkdir -p /root/builds`);
await runRemoteWithoutErrors(`docker pull ${dockerImage}`);
await runLocalWithoutErrors(`
rsync --exclude="package" -az -e "ssh -i /tmp/buildbot -o StrictHostKeyChecking=no " . ${remote}:/root/builds/${folder}
`);
await runRemoteWithoutErrors(`chmod -R 777 /root/builds/${folder}`);
const hash = getHash();
const tmpHash = require('crypto').createHash('sha256').update(getTmpFile()).digest('hex');
// lets guarantee npm install for this folder first
// do not pass REVIEW_ID because on failure we will run it locally and report
// from there
const vars = [
'CRUNCHBASE_KEY_4',
'GITHUB_KEY',
'TWITTER_KEYS',
'GA',
'BRANCH',
'GITHUB_TOKEN',
'GITHUB_USER',
'REPOSITORY_URL'
];
const outputFolder = 'landscape' + getTmpFile();
const buildCommand = [
`cd /opt/repo/packageRemote`,
"(ls . ~/.nvm/nvm.sh || (curl -s -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash >/dev/null))",
`. ~/.nvm/nvm.sh`,
`cat .nvmrc`,
`nvm install ${nvmrc}`,
`nvm use ${nvmrc}`,
`npm install -g agentkeepalive --save`,
`npm install -g npm@9 --no-progress`,
`npm install -g yarn@latest`,
`yarn`,
`git config --global --add safe.directory /opt/repo`,
`export NODE_OPTIONS="--unhandled-rejections=strict"`,
`PROJECT_PATH=.. yarn run build`,
`cp -r /opt/repo/dist /dist`
].join(' && ');
const dockerCommand = `
mkdir -p /root/builds/${outputFolder}
chmod -R 777 /root/builds/${outputFolder}
chmod -R 777 /root/builds/${folder}
docker run --shm-size 1G --rm -t \
${vars.map( (v) => ` -e ${v}="${process.env[v]}" `).join(' ')} \
-e NVM_NO_PROGRESS=1 \
-e NETLIFY=1 \
-e PARALLEL=TRUE \
-v /root/builds/${folder}:/opt/repo \
-v /root/builds/${outputFolder}:/dist \
${dockerImage} /bin/bash -lc "${buildCommand}"
`;
debug(dockerCommand);
// run a build command remotely for a given repo
let output;
output = await runRemote(dockerCommand);
console.info(`Output from remote build, exit code: ${output.exitCode}`);
if (output.exitCode === 255) { // a single ssh failure
console.info('SSH failure! Retrying ...');
output = await runRemote(dockerCommand);
console.info(`Output from remote build, exit code: ${output.exitCode}`);
} else if (output.exitCode !== 0) {
console.info(output.text);
throw new Error('Remote build failed');
// console.info('Retrying with reinstalling npm');
// output = await runRemote(dockerCommandWithNpmInstall);
// console.info(`Output from remote build, exit code: ${output.exitCode}`);
}
console.info(output.text);
// a build is done
console.info(await runLocalWithoutErrors(
`
mkdir -p distRemote
rsync -az --chmod=a+r -p -e "ssh -i /tmp/buildbot -o StrictHostKeyChecking=no " ${remote}:/root/builds/${outputFolder}/dist/* distRemote
`
));
await runRemote(
`
rm -rf /root/builds/${folder}
rm -rf /root/builds/${outputFolder}
`
)
console.info('Remote build done!');
console.info(output.text);
await runLocalWithoutErrors(`
rm -rf netlify/dist || true
rm -rf dist || true
mkdir -p netlify/dist
mkdir -p dist
cp -r distRemote/* netlify/dist
cp -r distRemote/* dist
mv netlify/dist/functions netlify/functions
cp -r netlify/functions functions # Fix netlify bug
`);
process.exit(0);
}
async function main() {
console.info('starting', process.cwd());
process.chdir('..');
await runLocal('rm package*.json');
const cleanPromise = runRemoteWithoutErrors(`
find builds/ -maxdepth 1 -not -path "builds/node_cache" -mtime +1 -exec rm -rf {} +;
`).catch(function() {
console.info('Failed to clean up a builds folder');
});
await Promise.all([makeRemoteBuildWithCache().catch(function(ex) {
console.info('build failed', ex);
process.exit(1);
}), cleanPromise]);
}
main().catch(function(ex) {
console.info(ex);
process.exit(1);
});

354
netlify/landscapeapp.js Normal file
View File

@ -0,0 +1,354 @@
if (process.env.KEY3) {
require('fs').mkdirSync(process.env.HOME + '/.ssh', { recursive: true});
require('fs').writeFileSync(process.env.HOME + '/.ssh/bot3',
"-----BEGIN RSA PRIVATE KEY-----\n" +
process.env.KEY3.replace(/\s/g,"\n") +
"\n-----END RSA PRIVATE KEY-----\n\n"
);
require('fs').chmodSync(process.env.HOME + '/.ssh/bot3', 0o600);
console.info('Made a bot3 file');
}
const path = require('path')
const { readdirSync, writeFileSync } = require('fs')
const generateIndex = require('./generateIndex')
const debug = function() {
if (process.env.DEBUG_BUILD) {
console.info.apply(console, arguments);
}
}
const pause = function(i) {
return new Promise(function(resolve) {
setTimeout(resolve, i * 1000);
})
};
const yaml = require('./jsyaml');
process.chdir('..');
const landscapesInfo = yaml.load(require('fs').readFileSync('landscapes.yml'));
const dockerImage = 'netlify/build:focal';
const dockerHome = '/opt/buildhome';
async function main() {
const nvmrc = require('fs').readFileSync('.nvmrc', 'utf-8').trim();
const secrets = [
process.env.CRUNCHBASE_KEY_4, process.env.TWITTER_KEYS, process.env.GITHUB_TOKEN, process.env.GITHUB_USER, process.env.GITHUB_KEY
].filter( (x) => !!x);
const maskSecrets = function(x) {
let result = x;
const replaceAll = function(s, search, replacement) {
var target = s;
return target.split(search).join(replacement);
};
for (var secret of secrets) {
const safeString = secret.substring(0, 2) + '***' + secret.substring(secret.length -2);
result = replaceAll(result, secret, safeString);
}
return result;
}
for (var secret of secrets) {
console.info(maskSecrets(`We have a secret: ${secret}`));
}
const key = `
-----BEGIN OPENSSH PRIVATE KEY-----
${process.env.BUILDBOT_KEY.replace(/\s/g,'\n')}
-----END OPENSSH PRIVATE KEY-----
`.split('\n').slice(1).join('\n');
require('fs').writeFileSync('/tmp/buildbot', key);
require('fs').chmodSync('/tmp/buildbot', 0o600);
// now our goal is to run this on a remote server. Step 1 - xcopy the repo
const folder = new Date().getTime();
const remote = 'root@147.75.199.15';
const runRemote = async function(command) {
const bashCommand = `
nocheck=" -o StrictHostKeyChecking=no "
ssh -i /tmp/buildbot $nocheck ${remote} << 'EOSSH'
set -e
${command}
EOSSH
`
const result = await runLocal(bashCommand);
let newOutput = [];
for (var l of result.text.split('\n')) {
if (l.match(/Counting objects: /)) {
continue;
}
if (l.match(/ExperimentalWarning: Custom ESM Loaders is an experimental feature./)) {
continue
}
if (l.match(/Compressing objects: /)) {
continue;
}
if (l.match(/Receiving objects: /)) {
continue;
}
if (l.match(/Resolving deltas: /)) {
continue;
}
if (l.match(/Could not resolve ".*?" in file/)) {
continue;
}
newOutput.push(l);
if (l.includes('mesg: ttyname failed: Inappropriate ioctl for device')) {
newOutput = [];
}
}
result.text = newOutput.join('\n');
return result;
};
const runLocal = function(command) {
return new Promise(function(resolve) {
let finished = false;
let timeout = setTimeout(function() {
if (finished) {
return;
}
finished = true;
child.kill();
resolve({
exitCode: 'timeout',
text: 'A command took more than 25 minutes. \n' + output.join('')
});
}, 25 * 60 * 1000);
var spawn = require('child_process').spawn;
var child = spawn('bash', ['-lc',`set -e \n${command}`]);
let output = [];
child.stdout.on('data', function(data) {
const text = maskSecrets(data.toString('utf-8'));
// console.info(text);
output.push(text);
//Here is where the output goes
});
child.stderr.on('data', function(data) {
const text = maskSecrets(data.toString('utf-8'));
// console.info(text);
output.push(text);
//Here is where the error output goes
});
child.on('close', function(exitCode) {
if (!finished) {
finished = true;
clearTimeout(timeout);
resolve({text: output.join(''), exitCode});
}
//Here you can get the exit code of the script
});
});
}
const runLocalWithoutErrors = async function(command) {
const result = await runLocal(command);
console.info(result.text);
if (result.exitCode !== 0) {
throw new Error(`Failed to execute ${command}, exit code: ${result.exitCode}`);
}
return result.text.trim();
}
const runRemoteWithoutErrors = async function(command) {
const result = await runRemote(command);
console.info(result.text);
if (result.exitCode !== 0) {
throw new Error(`Failed to execute remote ${command}, exit code: ${result.exitCode}`);
}
return result.text.trim();
}
await runLocalWithoutErrors(`
rm -rf dist || true
mkdir -p dist netlify/functions
`);
await runRemoteWithoutErrors(`mkdir -p /root/builds`);
await runRemoteWithoutErrors(`docker pull ${dockerImage}`);
await runLocalWithoutErrors(`
rsync --exclude="node_modules" --exclude="dist" -az -e "ssh -i /tmp/buildbot -o StrictHostKeyChecking=no " . ${remote}:/root/builds/${folder}
`);
console.info('Rsync done');
await runRemoteWithoutErrors(`chmod -R 777 /root/builds/${folder}`);
// lets guarantee npm install for this folder first
{
const buildCommand = [
"(ls . ~/.nvm/nvm.sh || (curl -s -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash >/dev/null))",
". ~/.nvm/nvm.sh",
`nvm install ${nvmrc} >/dev/null`,
`nvm use ${nvmrc}`,
`npm install -g yarn --no-progress --silent`,
`cd /opt/repo`,
`yarn >/dev/null`,
`yarn eslint`
].join(' && ');
const npmInstallCommand = `
mkdir -p /root/builds/${folder}_node
mkdir -p /root/builds/${folder}_node/{yarnGlobal,nvm}
chmod -R 777 /root/builds/${folder}_node
docker run --shm-size 1G --rm -t \
-v /root/builds/${folder}_node/nvm:${dockerHome}/.nvm \
-v /root/builds/${folder}_node/yarnGlobal:${dockerHome}/.yarn \
-v /root/builds/${folder}:/opt/repo \
${dockerImage} /bin/bash -lc "${buildCommand}"
chmod -R 777 /root/builds/${folder}_node
`
debug(npmInstallCommand);
console.info(`Installing npm packages`);
const output = await runRemote(npmInstallCommand);
console.info(`Output from npm install: exit code: ${output.exitCode}`);
const lines = output.text.split('\n');
const index = lines.indexOf(lines.filter( (line) => line.match(/added \d+ packages in/))[0]);
const filteredLines = lines.slice(index !== -1 ? index : 0).join('\n');
console.info(filteredLines);
}
// all landscapes
const results = await Promise.all(landscapesInfo.landscapes.map(async function(landscape, i) {
await pause(i);
const vars = ['CRUNCHBASE_KEY_4', 'GITHUB_KEY', 'TWITTER_KEYS'];
const outputFolder = landscape.name + new Date().getTime();
const buildCommand = [
`cd /opt/repo`,
`git config --global --add safe.directory /opt/repo`,
`. ~/.nvm/nvm.sh`,
`nvm use`,
`export NODE_OPTIONS="--unhandled-rejections=strict"`,
`bash build.sh ${landscape.repo} ${landscape.name}`,
`cp -r /opt/repo/${landscape.name}/dist /dist`
].join(' && ');
const nodeModulesFolder = `${folder}_node`;
const dockerCommand = `
mkdir -p /root/builds/${outputFolder}
chmod -R 777 /root/builds/${outputFolder}
mkdir -p /tmp/${outputFolder}/public /tmp/${outputFolder}/out /tmp/${outputFolder}/.next
chmod -R 777 /tmp/${outputFolder}
REPO_PATH=/root/builds/${folder}
OUTPUT_PATH=/root/builds/${outputFolder}
docker run --shm-size 1G --rm -t \
${vars.map( (v) => ` -e ${v}="${process.env[v]}" `).join(' ')} \
-e NVM_NO_PROGRESS=1 \
-e NETLIFY=1 \
-e PARALLEL=TRUE \
-v /root/builds/${nodeModulesFolder}/nvm:${dockerHome}/.nvm \
-v /root/builds/${nodeModulesFolder}/yarnGlobal:${dockerHome}/.yarn \
-v /tmp/${outputFolder}/public:/opt/repo/public \
-v /tmp/${outputFolder}/out:/opt/repo/out \
-v /tmp/${outputFolder}/.next:/opt/repo/.next \
-v /root/builds/${folder}:/opt/repo \
-v /root/builds/${outputFolder}:/dist \
${dockerImage} /bin/bash -lc "${buildCommand}"
`;
console.info(`processing ${landscape.name} at ${landscape.repo}`);
debug(dockerCommand);
// run a build command remotely for a given repo
let output;
output = await runRemote(dockerCommand);
output.landscape = landscape;
if (output.exitCode) {
console.info(`Output from: ${output.landscape.name}, exit code: ${output.exitCode}`);
console.info(output.text);
} else {
console.info(`Done: ${output.landscape.name}`);
}
if (output.exitCode === 255) { // a single ssh failure
output = await runRemote(dockerCommand);
output.landscape = landscape;
console.info('Retrying ...');
console.info(`Output from: ${output.landscape.name}, exit code: ${output.exitCode}`);
console.info(output.text);
}
landscape.done = true;
console.info(`Remaining : ${landscapesInfo.landscapes.filter( (x) => !x.done).map( (x) => x.name).join(',')}`);
await runLocal(
`
rsync -az --chmod=a+r -p -e "ssh -i /tmp/buildbot -o StrictHostKeyChecking=no " ${remote}:/root/builds/${outputFolder}/dist/${landscape.name}/ dist/${landscape.name}
`
);
await runLocal(`mv dist/${landscape.name}/functions/* netlify/functions`)
await runRemote(
`
rm -rf /root/builds/${outputFolder}
`
)
return output;
}));
await runRemote(`
rm -rf /root/builds/${folder}
rm -rf /root/builds/${folder}_node || true
`);
for (let x of results) {
if (x.exitCode !== 0 && x.landscape.required) {
console.info(`a landscape ${x.landscape.name} failed but it is required = ${x.landscape.required}`);
process.exit(1);
}
}
const index = generateIndex(results)
const robots = `
User-agent: *
Disallow: /
`;
require('fs').writeFileSync('dist/index.html', index);
require('fs').writeFileSync('dist/robots.html', robots);
require('fs').copyFileSync(path.resolve(__dirname, '..', '_headers'), 'dist/_headers')
const notFoundRedirects = landscapesInfo.landscapes.map(({ name }) => `/${name}/* /${name}/404.html 404`)
const functionRedirects = readdirSync('netlify/functions').map(file => {
const prefixedName = file.replace(/\..*/, '')
const [landscape, functionName] = prefixedName.split('--')
const newPath = `/${landscape}/api/${functionName}`
return `${newPath} /.netlify/functions/${prefixedName} 200`
})
writeFileSync('dist/_redirects', [...functionRedirects, ...notFoundRedirects].join('\n'))
require('fs').writeFileSync("dist/robots.txt", "User-agent: *");
// comment below when about to test a googlebot rendering
require('fs').appendFileSync("dist/robots.txt", "Disallow: /");
await runLocalWithoutErrors('cp -r dist netlify');
if (process.env.BRANCH === 'master') {
console.info(await runLocal('git remote -v'));
await runLocalWithoutErrors(`
git config --global user.email "info@cncf.io"
git config --global user.name "CNCF-bot"
git remote rm github 2>/dev/null || true
git remote add github "git@github.com:cncf/landscapeapp.git"
echo 1
GIT_SSH_COMMAND='ssh -i ~/.ssh/bot3 -o IdentitiesOnly=yes' git fetch github
echo 2
git --no-pager show HEAD
echo 3
GIT_SSH_COMMAND='ssh -i ~/.ssh/bot3 -o IdentitiesOnly=yes' git push github github/master:deploy
`);
// just for debug purpose
//now we have a different hash, because we updated a version, but for build purposes we have exactly same npm modules
for (let landscape of landscapesInfo.landscapes) {
console.info(`triggering a hook for ${landscape.name}`);
await runLocalWithoutErrors(`curl -X POST -d {} https://api.netlify.com/build_hooks/${landscape.hook}`);
}
}
}
main().then(function() {
process.exit(0);
}).catch(function(ex) {
console.info(ex);
process.exit(1);
});

176
netlify/server.js Normal file
View File

@ -0,0 +1,176 @@
// this "server.js" script should be able to run everything itself, without
// having to bother with any packages or similar problems.
const fs = require('fs/promises');
const path = require('path');
const oldCreateConnection = require('https').globalAgent.createConnection;
require('https').globalAgent.createConnection = function(options, cb) {
options.highWaterMark = 1024 * 1024;
options.readableHighWaterMark = 1024 * 1024;
return oldCreateConnection.apply(this, [options, cb]);
}
// we will get a content of all files, in a form of entries
// "file", "content", "md5"
async function getContent() {
const dirs = ["images", "hosted_logos", "cached_logos"];
const files = ["landscape.yml", "settings.yml", "processed_landscape.yml", "guide.md"];
const all = [];
for (let dir of dirs) {
const filesInDir = await fs.readdir(dir);
for (let file of filesInDir) {
if (file !== '.' && file !== '..') {
const content = await fs.readFile(`${dir}/${file}`, { encoding: 'base64'});
const md5 = require('crypto').createHash('md5').update(content).digest("hex");
all.push({
file: `${dir}/${file}`,
content: content,
md5: md5
});
}
}
}
for (let file of files) {
let content;
try {
content = await fs.readFile(file, { encoding: 'base64'});
} catch(ex) {
}
if (content) {
const md5 = require('crypto').createHash('md5').update(content).digest("hex");
all.push({
file: file,
content: content,
md5: md5
});
}
}
return all;
}
function get(path) {
return new Promise(function(resolve) {
const base = process.env.DEBUG_SERVER ? 'http://localhost:3000' : 'https://weblandscapes.ddns.net';
const http = require(base.indexOf('http://') === 0 ? 'http' : 'https');
const originalPath = path;
path = `${base}/api/console/download/${path}`;
const req = http.request(path, function(res) {
const path1 = originalPath.replace('?', '.html?');
if (res.statusCode === 404 && path.indexOf('.html') === -1) {
get(path1).then( (x) => resolve(x));
} else {
resolve({
res: res,
headers: res.headers,
statusCode: res.statusCode
});
}
});
req.end();
});
}
function post({path, request}) {
return new Promise(function(resolve) {
const base = process.env.DEBUG_SERVER ? 'http://localhost:3000' : 'https://weblandscapes.ddns.net';
const http = require(base.indexOf('http://') === 0 ? 'http' : 'https');
let data = '';
const req = http.request({
hostname: base.split('://')[1].replace(':3000', ''),
port: base.indexOf('3000') !== -1 ? '3000' : 443,
path: path,
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json; charset=UTF-8'
}
}, function(res) {
res.on('data', function(chunk) {
data += chunk;
});
res.on('close', function() {
resolve(JSON.parse(data));
});
});
req.write(JSON.stringify(request));
req.end();
});
}
// a build is done on a server side, instead of a client side, this
// is a key moment
// 1. get content (that is fast)
// 2. send a list of hashes
// 3. get back a list of existing hashes
// 4. send a list of (file, content, hash) , but skip the content when a hash is on the server
// 5. get a build result on a server
let previousGlobalHash;
let lastOutput;
let currentPath;
async function build() {
const files = await getContent();
if (!previousGlobalHash) {
console.info(`Starting a new build...`);
}
if (JSON.stringify(files.map( (x) => x.md5)) === previousGlobalHash) {
return;
}
if (previousGlobalHash) {
console.info(`Changes detected, starting a new build`);
}
previousGlobalHash = JSON.stringify(files.map( (x) => x.md5));
const availableIds = await post({path: '/api/console/ids', request: { ids: files.map( (x) => x.md5 ) }});
const availableSet = new Set(availableIds.existingIds);
const filesWithoutExtraContent = files.map( (file) => ({
file: file.file,
md5: file.md5,
content: availableSet.has(file.md5) ? '' : file.content
}));
const result = await post({path: '/api/console/preview', request: { files: filesWithoutExtraContent }});
if (result.success) {
currentPath = result.path;
console.info(`${new Date().toISOString()} build result: ${result.success ? 'success' : 'failure'} `);
} else {
lastOutput = result.output;
console.info(`${new Date().toISOString()} build result: ${result.success ? 'success' : 'failure'} `);
console.info(result.output);
}
}
function server() {
const http = require('http');
http.createServer(async function (request, response) {
if (!currentPath) {
response.writeHead(404);
if (lastOutput) {
response.end(lastOutput);
} else {
response.end('Site is not ready');
}
} else {
let filePath = request.url.split('?')[0];
const url = path.join(currentPath, 'dist', filePath + '?' + request.url.split('?')[1]);
console.info(`Fetching ${url}`);
const output = await get(url);
response.writeHead(output.statusCode, output.headers);
output.res.pipe(response);
}
}).listen(process.env.PORT || 8001);
console.log(`Development server running at http://127.0.0.1:${process.env.PORT || 8001}/`);
}
async function main() {
server();
//eslint-disable-next-line no-constant-condition
while(true) {
await build();
}
}
main().catch(function(ex) {
console.info(ex);
});
// how will a server work?

View File

@ -1,190 +1,97 @@
{
"name": "interactive-landscape",
"version": "1.0.6",
"description": "Interactive visualization of cloud native projects and products",
"version": "1.0.657",
"description": "Visualization tool for building interactive landscapes",
"engines": {
"npm": ">=3",
"node": ">= 10.5"
},
"scripts": {
"open:src": "npm run yaml2json && babel-node tools/srcServer.js",
"open:dist": "babel-node tools/distServer.js",
"lint": "esw webpack.config.* src tools --color",
"lint:watch": "npm run lint -- --watch",
"fetch": "babel-node tools/validateLandscapeKeys && babel-node tools/addExternalInfo.js && npm run yaml2json",
"update": "(rm /tmp/landscape.json || true) && babel-node tools/validateLandscapeKeys && npm run remove-quotes && LEVEL=medium babel-node tools/addExternalInfo.js && npm run yaml2json",
"yaml2json": "babel-node tools/generateJson.js",
"remove-quotes": "babel-node tools/removeQuotes",
"check-links": "babel-node tools/checkLinks",
"fetchAll": "LEVEL=complete npm run fetch",
"clean-dist": "npm run remove-dist && mkdir \"$PROJECT_PATH\"/dist",
"remove-dist": "rimraf \"$PROJECT_PATH\"/dist",
"precommit": "npm run fetch",
"start-ci": "(babel-node tools/ciServer &) & sleep 10",
"stop-ci": "kill -9 `cat /tmp/ci.pid` && rm /tmp/ci.pid",
"integration-test": "jest",
"check-landscape": "babel-node tools/checkLandscape",
"render-landscape": "babel-node tools/renderLandscape",
"copy-dist": "cp -r _headers _redirects \"$PROJECT_PATH\"/data.json \"$PROJECT_PATH\"/images src/embed.html \"$PROJECT_PATH\"/dist/ && cp -r \"$PROJECT_PATH\"/cached_logos \"$PROJECT_PATH\"/dist/logos",
"setup-robots": "babel-node tools/sitemap && babel-node tools/addRobots",
"quick-build": "babel-node tools/build.js && npm run copy-dist && npm run setup-robots",
"prebuild": "npm config set scripts-prepend-node-path true && npm run fetch && npm run clean-dist",
"build": "babel-node tools/build.js && npm run copy-dist && npm run setup-robots && npm run start-ci && npm run integration-test && npm run check-landscape && npm run render-landscape && npm run stop-ci && babel-node tools/fundingForMasterBranch",
"show-report": "open dist/report.html",
"eslint": "eslint src tools specs netlify",
"autocrop-images": "node tools/autocropImages",
"dev": "yarn server",
"open:src": "yarn server",
"server": "node server.js",
"landscapes": "node tools/landscapes.js",
"update-github-colors": "curl https://raw.githubusercontent.com/Diastro/github-colors/master/github-colors.json > tools/githubColors.json",
"fetch": "node tools/validateLandscape && node tools/checkWrongCharactersInFilenames && node tools/addExternalInfo.js && yarn yaml2json",
"fetchAll": "LEVEL=complete yarn fetch",
"light-update": "(rm /tmp/landscape.json || true) && node tools/validateLandscape && yarn remove-quotes && LEVEL=crunchbase node tools/addExternalInfo.js && yarn prune && yarn yaml2json && node tools/updateTimestamps",
"update": "(rm /tmp/landscape.json || true) && node tools/validateLandscape && yarn remove-quotes && LEVEL=medium node tools/addExternalInfo.js && yarn prune && yarn check-links && yarn yaml2json && node tools/updateTimestamps",
"yaml2json": "node tools/generateJson.js",
"remove-quotes": "node tools/removeQuotes",
"prune": "node tools/pruneExtraEntries",
"check-links": "node tools/checkLinks",
"precommit": "yarn fetch",
"start-ci": "yarn exec bash -c \"(node tools/distServer.js &) && sleep 10\"",
"stop-old-ci": "node tools/stopOldDistServer.js",
"stop-ci": "yarn exec bash -c \"kill -9 `cat /tmp/ci.pid` >/dev/null 2>/dev/null && rm /tmp/ci.pid \"",
"integration-test": "jest --runInBand --reporters=jest-standard-reporter",
"test": "jest",
"test:CI": "babel-node tools/testCi.js",
"test:watch": "jest --watch",
"analyze-bundle": "babel-node ./tools/analyzeBundle.js"
"check-landscape": "node tools/checkLandscape",
"render-landscape": "node tools/renderLandscape",
"funding": "node tools/fundingForMasterBranch",
"prepare-landscape": "node tools/prepareLandscape.js && node tools/renderItems.js",
"setup-robots": "node tools/sitemap && node tools/addRobots",
"build": "yarn fetch && yarn prepare-landscape && node tools/renderAcquisitions && yarn setup-robots && yarn export-functions && yarn stop-old-ci && yarn start-ci && node tools/parallelWithRetry integration-test check-landscape render-landscape funding && yarn stop-ci",
"export-functions": "node ./tools/exportFunctions",
"latest": "yarn",
"reset-tweet-count": "node tools/resetTweetCount.js",
"prepublish": "cp yarn.lock _yarn.lock",
"postpublish": "rm _yarn.lock || true",
"preview": "yarn fetch && yarn prepare-landscape && yarn export-functions"
},
"author": "CNCF",
"license": "Apache-2.0",
"dependencies": {
"@babel/cli": "7.1.5",
"@babel/core": "7.1.6",
"@babel/node": "7.0.0",
"@babel/plugin-proposal-class-properties": "7.1.0",
"@babel/plugin-proposal-decorators": "7.1.6",
"@babel/plugin-proposal-do-expressions": "7.0.0",
"@babel/plugin-proposal-export-default-from": "7.0.0",
"@babel/plugin-proposal-export-namespace-from": "7.0.0",
"@babel/plugin-proposal-function-bind": "7.0.0",
"@babel/plugin-proposal-function-sent": "7.1.0",
"@babel/plugin-proposal-json-strings": "7.0.0",
"@babel/plugin-proposal-logical-assignment-operators": "7.0.0",
"@babel/plugin-proposal-nullish-coalescing-operator": "7.0.0",
"@babel/plugin-proposal-numeric-separator": "7.0.0",
"@babel/plugin-proposal-optional-chaining": "7.0.0",
"@babel/plugin-proposal-pipeline-operator": "7.0.0",
"@babel/plugin-proposal-throw-expressions": "7.0.0",
"@babel/plugin-syntax-dynamic-import": "7.0.0",
"@babel/plugin-syntax-import-meta": "7.0.0",
"@babel/plugin-transform-async-to-generator": "7.1.0",
"@babel/plugin-transform-react-constant-elements": "7.0.0",
"@babel/plugin-transform-regenerator": "7.0.0",
"@babel/plugin-transform-runtime": "7.1.0",
"@babel/polyfill": "7.0.0",
"@babel/preset-env": "7.1.6",
"@babel/preset-react": "7.0.0",
"@babel/register": "7.0.0",
"@material-ui/core": "3.5.1",
"@material-ui/icons": "3.0.1",
"autoprefixer": "9.3.1",
"babel-core": "7.0.0-bridge.0",
"babel-eslint": "10.0.1",
"babel-jest": "23.6.0",
"babel-loader": "8.0.4",
"babel-plugin-lodash": "3.3.4",
"babel-plugin-root-import": "6.1.0",
"babel-plugin-transform-react-remove-prop-types": "0.4.20",
"babel-polyfill": "6.26.0",
"babel-preset-latest-node": "2.0.0-beta.3",
"bluebird": "3.5.3",
"browser-sync": "2.26.3",
"chalk": "2.4.1",
"change-case": "3.0.2",
"cheerio": "1.0.0-rc.2",
"classnames": "2.2.6",
"colors": "1.3.2",
"comma-number": "2.0.0",
"connect-history-api-fallback": "1.5.0",
"convert-svg-to-png": "0.4.0",
"css-loader": "1.0.1",
"cssnano": "4.1.7",
"current-device": "0.7.8",
"debug": "4.1.0",
"ejs": "2.6.1",
"ejs-loader": "0.3.1",
"eslint": "5.9.0",
"eslint-plugin-import": "2.14.0",
"eslint-plugin-react": "7.11.1",
"eslint-watch": "4.0.2",
"@vercel/ncc": "^0.34.0",
"anchorme": "^2.1.2",
"axios": "^0.27.2",
"bluebird": "3.7.2",
"change-case": "^4.1.2",
"cheerio": "^1.0.0-rc.11",
"colors": "1.4.0",
"debug": "^4.3.4",
"eslint": "latest",
"event-emitter": "0.3.5",
"feed": "2.0.1",
"file-loader": "2.0.0",
"expect-puppeteer": "^6.1.0",
"feed": "^4.2.2",
"format-number": "3.0.0",
"get-contrast-ratio": "^0.2.1",
"git-branch": "2.0.1",
"git-last-commit": "0.3.0",
"history": "4.7.2",
"html-webpack-plugin": "^3.0.7",
"identity-obj-proxy": "3.0.0",
"iframe-resizer": "3.6.3",
"jest": "23.6.0",
"jest-cli": "23.6.0",
"jimp": "^0.2.28",
"js-yaml": "3.12.0",
"jsdom": "13.0.0",
"json-loader": "0.5.7",
"json2csv": "4.3.1",
"lodash-es": "4.17.11",
"millify": "2.0.1",
"mini-css-extract-plugin": "0.4.4",
"minimatch": "3.0.4",
"mockdate": "2.0.2",
"node-sass": "4.10.0",
"object-assign": "4.1.1",
"opn-cli": "4.0.0",
"postcss-loader": "3.0.0",
"prompt": "1.0.0",
"prop-types": "15.6.2",
"puppeteer": "1.10.0",
"query-string": "6.2.0",
"raf": "3.4.1",
"react": "16.6.3",
"react-dom": "16.6.3",
"react-ga": "2.5.3",
"react-hot-loader": "4.3.12",
"react-key-handler": "1.2.0-beta.3",
"react-redux": "5.1.1",
"react-router-dom": "4.3.1",
"react-router-redux": "5.0.0-alpha.8",
"react-test-renderer": "16.6.3",
"react-twitter-widgets": "1.7.1",
"redux": "4.0.1",
"redux-immutable-state-invariant": "2.1.0",
"redux-mock-store": "1.5.3",
"redux-thunk": "2.3.0",
"iframe-resizer": "^4.3.2",
"jest": "^28.1.0",
"jest-cli": "^28.1.0",
"jest-standard-reporter": "^2.0.0",
"js-yaml": "^4.1.0",
"json2csv": "^5.0.7",
"lodash": "^4.17.21",
"node-emoji": "^1.11.0",
"oauth-1.0a": "^2.2.6",
"puppeteer": "^14.2.1",
"query-string": "^7.1.1",
"relative-date": "1.1.3",
"replace": "1.0.0",
"request": "2.88.0",
"request-promise": "4.2.2",
"require-promise": "1.0.1",
"reselect": "4.0.0",
"rimraf": "2.6.2",
"sass-loader": "7.1.0",
"sitemap": "2.1.0",
"string-replace-all": "1.0.3",
"style-loader": "0.23.1",
"terser-webpack-plugin": "1.1.0",
"sanitize-html": "^2.7.0",
"showdown": "^2.1.0",
"sitemap": "^7.1.1",
"svg-autocrop": "^2.0.41",
"traverse": "0.6.6",
"twitter": "1.7.1",
"typeface-roboto": "0.0.54",
"uglifyjs-webpack-plugin": "2.0.1",
"url-loader": "1.1.2",
"webapp-webpack-plugin": "2.3.1",
"webpack": "4.26.0",
"webpack-bundle-analyzer": "3.0.3",
"webpack-dev-middleware": "3.4.0",
"webpack-hot-middleware": "2.24.3",
"webpack-md5-hash": "0.0.6",
"xml2js": "0.4.19",
"yahoo-finance": "0.3.5",
"yaml-loader": "0.5.0"
"yarn": "^1.22.18"
},
"keywords": [],
"keywords": [
"landscape",
"interactive",
"map",
"categories",
"crunchbase",
"github",
"ecosystem",
"stars",
"funding"
],
"repository": {
"type": "git",
"url": "https://github.com/cncf/landscapeapp"
},
"jest": {
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/tools/assetsTransformer.js",
"\\.(css)$": "<rootDir>/tools/assetsTransformer.js"
},
"setupFiles": [
"raf/polyfill"
]
},
"devDependencies": {
"postinstall-prepare": "1.0.1"
}
"packageManager": "yarn@3.2.1"
}

5
postcss.config.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
plugins: [
'postcss-import', 'postcss-simple-vars', 'postcss-nested'
],
};

119
server.js Normal file
View File

@ -0,0 +1,119 @@
// acts as a dev server and a dist server
// netlify does not use this
const projectPath = process.env.PROJECT_PATH;
const http = require('http');
const fs = require('fs');
const path = require('path');
const fnFile = (file) => {
const functionsPath = path.join(projectPath, 'dist', process.env.PROJECT_NAME || '', 'functions' );
const destFile = [process.env.PROJECT_NAME, file].filter(_ => _).join('--');
return path.join(functionsPath, destFile);
}
http.createServer(function (request, response) {
if (request.url.indexOf('/api/ids') !== -1) {
console.log('api request starting...', request.url);
const query = request.url.split('?')[1] || '';
if (!process.env.INLINE_API) {
require('child_process').exec(`node ${fnFile("ids.js")} '${query}'`, {}, function(e, output, err) {
console.info(err);
response.writeHead(200, { 'Content-Type': 'application/json' });
response.end(output);
});
} else {
const output = require('./src/api/ids.js').processRequest(query);
response.writeHead(200, { 'Content-Type': 'application/json' });
response.end(JSON.stringify(output));
}
return;
}
if (request.url.indexOf('/api/export') !== -1) {
console.log('api request starting...', request.url);
const query = request.url.split('?')[1] || '';
if (!process.env.INLINE_API) {
require('child_process').exec(`node ${fnFile("export.js")} '${query}'`, {}, function(e, output, err) {
response.writeHead(200, {
'Content-Type': 'text/css',
'Content-Disposition': 'attachment; filename=interactive-landscape.csv'
});
response.end(output);
});
} else {
const output = require('./src/api/export.js').processRequest(query);
response.writeHead(200, {
'Content-Type': 'text/css',
'Content-Disposition': 'attachment; filename=interactive-landscape.csv'
});
response.end(output);
}
return;
}
let filePath = path.join(process.env.PROJECT_PATH, 'dist', request.url.split('?')[0]);
if (fs.existsSync(path.resolve(filePath, 'index.html'))) {
filePath = path.resolve(filePath, 'index.html');
} else if (fs.existsSync(filePath + '.html')) {
filePath = filePath + '.html'
}
const extname = path.extname(filePath);
let encoding = 'utf-8';
var contentType = 'text/html; charset=utf-8';
switch (extname) {
case '.js':
contentType = 'text/javascript; charset=utf-8';
break;
case '.css':
contentType = 'text/css; charset=utf-8';
break;
case '.json':
contentType = 'application/json; charset=utf-8';
break;
case '.svg':
contentType = 'image/svg+xml; charset=utf-8';
break;
case '.jpg':
contentType = 'image/jpg';
encoding = undefined;
break;
case '.png':
contentType = 'image/png';
encoding = undefined;
break;
case '.pdf':
contentType = 'application/pdf';
encoding = undefined;
break;
}
fs.readFile(filePath, encoding, function(error, content) {
if (error) {
const extraPath = filePath + '.html';
fs.readFile(extraPath, encoding, function(error, content) {
if (error) {
if(error.code == 'ENOENT') {
response.writeHead(200, { 'Content-Type': contentType });
response.end('404. Not found. ', 'utf-8');
} else {
response.writeHead(500);
response.end('Sorry, check with the site admin for error: '+error.code+' ..\n');
response.end();
}
} else {
response.writeHead(200, { 'Content-Type': contentType });
response.end(content, 'utf-8');
}
});
} else {
response.writeHead(200, { 'Content-Type': contentType });
response.end(content, 'utf-8');
}
});
}).listen(process.env.PORT || 8001);
console.log(`Development server running at http://127.0.0.1:${process.env.PORT || 8001}/`);

9
specs/.eslintrc.js Normal file
View File

@ -0,0 +1,9 @@
module.exports = {
globals: {
jest: true,
test: true,
it: true,
describe: true,
expect: true
}
};

View File

@ -1,62 +1,165 @@
import puppeteer from "puppeteer";
import devices from 'puppeteer/DeviceDescriptors';
import { settings } from '../tools/settings'
const port = process.env.PORT || '4000';
const appUrl = `http://localhost:${port}`;
const puppeteer = require("puppeteer");
require('expect-puppeteer');
const { paramCase } = require('change-case');
const { settings } = require('../tools/settings');
const { projects } = require('../tools/loadData');
const { landscapeSettingsList } = require("../src/utils/landscapeSettings");
const { appUrl, pathPrefix } = require('../tools/distSettings');
const width = 1920;
const height = 1080;
let page;
let browser;
let page;
let close = () => test('Closing a browser', async () => await browser.close());
if (process.env.SHOW_BROWSER) {
jest.setTimeout(30000);
}
function mainTest() {
describe("Main test", () => {
test("I visit a main page and have all required elements", async () => {
console.info('about to open a page', appUrl);
await page.goto(appUrl);
console.info('page is open');
//header
await page.waitForXPath(`//h1[text() = '${settings.test.header}']`);
console.info('header is present');
//group headers
await page.waitForXPath(`//a[contains(text(), '${settings.test.section}')]`);
console.info('group headers are ok');
//card
await page.waitForSelector(`.mosaic img[src='./logos/${settings.test.logo}']`);
console.info('there is a kubernetes card');
//click on a card
await page.click(`.mosaic img[src='./logos/${settings.test.logo}']`);
console.info('it is clickable');
//await for a modal
await page.waitForSelector(".modal-content");
console.info('modal appears');
}, 6 * 60 * 1000); //give it up to 1 min to execute
});
}
expect.extend({
async toHaveElement(page, selectorOrXpath) {
const method = selectorOrXpath.slice(0, 2) === '//' ? '$x' : '$$';
const elements = await page[method](selectorOrXpath);
const pass = elements.length > 0;
const message = () => {
return `Element "${selectorOrXpath}" ${this.isNot ? "was not supposed to" : "could not"} be found.`
};
return { pass, message };
},
})
jest.setTimeout(process.env.SHOW_BROWSER ? 30000 : 30000);
describe("Normal browser", function() {
beforeAll(async function() {
browser = await puppeteer.launch({headless: !process.env.SHOW_BROWSER});
page = await browser.newPage();
async function makePage(initialUrl) {
try {
browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox'], headless: !process.env.SHOW_BROWSER});
const page = await browser.newPage();
await page.goto(initialUrl);
await page.setViewport({ width, height });
})
afterAll(async function() {
browser.close();
})
mainTest();
return page;
} catch(ex) {
try {
console.info('retrying...', ex);
browser.close();
} catch(ex2) {
console.info('failed to close browser', ex2);
}
return await makePage(initialUrl);
}
}
async function waitForSelector(page, selector) {
await page.waitForFunction(`document.querySelector('${selector}') && document.querySelector('${selector}').clientHeight != 0`);
}
async function waitForSummaryText(page, text) {
await page.waitForFunction(`document.querySelector('.summary') && document.querySelector('.summary').innerText.includes('${text}')`);
}
async function waitForHeaderText(page, text) {
await page.waitForFunction(`[...document.querySelectorAll('.sh_wrapper')].find( (x) => x.innerText.includes('${text}'))`);
}
// describe("Embed test", () => {
// describe("I visit an example embed page", () => {
// let frame;
// test('page is open and has a frame', async function(){
// page = await makePage(appUrl + '/embed');
// frame = await page.frames()[1];
// await frame.waitForSelector('.cards-section .mosaic');
// await waitForSelector(frame, '#embedded-footer');
// });
// test('Do not see a content from a main mode', async function() {
// const title = await frame.$('h1', { text: settings.test.header })
// expect(await title.boundingBox()).toBe(null)
// });
// // ensure that it is clickable
// test('I can click on a tile in a frame and I get a modal after that', async function() {
// await waitForSelector(frame, ".cards-section .mosaic img");
// await frame.click(`.mosaic img`);
// });
// close();
// }, 6 * 60 * 1000); //give it up to 1 min to execute
// });
describe("Main test", () => {
describe("I visit a main page and have all required elements", () => {
test('I can open a page', async function() {
page = await makePage(appUrl + '/card-mode');
await page.waitForSelector('.cards-section .mosaic');
});
//header
test('A proper header is present', async function() {
await expect(page).toHaveElement(`//h1[text() = '${settings.test.header}']`);
});
test('Group headers are ok', async function() {
await waitForHeaderText(page, settings.test.section);
});
test('I see a You are viewing text', async function() {
await waitForSummaryText(page, 'You are viewing ');
});
test(`A proper card is present`, async function() {
await expect(page).toHaveElement(`.mosaic img[src='${pathPrefix}/logos/${settings.test.logo}']`);
});
test(`If I click on a card, I see a modal dialog`, async function() {
await page.click(`.mosaic img[src='${pathPrefix}/logos/${settings.test.logo}']`);
await waitForSelector(page, ".modal-content .product-logo");
});
close();
}, 6 * 60 * 1000); //give it up to 1 min to execute
});
describe("iPhone simulator", function() {
beforeAll(async function() {
browser = await puppeteer.launch({headless: !process.env.SHOW_BROWSER});
page = await browser.newPage();
await page.emulate(devices['iPhone X'])
})
describe("Landscape Test", () => {
describe("I visit a main landscape page and have all required elements", () => {
test('I open a landscape page and wait for it to load', async function() {
page = await makePage(appUrl);
await page.waitForSelector('.cards-section [data-mode=main]');
});
test('When I click on an item the modal is open', async function() {
await waitForSelector(page, '.cards-section [data-mode=main] [data-id]');
await page.click('.cards-section [data-mode=main] [data-id]');
await waitForSelector(page, ".modal-content .product-logo");
});
afterAll(async function() {
browser.close();
test('If I would straight open the url with a selected id, a modal appears', async function() {
await page.goto(appUrl);
await waitForSelector(page, '.cards-section [data-mode=main] [data-id]');
await page.click('.cards-section [data-mode=main] [data-id]');
await waitForSelector(page, ".modal-content .product-logo");
});
close();
}, 6 * 60 * 1000); //give it up to 1 min to execute
landscapeSettingsList.slice(1).forEach(({ name, basePath, url }) => {
test(`I visit ${name} landscape page and have all required elements, elements are clickable`, async () => {
const page = await makePage(`${appUrl}/${basePath}`);
await waitForSelector(page, `.cards-section [data-mode=${url}] [data-id]`);
await page.click(`.cards-section [data-mode=${url}] [data-id]`);
await waitForSelector(page, ".modal-content .product-logo");
}, 6 * 60 * 1000); //give it up to 1 min to execute
close();
})
mainTest();
});
describe("Filtering by organization", () => {
const project = projects[0];
const organizationSlug = paramCase(project.organization);
const otherProject = projects.find(({ organization }) => organization.toLowerCase() !== project.organization.toLowerCase());
if (otherProject) {
const otherOrganizationSlug = paramCase(otherProject.organization);
test(`Checking we see ${project.name} when filtering by organization ${project.organization}`, async function() {
page = await makePage(`${appUrl}/card-mode?organization=${organizationSlug}`);
await page.waitForSelector('.cards-section .mosaic');
await expect(page).toHaveElement(`//div[contains(@class, 'mosaic')]//*[text()='${project.name}']`);
});
test(`Checking we don't see ${project.name} when filtering by organization ${otherProject.organization}`, async function() {
await page.goto(`${appUrl}/card-mode?organization=${otherOrganizationSlug}`);
await page.waitForSelector('.cards-section .mosaic');
await expect(page).not.toHaveElement(`//div[contains(@class, 'mosaic')]//*[text()='${project.name}']`);
});
}
close();
}, 6 * 60 * 1000);

View File

@ -0,0 +1,63 @@
const { actualTwitter } = require('../../tools/actualTwitter');
describe('Twitter URL', () => {
describe('when crunchbase data not set', () => {
const node = { twitter: 'https://twitter.com/foo' };
test('returns URL from node', async () => {
expect(actualTwitter(node, null)).toBe(node.twitter)
})
});
describe('when node does not have twitter URL', () => {
const crunchbaseData = { twitter: 'https://twitter.com/foo' };
test('returns URL from node', async () => {
expect(actualTwitter({}, crunchbaseData)).toBe(crunchbaseData.twitter)
})
});
describe('when node has twitter URL set to null', () => {
const crunchbaseData = { twitter: 'https://twitter.com/foo' };
const node = { twitter: null };
test('returns undefined', async () => {
expect(actualTwitter(node, crunchbaseData)).toBe(undefined)
})
});
describe('when both node and crunchbase have twitter URL', () => {
const node = { twitter: 'https://twitter.com/main' };
const crunchbaseData = { twitter: 'https://twitter.com/other' };
test('returns URL from node', async () => {
expect(actualTwitter(node, crunchbaseData)).toBe(node.twitter)
})
});
describe('when twitter URL is not set anywhere', () => {
const node = {};
const crunchbaseData = {};
test('returns undefined', async () => {
expect(actualTwitter(node, crunchbaseData)).toBe(undefined)
})
});
describe('cleaning up twitter URL', () => {
test('replaces http with https', async () => {
const node = { twitter: 'http://twitter.com/foo' };
expect(actualTwitter(node)).toBe('https://twitter.com/foo')
});
test('removes www', async () => {
const node = { twitter: 'https://www.twitter.com/foo' };
expect(actualTwitter(node)).toBe('https://twitter.com/foo')
});
test('query string', async () => {
const node = { twitter: 'https://twitter.com/foo?omg' };
expect(actualTwitter(node)).toBe('https://twitter.com/foo')
});
});
});

49
src/api/export.js Normal file
View File

@ -0,0 +1,49 @@
const { flattenItems } = require('../utils/itemsCalculator');
const { getGroupedItems, expandSecondPathItems } = require('../utils/itemsCalculator');
const { parseParams } = require('../utils/routing');
const Parser = require('json2csv/lib/JSON2CSVParser');
const { readJsonFromDist } = require('../utils/readJson');
const allItems = readJsonFromDist('data/items-export');
const projects = readJsonFromDist('data/items');
const processRequest = module.exports.processRequest = query => {
const params = parseParams(query);
const p = new URLSearchParams(query);
params.format = p.get('format');
let items = projects;
if (params.grouping === 'landscape' || params.format !== 'card') {
items = expandSecondPathItems(items);
}
// extract alias - if grouping = category
// extract alias - if params != card-mode (big_picture - always show)
// i.e. make a copy to items here - to get a list of ids
const selectedItems = flattenItems(getGroupedItems({data: items, skipDuplicates: params.format === 'card', ...params}))
.reduce((acc, item) => ({ ...acc, [item.id]: true }), {})
const fields = allItems[0].map(([label]) => label !== 'id' && label).filter(_ => _);
const itemsForExport = allItems
.map(item => item.reduce((acc, [label, value]) => ({ ...acc, [label]: value }), {}))
.filter(item => selectedItems[item.id]);
const json2csvParser = new Parser({ fields });
const csv = json2csvParser.parse(itemsForExport, { fields });
return csv;
}
// Netlify function
module.exports.handler = async function(event) {
const body = processRequest(event.queryStringParameters)
const headers = {
'Content-Type': 'text/css',
'Content-Disposition': 'attachment; filename=interactive-landscape.csv'
};
return { statusCode: 200, body: body, headers }
}
if (__filename === process.argv[1]) {
console.info(processRequest(process.argv[2]), null, 4);
}

41
src/api/ids.js Normal file
View File

@ -0,0 +1,41 @@
const { expandSecondPathItems } = require('../utils/itemsCalculator');
const { getGroupedItems } = require('../utils/itemsCalculator');
const { getSummary, getSummaryText } = require('../utils/summaryCalculator');
const { parseParams } = require('../utils/routing');
const { readJsonFromDist } = require('../utils/readJson');
const projects = readJsonFromDist('data/items');
const processRequest = module.exports.processRequest = query => {
const params = parseParams(query);
const p = new URLSearchParams(query);
params.format = p.get('format');
let items = projects;
if (params.grouping === 'landscape' || params.format !== 'card') {
items = expandSecondPathItems(items);
}
const summary = getSummary({data: items, ...params});
const groupedItems = getGroupedItems({data: items, skipDuplicates: params.format === 'card', ...params })
.map(group => {
const items = group.items.map(({ id }) => ({ id } ))
return { ...group, items }
})
return {
summaryText: getSummaryText(summary),
items: groupedItems
}
}
// Netlify function
module.exports.handler = async function(event) {
const body = processRequest(event.queryStringParameters)
const headers = { 'Content-Type': 'application/json' }
return { statusCode: 200, body: JSON.stringify(body), headers }
}
if (__filename === process.argv[1]) {
console.info(JSON.stringify(processRequest(process.argv[2]), null, 4));
}

35
src/api/items.js Normal file
View File

@ -0,0 +1,35 @@
const { flattenItems, expandSecondPathItems } = require('../utils/itemsCalculator');
const { getGroupedItems } = require('../utils/itemsCalculator');
const { parseParams } = require('../utils/routing');
const { readJsonFromDist } = require('../utils/readJson');
const projects = readJsonFromDist('data/items');
const settings = readJsonFromDist('settings');
const processRequest = module.exports.processRequest = query => {
const params = parseParams({ mainContentMode: 'card-mode', ...query })
// extract alias - if grouping = category
// extract alias - if params != card-mode (big_picture - always show)
// i.e. make a copy to items here - to get a list of ids
let items = projects;
if (params.grouping === 'landscape') {
items = expandSecondPathItems(items);
}
const groupedItems = getGroupedItems({data: items, ...params, skipDuplicates: true})
.map(group => {
const items = group.items.map(({ id, name, href }) => ({ id, name, logo: `${settings.global.website}/${href}` }))
return { ...group, items }
})
return params.grouping === 'no' ? flattenItems(groupedItems) : groupedItems
}
// Netlify function
module.exports.handler = async function(event) {
const body = processRequest(event.queryStringParameters)
const headers = {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': true
}
return { statusCode: 200, body: JSON.stringify(body), headers }
}

View File

@ -1,22 +0,0 @@
import React from 'react';
import { OutboundLink } from 'react-ga';
import settings from 'project/settings.yml';
const Ad = () => {
const entries = settings.ads;
return <div id="kubecon">
{ entries.map( (entry) => (
<OutboundLink className="sidebar-event"
key={entry.image}
eventLabel={entry.url}
to={entry.url}
target="_blank">
<img src={entry.image} />
</OutboundLink>
)) }
</div>
}
export default Ad;

View File

@ -1,43 +0,0 @@
/* eslint-disable import/no-named-as-default */
import React from 'react';
import PropTypes from 'prop-types';
import CssBaseline from '@material-ui/core/CssBaseline';
import { Switch, Route } from 'react-router-dom';
import { MainFullscreenLandscapeContainer, ExtraFullscreenLandscapeContainer } from "./BigPicture";
import HomePageContainer from './HomePageContainer';
import NotFoundPage from './NotFoundPage';
import settings from 'project/settings.yml';
const mainSettings = settings.big_picture.main;
const extraSettings = settings.big_picture.extra;
// detect an initial prefix, like /cncf/ or /lfdl/ , but it can be just /
const possiblePrefix = window.possiblePrefix || '';
const prefix = (possiblePrefix && location.pathname.indexOf(possiblePrefix) === 1) ? (possiblePrefix + '/') : '';
window.prefix = prefix;
// This is a class-based component because the current
// version of hot reloading won't hot reload a stateless
// component at the top-level.
class App extends React.Component {
render() {
return (
<div>
<CssBaseline />
<Switch>
<Route exact path={`/${prefix}`} component={HomePageContainer} />
{ extraSettings && <Route exact path={`/${prefix}${extraSettings.url}`} component={ExtraFullscreenLandscapeContainer}/> }
<Route exact path={`/${prefix}${mainSettings.url}`} component={MainFullscreenLandscapeContainer}/>
<Route path={`/${prefix}`} component={HomePageContainer} />
<Route component={NotFoundPage} />
</Switch>
</div>
);
}
}
App.propTypes = {
children: PropTypes.element
};
export default App;

View File

@ -1,261 +0,0 @@
import React from 'react';
import _ from 'lodash'
import InternalLink from '../InternalLink';
import Fade from '@material-ui/core/Fade';
import fields from '../../types/fields';
const itemWidth = 36;
const itemHeight = 32;
const isLargeFn = function(x) {
const relationInfo = _.find(fields.relation.values, {id: x.relation});
return !!relationInfo.big_picture_order;
}
const Item = function({zoom, item, x, y, isLarge, onSelectItem}) {
if (isLarge) {
return new LargeItem({zoom, item, x, y, onSelectItem});
}
const k = 1;
return <div style={{
cursor: 'pointer',
position: 'absolute',
left: (itemWidth * x) * zoom,
top: (itemHeight * y) * zoom,
width: (itemWidth * k) * zoom,
height: (itemHeight * k) * zoom }}
key={item.id}
>
<img src={item.href} style={{
width: (itemWidth * k - 2) * zoom,
height: (itemHeight * k - 2) * zoom,
margin: 2 * zoom,
padding: 2 * zoom,
border: `${1 * zoom}px solid grey`,
borderRadius: 3 * zoom,
background: item.oss ? '' : '#eee'
}}
onClick={ () => onSelectItem(item.id)}
/>
</div>;
}
const LargeItem = function({zoom, item, x, y, onSelectItem}) {
const k = 2;
const z = function(x) {
return Math.round(x * zoom * 2) / 2;
};
const relationInfo = _.find(fields.relation.values, {id: item.relation});
const color = relationInfo.big_picture_color;
const label = relationInfo.big_picture_label;
return <div style={{
cursor: 'pointer',
position: 'absolute',
border: `${z(2)}px solid ${color}`,
left: (itemWidth * x + 3) * zoom,
top: (itemHeight * y + 3) * zoom,
width: (itemWidth * k) * zoom,
height: (itemHeight * k - 5) * zoom }}
onClick={ () => onSelectItem(item.id)}
key={item.id}
>
<img src={item.href} style={{
width: (itemWidth * k - 2 - 5) * zoom,
height: (itemHeight * k - 9 - 2 - 10) * zoom,
margin: z(2),
padding: z(2)
}} />
<div style={{position: 'absolute', left: 0, right: 0, bottom: 0, height: 10 * zoom, textAlign: 'center', background: color, color: 'white', fontSize: 6.7 * zoom, lineHeight: `${13 * zoom}px`}}>
{label}
</div>
</div>;
}
const HorizontalSubcategory = function({zoom, subcategory, rows, onSelectItem, parentHeight, xRatio }) {
const categoryHeight = rows;
const total = _.sumBy(subcategory.allItems, function(item) {
return isLargeFn(item) ? 4 : 1;
});
const filteredItems = subcategory.items;
let cols = Math.max(Math.ceil(total / categoryHeight ), 2);
// what if we have 3 cols but first 2 items are large items, effectively
// requiring 4 columns?
if (cols % 2 === 1 && subcategory.allItems.slice(0, Math.trunc(cols / 2) + 1).every( (x) => isLargeFn(x))) {
cols += 1;
}
const width = itemWidth * (cols - 1) * xRatio + itemWidth;
const height = itemHeight * categoryHeight;
const offset = (parentHeight - 20 - height) / 2;
let x = 0;
let y = 0;
let busy = {};
return <div style={{ width: width * zoom, height: height * zoom, top: -40 * zoom, marginTop: (20 + offset) * zoom, position: 'relative' }}>
{ subcategory.allItems.map(function(item) {
const isVisible = !! _.find(filteredItems, function(x) { return x.id === item.id });
const isLarge = isLargeFn(item);
const result = {key: item.name, zoom: zoom, item, y: y, x: x, isLarge: isLarge, onSelectItem: onSelectItem};
busy[`${x}:${y}`] = true;
if (isLarge) {
busy[`${x + 1}:${y}`] = true;
busy[`${x}:${y+1}`] = true;
busy[`${x + 1}:${y+1}`] = true;
}
while(busy[`${x}:${y}`]) {
x += 1;
if (x >= cols) {
x = 0;
y += 1;
}
}
return <Fade timeout={1000} in={isVisible}>
{new Item({...result, x: result.x * xRatio})}
</Fade>;
}) }
</div>
};
const VerticalSubcategory = function({zoom, subcategory, cols, onSelectItem, xRatio}) {
const categoryWidth = cols;
const total = _.sumBy(subcategory.allItems, function(item) {
return isLargeFn(item) ? 4 : 1;
});
const filteredItems = subcategory.items;
const raws = Math.ceil(total / categoryWidth );
const height = itemHeight * raws;
const width = itemWidth * categoryWidth;
let x = 0;
let y = 0;
let busy = {};
return <div style={{ left: 5 * zoom, width: width * zoom, height: height * zoom, position: 'relative' }} >
{ subcategory.allItems.map(function(item) {
const isVisible = !! _.find(filteredItems, function(x) { return x.id === item.id });
const isLarge = isLargeFn(item);
const result = {key: item.name, zoom: zoom, item, y: y, x: x, isLarge: isLarge, onSelectItem: onSelectItem};
busy[`${x}:${y}`] = true;
if (isLarge) {
busy[`${x + 1}:${y}`] = true;
busy[`${x}:${y+1}`] = true;
busy[`${x + 1}:${y+1}`] = true;
}
while(busy[`${x}:${y}`]) {
x += 1;
if (x >= categoryWidth) {
x = 0;
y += 1;
}
}
return <Fade timeout={1000} in={isVisible}>
{new Item({...result, x: result.x * xRatio})}
</Fade>;
}) }
</div>
};
const getSubcategoryWidth = function({subcategory, rows}) {
const categoryHeight = rows;
const total = _.sumBy(subcategory.allItems, function(item) {
return isLargeFn(item) ? 4 : 1;
});
const cols = Math.max(Math.ceil(total / categoryHeight ), 2);
const width = itemWidth * cols;
console.info(`Subcategory ${subcategory.name} has a width: ${width}`);
return width;
}
const HorizontalCategory = function({header, subcategories, rows, width, height, top, left, zoom, color, href, onSelectItem, fitWidth}) {
let innerWidth = _.sumBy(subcategories, (subcategory) => getSubcategoryWidth({subcategory, rows}));
if (subcategories.length > 1) {
console.info(`${header} has a width of ${innerWidth}, but expected width is ${width}`);
}
const xRatio = fitWidth ? (width - 50 ) / innerWidth : 1.05;
return (
<div style={{
position: 'absolute', height: height * zoom, margin: 5 * zoom, width: width * zoom, top: (top - 5) * zoom, left: left * zoom
}} className="big-picture-section" >
<div style={{position: 'absolute', top: 20 * zoom, height: (height - 20) * zoom, width: 30 * zoom, opacity: 0.5, zIndex: 10}}>
<InternalLink to={href}>
<div style={{
width: '100%',
height: '100%'
}}></div>
</InternalLink>
</div>
<div style={{transform: 'rotate(-90deg)', width: (height - 20) * zoom, height: 30 * zoom, top: ((height + 20) / 2 - 30 / 2) * zoom, left: (-(height / 2 - 30/2) + 20/2) * zoom, textAlign: 'center', position: 'absolute', background:color, color: 'white', fontSize: 13 * zoom}}>
<div style={{
color: 'white',
fontSize: 12 * zoom,
position: 'absolute',
width: '100%',
transform: 'translate(-50%, -50%)',
left: '50%',
top:'50%'}}>{header}</div>
</div>
<div style={{width: 40 * zoom, display: 'inline-block'}} />
<div style={{position: 'absolute', border: `${1 * zoom}px solid ${color}`, background: 'white', top: 20 * zoom, bottom: 0, left: 30 * zoom, right: 0}}></div>
<div style={{position: 'absolute', top: 20 * zoom, bottom: 0, left: 0, right: 0,
boxShadow: `0 ${4 * zoom}px ${8 * zoom}px 0 rgba(0, 0, 0, 0.2), 0 ${6 * zoom}px ${20 * zoom}px 0 rgba(0, 0, 0, 0.19)`
}}></div>
<div style={{position: 'absolute', left: 35 * zoom, top: 0, right: 10 * zoom, bottom: 0, display: 'flex', justifyContent: 'space-between'}}>
{subcategories.map(function(subcategory, index, all) {
return [
<div key={subcategory.name} style={{position: 'relative', fontSize: `${10 * zoom}px`}}>
<div style={{position: 'relative', width: '100%', height: 40 * zoom, top: -14 * zoom}}>
<span style={{textAlign: 'center', position: 'absolute', width: '100%', minWidth: 100 * zoom, transform: 'translate(-50%, -50%)', left: '50%', top:'50%'}}>
<InternalLink to={subcategory.href}>
<span style={{
color: 'white',
fontSize: 10 * zoom
}}>{subcategory.name}</span>
</InternalLink>
</span>
</div>
<HorizontalSubcategory subcategory={subcategory} rows={rows} zoom={zoom} onSelectItem={onSelectItem} parentHeight={height} xRatio={xRatio} key={subcategory.name}/>
</div>,
index !== all.length - 1 && <div key={index} style={{ top: 40 * zoom, height: `calc(100% - ${50 * zoom}px)`, border: `${Math.max(Math.round(zoom) / 2, 0.5)}px solid #777`, position: 'relative' }}></div>
]
})}
</div>
</div>);
}
const VerticalCategory = function({header, subcategories, cols = 6, top, left, width, height, color, zoom, href, onSelectItem}) {
const xRatio = 1.07;
return (<div style={{}}>
<div style={{
position: 'absolute', top: top -5 * zoom, left: left * zoom, height: height * zoom, margin: 5 * zoom, width: (width + 2) * zoom, background: 'white', border: `${1 * zoom}px solid ${color}`,
boxShadow: `0 ${4 * zoom}px ${8 * zoom}px 0 rgba(0, 0, 0, 0.2), 0 ${6 * zoom}px ${20 * zoom}px 0 rgba(0, 0, 0, 0.19)`
}} className="big-picture-section">
<div style={{ width: width * zoom, height: 20 * zoom, lineHeight: `${20 * zoom}px`, textAlign: 'center', color: 'white', background: color, fontSize: 12 * zoom}}>
<InternalLink to={href}>
<span style={{
color: 'white',
fontSize: 12 * zoom
}}>{header}</span>
</InternalLink>
</div>
{subcategories.map(function(subcategory) {
return <div key={subcategory.name} style={{position: 'relative'}}>
<div style={{ fontSize: 10 * zoom, lineHeight: `${15 * zoom}px`, textAlign: 'center', color: color}}>
<InternalLink to={subcategory.href}>
<span style={{
color: color,
fontSize: 10 * zoom
}}>{subcategory.name}</span>
</InternalLink>
</div>
<VerticalSubcategory subcategory={subcategory} zoom={zoom} cols={cols} onSelectItem={onSelectItem} xRatio={xRatio} />
</div>
})}
</div>
</div>);
}
export {
HorizontalCategory,
VerticalCategory
};

View File

@ -1,18 +0,0 @@
import { connect } from 'react-redux';
import qs from 'query-string';
import FullscreenLandscape from './FullscreenLandscape';
import { bigPictureMethods } from '../../utils/itemsCalculator';
import settings from 'project/settings.yml'
const extraSettings = settings.big_picture.extra;
const mapStateToProps = (state) => ({
ready: state.main.ready,
groupedItems: state.main.ready && bigPictureMethods[extraSettings.method](state),
landscapeSettings: settings.big_picture.extra,
showPreview:location.search.indexOf('preview') === -1,
version:qs.parse(location.search).version
});
const mapDispatchToProps = {
};
export default connect(mapStateToProps, mapDispatchToProps)(FullscreenLandscape);

View File

@ -1,21 +0,0 @@
import { connect } from 'react-redux';
import LandscapeContent from './LandscapeContent';
import { changeSelectedItemId, changeMainContentMode } from '../../reducers/mainReducer';
import { getGroupedItemsForBigPicture } from '../../utils/itemsCalculator';
import settings from 'project/settings.yml'
const mainSettings = settings.big_picture.main;
const extraSettings = settings.big_picture.extra || {};
const mapStateToProps = (state) => ({
groupedItems: getGroupedItemsForBigPicture(state),
zoom: state.main.zoom,
landscapeSettings: extraSettings,
showPreview: true
});
const mapDispatchToProps = {
onSelectItem: changeSelectedItemId,
switchToOther: () => changeMainContentMode(mainSettings.url)
};
export default connect(mapStateToProps, mapDispatchToProps)(LandscapeContent);

View File

@ -1,24 +0,0 @@
// locate zoom buttons
import IconButton from '@material-ui/core/IconButton';
import FullscreenExitIcon from '@material-ui/icons/FullscreenExit';
import FullscreenIcon from '@material-ui/icons/Fullscreen';
import React from 'react';
const FullscreenButton = function({isVisible, isFullscreen, enableFullscreen, disableFullscreen}) {
if (!isVisible) {
return null;
}
return <div className="fullscreen-button" style={{position:'absolute', zIndex: 7, display: 'inline-block', width: 40}}>
{ isFullscreen ?
<IconButton onClick={disableFullscreen}>
<FullscreenExitIcon />
</IconButton>
:
<IconButton onClick={enableFullscreen} >
<FullscreenIcon />
</IconButton>
}
</div>
}
export default FullscreenButton;

View File

@ -1,16 +0,0 @@
import { connect } from 'react-redux';
import FullscreenButton from './FullscreenButton';
import { makeFullscreenEnabled, makeFullscreenDisabled} from '../../reducers/mainReducer';
const mapStateToProps = (state) => ({
isFullscreen: state.main.isFullscreen,
isVisible: state.main.mainContentMode !== 'card'
});
const mapDispatchToProps = {
enableFullscreen: makeFullscreenEnabled,
disableFullscreen: makeFullscreenDisabled
};
export default connect(mapStateToProps, mapDispatchToProps)(FullscreenButton);

View File

@ -1,69 +0,0 @@
import React from 'react';
import LandscapeContent from './LandscapeContent';
import HomePageUrlContainer from '../HomePageUrlContainer';
import qs from 'query-string';
const Fullscreen = ({ready, groupedItems, landscapeSettings, showPreview, version}) => {
if (!ready) {
return (
<div>
<HomePageUrlContainer />
</div>
)
}
return (
<div style={{zoom: 4, fontFamily: 'roboto'}}>
<HomePageUrlContainer />
<div className="gradient-bg" style={{
width: landscapeSettings.fullscreen_size.width,
height: landscapeSettings.fullscreen_size.height,
position: 'relative'}}>
<LandscapeContent style={{top: 50, left: 20}} groupedItems={groupedItems} zoom={1} showPreview={showPreview} landscapeSettings={landscapeSettings} />
<div style={{
position: 'absolute',
top: 15,
left: '50%',
transform: 'translateX(-50%)',
fontSize: 18,
background: 'rgb(64,89,163)',
color: 'white',
paddingLeft: 20,
paddingRight: 20,
paddingTop: 3,
paddingBottom: 3,
borderRadius: 5
}}>{landscapeSettings.fullscreen_header}</div>
<div style={{
position: 'absolute',
top: 15,
right: 12,
fontSize: 6,
background: '#eee',
color: 'rgb(100,100,100)',
paddingLeft: 20,
paddingRight: 20,
paddingTop: 3,
paddingBottom: 3,
borderRadius: 5
}}>Greyed logos are not open source</div>
<div style={{
position: 'absolute',
top: 10,
left: 15,
fontSize: 14,
color: 'white',
}}>{landscapeSettings.title} </div>
<div style={{
position: 'absolute',
top: 30,
left: 15,
fontSize: 12,
color: '#eee',
}}>{version}</div>
</div>
</div>
);
};
export default Fullscreen;

View File

@ -1,44 +0,0 @@
import React from 'react';
import _ from 'lodash';
import {HorizontalCategory, VerticalCategory } from './Elements';
import LandscapeInfo from './LandscapeInfo';
import OtherLandscapeLink from './OtherLandscapeLink';
const LandscapeContent = ({groupedItems, onSelectItem, style, showPreview, switchToOther, zoom, landscapeSettings }) => {
const elements = landscapeSettings.elements.map(function(element) {
if (element.type === 'HorizontalCategory') {
const cat = _.find(groupedItems, {key: element.category});
return <HorizontalCategory {...cat} {..._.pick(element, ['rows','width','height','top','left','color']) }
fitWidth={element.fit_width}
zoom={zoom}
onSelectItem={onSelectItem}
/>
}
if (element.type === 'VerticalCategory') {
const cat = _.find(groupedItems, {key: element.category});
return <VerticalCategory {...cat} {..._.pick(element, ['cols','width','height','top','left','color']) }
zoom={zoom}
onSelectItem={onSelectItem}
/>
}
if (element.type === 'OtherLandscapeLink') {
return <OtherLandscapeLink {..._.pick(element, ['width','height','top','left','color', 'layout', 'title', 'url']) }
zoom={zoom}
showPreview={showPreview}
onClick={switchToOther}
/>
}
if (element.type === 'LandscapeInfo') {
return <LandscapeInfo {..._.pick(element, ['width', 'height', 'top', 'left']) } childrenInfo={element.children}
zoom={zoom}
/>
}
return null;
});
return (<div style={{...style, position: 'relative', ...landscapeSettings.size }}>
{elements}
</div>);
};
export default LandscapeContent;

View File

@ -1,50 +0,0 @@
import React from 'react';
import _ from 'lodash';
const LandscapeInfo = ({zoom, width, height, top, left, childrenInfo}) => {
const children = childrenInfo.map(function(info) {
const positionProps = {
position: 'absolute',
top: _.isUndefined(info.top) ? null : info.top * zoom,
left: _.isUndefined(info.left) ? null : info.left * zoom,
right: _.isUndefined(info.right) ? null : info.right * zoom,
bottom: _.isUndefined(info.bottom) ? null : info.bottom * zoom ,
width: _.isUndefined(info.width) ? null : info.width * zoom,
height: _.isUndefined(info.height) ? null : info.height * zoom
};
if (info.type === 'text') {
return <div style={{
...positionProps,
fontSize: info.font_size * zoom,
fontStyle: 'italic',
textAlign: 'justify'
}}> {info.text} </div>
}
if (info.type === 'title') {
return <div style= {{
...positionProps,
fontSize: info.font_size * zoom,
color: '#666'
}}>{info.title}</div>
}
if (info.type === 'image') {
return <img src={`/images/${info.image}`} style={{
...positionProps
}} />
}
});
return <div style={{
position: 'absolute',
width: width * zoom,
height: (height - 20) * zoom,
top: top * zoom,
left: left * zoom,
border: `${1 * zoom}px solid black`,
background: 'white',
borderRadius: 15 * zoom,
marginTop: 20 * zoom,
boxShadow: `0 ${4 * zoom}px ${8 * zoom}px 0 rgba(0, 0, 0, 0.2), 0 ${6 * zoom}px ${20 * zoom}px 0 rgba(0, 0, 0, 0.19)`
}}>{children}</div>
}
export default LandscapeInfo;

View File

@ -1,18 +0,0 @@
import { connect } from 'react-redux';
import qs from 'query-string';
import FullscreenLandscape from './FullscreenLandscape';
import { bigPictureMethods } from '../../utils/itemsCalculator';
import settings from 'project/settings.yml'
const mainSettings = settings.big_picture.main;
const mapStateToProps = (state) => ({
ready: state.main.ready,
groupedItems: state.main.ready && bigPictureMethods[mainSettings.method](state),
landscapeSettings: settings.big_picture.main,
showPreview:location.search.indexOf('preview') === -1,
version:qs.parse(location.search).version
});
const mapDispatchToProps = {
};
export default connect(mapStateToProps, mapDispatchToProps)(FullscreenLandscape);

View File

@ -1,21 +0,0 @@
import { connect } from 'react-redux';
import LandscapeContent from './LandscapeContent';
import { changeSelectedItemId, changeMainContentMode } from '../../reducers/mainReducer';
import { getGroupedItemsForBigPicture } from '../../utils/itemsCalculator';
import settings from 'project/settings.yml'
const mainSettings = settings.big_picture.main;
const extraSettings = settings.big_picture.extra || {};
const mapStateToProps = (state) => ({
groupedItems: getGroupedItemsForBigPicture(state),
zoom: state.main.zoom,
landscapeSettings: mainSettings,
showPreview: true
});
const mapDispatchToProps = {
onSelectItem: changeSelectedItemId,
switchToOther: () => changeMainContentMode(extraSettings.url)
};
export default connect(mapStateToProps, mapDispatchToProps)(LandscapeContent);

View File

@ -1,30 +0,0 @@
import React from 'react';
const OtherLandscapeLink = function({zoom, top, left, height, width, color, showPreview, onClick, title, url, layout}) {
if (layout === 'category') {
return (<div style={{
position: 'absolute', top: (top - 5) * zoom, left: left * zoom, height: height * zoom, margin: 5 * zoom, width: (width + 2) * zoom, background: 'white', border: `${1 * zoom}px solid ${color}`,
cursor: 'pointer',
boxShadow: `0 ${4 * zoom}px ${8 * zoom}px 0 rgba(0, 0, 0, 0.2), 0 ${6 * zoom}px ${20 * zoom}px 0 rgba(0, 0, 0, 0.19)`
}} onClick={onClick} >
<div style={{ width: width * zoom, height: 20 * zoom, lineHeight: `${20 * zoom}px`, textAlign: 'center', color: 'white', background: color, fontSize: 12 * zoom}}> {title} </div>
{ showPreview &&
<div style={{ width: (width - 10) * zoom, height: (height - 40) * zoom, margin: 5 * zoom,
backgroundImage: `url("/images/${url}_preview.png")`, backgroundSize: 'contain', backgroundPosition: 'center', backgroundRepeat: 'no-repeat' }}></div>
}
</div>);
}
if (layout === 'subcategory') {
return (<div style={{
position: 'absolute', top: (top -5) * zoom, left: left * zoom, height: height * zoom, margin: 5 * zoom, width: (width + 2) * zoom,
cursor: 'pointer',
}} onClick={onClick} >
<div style={{ width: width * zoom, height: 20 * zoom, lineHeight: `${20 * zoom}px`, textAlign: 'center', color: 'white', fontSize: 11 * zoom}}> {title}</div>
{ showPreview &&
<div style={{ width: (width - 10) * zoom, height: (height - 40) * zoom, margin: 5 * zoom,
backgroundImage: `url("/images/${url}_preview.png")`, backgroundSize: 'contain', backgroundPosition: 'center', backgroundRepeat: 'no-repeat' }}></div>
}
</div>);
}
}
export default OtherLandscapeLink;

View File

@ -1,23 +0,0 @@
import React from 'react';
import Tabs from '@material-ui/core/Tabs';
import Tab from '@material-ui/core/Tab';
import InternalLink from '../InternalLink';
import isEmbed from '../../utils/isEmbed';
const SwitchButton = function({mainContentMode, changeMainContentMode, cards}) {
if (isEmbed) {
return null;
}
return <Tabs
className="big-picture-switch"
value={mainContentMode}
indicatorColor="primary"
textColor="primary"
onChange={(_event, value) => changeMainContentMode(value)}
>
{ cards.map(function(card) {
return <Tab key={card.mode} label={card.title} component={(props) => <InternalLink to={card.url} {...props}></InternalLink>} value={card.mode} />
}) }
</Tabs>
}
export default SwitchButton;

View File

@ -1,25 +0,0 @@
import { connect } from 'react-redux';
import SwitchButton from './SwitchButton';
import { changeMainContentMode } from '../../reducers/mainReducer.js';
import { filtersToUrl } from '../../utils/syncToUrl';
import settings from 'project/settings.yml';
import _ from 'lodash';
const mainCard = [{ title: 'Card Mode', mode: 'card'}];
const landscapes = _.map(settings.big_picture, function(section) {
return {
title: section.name,
mode: section.url
}
});
const cards = mainCard.concat(landscapes);
const mapStateToProps = (state) => ({
mainContentMode: state.main.mainContentMode,
cards: cards.map( (card) => ({ ...card, url: filtersToUrl({filters: state.main.filters, grouping: state.main.grouping, sortField: state.main.sortField, mainContentMode: card.mode})})),
});
const mapDispatchToProps = {
changeMainContentMode: changeMainContentMode
};
export default connect(mapStateToProps, mapDispatchToProps)(SwitchButton);

View File

@ -1,10 +0,0 @@
// locate zoom buttons
import React from 'react';
const Zoom = function({zoom, children}) {
return <div style={{position:'relative', zoom: zoom}}>
{children}
</div>
}
export default Zoom;

View File

@ -1,20 +0,0 @@
// locate zoom buttons
import IconButton from '@material-ui/core/IconButton';
import Button from '@material-ui/core/Button';
import RemoveCircleIcon from '@material-ui/icons/RemoveCircle';
import AddCircleIcon from '@material-ui/icons/AddCircle';
import React from 'react';
const ZoomButtons = function({canZoomIn, canZoomOut, zoomText, onZoomIn, onZoomOut, onZoomReset}) {
return <div className="zoom-buttons" style={{position:'absolute'}}>
<IconButton disabled={!canZoomOut} onClick={onZoomOut}>
<RemoveCircleIcon />
</IconButton>
<Button onClick={onZoomReset}>{zoomText}</Button>
<IconButton disabled={!canZoomIn} onClick={onZoomIn}>
<AddCircleIcon />
</IconButton>
</div>
}
export default ZoomButtons;

View File

@ -1,19 +0,0 @@
import { connect } from 'react-redux';
import ZoomButtons from './ZoomButtons';
import { makeZoomIn, makeZoomOut, makeZoomReset} from '../../reducers/mainReducer';
import { zoomLevels } from '../../utils/zoom';
const mapStateToProps = (state) => ({
canZoomOut: state.main.zoom !== zoomLevels[0],
canZoomIn: state.main.zoom !== zoomLevels.slice(-1)[0],
zoomText: Math.round(state.main.zoom * 100) + '%'
});
const mapDispatchToProps = {
onZoomIn: makeZoomIn,
onZoomOut: makeZoomOut,
onZoomReset: makeZoomReset
};
export default connect(mapStateToProps, mapDispatchToProps)(ZoomButtons);

View File

@ -1,10 +0,0 @@
import { connect } from 'react-redux';
import Zoom from './Zoom';
const mapStateToProps = (state) => ({
zoom: state.main.zoom
});
const mapDispatchToProps = {};
export default connect(mapStateToProps, mapDispatchToProps)(Zoom);

View File

@ -1,19 +0,0 @@
import MainLandscapeContentContainer from './MainLandscapeContentContainer';
import ExtraLandscapeContentContainer from './ExtraLandscapeContentContainer';
import SwitchButtonContainer from './SwitchButtonContainer';
import ZoomContainer from './ZoomContainer';
import ZoomButtonsContainer from './ZoomButtonsContainer';
import MainFullscreenLandscapeContainer from './MainFullscreenLandscapeContainer';
import ExtraFullscreenLandscapeContainer from './ExtraFullscreenLandscapeContainer';
import FullscreenButtonContainer from './FullscreenButtonContainer';
export {
MainLandscapeContentContainer,
ExtraLandscapeContentContainer,
SwitchButtonContainer,
ZoomContainer,
ZoomButtonsContainer,
MainFullscreenLandscapeContainer,
ExtraFullscreenLandscapeContainer,
FullscreenButtonContainer
}

View File

@ -0,0 +1,64 @@
const _ = require('lodash');
const { assetPath } = require('../utils/assetPath');
const { millify, h } = require('../utils/format');
const { fields } = require('../types/fields');
function getRelationStyle(relation) {
const relationInfo = fields.relation.valuesMap[relation]
if (relationInfo && relationInfo.color) {
return `border: 4px solid ${relationInfo.color};`;
} else {
return '';
}
}
module.exports.renderDefaultCard = function renderDefaultCard({item}) {
return `
<div data-id="${h(item.id)}" class="mosaic-wrap">
<div class="mosaic ${item.oss ? '' : 'nonoss' }" style="${getRelationStyle(item.relation)}">
<div class="logo_wrapper">
<img loading="lazy" src="${assetPath(item.href)}" class="logo" max-height="100%" max-width="100%" alt="${h(item.name)}" />
</div>
<div class="mosaic-info">
<div class="mosaic-title">
<h5>${h(item.name)}</h5>
${h(item.organization)}
</div>
<div class="mosaic-stars">
${_.isNumber(item.stars) && item.stars ?
`<div>
<span></span>
<span>${h(item.starsAsText)}</span>
</div>` : ''
}
${Number.isInteger(item.amount) ?
`<div class="mosaic-funding">${item.amountKind === 'funding' ? 'Funding: ': 'MCap: '} ${'$'+ h(millify(item.amount))}</div>` : ''
}
</div>
</div>
</div>
</div>
`;
}
module.exports.renderFlatCard = function renderFlatCard({item}) {
return `
<div data-id="${item.id}" class="mosaic-wrap">
<div class="mosaic">
<img loading="lazy" src="${assetPath(item.href)}" class="logo" alt="${h(item.name)}" />
<div class="separator"></div>
<h5>${h(item.flatName)}</h5>
</div>
</div>
`;
}
module.exports.renderBorderlessCard = function renderBorderlessCard({item}) {
return `
<div data-id="${item.id}" class="mosaic-wrap">
<div class="mosaic">
<img loading="lazy" src="${assetPath(item.href)}" class="logo" alt="${h(item.name)}" />
</div>
</div>
`;
}

View File

@ -0,0 +1,40 @@
const getContrastRatio = require('get-contrast-ratio').default;
const { h } = require('../utils/format');
const { renderGuideLink } = require('./GuideLink');
const { categoryTitleHeight } = require('../utils/landscapeCalculations');
module.exports.renderCategoryHeader = function renderCategoryHeader({ href, label, guideAnchor, background, rotate = false }) {
const lowContrast = getContrastRatio('#ffffff', background) < 4.5
const color = lowContrast ? '#282828' : '#ffffff'
const backgroundColor = lowContrast ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)'
return `
<a data-type="internal"
href="${href}"
style="
display: flex;
justify-content: center;
align-items: center;
text-align: center;
width: 100%;
flex: 1;
font-size: 12px;
color: ${color};
background: none
"
>${h(label)}</a>
${ guideAnchor ? renderGuideLink({label, anchor: guideAnchor, style: `
width: ${categoryTitleHeight - 4}px;
height: ${categoryTitleHeight - 4}px;
margin: 2px;
display: flex;
justify-content: center;
align-items: center;
font-size: 18px;
color: ${color};
background: ${backgroundColor};
transform: ${rotate ? 'rotate(180deg)' : 'none' };
`}) : '' }
`;
}

View File

@ -1,32 +0,0 @@
import React from 'react';
import FormGroup from '@material-ui/core/FormGroup';
import FormControlLabel from '@material-ui/core/FormControlLabel';
import Checkbox from '@material-ui/core/Checkbox';
const CheckboxSelector = ({value, options, onChange}) => {
const valueOf = function(checkbox) {
return value.indexOf(checkbox) !== -1;
};
const handleCheckboxChange = function(checkbox, checked) {
console.info(checkbox, checked);
if (checked) {
onChange(value.concat([checkbox]));
} else {
onChange(value.filter(function(x) { return x !== checkbox; }))
}
};
return <FormGroup>
{ options.map( (el) => (
<FormControlLabel key={el.id} control={
<Checkbox onClick={function() {
handleCheckboxChange(el.id, !valueOf(el.id));
}}
checked={valueOf(el.id)}
/>
} label={el.label}
/>
)) }
</FormGroup>
};
export default CheckboxSelector;

View File

@ -1,40 +0,0 @@
import React from 'react';
import MenuItem from '@material-ui/core/MenuItem';
import Select from '@material-ui/core/Select';
import Checkbox from '@material-ui/core/Checkbox';
import ListItemText from '@material-ui/core/ListItemText';
const idToValue = (id) => id !== null ? id : 'any';
const valueToId = (value) => value === 'any' ? null : value;
const ComboboxSelector = ({value, options, onChange}) => {
const renderValue = function(selected) {
console.info(selected);
if (selected.length === 0) {
return 'Any';
}
return selected.join(', ');
}
return <Select
multiple
style={{width:175, fontSize:'0.8em'}}
value={idToValue(value)}
onChange={(e) => onChange(valueToId(e.target.value))}
renderValue={renderValue }
displayEmpty
>
{ options.map( (el) => (
<MenuItem key={idToValue(el.id)}
value={idToValue(el.id)}
style={{height:5}}
>
<Checkbox color="primary" disableRipple checked={value.indexOf(el.id) !== -1} />
<ListItemText disableTypography style={{fontSize:'0.8em'}} primary={el.label}/>
</MenuItem>
)) }
</Select>
};
export default ComboboxSelector;

View File

@ -1,23 +0,0 @@
import React from 'react';
import MenuItem from '@material-ui/core/MenuItem';
import Select from '@material-ui/core/Select';
const idToValue = (id) => id !== null ? id : 'any';
const valueToId = (value) => value === 'any' ? null : value;
const ComboboxSelector = ({value, options, onChange}) => {
return <Select
style={{width:175, fontSize:'0.8em'}}
value={idToValue(value)}
onChange={(e) => onChange(valueToId(e.target.value))}
>
{ options.map( (el) => (
<MenuItem key={idToValue(el.id)}
value={idToValue(el.id)}
style={{height:5, fontSize:'0.8em'}}>{el.label}</MenuItem>
)) }
</Select>
};
export default ComboboxSelector;

View File

@ -1,143 +0,0 @@
import * as React from 'react';
import isMobile from '../utils/isMobile';
export default class AutoSizer extends React.PureComponent {
static defaultProps = {
onResize: () => {},
disableHeight: false,
disableWidth: false,
style: {},
};
state = {
height: this.props.defaultHeight || 0,
width: this.props.defaultWidth || 0,
};
componentDidMount() {
if (
this._autoSizer &&
this._autoSizer.parentNode &&
this._autoSizer.parentNode.ownerDocument &&
this._autoSizer.parentNode.ownerDocument.defaultView &&
this._autoSizer.parentNode instanceof
this._autoSizer.parentNode.ownerDocument.defaultView.HTMLElement
) {
// Delay access of parentNode until mount.
// This handles edge-cases where the component has already been unmounted before its ref has been set,
// As well as libraries like react-lite which have a slightly different lifecycle.
this._parentNode = this._autoSizer.parentNode;
// Defer requiring resize handler in order to support server-side rendering.
// See issue #41
this._onResize();
this._timerId = setInterval( () => this._onResize(), 1000);
}
}
componentWillUnmount() {
if (this._detectElementResize && this._parentNode) {
this._detectElementResize.removeResizeListener(
this._parentNode,
this._onResize,
);
}
clearTimeout(this._timerId);
}
render() {
const {
children,
className,
disableHeight,
disableWidth,
style,
} = this.props;
const {height, width} = this.state;
// Outer div should not force width/height since that may prevent containers from shrinking.
// Inner component should overflow and use calculated width/height.
// See issue #68 for more information.
const outerStyle = {overflow: 'visible'};
const childParams = {};
if (!disableHeight) {
outerStyle.height = 0;
childParams.height = height;
}
if (!disableWidth) {
outerStyle.width = 0;
childParams.width = width;
}
/**
* TODO: Avoid rendering children before the initial measurements have been collected.
* At best this would just be wasting cycles.
* Add this check into version 10 though as it could break too many ref callbacks in version 9.
* Note that if default width/height props were provided this would still work with SSR.
if (
height !== 0 &&
width !== 0
) {
child = children({ height, width })
}
*/
return (
<div
className={className}
ref={this._setRef}
style={{
...outerStyle,
...style,
}}>
{children(childParams)}
</div>
);
}
_onResize = () => {
const {disableHeight, disableWidth, onResize} = this.props;
if (this._parentNode) {
// Guard against AutoSizer component being removed from the DOM immediately after being added.
// This can result in invalid style values which can result in NaN values if we don't handle them.
// See issue #150 for more context.
const style = window.getComputedStyle(this._parentNode) || {};
const paddingLeft = parseInt(style.paddingLeft, 10) || 0;
const paddingRight = parseInt(style.paddingRight, 10) || 0;
const paddingTop = parseInt(style.paddingTop, 10) || 0;
const paddingBottom = parseInt(style.paddingBottom, 10) || 0;
const height = window.innerHeight;
const width = window.innerWidth;
const rect = this._parentNode.getBoundingClientRect();
const isFullscreen = document.querySelector('html').classList.contains('fullscreen');
const offset = isMobile ? 10 : isFullscreen ? 0 : 25;
const newHeight = height - paddingTop - paddingBottom - rect.bottom + offset;
const newWidth = width - paddingLeft - paddingRight - rect.left;
if (
(!disableHeight && this.state.height !== newHeight) ||
(!disableWidth && this.state.width !== newWidth)
) {
this.setState({
height: newHeight,
width: newWidth
});
onResize({height, width});
}
}
};
_setRef = (autoSizer) => {
this._autoSizer = autoSizer;
};
}

View File

@ -1,35 +0,0 @@
import { Component } from 'react';
export default class DelayRender extends Component {
constructor() {
super();
this.state = { ready: true };
}
componentWillMount() {
const delay = this.props.delay || 1000;
const d = parseInt(delay, 10);
if (d && d > 0) {
this.setState({ ready: false });
this.timeout = setTimeout(() => {
this.setState({ ready: true });
}, delay);
} else {
this.setState({ ready: true });
}
}
componentWillUnmount() {
if (this.timeout) {
clearTimeout(this.timeout);
}
}
render() {
if (this.state.ready) {
const content = this.props.content();
return content;
}
return null;
}
}

View File

@ -0,0 +1,64 @@
const _ = require('lodash');
// Render only for an export
const { saneName } = require('../utils/saneName');
const { h } = require('../utils/format');
const { getGroupedItems, expandSecondPathItems } = require('../utils/itemsCalculator');
const { parseParams } = require('../utils/routing');
const { renderDefaultCard, renderBorderlessCard, renderFlatCard } = require('./CardRenderer');
const icons = require('../utils/icons');
module.exports.render = function({items, exportUrl}) {
const params = parseParams(exportUrl.split('?').slice(-1)[0]);
if (params.grouping === 'landscape') {
items = expandSecondPathItems(items);
}
const groupedItems = getGroupedItems({data: items, ...params})
const cardStyle = params.cardStyle || 'default';
const cardFn = cardStyle === 'borderless' ? renderBorderlessCard : cardStyle === 'flat' ? renderFlatCard : renderDefaultCard;
const linkUrl = exportUrl.replace('&embed=yes', '').replace('embed=yes', '')
const result = `
<div class="modal" style="display: none;">
<div class="modal-shadow"></div>
<div class="modal-container">
<div class="modal-body">
<div class="modal-buttons">
<a class="modal-close">x</a>
<span class="modal-prev">${icons.prev}</span>
<span class="modal-next">${icons.next}</span>
</div>
<div class="modal-content"></div>
</div>
</div>
</div>
<div id="home" class="app ${cardStyle}-mode">
<div class="app-overlay"></div>
<div class="main-parent">
<div class="app-overlay"></div>
<div class="main">
<div class="cards-section">
<div class="column-content" >
${ groupedItems.map( (groupedItem) => {
const uniqItems = _.uniqBy(groupedItem.items, (x) => x.name + x.logo);
const cardElements = uniqItems.map( (item) => cardFn({item}));
const header = items.length > 0 ? `
<div class="sh_wrapper" data-wrapper-id="${h(saneName(groupedItem.header))}">
<div style="font-size: 24px; padding-left: 16px; line-height: 48px; font-weight: 500;">
<span>${h(groupedItem.header)}</span>
<span class="items-cont">&nbsp;(${uniqItems.length})</span>
</div>
</div>` : '';
return [ header, `<div data-section-id="${h(saneName(groupedItem.header))}">${cardElements.join('')}</div>`].join('');
}) }
</div>
</div>
<div id="embedded-footer">
<h1 style="margin-top: 20px; width: 100%; text-align: center;">
<a data-type="external" target="_blank" href="${linkUrl}">View</a> the full interactive landscape
</h1>
</div>
</div>
</div>
</div>`;
return result;
};

View File

@ -1,8 +0,0 @@
import React from 'react';
const EmbeddedFooter = () => {
const originalLink = window.location.pathname.replace('&embed=yes', '').replace('&embed=true', '');
return <h1 style={{ marginTop: 20, width: '100%', textAlign: 'center' }}>
<a target="_blank" href={originalLink}>View</a> the full interactive landscape
</h1>
}
export default EmbeddedFooter;

View File

@ -1,11 +0,0 @@
import React from 'react';
import SystemUpdateIcon from '@material-ui/icons/SystemUpdate';
const ExportCsv = ({onExport}) => {
return (
<div className="filters-action" onClick={()=>onExport()} aria-label="Download as CSV">
<SystemUpdateIcon /><span>Download as CSV</span>
</div>
);
};
export default ExportCsv;

View File

@ -1,12 +0,0 @@
import { connect } from 'react-redux';
import ExportCsv from './ExportCsv';
import { exportCsv } from '../reducers/mainReducer.js';
const mapStateToProps = () => ({
});
const mapDispatchToProps = {
onExport: exportCsv
};
export default connect(mapStateToProps, mapDispatchToProps)(ExportCsv);

View File

@ -1,53 +0,0 @@
import React from 'react';
import FormGroup from '@material-ui/core/FormGroup';
import FormControl from '@material-ui/core/FormControl';
import FormLabel from '@material-ui/core/FormLabel';
import ProjectFilterContainer from './ProjectFilterContainer';
import LicenseFilterContainer from './LicenseFilterContainer';
import OrganizationFilterContainer from './OrganizationFilterContainer';
import HeadquartersFilterContainer from './HeadquartersFilterContainer';
import LandscapeFilterContainer from './LandscapeFilterContainer';
import fields from '../types/fields';
const Filters = () => {
return <div>
<FormGroup row>
<FormControl component="fieldset">
<FormLabel component="legend">{fields.landscape.label}</FormLabel>
<LandscapeFilterContainer/>
</FormControl>
</FormGroup>
<FormGroup row>
<FormControl component="fieldset">
<FormLabel component="legend">{fields.relation.label}</FormLabel>
<ProjectFilterContainer/>
</FormControl>
</FormGroup>
<FormGroup row>
<FormControl component="fieldset">
<FormLabel component="legend">{fields.license.label}</FormLabel>
<LicenseFilterContainer />
</FormControl>
</FormGroup>
<FormGroup row>
<FormControl component="fieldset">
<FormLabel component="legend">{fields.organization.label}</FormLabel>
<OrganizationFilterContainer />
</FormControl>
</FormGroup>
<FormGroup row>
<FormControl component="fieldset">
<FormLabel component="legend">{fields.headquarters.label}</FormLabel>
<HeadquartersFilterContainer />
</FormControl>
</FormGroup>
</div>;
}
export default Filters;

View File

@ -1,10 +0,0 @@
import React from 'react';
import { OutboundLink } from 'react-ga';
import settings from 'project/settings.yml'
const Footer = () => {
return <div style={{ marginTop: 10, fontSize:'9pt', width: '100%', textAlign: 'center' }}>
Crunchbase data is used under license from Crunchbase to {settings.global.short_name}. For more information, please see the <OutboundLink eventLabel="crunchbase-terms" to={`https://github.com/${settings.global.repo}/blob/master/README.md#license`} target="_blank">license</OutboundLink> info.
</div>
}
export default Footer;

View File

@ -0,0 +1,61 @@
const { calculateSize } = require("../utils/landscapeCalculations");
const headerHeight = 40;
module.exports.render = function({landscapeSettings, landscapeContent, version}) {
const { fullscreenWidth, fullscreenHeight } = calculateSize(landscapeSettings);
return `
<div class="gradient-bg" style="
width: ${fullscreenWidth}px;
height: ${fullscreenHeight}px;
overflow: hidden;
"><div class="inner-landscape" style="
width: ${fullscreenWidth}px;
height: ${fullscreenHeight}px;
padding-top: ${headerHeight + 20}px;
padding-left: 20px;
position: relative;
">
${landscapeContent }
<div style="
position: absolute;
top: 10px;
left: 50%;
transform: translateX(-50%);
font-size: 18px,
background: rgb(64,89,163);
color: white;
padding-left: 20px;
padding-right: 20px;
padding-top: 3px;
padding-bottom: 3px;
border-radius: 5px;
">${landscapeSettings.fullscreen_header}</div>
${ !landscapeSettings.fullscreen_hide_grey_logos ? `<div style="
position: absolute;
top: 15px;
right: 12px;
font-size: 11px;
background: #eee;
color: rgb(100,100,100);
padding-left: 20px;
padding-right: 20px;
padding-top: 3px;
padding-bottom: 3px;
border-radius: 5px;
">Greyed logos are not open source</div>` : '' }
<div style="
position: absolute;
top: 10px;
left: 15px;
font-size: 14px;
color: white;
">${landscapeSettings.title} </div>
<div style="
position: absolute;
top: 30px;
left: 15px;
font-size: 12px;
color: #eee;
">${version}</div>
</div>
</div>`;
}

View File

@ -1,14 +0,0 @@
import React from 'react';
import FormGroup from '@material-ui/core/FormGroup';
import FormControl from '@material-ui/core/FormControl';
import FormLabel from '@material-ui/core/FormLabel';
import GroupingTypeContainer from './GroupingTypeContainer';
const Grouping = () => {
return <FormGroup row>
<FormControl component="fieldset">
<FormLabel component="legend">Grouping</FormLabel>
<GroupingTypeContainer />
</FormControl>
</FormGroup>;
};
export default Grouping;

View File

@ -1,31 +0,0 @@
import { connect } from 'react-redux';
import ComboboxSelector from './ComboboxSelector';
import { changeGrouping } from '../reducers/mainReducer.js';
import fields from '../types/fields';
const groupingFields = ['landscape', 'relation', 'license', 'organization', 'headquarters'];
const options = [{
id: 'no',
label: 'No Grouping',
url: 'no'
}].concat(groupingFields.map(function(x) {
return {
id: x,
label: fields[x].groupingLabel
};
}).filter(function(x) {
return ! fields[x.id].hideInGrouping;
}));
const mapStateToProps = (state) => ({
value: state.main.grouping,
options: options
});
const onChange = function(newValue) {
return changeGrouping(newValue);
}
const mapDispatchToProps = {
onChange: onChange
};
export default connect(mapStateToProps, mapDispatchToProps)(ComboboxSelector);

View File

@ -0,0 +1,10 @@
const { h } = require('../utils/format');
const { guideLink } = require('../utils/icons');
module.exports.renderGuideLink = function({anchor, label, style }) {
const ariaLabel = `Read more about ${label} on the guide`
const to = h(`guide#${anchor}`);
return `<a data-type="external" target="_blank" style="${style}" aria-label="${h(ariaLabel)}" href="${to}">
${guideLink}
</a>`;
}

View File

@ -0,0 +1,175 @@
const _ = require('lodash');
const { sizeFn } = require('../utils/landscapeCalculations');
const { renderItem } = require('./Item.js');
const { h } = require('../utils/format');
const { assetPath } = require('../utils/assetPath');
const icons = require('../utils/icons');
// guide is a guide index
module.exports.render = function({settings, items, guide}) {
const currentBranch = require('child_process').execSync(`git rev-parse --abbrev-ref HEAD`, {
cwd: require('../../tools/settings').projectPath
}).toString().trim();
const title = `<h1 className="title" style="margin-top: -5px;">${h(settings.global.short_name)} Landscape Guide</h1>`;
const renderSubcategoryMetadata = ({ node, entries }) => {
const orderedEntries = _.orderBy(entries, (x) => -x.size);
const projectEntries = entries.filter(entry => entry.project)
return `
${ (node.buzzwords.length > 0 || projectEntries.length > 0) ? `<div class="metadata">
<div class="header">
<div>Buzzwords</div>
<div>${h(settings.global.short_name)} Projects</div>
</div>
<div class="body">
<div>
<ul>
${ node.buzzwords.map(str => `<li>${h(str)}</li>`).join('') }
</ul>
</div>
<div>
<ul>
${ projectEntries.map(entry => `<li>${h(entry.name)} (${h(entry.project)})</li>`).join('') }
</ul>
</div>
</div>
</div> ` : '' }
<div class="items">
${ orderedEntries.map(entry => renderItem(entry)).join('') }
</div>
`;
};
const renderNavigation = ({ nodes }) => {
const links = nodes.filter(node => node.anchor)
const parents = links
.map(n => n.anchor.split('--')[0])
.reduce((acc, n) => ({ ...acc, [n]: (acc[n] || 0) + 1}), {})
return links
.filter(({ title }) => {
return title
})
.map(node => {
const hasChildren = (parents[node.anchor] || 0) > 1
return `
<a href="#${node.anchor}" data-level="${node.level}" class="sidebar-link expandable" style="padding-left: ${10 + node.level * 10}px;">
${h(node.title)} ${hasChildren ? icons.expand : ''}
</a>
${hasChildren ? `
<a href="#${node.anchor}" data-level=${node.level + 1} class="sidebar-link" style="padding-left: 30px;"> Overview </a>
` : ''}
`}).join('');
}
const renderLandscapeLink = ({ landscapeKey, title }) => {
const href = `card-mode?category=${landscapeKey}`
return `<a href="${href}" target="_blank" class="permalink">${icons.guide} ${h(title)} </a>`;
}
const renderContent = ({ nodes, enhancedEntries }) => {
return nodes.map((node) => {
const subcategoryEntries = node.subcategory && enhancedEntries.filter(entry => entry.path.split(' / ')[1].trim() === node.title) || [];
return `<div>
${ node.title ? `<div class="section-title" id="${h(node.anchor)}">
<h2 data-variant="${node.level + 1}">
${ node.landscapeKey
? renderLandscapeLink({landscapeKey: node.landscapeKey, title: node.title})
: h(node.title)
}
</h2>
</div>
` : ''}
${ node.content ? `<div class="guide-content">${node.content}</div>` : ''}
${ node.subcategory ? renderSubcategoryMetadata({entries: subcategoryEntries,node:node}) : '' }
</div>`;
}).join('');
}
const enhancedEntries = items.map( (entry) => {
let subcategory = entry.path.split(' / ')[1];
let categoryAttrs = null;
for (let key in settings.big_picture) {
let page = settings.big_picture[key];
for (let element of page.elements) {
if (!page.category && element.category === entry.category) {
categoryAttrs = element;
}
if (page.category === entry.category && element.category === subcategory) {
categoryAttrs = element;
}
}
}
if (!categoryAttrs) {
return null;
}
const enhanced = { ...entry, categoryAttrs }
return { ...enhanced, size: sizeFn(enhanced) }
}).filter( (x) => !!x);
return `
<div class="links">
<div>
<a href="${(settings.global.self_hosted_repo || false) ? "" : "https://github.com/"}${settings.global.repo}/edit/${currentBranch}/guide.md" target="_blank">
${icons.edit}
Edit this page</a>
</div>
<div style="height: 5px;"></div>
<div>
<a href="${(settings.global.self_hosted_repo || false) ? "" : "https://github.com/"}${settings.global.repo}/issues/new?title=Guide Issue" target="_blank">
${icons.github}
Report issue</a>
</div>
</div>
<div class="side-content">
<span class="landscape-logo">
<a aria-label="reset filters" class="nav-link" href="/">
<img alt="landscape logo" src="${assetPath("images/left-logo.svg")} ">
</a>
</span>
<div class="guide-sidebar">
<div class="sidebar-collapse">+</div>
<div class="guide-toggle">
<span class="toggle-item "><a href="./">Landscape</a></span>
<span class="toggle-item active">Guide</span>
</div>
${renderNavigation({nodes: guide})}
</div>
</div>
<div class="guide-header">
<div class="container">
<div class="content">
<button class="sidebar-show" role="none" aria-label="show sidebar">${icons.sidebar}</button>
<span class="landscape-logo">
<a aria-label="reset filters" class="nav-link" href="/">
<img alt="landscape logo" src="${assetPath("/images/left-logo.svg")}">
</a>
</span>
${title}
</div>
</div>
<a rel="noopener noreferrer noopener noreferrer"
class="landscapeapp-logo"
title="${h(settings.global.short_name)}"
target="_blank"
href="${settings.global.company_url}">
<img src="${assetPath("images/right-logo.svg")}" title="${settings.global.short_name}">
</a>
</div>
<div class="main-content">
<div class="container">
<div class="content">
${renderContent({nodes: guide,enhancedEntries: enhancedEntries})}
</div>
</div>
</div>
`;
}

View File

@ -1,19 +0,0 @@
import React from 'react';
import { OutboundLink } from 'react-ga';
import settings from 'project/settings.yml';
const Header = ({reset}) => {
return (
<div className="header_container">
<div className="header">
<span className="landscape-logo"><img onClick={reset} src="./images/left-logo.svg" /></span>
<OutboundLink eventLabel="projet" to={settings.global.company_url} target="_blank" rel="noopener noreferrer" className="landscapeapp-logo">
<img src="./images/right-logo.svg" />
</OutboundLink>
</div>
</div>
);
};
export default Header;

View File

@ -1,12 +0,0 @@
import { connect } from 'react-redux';
import Header from './Header';
import { resetParameters } from '../reducers/mainReducer.js';
const mapStateToProps = () => ({
});
const mapDispatchToProps = {
reset: resetParameters
};
export default connect(mapStateToProps, mapDispatchToProps)(Header);

View File

@ -1,17 +0,0 @@
import { connect } from 'react-redux';
import TreeSelector from './TreeSelector';
import { changeFilter } from '../reducers/mainReducer.js';
import { options } from '../types/fields';
const mapStateToProps = (state) => ({
value: state.main.filters.headquarters,
options: options('headquarters')
});
const onChange = function(newValue) {
return changeFilter('headquarters', newValue);
}
const mapDispatchToProps = {
onChange: onChange
};
export default connect(mapStateToProps, mapDispatchToProps)(TreeSelector);

View File

@ -1,224 +0,0 @@
import React from 'react';
import IconButton from '@material-ui/core/IconButton';
import CloseIcon from '@material-ui/icons/Close';
import MenuIcon from '@material-ui/icons/Menu';
import classNames from 'classnames'
import Filters from './Filters';
import Grouping from './Grouping';
import Sorting from './Sorting';
import Presets from './Presets';
import Ad from './Ad';
import AutoSizer from './CustomAutoSizer';
import {
MainLandscapeContentContainer,
ExtraLandscapeContentContainer,
SwitchButtonContainer,
ZoomButtonsContainer,
FullscreenButtonContainer
} from './BigPicture';
import MainContentContainer from './MainContentContainer';
import HomePageUrlContainer from './HomePageUrlContainer';
import HomePageScrollerContainer from './HomePageScrollerContainer';
import ResetFiltersContainer from './ResetFiltersContainer';
import ItemDialogContainer from './ItemDialogContainer';
import ItemDialogButtonsContainer from './ItemDialogButtonsContainer';
import HeaderContainer from './HeaderContainer';
import SummaryContainer from './SummaryContainer';
import ExportCsvContainer from './ExportCsvContainer';
import Footer from './Footer';
import EmbeddedFooter from './EmbeddedFooter';
import isIphone from '../utils/isIphone';
import isMobile from '../utils/isMobile';
import isGoogle from '../utils/isGoogle';
import bus from '../reducers/bus';
import settings from 'project/settings.yml'
const mainSettings = settings.big_picture.main;
const extraSettings = settings.big_picture.extra || {};
const state = {
lastScrollPosition: 0
};
bus.on('scrollToTop', function() {
document.scrollingElement.scrollTop = 0;
});
const HomePage = ({isEmbed, mainContentMode, ready, hasSelectedItem, filtersVisible, hideFilters, showFilters, onClose, title, isFullscreen}) => {
const isBigPicture = mainContentMode !== 'card';
if (!ready) {
return (
<div>
<HomePageUrlContainer />
</div>
)
}
document.title = title;
if (isGoogle && hasSelectedItem) {
return <ItemDialogContainer />;
}
if (isBigPicture) {
document.querySelector('html').classList.add('big-picture');
} else {
document.querySelector('html').classList.remove('big-picture');
}
if (isFullscreen) {
document.querySelector('html').classList.add('fullscreen');
} else {
document.querySelector('html').classList.remove('fullscreen');
}
if (isIphone) {
if (hasSelectedItem) {
if (!document.querySelector('.iphone-scroller')) {
state.lastScrollPosition = document.scrollingElement.scrollTop;
}
document.querySelector('html').classList.add('has-selected-item');
document.scrollingElement.scrollTop = 0;
} else {
document.querySelector('html').classList.remove('has-selected-item');
if (document.querySelector('.iphone-scroller')) {
document.scrollingElement.scrollTop = state.lastScrollPosition;
}
}
//try to get a current scroll if we are in a normal mode
}
if (isEmbed) {
if (window.parentIFrame) {
if (hasSelectedItem) {
window.parentIFrame.sendMessage({type: 'showModal'})
} else {
window.parentIFrame.sendMessage({type: 'hideModal'})
}
if (hasSelectedItem) {
window.parentIFrame.getPageInfo(function(info) {
var offset = info.scrollTop - info.offsetTop;
var height = info.iframeHeight - info.clientHeight;
var maxHeight = info.clientHeight * 0.9;
if (maxHeight > 480) {
maxHeight = 480;
}
var t = function(x1, y1, x2, y2, x3) {
if (x3 < x1 - 50) {
x3 = x1 - 50;
}
if (x3 > x2 + 50) {
x3 = x2 + 50;
}
return y1 + (x3 - x1) / (x2 - x1) * (y2 - y1);
}
var top = t(0, -height, height, height, offset);
if (top < 0 && info.iframeHeight <= 600) {
top = 10;
}
setTimeout(function() {
const modal = document.querySelector('.modal-body');
if (modal) {
modal.style.top = top + 'px';
modal.style.maxHeight = maxHeight + 'px';
}
}, 10);
});
}
}
document.querySelector('body').classList.add('embed');
}
function handleShadowClick(e) {
if (!(isIphone && hasSelectedItem)) {
return;
}
if (window.matchMedia("(orientation: portrait)").matches) {
const x = e.clientX / window.innerWidth;
const y = e.clientY / window.innerHeight;
const marginX = 0.125;
const marginY = 0.06;
if ( x > marginX && x < 1 - marginX && y > marginY && y < 1 - marginY ) {
console.info('a click inside the mask, ignoring');
} else {
onClose();
}
}
if (window.matchMedia("(orientation: landscape)").matches) {
const x = e.clientX / window.innerWidth;
const y = e.clientY / window.innerHeight;
const marginX = 0.07;
const marginY = 0.1;
if ( x > marginX && x < 1 - marginX && y > marginY) {
console.info('a click inside the mask, ignoring');
} else {
onClose();
}
}
}
const hideTopPart = isEmbed || isFullscreen || (isMobile && isBigPicture);
return (
<div onClick={handleShadowClick} >
<HomePageScrollerContainer/>
<ItemDialogContainer/>
{ isIphone && <ItemDialogButtonsContainer/> }
<div className={classNames('app',{'filters-opened' : filtersVisible, 'background': isIphone && hasSelectedItem})}>
<div className={classNames({"shadow": isIphone && hasSelectedItem})} />
<div style={{marginTop: (isIphone && hasSelectedItem) ? -state.lastScrollPosition : 0}} className={classNames({"iphone-scroller": isIphone && hasSelectedItem}, 'main-parent')} >
{ !isEmbed && !isFullscreen && <HeaderContainer/> }
{ !isEmbed && !isFullscreen && <IconButton className="sidebar-show" onClick={showFilters}><MenuIcon /></IconButton> }
{ !isEmbed && !isFullscreen && <div className="sidebar">
<div className="sidebar-scroll">
<IconButton className="sidebar-collapse" onClick={hideFilters}><CloseIcon /></IconButton>
<ResetFiltersContainer />
<Grouping/>
<Sorting/>
<Filters />
<Presets />
<ExportCsvContainer />
<Ad />
</div>
</div>
}
<div className="app-overlay" onClick={hideFilters}></div>
<HomePageUrlContainer />
<div className={classNames('main', {'embed': isEmbed})}>
{ isMobile && <SwitchButtonContainer /> }
{ !hideTopPart && <div className="disclaimer">
<span dangerouslySetInnerHTML={{__html: settings.home.header}} />
Please <a target="_blank" href={`https://github.com/${settings.global.repo}`}>open</a> a pull request to
correct any issues. Greyed logos are not open source. Last Updated: {window.lastUpdated}
</div> }
{ !hideTopPart && <SummaryContainer /> }
{ !isMobile && <SwitchButtonContainer /> }
{ isBigPicture &&
<AutoSizer>
{({ height, width }) => (
<div style={{width:width, height: height, position: 'relative', background: 'rgb(134,175,188)'}}>
<ZoomButtonsContainer />
<FullscreenButtonContainer />
<div style={{width: '100%', height: '100%', position: 'relative', overflow: 'scroll', padding: 10}}>
{ mainContentMode === mainSettings.url && <MainLandscapeContentContainer /> }
{ mainContentMode === extraSettings.url && <ExtraLandscapeContentContainer /> }
</div>
</div>
)}
</AutoSizer>
}
{ !isBigPicture && <MainContentContainer/> }
{ !isEmbed && !isBigPicture && <Footer/> }
{ isEmbed && <EmbeddedFooter/> }
</div>
</div>
</div>
</div>
);
};
export default HomePage;

View File

@ -1,38 +0,0 @@
import { connect } from 'react-redux';
import createSelector from '../utils/createSelector';
import HomePage from './HomePage';
import {showFilters, hideFilters, closeDialog } from '../reducers/mainReducer';
import isEmbed from '../utils/isEmbed';
import getGroupedItems, {getGroupedItemsForBigPicture } from '../utils/itemsCalculator';
import selectedItemCalculator from '../utils/selectedItemCalculator';
const defaultTitle = `CNCF Cloud Native Interactive Landscape`;
const getTitle = createSelector([state => state], function(state) {
if (!state.main.ready) {
return defaultTitle;
}
const groupedItems = getGroupedItems(state);
const groupedItemsForBigPicture = getGroupedItemsForBigPicture(state);
const selectedItemId = state.main.selectedItemId;
const isBigPicture = state.main.mainContentMode !== 'card';
const selectedItemInfo = selectedItemCalculator(groupedItems, groupedItemsForBigPicture, selectedItemId, isBigPicture);
return selectedItemInfo.hasSelectedItem ? `${selectedItemInfo.itemInfo.name} - ${defaultTitle}` : defaultTitle;
});
const mapStateToProps = (state) => ({
ready: state.main.ready,
filtersVisible: state.main.filtersVisible && !isEmbed,
isEmbed: isEmbed,
isFullscreen: state.main.isFullscreen && state.main.mainContentMode !== 'card',
mainContentMode: state.main.mainContentMode,
hasSelectedItem: !!state.main.selectedItemId,
title: getTitle(state)
});
const mapDispatchToProps = {
showFilters: showFilters,
hideFilters: hideFilters,
onClose: closeDialog
};
export default connect(mapStateToProps, mapDispatchToProps)(HomePage);

View File

@ -0,0 +1,237 @@
const _ = require('lodash');
const { h } = require('../utils/format');
const { fields, sortOptions, options } = require('../types/fields');
const { assetPath } = require('../utils/assetPath');
const icons = require('../utils/icons');
const renderSingleSelect = ({name, options, title}) => (
`
<div class="select" data-type="single" data-name="${name}" data-options="${h(JSON.stringify(options))}">
<select class="select-text" required>
<option value="1" selected>Value</option>
</select>
<span class="select-highlight"></span>
<span class="select-bar"></span>
<label class="select-label">${h(title)}</label>
</div>
`
)
const renderMultiSelect = ({name, options, title}) => (
`
<div class="select" data-type="multi" data-name="${name}" data-options="${h(JSON.stringify(options))}">
<select class="select-text" required>
<option value="1" selected>Value</option>
</select>
<span class="select-highlight"></span>
<span class="select-bar"></span>
<label class="select-label">${h(title)}</label>
</div>
`
)
const renderGroupingSelect = function() {
const groupingFields = ['landscape', 'relation', 'license', 'organization', 'headquarters'];
const options = [{
id: 'no',
label: 'No Grouping',
}].concat(groupingFields.map(id => ({ id: fields[id].url, label: (fields[id].groupingLabel) })))
return renderSingleSelect({name: "grouping", options, title: "Grouping" });
}
const renderSortBySelect = function() {
const options = sortOptions.filter( (x) => !x.disabled).map( (x) => ({
id: (fields[x.id] || { url: x.id}).url || x.id, label: x.label
}))
return renderSingleSelect({name: "sort", options, title: "Sort By" });
}
const renderFilterCategory = function() {
return renderMultiSelect({name:"category", options: options('landscape'), title: 'Category'});
}
const renderFilterProject = function() {
return renderMultiSelect({name:"project", options: options('relation'), title: 'Project'});
}
const renderFilterLicense = function() {
return renderMultiSelect({name:"license", options: options('license'), title: "License"});
}
const renderFilterOrganization = function() {
return renderMultiSelect({name: "organization", options: options('organization'), title: "Organization"});
}
const renderFilterHeadquarters = function() {
return renderMultiSelect({name: "headquarters", options: options('headquarters'), title: "Headquarters"});
}
const renderFilterCompanyType = function() {
return renderMultiSelect({name: "company-type", options: options('companyType'), title: "Company Type"});
}
const renderFilterIndustries = function() {
return renderMultiSelect({name: "industries", options: options('industries'), title: "Industry"});
}
module.exports.render = function({settings, guidePayload, hasGuide, bigPictureKey}) {
const mainCard = [{shortTitle: 'Card', title: 'Card Mode', mode: 'card', url: 'card-mode', tabIndex: 0}]
const landscapes = Object.values(settings.big_picture).map(function(section) {
return {
url: section.url,
title: section.name,
shortTitle: section.short_name,
mode: section.url === settings.big_picture.main.url ? 'main' : section.url,
tabIndex: section.tab_index
}
})
const tabs = _.orderBy(mainCard.concat(landscapes), 'tabIndex').map( item => _.pick(item, ['title', 'mode', 'shortTitle', 'url']))
return `
<div class="select-popup" style="display: none;">
<div class="select-popup-body" ></div>
</div>
<div class="modal" style="display: none;">
<div class="modal-shadow" ></div>
<div class="modal-container">
<div class="modal-body">
<div class="modal-buttons">
<a class="modal-close">x</a>
<span class="modal-prev">${icons.prev}</span>
<span class="modal-next">${icons.next}</span>
</div>
<div class="modal-content"></div>
</div>
</div>
</div>
<div id="guide-page" style="display: ${guidePayload ? "" : "none"};" data-loaded="${guidePayload ? "true" : ""}">
${ !guidePayload ? `<div class="side-content">
<span class="landscape-logo">
<a aria-label="reset filters" class="nav-link" href="/">
<img alt="landscape logo" src="${assetPath("images/left-logo.svg")}" />
</a>
</span>
<div class="guide-sidebar">
<div class="sidebar-collapse">X</div>
<div class="guide-toggle">
<span class="toggle-item "><a href="./">Landscape</a></span>
<span class="toggle-item active">Guide</span>
</div>
</div>
</div>` : ''
}
${ guidePayload ? "$$guide$$" : ''}
</div>
<div id="home" style="display: ${guidePayload ? "none" : ""}" class="app">
<div class="app-overlay"></div>
<div class="main-parent">
<button class="sidebar-show" role="none" aria-label="show sidebar">${icons.sidebar}</button>
<div class="header_container">
<div class="header">
<span class="landscape-logo">
<a aria-label="reset filters" class="nav-link" href="/">
<img alt="landscape logo" src="${assetPath("images/left-logo.svg")}" />
</a>
</span>
<a rel="noopener noreferrer noopener noreferrer"
class="landscapeapp-logo"
title="${h(settings.global.short_name)}"
target="_blank"
href="${settings.global.company_url}">
<img src="${assetPath("/images/right-logo.svg")}" title="${h(settings.global.short_name)}" />
</a>
</div>
</div>
<div class="sidebar">
<div class="sidebar-scroll">
<div class="sidebar-collapse">+</div>
${ hasGuide ? `
<div class="guide-toggle">
<span class="toggle-item active">Landscape</span>
<span class="toggle-item "><a href="/guide">Guide</a></span>
</div> ` : ''
}
<a class="filters-action reset-filters">${icons.reset}<span>Reset Filters</span>
</a>
${renderGroupingSelect()}
${renderSortBySelect()}
${renderFilterCategory()}
${renderFilterProject()}
${renderFilterLicense()}
${renderFilterOrganization()}
${renderFilterHeadquarters()}
${renderFilterCompanyType()}
${renderFilterIndustries()}
<div class="sidebar-presets">
<h4>Example filters</h4>
${ (settings.presets || []).map(preset => `
<a data-type="internal" class="preset" href="${preset.url}">
${h(preset.label)}
</a> `
).join('')}
</div>
${ (settings.ads || []).map( (entry) => `
<a data-type="external" target="_blank" class="sidebar-event" href="${entry.url}" title="${h(entry.title)}">
<img src="${assetPath(entry.image)}" alt="${entry.title}" />
</a>
`).join('') }
</div>
</div>
<div class="app-overlay"></div>
<div class="main">
<div class="disclaimer">
<span> ${settings.home.header} </span>
Please <a data-type="external" target="_blank" href="${(settings.global.self_hosted_repo || false) ? "" : "https://github.com/"}${settings.global.repo}">open</a> a pull request to
correct any issues. Greyed logos are not open source. Last Updated: ${process.env.lastUpdated}
</div>
<h4 class="summary"></h4>
<div class="cards-section">
<div class="big-picture-switch big-picture-switch-normal">
${ tabs.map( (tab) => `
<a href="${tab.url}" data-mode="${tab.mode}"><div>${h(tab.title)}</div></a>
`).join('')}
</div>
<div class="right-buttons">
<div class="fullscreen-exit">${icons.fullscreenExit}</div>
<div class="fullscreen-enter">${icons.fullscreenEnter}</div>
<div class="zoom-out">${icons.zoomOut}</div>
<div class="zoom-reset"></div>
<div class="zoom-in">${icons.zoomIn}</div>
</div>
${ tabs.filter( (x) => x.mode !== 'card').map( (tab) => `
<div data-mode="${tab.mode}" class="landscape-flex">
<div class="landscape-wrapper">
<div class="inner-landscape" style="padding: 10px; display: none;">
${ bigPictureKey === tab.mode ? '$$' + bigPictureKey + '$$' : ''}
</div>
</div>
</div>
`).join('')}
<div class="column-content"></div>
</div>
<div id="footer" style="
margin-top: 10px;
font-size: 9pt;
width: 100%;
text-align: center;">
${h(settings.home.footer)} For more information, please see the&nbsp;
<a data-type="external" target="_blank" eventLabel="crunchbase-terms" href="${(settings.global.self_hosted_repo || false) ? "" : "https://github.com/"}${settings.global.repo}/blob/HEAD/README.md#license">
license
</a> info.
</div>
<div id="embedded-footer">
<h1 style="margin-top: 20px; width: 100%; text-align: center;">
<a data-type="external" target="_blank" href="url">View</a> the full interactive landscape
</h1>
</div>
</div>
</div>
</div>
`;
}

View File

@ -1,17 +0,0 @@
import { connect } from 'react-redux';
import getGroupedItems from '../utils/itemsCalculator';
const mapStateToProps = (state) => ({
groupedItems: getGroupedItems(state)
});
const mapDispatchToProps = {
};
const Component = function() {
setTimeout(function() {
document.scrollingElement.scrollTop = 0;
}, 1);
return null;
}
export default connect(mapStateToProps, mapDispatchToProps)(Component);

View File

@ -1,41 +0,0 @@
import React from 'react';
import { connect } from 'react-redux';
import createSelector from '../utils/createSelector';
import { parseUrl } from '../utils/syncToUrl';
import { changeParameters} from '../reducers/mainReducer';
// var bouncedFn = _.debounce((fn, args) => {console.info('Real Change!', args);fn(args)}, 10000);
import { history} from '../store/configureStore';
history.listen(function(x) {
console.info('Url changed: ', x);
});
const getParameters = createSelector(
(state) => state.routing.location.pathname.split('/').slice(-1)[0],
function(part) {
return parseUrl(part);
}
);
const mapStateToProps = (state) => ({
info: getParameters(state),
});
const mapDispatchToProps = {
changeParameters: changeParameters
};
const render = ({info, changeParameters}) => {
// if we are here - url has changed
// otherwise everything is cached
console.info('Want to change : ', JSON.stringify(info));
window.setTimeout(() => changeParameters(info), 1);
return <div/>;
}
export default connect(mapStateToProps, mapDispatchToProps)(render);

View File

@ -0,0 +1,120 @@
const { renderItem } = require("./Item");
const { h } = require('../utils/format');
const {
calculateHorizontalCategory,
categoryBorder,
categoryTitleHeight,
dividerWidth,
itemMargin,
smallItemWidth,
smallItemHeight,
subcategoryMargin,
subcategoryTitleHeight
} = require("../utils/landscapeCalculations");
const { renderSubcategoryInfo } = require('./SubcategoryInfo');
const { renderCategoryHeader } = require('./CategoryHeader');
const renderDivider = (color) => {
const width = dividerWidth;
const marginTop = 2 * subcategoryMargin;
const height = `calc(100% - ${2 * marginTop}px)`;
return `<div style="
width: ${width}px;
margin-top: ${marginTop}px;
height: ${height};
border-left: ${width}px solid ${color}
"></div>`;
}
module.exports.renderHorizontalCategory = function({ header, guideInfo, subcategories, width, height, top, left, color, href, fitWidth }) {
const addInfoIcon = !!guideInfo;
const subcategoriesWithCalculations = calculateHorizontalCategory({ height, width, subcategories, fitWidth, addInfoIcon })
const totalRows = Math.max(...subcategoriesWithCalculations.map(({ rows }) => rows))
return `
<div style="
width: ${width}px;
left: ${left}px;
height: ${height}px;
top: ${top}px;
position: absolute;
" class="big-picture-section">
<div
style="
position: absolute;
background: ${color};
top: ${subcategoryTitleHeight}px;
bottom: 0;
left: 0;
right: 0;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.2);
padding: ${categoryBorder}px;
"
>
<div style="
top: 0;
bottom: 0;
left: 0;
width: ${categoryTitleHeight}px;
position: absolute;
writing-mode: vertical-rl;
transform: rotate(180deg);
text-align: center;
display: flex;
align-items: center;
justify-content: center;
">
${renderCategoryHeader({href, label: header, guideAnchor: guideInfo, background: color,rotate: true})}
</div>
<div style="
margin-left: 30px;
height: 100%;
display: flex;
justify-content: space-evenly;
background: white;
">
${subcategoriesWithCalculations.map((subcategory, index) => {
const lastSubcategory = index !== subcategories.length - 1
const { allItems, guideInfo, columns, width, name, href } = subcategory
const padding = fitWidth ? 0 : `${subcategoryMargin}px 0`;
const style = `
display: grid;
height: 100%;
grid-template-columns: repeat(${columns}, ${smallItemWidth}px);
grid-auto-rows: ${smallItemHeight}px;
`;
const extraStyle = fitWidth ? `justify-content: space-evenly; align-content: space-evenly;` : `grid-gap: ${itemMargin}px;`;
return `
<div style="
width: ${width}px;
position: relative;
overflow: visible;
padding: ${padding};
box-sizing: border-box;
">
<div style="
position: absolute;
top: ${-1 * categoryTitleHeight}px;
left: 0;
right: 0;
height: ${categoryTitleHeight}px;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
">
<a data-type="internal" href="${href}" class="white-link">${h(name)}</a>
</div>
<div style="${style} ${extraStyle}">
${allItems.map(renderItem).join('')}
${guideInfo ? renderSubcategoryInfo({label: name, anchor: guideInfo,column: columns, row:totalRows}) : ''}
</div>
</div>
${lastSubcategory ? renderDivider(color) : ''}
`
}).join('')}
</div>
</div>
</div>`;
}

View File

@ -1,20 +0,0 @@
import React from 'react';
import isEmbed from '../utils/isEmbed';
import { NavLink } from 'react-router-dom';
const skipDefaultHandler = (e) => e.preventDefault();
const InternalLink = ({to, children, onClick, ...other}) => {
if (onClick) {
other.onClick = function(e) {
skipDefaultHandler(e);
onClick();
};
}
if (isEmbed) {
return <span {...other}>{children}</span>;
} else {
return <NavLink {...other} to={to}>{children}</NavLink>
}
}
export default InternalLink;

78
src/components/Item.js Normal file
View File

@ -0,0 +1,78 @@
const { assetPath } = require('../utils/assetPath');
const { fields } = require("../types/fields");
const { h } = require('../utils/format');
const { readJsonFromDist } = require('../utils/readJson');
const settings = readJsonFromDist('settings');
const largeItem = function(item) {
const isMember = item.category === settings.global.membership;
const relationInfo = fields.relation.valuesMap[item.relation]
if (!relationInfo) {
console.error(`no map for ${item.relation} on ${item.name}`);
}
const color = relationInfo.big_picture_color;
const label = relationInfo.big_picture_label;
const textHeight = label ? 10 : 0
const padding = 2
const isMultiline = h(label).length > 20;
const formattedLabel = isMultiline ? h(label).replace(' - ', '<br>') : h(label);
if (isMember) {
return `
<div data-id="${item.id}" class="large-item large-item-${item.size} item">
<img loading="lazy" src="${assetPath(item.href)}" alt="${item.name}" style="
width: calc(100% - ${2 * padding}px);
height: calc(100% - ${2 * padding + textHeight}px);
padding: 5px;
margin: ${padding}px ${padding}px 0 ${padding}px;
"/>
</div>`;
}
return `
<div data-id="${item.id}" class="large-item large-item-${item.size} item" style="background: ${color}">
<img loading="lazy" src="${assetPath(item.href)}" alt="${item.name}" style="
width: calc(100% - ${2 * padding}px);
height: calc(100% - ${2 * padding + textHeight}px);
padding: 5px;
margin: ${padding}px ${padding}px 0 ${padding}px;
"/>
<div class="label" style="
position: absolute;
bottom: 0;
width: 100%;
height: ${textHeight + padding + (isMultiline ? 6 : 0) }px;
text-align: center;
vertical-align: middle;
background: ${color};
color: white;
font-size: 6.7px;
line-height: ${isMultiline ? 9 : 13 }px;
">${ formattedLabel }</div>
</div>`;
}
const smallItem = function(item) {
const isMember = item.category === settings.global.membership;
return `
<img data-id="${item.id}"
loading="lazy"
class="item small-item"
src="${assetPath(item.href)}"
alt="${h(item.name)}"
style="border-color: ${isMember ? 'white' : ''};"
/>`
}
module.exports.renderItem = function (item) {
const {size, category, oss, categoryAttrs } = item;
const isMember = category === settings.global.membership;
const ossClass = isMember || oss || (categoryAttrs.isLarge && !settings.global.flags?.gray_large_items) ? 'oss' : 'nonoss';
const isLargeClass = size > 1 ? `wrapper-large-${size}` : '';
return `<div class="${isLargeClass + ' item-wrapper ' + ossClass}">
${size > 1 ? largeItem({isMember, ...item}) : smallItem({...item})}
</div>`;
}

View File

@ -1,49 +0,0 @@
import React from 'react';
import Dialog from '@material-ui/core/Dialog';
import classNames from 'classnames'
import _ from 'lodash';
import ItemDialogContent from './ItemDialogContent';
import ItemDialogButtonsContainer from './ItemDialogButtonsContainer';
import '../styles/itemModal.scss';
import isIphone from '../utils/isIphone';
import fields from '../types/fields';
let lastItemInfo;
function getRelationStyle(relation) {
const relationInfo = _.find(fields.relation.values, {id: relation});
if (relationInfo && relationInfo.color) {
return {
border: '4px solid ' + relationInfo.color
};
} else {
return {};
}
}
const ItemDialog = ({onClose, itemInfo}) => {
const recentItemInfo = itemInfo || lastItemInfo || {};
if (itemInfo) {
lastItemInfo = itemInfo;
}
if (isIphone) {
if (!itemInfo) {
return null;
}
return (
<div className={classNames('modal', 'product', {nonoss : recentItemInfo.oss === false})} style={getRelationStyle(recentItemInfo.relation)} >
{ /* Note - we move buttons away from here to the HomePage because of Safari Issues */ }
{ <ItemDialogContent itemInfo={itemInfo || lastItemInfo}/> }
</div>
)
}
return (
<Dialog open={!!itemInfo} onClose={() => onClose() } transitionDuration={400}
classes={{paper:'modal-body'}}
className={classNames('modal', 'product', {nonoss : recentItemInfo.oss === false})}>
{ itemInfo && <ItemDialogButtonsContainer/> }
{ (itemInfo || lastItemInfo) && <ItemDialogContent itemInfo={itemInfo || lastItemInfo}/> }
</Dialog>
);
}
export default ItemDialog;

View File

@ -1,26 +0,0 @@
import React from 'react';
import ChevronLeftIcon from '@material-ui/icons/ChevronLeft';
import ChevronRightIcon from '@material-ui/icons/ChevronRight';
import KeyHandler from 'react-key-handler';
import '../styles/itemModal.scss';
const ItemDialogButtons = ({hasSelectedItem, onClose, previousItemId, nextItemId, onSelectItem }) => {
if (!hasSelectedItem) {
return null;
}
return (
<div className='modal-buttons'>
{ nextItemId && <KeyHandler keyValue="ArrowRight" onKeyHandle={() => onSelectItem(nextItemId)} /> }
{ previousItemId && <KeyHandler keyValue="ArrowLeft" onKeyHandle={() => onSelectItem(previousItemId)} /> }
<a className="modal-close" onClick={() => onClose()}>×</a>
<span className="modal-prev" disabled={!previousItemId} onClick={(e) => {e.stopPropagation(); onSelectItem(previousItemId)}}>
<ChevronLeftIcon style={{ fontSize:'1.2em'}} />
</span>
<span className="modal-next" disabled={!nextItemId} onClick={(e) => {e.stopPropagation(); onSelectItem(nextItemId)}}>
<ChevronRightIcon style={{ fontSize:'1.2em'}} />
</span>
</div>
);
}
export default ItemDialogButtons;

View File

@ -1,32 +0,0 @@
import { connect } from 'react-redux';
import createSelector from '../utils/createSelector';
import ItemDialogButtons from './ItemDialogButtons';
import { changeSelectedItemId, closeDialog } from '../reducers/mainReducer';
import getGroupedItems, {getGroupedItemsForBigPicture } from '../utils/itemsCalculator';
import selectedItemCalculator from '../utils/selectedItemCalculator';
const getSelectedItem = createSelector(
[ getGroupedItems,
getGroupedItemsForBigPicture,
(state) => state.main.selectedItemId,
(state) => state.main.mainContentMode !== 'card'
],
function(groupedItems,groupedItemsForBigPicture, selectedItemId, isBigPicture) {
const selectedItemInfo = selectedItemCalculator(groupedItems, groupedItemsForBigPicture, selectedItemId, isBigPicture);
return {
hasSelectedItem: selectedItemInfo.hasSelectedItem,
nextItemId: selectedItemInfo.nextItemId,
previousItemId: selectedItemInfo.previousItemId
};
}
)
const mapStateToProps = (state) => ({
... getSelectedItem(state)
});
const mapDispatchToProps = {
onClose: closeDialog,
onSelectItem: changeSelectedItemId
};
export default connect(mapStateToProps, mapDispatchToProps)(ItemDialogButtons);

View File

@ -1,31 +0,0 @@
import { connect } from 'react-redux';
import createSelector from '../utils/createSelector';
import ItemDialog from './ItemDialog';
import { changeSelectedItemId, closeDialog } from '../reducers/mainReducer';
import getGroupedItems, {getGroupedItemsForBigPicture } from '../utils/itemsCalculator';
import selectedItemCalculator from '../utils/selectedItemCalculator';
const getSelectedItem = createSelector(
[ getGroupedItems,
getGroupedItemsForBigPicture,
(state) => state.main.selectedItemId,
(state) => state.main.mainContentMode !== 'card'
],
function(groupedItems,groupedItemsForBigPicture, selectedItemId, isBigPicture) {
const selectedItemInfo = selectedItemCalculator(groupedItems, groupedItemsForBigPicture, selectedItemId, isBigPicture);
return {
itemInfo: selectedItemInfo.itemInfo,
};
}
)
const mapStateToProps = (state) => ({
... getSelectedItem(state)
});
const mapDispatchToProps = {
onClose: closeDialog,
onSelectItem: changeSelectedItemId
};
export default connect(mapStateToProps, mapDispatchToProps)(ItemDialog);

View File

@ -1,370 +0,0 @@
import React from 'react';
import Timeline from 'react-twitter-widgets/dist/components/Timeline.js';
import SvgIcon from '@material-ui/core/SvgIcon';
import StarIcon from '@material-ui/icons/Star';
import KeyHandler from 'react-key-handler';
import _ from 'lodash';
import { OutboundLink } from 'react-ga';
import millify from 'millify';
import relativeDate from 'relative-date';
import { filtersToUrl } from '../utils/syncToUrl';
import formatNumber from '../utils/formatNumber';
import isMobile from '../utils/isMobile';
import InternalLink from './InternalLink';
import '../styles/itemModal.scss';
import fields from '../types/fields';
import isGoogle from '../utils/isGoogle';
import settings from 'project/settings.yml';
let productScrollEl = null;
const formatDate = function(x) {
if (x.text) {
return x.text;
}
return relativeDate(new Date(x));
};
const formatTwitter = function(x) {
const name = x.split('/').slice(-1)[0];
return '@' + name;
}
function getRelationStyle(relation) {
const relationInfo = _.find(fields.relation.values, {id: relation});
if (relationInfo && relationInfo.color) {
return {
border: '4px solid ' + relationInfo.color
};
} else {
return {};
}
}
const showTwitter = !isGoogle;
const iconGithub = <svg viewBox="0 0 24 24">
<path d="M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58
9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81
5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18
9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5
6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84
13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39
18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68
14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z" />
</svg>
const projectTag = function({relation, member, project}) {
if (relation === false) {
return null;
}
const { prefix, tag } = _.find(fields.relation.values, {id: relation});
if (settings.global.flags.cncf_sandbox) {
if (project === 'sandbox') {
return (<InternalLink to={filtersToUrl({filters:{relation: project}})} className="tag tag-blue">
<span className="tag-name">Cloud Native</span>
<span className="tag-value">Sandbox Project</span>
</InternalLink>)
}
}
if (relation === 'member' || relation === 'company') {
console.info(settings.membership, member);
const { name, label } = settings.membership[member];
return (<InternalLink to={filtersToUrl({filters:{relation: relation}})} className="tag tag-blue">
<span className="tag-name">{name}</span>
<span className="tag-value">{label}</span>
</InternalLink>)
}
return (<InternalLink to={filtersToUrl({filters:{relation: relation}})} className="tag tag-blue">
<span className="tag-name">{prefix}</span>
<span className="tag-value">{tag}</span>
</InternalLink>)
};
const openSourceTag = function(oss) {
if (!oss) {
return null;
}
return (<InternalLink to={filtersToUrl({grouping: 'license', filters: {license: 'Open Source'}})} className="tag tag-orange">
<span className="tag-value">Open Source Software</span>
</InternalLink>)
}
const licenseTag = function({relation, license}) {
if (relation === 'company') {
return null;
}
const text = _.find(fields.license.values, {id: license}).label;
return (<InternalLink to={filtersToUrl({grouping: 'license', filters:{license: license}})} className="tag tag-purple">
<span className="tag-name">License</span>
<span className="tag-value">{text}</span>
</InternalLink>);
}
const badgeTag = function(itemInfo) {
if (!itemInfo.bestPracticeBadgeId) {
if (itemInfo.oss) {
const emptyUrl="https://bestpractices.coreinfrastructure.org/";
return (<OutboundLink eventLabel={emptyUrl} to={emptyUrl} target="_blank" className="tag tag-grass">
<span className="tag-value">No CII Best Practices </span>
</OutboundLink>);
} else {
return null;
}
}
const url = `https://bestpractices.coreinfrastructure.org/en/projects/${itemInfo.bestPracticeBadgeId}`;
const label = itemInfo.bestPracticePercentage === 100 ? 'passing' : ('In progress: ' + itemInfo.bestPracticePercentage + '%');
return (<OutboundLink eventLabel={url} to={url} target="_blank" className="tag tag-grass">
<span className="tag-name">CII Best Practices</span>
<span className="tag-value">{label}</span>
</OutboundLink>);
}
function handleUp() {
productScrollEl.scrollBy({top: -200, behavior: 'smooth'});
}
function handleDown() {
productScrollEl.scrollBy({top: 200, behavior: 'smooth' });
}
const $script = require('scriptjs'); // eslint-disable-line global-require
$script('https://platform.twitter.com/widgets.js', 'twitter-widgets');
const ItemDialogContent = ({itemInfo}) => {
const linkToOrganization = filtersToUrl({grouping: 'organization', filters: {organization: itemInfo.organization}});
const itemCategory = function(path) {
var separator = <span className="product-category-separator"></span>;
var subcategory = _.find(fields.landscape.values,{id: path});
var category = _.find(fields.landscape.values, {id: subcategory.parentId});
var categoryMarkup = (
<InternalLink key="category" to={filtersToUrl({grouping: 'landscape', filters: {landscape: category.id}})}>{category.label}</InternalLink>
)
var subcategoryMarkup = (
<InternalLink key="subcategory" to={filtersToUrl({grouping: 'landscape', filters: {landscape: path}})}>{subcategory.label}</InternalLink>
)
return (<span>{[categoryMarkup, separator, subcategoryMarkup]}</span>);
}
const twitterElement = itemInfo.twitter &&
<div className="product-property row">
<div className="product-property-name col col-40">Twitter</div>
<div className="product-property-value col col-60">
<OutboundLink eventLabel={itemInfo.twitter} to={itemInfo.twitter} target="_blank">{formatTwitter(itemInfo.twitter)}</OutboundLink>
</div>
</div>;
const latestTweetDateElement = itemInfo.twitter && (
<div className="product-property row">
<div className="product-property-name col col-50">Latest Tweet</div>
<div className="product-property-value col col-50">
{ itemInfo.latestTweetDate && (
<OutboundLink eventLabel={itemInfo.twitter} to={itemInfo.twitter} target="_blank">{formatDate(itemInfo.latestTweetDate)}</OutboundLink>
)}
</div>
</div>
);
const firstCommitDateElement = itemInfo.firstCommitDate && (
<div className="product-property row">
<div className="product-property-name col col-40">First Commit</div>
<div className="product-property-value tight-col col-60">
<OutboundLink eventLabel={itemInfo.firstCommitLink} to={itemInfo.firstCommitLink} target="_blank">{formatDate(itemInfo.firstCommitDate)}</OutboundLink>
</div>
</div>
);
const contributorsCountElement = itemInfo.contributorsCount && (
<div className="product-property row">
<div className="product-property-name col col-40">Contributors</div>
<div className="product-property-value tight-col col-60">
<OutboundLink eventLabel={itemInfo.contributorsLink} to={itemInfo.contributorsLink} target="_blank">{itemInfo.contributorsCount}</OutboundLink>
</div>
</div>
);
const headquartersElement = itemInfo.headquarters && itemInfo.headquarters !== 'N/A' && (
<div className="product-property row">
<div className="product-property-name col col-40">Headquarters</div>
<div className="product-property-value tight-col col-60"><InternalLink to={filtersToUrl({grouping: 'headquarters', filters:{headquarters:itemInfo.headquarters}})}>{itemInfo.headquarters}</InternalLink></div>
</div>
);
const amountElement = Number.isInteger(itemInfo.amount) && (
<div className="product-property row">
<div className="product-property-name col col-40">{itemInfo.amountKind === 'funding' ? 'Funding' : 'Market Cap'}</div>
{ itemInfo.amountKind === 'funding' &&
<div className="product-property-value tight-col col-60">
<OutboundLink
target="_blank"
eventLabel={itemInfo.crunchbase + '#section-funding-rounds'}
to={itemInfo.crunchbase + '#section-funding-rounds'}
>{'$' + millify(itemInfo.amount)}
</OutboundLink>
</div>
}
{ itemInfo.amountKind !== 'funding' &&
<div className="product-property-value tight-col col-60">
<OutboundLink
target="_blank"
eventLabel={'https://finance.yahoo.com/quote/' + itemInfo.yahoo_finance_data.effective_ticker}
to={'https://finance.yahoo.com/quote/' + itemInfo.yahoo_finance_data.effective_ticker}
>{'$' + millify(itemInfo.amount)}
</OutboundLink>
</div>
}
</div>
);
const tickerElement = itemInfo.ticker && (
<div className="product-property row">
<div className="product-property-name col col-40">Ticker</div>
<div className="product-property-value tight-col col-60">
<OutboundLink target="_blank" eventLabel={"https://finance.yahoo.com/quote/" + itemInfo.yahoo_finance_data.effective_ticker} to={"https://finance.yahoo.com/quote/" + itemInfo.yahoo_finance_data.effective_ticker}>{itemInfo.yahoo_finance_data.effective_ticker}</OutboundLink>
</div>
</div>
);
const latestCommitDateElement = itemInfo.latestCommitDate && (
<div className="product-property row">
<div className="product-property-name col col-50">Latest Commit</div>
<div className="product-property-value col col-50">
<OutboundLink eventLabel={itemInfo.latestCommitLink} to={itemInfo.latestCommitLink} target="_blank">{formatDate(itemInfo.latestCommitDate)}</OutboundLink>
</div>
</div>
);
const releaseDateElement = itemInfo.releaseDate && (
<div className="product-property row">
<div className="product-property-name col col-50">Latest Release</div>
<div className="product-property-value col col-50">
<OutboundLink eventLabel={itemInfo.releaseLink} to={itemInfo.releaseLink} target="_blank">{formatDate(itemInfo.releaseDate)}</OutboundLink>
</div>
</div>
);
const crunchbaseEmployeesElement = itemInfo.crunchbaseData && itemInfo.crunchbaseData.numEmployeesMin && (
<div className="product-property row">
<div className="product-property-name col col-50">Headcount</div>
<div className="product-property-value col col-50">{formatNumber(itemInfo.crunchbaseData.numEmployeesMin)}-{formatNumber(itemInfo.crunchbaseData.numEmployeesMax)}</div>
</div>
);
return (
<div className="modal-content">
<KeyHandler keyEventName="keydown" keyValue="ArrowUp" onKeyHandle={handleUp} />
<KeyHandler keyEventName="keydown" keyValue="ArrowDown" onKeyHandle={handleDown} />
<div className="product-logo" style={getRelationStyle(itemInfo.relation)}>
<img src={itemInfo.href} className='product-logo-img'/>
</div>
<div className="product-tags">
<div>{projectTag(itemInfo)}</div>
<div>{openSourceTag(itemInfo.oss)}</div>
<div>{licenseTag(itemInfo)}</div>
<div>{badgeTag(itemInfo)}</div>
</div>
<div className="product-scroll" ref={(x) => productScrollEl = x }>
<div className="product-main">
<div className="product-name">{itemInfo.name}</div>
<div className="product-parent"><InternalLink to={linkToOrganization}>{itemInfo.organization}</InternalLink></div>
<div className="product-category">{itemCategory(itemInfo.landscape)}</div>
<div className="product-description">{itemInfo.description}</div>
</div>
<div className="product-properties">
<div className="product-property row">
<div className="product-property-name col col-20">Website</div>
<div className="product-property-value col col-80">
<OutboundLink eventLabel={itemInfo.homepage_url} to={itemInfo.homepage_url} target="_blank">{itemInfo.homepage_url}</OutboundLink>
</div>
</div>
{itemInfo.repo_url &&
<div className="product-property row">
<div className="product-property-name col col-20">Repository</div>
<div className="product-property-value product-repo col col-80">
<OutboundLink eventLabel={itemInfo.repo_url} to={itemInfo.repo_url} target="_blank">{itemInfo.repo_url}</OutboundLink>
</div>
</div>
}
{itemInfo.starsAsText &&
<div className="product-property row">
<div className="product-property-name col col-20"></div>
<div className="product-property-value col col-80">
<span className="product-repo-stars">
<SvgIcon style={{color: '#7b7b7b'}}>{iconGithub}</SvgIcon>
<StarIcon style={{color: '#7b7b7b'}} />
{itemInfo.starsAsText}
</span>
</div>
</div>
}
{itemInfo.crunchbase &&
<div className="product-property row">
<div className="product-property-name col col-20">Crunchbase</div>
<div className="product-property-value col col-80">
<OutboundLink eventLabel={itemInfo.crunchbase} to={itemInfo.crunchbase} target="_blank">{itemInfo.crunchbase}</OutboundLink>
</div>
</div>
}
{itemInfo.crunchbaseData && itemInfo.crunchbaseData.linkedin &&
<div className="product-property row">
<div className="product-property-name col col-20">LinkedIn</div>
<div className="product-property-value col col-80">
<OutboundLink eventLabel={itemInfo.crunchbaseData.linkedIn} to={itemInfo.crunchbaseData.linkedin} target="_blank">{itemInfo.crunchbaseData.linkedin}</OutboundLink>
</div>
</div>
}
<div className="row">
{ isMobile && <div className="col col-50">
{ twitterElement }
{ latestTweetDateElement }
{ firstCommitDateElement }
{ latestCommitDateElement }
{ contributorsCountElement }
{ releaseDateElement }
{ headquartersElement }
{ crunchbaseEmployeesElement }
{ amountElement }
{ tickerElement }
</div> }
{ !isMobile && <div className="col col-50">
{ twitterElement }
{ firstCommitDateElement }
{ contributorsCountElement }
{ headquartersElement }
{ amountElement }
{ tickerElement }
</div>
}
{ !isMobile && <div className="col col-50">
{ latestTweetDateElement }
{ latestCommitDateElement }
{ releaseDateElement }
{ crunchbaseEmployeesElement }
</div>
}
</div>
</div>
{ showTwitter && itemInfo.twitter && (
<div className="product-twitter">
<Timeline
dataSource={{
sourceType: 'profile',
screenName: itemInfo.twitter.split('/').filter( x => !!x).slice(-1)[0]
}}
options={{
username: itemInfo.name,
tweetLimit: 3
}}
onLoad={() => console.log('Timeline is loaded!')}
/>
</div>
)}
</div>
</div>
);
}
export default ItemDialogContent;

View File

@ -0,0 +1,820 @@
const _ = require('lodash');
const relativeDate = require('relative-date');
const { formatNumber } = require('../utils/formatNumber');
const { isParent } = require('../utils/isParent');
const { fields } = require('../types/fields');
const { assetPath } = require('../utils/assetPath');
const { stringifyParams } = require('../utils/routing');
const { millify, h } = require('../utils/format');
const icons = require('../utils/icons');
module.exports.render = function({settings, tweetsCount, itemInfo}) {
const closeUrl = stringifyParams;
const formatDate = function(x) {
if (x.text) {
return x.text;
}
return relativeDate(new Date(x));
};
function getLinkedIn(itemInfo) {
if (itemInfo.extra && itemInfo.extra.override_linked_in) {
return itemInfo.extra.override_linked_in;
}
if (itemInfo.crunchbaseData && itemInfo.crunchbaseData.linkedin) {
return itemInfo.crunchbaseData.linkedin;
}
return '';
}
function getRelationStyle(relation) {
const relationInfo = fields.relation.valuesMap[relation]
if (relationInfo && relationInfo.color) {
return `border: 4px solid ${relationInfo.color};`;
} else {
return '';
}
}
const formatTwitter = function(x) {
const name = x.split('/').slice(-1)[0];
return '@' + name;
}
const tweetButton = (function() {
// locate zoom buttons
if (!process.env.TWITTER_KEYS) {
return ``
}
const twitterUrl = `https://twitter.com/intent/tweet`
return `<div class="tweet-button">
<a data-tweet="true" href="${h(twitterUrl)}">${icons.bird}<span>Tweet</span></a>
<div class="tweet-count-wrapper">
<div class="tweet-count">${tweetsCount}</div>
</div>
</div>`
})();
const renderLinkTag = (label, { name, url = null, color = 'blue', multiline = false, twoLines = false }) => {
return `<a data-type="internal" href="${url || '/'}" class="tag tag-${color} ${multiline ? 'multiline' : ''} ${twoLines ? 'twolines' : ''}">
${(name ? `<span class="tag-name">${h(name)}</span>` : '')}
<span class="tag-value">${h(label)}</span>
</a>`
}
const renderParentTag = (project) => {
const membership = Object.values(settings.membership).find(({ crunchbase_and_children }) => {
return isParent(crunchbase_and_children, project)
});
if (membership) {
const { label, name, crunchbase_and_children } = membership;
const slug = crunchbase_and_children.split("/").pop();
const url = closeUrl({ grouping: 'organization', filters: {parents: slug}})
return renderLinkTag(label, {name, url});
} else {
return '';
}
}
const renderProjectTag = function({relation, isSubsidiaryProject, project, ...item}) {
if (relation === false) {
return '';
}
const { prefix, tag } = fields.relation.valuesMap[project] || {};
if (prefix && tag) {
const url = closeUrl({ filters: { relation: project }})
return renderLinkTag(tag, {name: prefix, url, twoLines: tag.indexOf(' - ') !== -1 || tag.length > 20 || prefix.length > 20 })
}
if (isSubsidiaryProject) {
const url = closeUrl({ filters: { relation: 'member', organization: item.organization }})
return renderLinkTag("Subsidiary Project", { name: settings.global.short_name, url });
}
return '';
};
const renderMemberTag = function({relation, member, enduser}) {
if (relation === 'member' || relation === 'company') {
const info = settings.membership[member];
if (!info) {
return '';
}
const name = info.name;
const label = enduser ? (info.end_user_label || info.label) : info.label ;
if (!label) {
return '';
}
const url = closeUrl({ filters: { relation }})
return renderLinkTag(label, {name: name, url });
}
return '';
}
const renderOpenSourceTag = function(oss) {
if (oss) {
const url = closeUrl({ grouping: 'license', filters: {license: 'Open Source'}})
return renderLinkTag("Open Source Software", { url, color: "orange" });
} else {
return '';
}
};
const renderLicenseTag = function({relation, license, hideLicense, extra}) {
const { label } = _.find(fields.license.values, {id: license});
if (extra && extra.hide_license) {
return '';
}
if (relation === 'company' || hideLicense) {
return '';
}
const url = closeUrl({ grouping: 'license', filters: { license }});
return renderLinkTag(label, { name: "License", url, color: "purple", multiline: true});
}
const renderBadgeTag = function() {
if (settings.global.hide_best_practices) {
return '';
}
if (!itemInfo.bestPracticeBadgeId) {
if (settings.global.hide_no_best_practices) {
return '';
}
if (itemInfo.oss) {
const emptyUrl="https://bestpractices.coreinfrastructure.org/";
return `<a data-type="external" target="_blank" href=${emptyUrl} class="tag tag-grass">
<span class="tag-value">No OpenSSF Best Practices </span>
</a>`;
} else {
return '';
}
}
const url = `https://bestpractices.coreinfrastructure.org/en/projects/${itemInfo.bestPracticeBadgeId}`;
const label = itemInfo.bestPracticePercentage === 100 ? '✓' : (itemInfo.bestPracticePercentage + '%');
return (`<a data-type="external" target="_blank" href="${url}" class="tag tag-grass">
<span class="tag-name">OpenSSF Best Practices</span>
<span class="tag-value">${label}</span>
</a>`);
}
const renderChart = function() {
if (!itemInfo.github_data || !itemInfo.github_data.languages) {
return '';
}
const allLanguages = itemInfo.github_data.languages;
const languages = (function() {
const maxEntries = 7;
if (allLanguages.length <= maxEntries) {
return allLanguages
} else {
return allLanguages.slice(0, maxEntries).concat([{
name: 'Other',
value: _.sum( allLanguages.slice(maxEntries - 1).map( (x) => x.value)),
color: 'Grey'
}]);
}
})();
function getLegendText(language) {
const total = _.sumBy(languages, 'value');
function percents(v) {
const p = Math.round(v / total * 100);
if (p === 0) {
return '<1%';
} else {
return p + '%';
}
}
return `${language.name} ${percents(language.value)}`;
}
const legend = `
<div style="
position: absolute;
width: 170px;
left: 0;
top: 0;
margin-top: -5px;
margin-bottom: 5px;
font-size: 0.8em;
">
${languages.map(function(language) {
const url = language.name === 'Other' ? null : closeUrl({ grouping: 'no', filters: {language: language.name }});
return `<div style="position: relative; margin-top: 2px; height: 12px;" >
<div style="display: inline-block; position: absolute; height: 12px; width: 12px; background: ${language.color}; top: 2px; margin-right: 4px;" ></div>
<div style="display: inline-block; position: relative; width: 125px; left: 16px; white-space: nowrap; text-overflow: 'ellipsis'; overflow: hidden;">
<a data-type="internal" href="${url}">${h(getLegendText(language)) }</a></div>
</div>`
}).join('')}
</div> `;
// a quick 50 lines pie chart implementation is here
const renderSector = ({
path, fill
}) => `
<path
d="${path}"
fill="${fill}"
stroke="#fff"
strokeWidth="1"
strokeLinejoin="round"
></path>
`;
const renderCircle = ({
center, color, radius
}) => `
<ellipse cx=${center} cy=${center} fill=${color} rx=${radius} ry=${radius} stroke="#fff" strokeWidth="1" ></ellipse>
`;
const renderSectors = ({
center,
data
}) => {
const total = data.reduce((prev, current) => current.value + prev, 0)
let angleStart = -90;
let angleEnd = -90;
let angleMargin = 0;
return total > 0 ? `
<g>
${data.map((d) => {
const isLarge = d.value / total > 0.5;
const angle = 360 * d.value / total;
const radius = center - 1 / 2;
angleStart = angleEnd;
angleMargin = angleMargin > angle ? angle : angleMargin;
angleEnd = angleStart + angle - angleMargin;
const x1 = center + radius * Math.cos(Math.PI * angleStart / 180);
const y1 = center + radius * Math.sin(Math.PI * angleStart / 180);
const x2 = center + radius * Math.cos(Math.PI * angleEnd / 180);
const y2 = center + radius * Math.sin(Math.PI * angleEnd / 180);
const path = `
M${center},${center}
L${x1},${y1}
A${radius},${radius}
0 ${isLarge ? 1 : 0},1
${x2},${y2}
z
`
angleEnd += angleMargin;
return renderSector({fill: d.color, path: path});
}).join('')}
</g>
` : ''
}
const renderPie = ({data}) => {
const viewBoxSize = 100;
const center = viewBoxSize / 2;
if (!data || data.length === 0) {
return '';
}
return `<svg viewBox="0 0 ${viewBoxSize } ${viewBoxSize}">
<g>
${ data.length === 1
? renderCircle({center: center, radius: center, ...data[0]})
: renderSectors({center: center, data: data})
}
</g>
</svg>`;
}
return `<div style="width: 220px; height: 120px; position: relative">
<div style="margin-left: 170px; width: 100px; height: 100px;">
${renderPie({data: languages})}
</div>
${legend}
</div>`;
}
const renderParticipation = function() {
if (!itemInfo.github_data || !itemInfo.github_data.contributions) {
return '';
}
// build an Y scale axis
// build an X scale axis
const monthText = (function() {
const firstWeek = new Date(itemInfo.github_data.firstWeek.replace('Z', 'T00:00:00Z'));
const months = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ');
const result = [];
const m = firstWeek.getMonth();
for (let i = 0; i < 12; i += 2) {
const monthName = months[(m + i) % 12];
const separator = i === 12 ? '' : `<span style="width: 23px; display: inline-block;" ></span>`;
result.push(`<span style="width: 30px; display: inline-block">${monthName}</span>`);
result.push(separator);
}
return result.join('');
})();
const barValues = itemInfo.github_data.contributions.split(';').map( (x)=> +x).slice(-51)
const { maxValue, step } = ( () => {
const max = _.max(barValues);
let maxValue;
let step;
for (let pow = 0; pow < 10; pow++) {
for (let v of [1, 2, 5]) {
const value = v * Math.pow(10, pow);
if (value >= max && !maxValue) {
maxValue = value;
if (pow === 0) {
step = v;
} else {
step = 5;
}
}
}
}
return {
step,
maxValue
}
})();
const xyLines = ( () => {
const result = []
for (let x = 0; x <= step; x += 1) {
result.push(`<div style="
position: absolute;
left: 20px;
right: 0;
top: ${(x / step) * 100}%;
height: .5px;
background: #777;"
></div>
`)
result.push(`<span style="
display: inline-block;
position: absolute;
font-size: 10px;
left: 5px;
right: 0px;
top: ${(x / step) * 150 - 7}px;
">${(step - x) / step * maxValue}</span>`);
}
result.push(`<div style="
position: absolute;
left: 25px;
bottom: 0;
top: 0;
width: .5px;
background: #777;
"></div>`);
return result.join('');
})();
const bars = barValues.map(function(value, index) {
if (value === 0) {
value = 1;
}
return `<div style="
position: absolute;
bottom: 0;
top: ${(maxValue - value) / maxValue * 150}px;
left: ${24 + index * 5.6}px;
width: 4px;
background: #00F;
border: 1px solid #777;
" ></div>`;
}).join('');
const width = 300;
return `<div style="width: ${width}px; height: 150px; position: relative;">
${xyLines}
${bars}
<div style="
transform: rotate(-90deg);
position: absolute;
left: -24px;
font-size: 10px;
top: 59px;
">Commits</div>
<div style="
font-size: 10px;
left: 20px;
bottom: -16px;
white-space: nowrap;
position: absolute;
">${monthText}</div>
</div>`;
}
const linkToOrganization = closeUrl({ grouping: 'organization', filters: {organization: itemInfo.organization}});
const renderItemCategory = function({path, itemInfo}) {
var separator = `<span class="product-category-separator" key="product-category-separator">•</span>`;
var subcategory = _.find(fields.landscape.values,{id: path});
if (!subcategory) {
throw new Error(`Failed to render ${itemInfo.name}, can not find a subcategory: ${path}, available paths are below: \n${fields.landscape.values.map( (x) => x.id).join('\n')}`);
}
var category = _.find(fields.landscape.values, {id: subcategory.parentId});
var categoryMarkup = `
<a data-type="internal" href="${closeUrl({ grouping: 'landscape', filters: {landscape: category.id}})}">${h(category.label)}</a>
`
var subcategoryMarkup = `
<a data-type="internal" href="${closeUrl({ grouping: 'landscape', filters: {landscape: path}})}">${h(subcategory.label)}</a>
`
return `<span>${categoryMarkup} ${separator} ${subcategoryMarkup}</span>`;
}
const twitterElement = itemInfo.twitter ? `
<div class="product-property row">
<div class="product-property-name col col-40">Twitter</div>
<div class="product-property-value col col-60">
<a data-type="external" target="_blank" href="${itemInfo.twitter}">${h(formatTwitter(itemInfo.twitter))}</a>
</div>
</div>
` : '';
const latestTweetDateElement = itemInfo.twitter ? `
<div class="product-property row">
<div class="product-property-name col col-50">Latest Tweet</div>
<div class="product-property-value col col-50">
${ itemInfo.latestTweetDate ? `
<a data-type="external" target="_blank" href="${h(itemInfo.twitter)}">${formatDate(itemInfo.latestTweetDate)}</a>
` : ''}
</div>
</div>
` : '';
const firstCommitDateElement = itemInfo.firstCommitDate ? `
<div class="product-property row">
<div class="product-property-name col col-40">First Commit</div>
<div class="product-property-value tight-col col-60">
<a data-type="external" target=_blank href="${h(itemInfo.firstCommitLink)}">${formatDate(itemInfo.firstCommitDate)}</a>
</div>
</div>
` : '';
const contributorsCountElement = itemInfo.contributorsCount ? `
<div class="product-property row">
<div class="product-property-name col col-40">Contributors</div>
<div class="product-property-value tight-col col-60">
<a data-type="external" target=_blank href="${itemInfo.contributorsLink}">
${itemInfo.contributorsCount > 500 ? '500+' : itemInfo.contributorsCount }
</a>
</div>
</div>
` : '';
const headquartersElement = itemInfo.headquarters && itemInfo.headquarters !== 'N/A' ? `
<div class="product-property row">
<div class="product-property-name col col-40">Headquarters</div>
<div class="product-property-value tight-col col-60">
<a data-type="external" target=_blank href="${closeUrl({ grouping: 'headquarters', filters:{headquarters:itemInfo.headquarters}})}">${h(itemInfo.headquarters)}</a>
</div>
</div>
` : '';
const amountElement = !settings.global.hide_funding_and_market_cap && Number.isInteger(itemInfo.amount) ? `
<div class="product-property row">
<div class="product-property-name col col-40">${itemInfo.amountKind === 'funding' ? 'Funding' : 'Market Cap'}</div>
${ itemInfo.amountKind === 'funding' ? `
<div class="product-property-value tight-col col-60">
<a data-type="external" target=_blank href="${itemInfo.crunchbase + '#section-funding-rounds'}">
${'$' + millify(itemInfo.amount)}
</a>
</div>` : ''
}
${ itemInfo.amountKind !== 'funding' ? `
<div class="product-property-value tight-col col-60">
<a data-type="external" target=_blank href="https://finance.yahoo.com/quote/${itemInfo.yahoo_finance_data.effective_ticker}">
${'$' + millify(itemInfo.amount)}
</a>
</div>` : ''
}
</div>
` : '';
const tickerElement = itemInfo.ticker ? `
<div class="product-property row">
<div class="product-property-name col col-40">Ticker</div>
<div class="product-property-value tight-col col-60">
<a data-type="external" target=_blank href="https://finance.yahoo.com/quote/${itemInfo.yahoo_finance_data.effective_ticker}">
${h(itemInfo.yahoo_finance_data.effective_ticker)}
</a>
</div>
</div>
` : '';
const latestCommitDateElement = itemInfo.latestCommitDate ? `
<div class="product-property row">
<div class="product-property-name col col-50">Latest Commit</div>
<div class="product-property-value col col-50">
<a data-type="external" target=_blank href="${itemInfo.latestCommitLink}">${formatDate(itemInfo.latestCommitDate)}</a>
</div>
</div>
` : '';
const releaseDateElement = itemInfo.releaseDate ? `
<div class="product-property row">
<div class="product-property-name col col-50">Latest Release</div>
<div class="product-property-value col col-50">
<a data-type="external" target=_blank href="${itemInfo.releaseLink}">${formatDate(itemInfo.releaseDate)}</a>
</div>
</div>
` : '';
const crunchbaseEmployeesElement = itemInfo.crunchbaseData && itemInfo.crunchbaseData.numEmployeesMin ? `
<div class="product-property row">
<div class="product-property-name col col-50">Headcount</div>
<div class="product-property-value col col-50">${formatNumber(itemInfo.crunchbaseData.numEmployeesMin)}-${formatNumber(itemInfo.crunchbaseData.numEmployeesMax)}</div>
</div>
` : '';
const specialDates = ( function() {
let specialKeys = ['accepted', 'incubation', 'graduated', 'archived'];
const names = {
accepted: 'Accepted',
incubation: 'Incubation',
graduated: 'Graduated',
archived: 'Archived'
}
let result = {};
for (let key of specialKeys) {
if (itemInfo.extra && itemInfo.extra[key]) {
result[key] = itemInfo.extra[key];
delete itemInfo.extra[key];
}
}
const keys = Object.keys(result);
const values = Object.values(result);
if (keys.length === 0) {
return '';
}
if (keys.length === 1) {
return `
<div class="product-property row">
<div class="product-property-name col col-20">${names[keys[0]]}</div>
<div class="product-property-name col col-80">${values[0]}</div>
</div>
`
}
if (keys.length === 2) {
return `
<div class="row">
<div class="col col-50">
<div class="product-property row">
<div class="product-property-name col col-40">${names[keys[0]]}</div>
<div class="product-property-name col col-60">${values[0]}</div>
</div>
</div>
<div class="col col-50">
<div class="product-property row">
<div class="product-property-name col col-50">${names[keys[1]]}</div>
<div class="product-property-name col col-50">${values[1]}</div>
</div>
</div>
</div>
`
}
if (keys.length === 3) {
return `
<div class="row">
<div class="col col-50">
<div class="product-property row">
<div class="product-property-name col col-40">${names[keys[0]]}</div>
<div class="product-property-name col col-60">${values[0]}</div>
</div>
</div>
<div class="col col-50">
<div class="product-property row">
<div class="product-property-name col col-50">${names[keys[1]]}</div>
<div class="product-property-name col col-50">${values[1]}</div>
</div>
</div>
</div>
<div class="product-property row">
<div class="product-property-name col col-20">${names[keys[2]]}</div>
<div class="product-property-name col col-80">${values[2]}</div>
</div>
`;
}
return '';
})();
const cloElement = ( function() {
if (!itemInfo.extra) {
return '';
}
if (!itemInfo.extra.clomonitor_svg) {
return '';
}
return `
<a href="https://clomonitor.io/projects/cncf/${itemInfo.extra.clomonitor_name}" target="_blank">
${itemInfo.extra.clomonitor_svg}
</a>
`;
})();
const extraElement = ( function() {
if (!itemInfo.extra) {
return '';
}
const items = Object.keys(itemInfo.extra).map( function(key) {
if (key.indexOf('summary_') === 0) {
return '';
}
if (key === 'clomonitor_name' || key === 'clomonitor_svg') {
return '';
}
if (key === 'hide_license') {
return '';
}
if (key === 'override_linked_in') {
return '';
}
if (key === 'audits') {
const value = itemInfo.extra[key];
const lines = (value.map ? value : [value]).map( (auditInfo) => `
<div>
<a href="${h(auditInfo.url)}" target="_blank">${h(auditInfo.type)} at ${auditInfo.date}</a>
</div>
`).join('');
return `<div class="product-property row">
<div class="product-property-name tight-col col-20">Audits</div>
<div class="product-proerty-value tight-col col-80">${lines}</div>
</div>`;
}
const value = itemInfo.extra[key];
const keyText = (function() {
const step1 = key.replace(/_url/g, '');
const step2 = step1.split('_').map( (x) => x.charAt(0).toUpperCase() + x.substring(1)).join(' ');
return step2;
})();
const valueText = (function() {
if (!!(new Date(value).getTime()) && typeof value === 'string') {
return h(relativeDate(new Date(value)));
}
if (typeof value === 'string' && (value.indexOf('http://') === 0 || value.indexOf('https://') === 0)) {
return `<a data-type="external" target=_blank href="${h(value)}">${h(value)}</a>`;
}
return h(value);
})();
return `<div class="product-property row">
<div class="product-property-name tight-col col-20">${h(keyText)}</div>
<div class="product-proerty-value tight-col col-80">${valueText}</div>
</div>`;
});
return items.join('');
})();
const cellStyle = `
width: 146px;
marginRight: 4px;
height: 26px;
display: inline-block;
layout: relative;
overflow: hidden;
`;
const productLogoAndTagsAndCharts = `
<div class="product-logo" style="${getRelationStyle(itemInfo.relation)}">
<img alt="product logo" src="${assetPath(itemInfo.href)}" class="product-logo-img">
</div>
<div class="product-tags">
<div class="product-badges" style="width: 300px;" >
<div style="${cellStyle}">${renderProjectTag(itemInfo)}</div>
<div style="${cellStyle}">${renderParentTag(itemInfo)}</div>
<div style="${cellStyle}">${renderOpenSourceTag(itemInfo.oss)}</div>
<div style="${cellStyle}">${renderLicenseTag(itemInfo)}</div>
<div style="${cellStyle}">${renderBadgeTag(itemInfo)}</div>
<div style="${cellStyle}">${tweetButton}</div>
<div class="charts-desktop">
${renderChart(itemInfo)}
${renderParticipation(itemInfo)}
</div>
</div>
</div>`;
const shortenUrl = (url) => url.replace(/http(s)?:\/\/(www\.)?/, "").replace(/\/$/, "");
const productPaths1 = [itemInfo.landscape, itemInfo.second_path || [], itemInfo.allPaths || []].flat();
const productPaths = _.uniq(productPaths1.filter( (x) => !!x));
const productInfo = `
<div class="product-main">
<div class="product-name">${h(itemInfo.name)}</div>
<div class="product-parent"><a data-type=internal href="${linkToOrganization}">
<span>${h(itemInfo.organization)}</span>${renderMemberTag(itemInfo)}</a></div>
${productPaths.map( (productPath) => `
<div class="product-category">${renderItemCategory({path: productPath, itemInfo})}</div>
`).join('')}
<div class="product-description">${h(itemInfo.description)}</div>
</div>
<div class="product-properties">
<div class="product-property row">
<div class="product-property-name col col-20">Website</div>
<div class="product-property-value col col-80">
<a data-type=external target=_blank href="${itemInfo.homepage_url}">${shortenUrl(itemInfo.homepage_url)}</a>
</div>
</div>
${ (itemInfo.repos || []).map(({ url, stars }, idx) => {
return `<div class="product-property row">
<div class="product-property-name col col-20">
${ idx === 0 ? (itemInfo.repos.length > 1 ? 'Repositories' : 'Repository') : '' }
</div>
<div class="product-property-value product-repo col col-80">
<a data-type=external target=_blank href="${url}">${shortenUrl(url)}</a>
${ idx === 0 && itemInfo.repos.length > 1 ? `<span class="primary-repo">(primary)</span>` : '' }
${ itemInfo.github_data ? `<span class="product-repo-stars">
${icons.github}
${icons.star}
${formatNumber(stars)}
</span> ` : ''
}
</div>
</div>`
}).join('')}
${itemInfo.repos && (itemInfo.repos.length > 3 || (itemInfo.repos.length > 1 && itemInfo.github_data)) ? `
<div class="product-property row">
<div class="product-property-name col col-20"></div>
<div class="product-property-value product-repo col col-80">
${ itemInfo.github_data ? `
<span class="product-repo-stars-label">
total:
</span>
<span class="product-repo-stars">
${icons.github}
${icons.star}
${formatNumber(itemInfo.github_data.stars)}
</span> ` : ''
}
</div>
</div> ` : ''
}
${itemInfo.crunchbase ? `
<div class="product-property row">
<div class="product-property-name col col-20">Crunchbase</div>
<div class="product-property-value col col-80">
<a data-type=external target=_blank href="${itemInfo.crunchbase}">${shortenUrl(itemInfo.crunchbase)}</a>
</div>
</div> ` : ''
}
${getLinkedIn(itemInfo) ? `
<div class="product-property row">
<div class="product-property-name col col-20">LinkedIn</div>
<div class="product-property-value col col-80">
<a data-type=external target=_blank href="${getLinkedIn(itemInfo)}">
${shortenUrl(getLinkedIn(itemInfo))}
</a>
</div>
</div> ` : ''
}
<div class="row">
<div class="col col-50">
${ twitterElement }
${ firstCommitDateElement }
${ contributorsCountElement }
</div>
<div class="col col-50">
${ latestTweetDateElement }
${ latestCommitDateElement }
${ releaseDateElement }
</div>
</div>
${specialDates}
<div class="row">
<div class="col col-50">
${ headquartersElement }
${ amountElement }
${ tickerElement }
</div>
<div class="col col-50">
${ crunchbaseEmployeesElement }
</div>
</div>
${extraElement}
${cloElement}
</div>
`;
const result = `<div class="modal-content ${itemInfo.oss ? 'oss' : 'nonoss'}">
${productLogoAndTagsAndCharts}
<div class="product-scroll" >
${productInfo}
<div class="charts-mobile">
${renderChart(itemInfo)}
${renderParticipation(itemInfo)}
</div>
${ itemInfo.twitter ? `<div class="twitter-timeline">
<a class="twitter-timeline" aria-hidden="true" data-tweet-limit="5" href="${itemInfo.twitter}"></a>
</div>` : '' }
</div>
</div>`;
return result;
}

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