From bd4cb0e4e79c8b4116d7b3bd0a894e2925749daf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 08:35:12 +0000 Subject: [PATCH 01/47] Bump @astrojs/mdx from 3.1.8 to 3.1.9 Bumps [@astrojs/mdx](https://github.com/withastro/astro/tree/HEAD/packages/integrations/mdx) from 3.1.8 to 3.1.9. - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/mdx/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/@astrojs/mdx@3.1.9/packages/integrations/mdx) --- updated-dependencies: - dependency-name: "@astrojs/mdx" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 236 +++++++++++++++++++++++++++++++--------------- package.json | 2 +- 2 files changed, 159 insertions(+), 79 deletions(-) diff --git a/package-lock.json b/package-lock.json index eae0d78..c93b811 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "@astro-community/astro-embed-youtube": "^0.5.3", "@astrojs/check": "^0.9.4", "@astrojs/markdoc": "^0.11.5", - "@astrojs/mdx": "^3.1.8", + "@astrojs/mdx": "^3.1.9", "@astrojs/netlify": "^5.5.4", "@astrojs/react": "^3.6.2", "@astrojs/sitemap": "^3.2.1", @@ -246,14 +246,13 @@ } }, "node_modules/@astrojs/mdx": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-3.1.8.tgz", - "integrity": "sha512-4o/+pvgoLFG0eG96cFs4t3NzZAIAOYu57fKAprWHXJrnq/qdBV0av6BYDjoESxvxNILUYoj8sdZVWtlPWVDLog==", - "license": "MIT", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-3.1.9.tgz", + "integrity": "sha512-3jPD4Bff6lIA20RQoonnZkRtZ9T3i0HFm6fcDF7BMsKIZ+xBP2KXzQWiuGu62lrVCmU612N+SQVGl5e0fI+zWg==", "dependencies": { "@astrojs/markdown-remark": "5.3.0", - "@mdx-js/mdx": "^3.0.1", - "acorn": "^8.12.1", + "@mdx-js/mdx": "^3.1.0", + "acorn": "^8.14.0", "es-module-lexer": "^1.5.4", "estree-util-visit": "^2.0.0", "gray-matter": "^4.0.3", @@ -2385,10 +2384,9 @@ } }, "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -2396,14 +2394,15 @@ "@types/mdx": "^2.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", + "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", @@ -4715,8 +4714,7 @@ "node_modules/@types/mdx": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "license": "MIT" + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" }, "node_modules/@types/ms": { "version": "0.7.34", @@ -5069,10 +5067,9 @@ "license": "ISC" }, "node_modules/acorn": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", - "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", - "license": "MIT", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -5262,7 +5259,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "license": "MIT", "bin": { "astring": "bin/astring" } @@ -6072,7 +6068,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -6696,6 +6691,36 @@ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "license": "MIT" }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -6772,7 +6797,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" }, @@ -6785,7 +6809,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", @@ -6807,11 +6830,23 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/estree-util-to-js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", @@ -7694,7 +7729,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -7718,6 +7752,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-estree/node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/hast-util-to-estree/node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/hast-util-to-html": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", @@ -7745,7 +7792,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==", - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -7768,21 +7814,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", - "license": "MIT" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", - "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.4" - } - }, "node_modules/hast-util-to-parse5": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", @@ -8071,10 +8102,9 @@ "license": "ISC" }, "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "license": "MIT" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" }, "node_modules/intl-messageformat": { "version": "10.7.0", @@ -8285,15 +8315,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", @@ -8747,7 +8768,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "license": "MIT", "engines": { "node": ">=16" }, @@ -10612,17 +10632,6 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, "node_modules/picocolors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", @@ -11223,6 +11232,66 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", + "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -11304,6 +11373,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-stringify": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", @@ -11363,10 +11446,9 @@ } }, "node_modules/remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", + "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" @@ -12016,7 +12098,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "license": "BSD-3-Clause", "engines": { "node": ">= 8" } @@ -12215,12 +12296,11 @@ } }, "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "license": "MIT", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "dependencies": { - "inline-style-parser": "0.1.1" + "inline-style-parser": "0.2.4" } }, "node_modules/stylis": { diff --git a/package.json b/package.json index 2171204..110f349 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "@astro-community/astro-embed-youtube": "^0.5.3", "@astrojs/check": "^0.9.4", "@astrojs/markdoc": "^0.11.5", - "@astrojs/mdx": "^3.1.8", + "@astrojs/mdx": "^3.1.9", "@astrojs/netlify": "^5.5.4", "@astrojs/react": "^3.6.2", "@astrojs/sitemap": "^3.2.1", From 9b30d44707f88dd7ac7f54bfd0e393b337e3d8bb Mon Sep 17 00:00:00 2001 From: Guido X Jansen Date: Mon, 4 Nov 2024 15:01:59 +0100 Subject: [PATCH 02/47] Implement KeyStatic --- keystatic.config.ts | 156 ++--------------------------- package-lock.json | 90 +++++++++-------- package.json | 4 +- src/pages/keystatic/[...params].ts | 7 ++ src/pages/keystatic/index.astro | 25 +++++ 5 files changed, 88 insertions(+), 194 deletions(-) create mode 100644 src/pages/keystatic/[...params].ts create mode 100644 src/pages/keystatic/index.astro diff --git a/keystatic.config.ts b/keystatic.config.ts index 622411e..0e54ab4 100644 --- a/keystatic.config.ts +++ b/keystatic.config.ts @@ -1,158 +1,18 @@ -import { config, fields, collection } from '@keystatic/core'; +import { config } from '@keystatic/core'; + export default config({ storage: { - kind: 'local', + kind: 'cloud', + }, + cloud: { + project: 'commercequest/cq-astro', }, ui: { brand: { name: 'CommerceQuest Admin', - // mark: ({ colorScheme }) => { - // let path = colorScheme === 'dark' - // ? '/icon.svg' - // : '/icon.svg'; - - // return - // }, }, }, collections: { - posts: collection({ - label: 'Blogs', - slugField: 'title', - path: 'src/content/blog/*', - format: { contentField: 'content' }, - schema: { - title: fields.slug({ - name: { label: "Title" }, - slug: { - label: "SEO-friendly slug", - description: "Don't change the slug once a file is published!", - }, - }), - description: fields.text({ - label: "Description", - description: "A short description of the post.", - validation: { isRequired: true }, - }), - notes: fields.mdx({ - label: "Notes", - description: "Internal notes for this post.", - }), - content: fields.text({ - label: 'Main content', - // formatting: true, - // dividers: true, - // links: true, - // images: true, - }), - // draft: fields.checkbox({ - // label: "Draft", - // description: - // "Set this post as draft to prevent it from being published.", - // }), - authors: fields.array( - fields.relationship({ - label: "Post author", - collection: `authors`, - }), - { - label: "Authors", - validation: { length: { min: 1 } }, - itemLabel: (props) => props.value || "Please select an author", - }, - ), - pubDate: fields.date({ label: "Publish Date" }), - updatedDate: fields.date({ - label: "Updated Date", - validation: { isRequired: true }, - description: - "If you update this post at a later date, put that date here.", - }), - cardImage: fields.image({ - label: "Hero Image", - publicPath: "../", - validation: { isRequired: true }, - }), - cardImageAlt: fields.text({ - label: "Hero Image Alt Text", - description: "Describe the image for screen readers.", - validation: { isRequired: true }, - }), - tags: fields.array(fields.text({ label: "Tags" }), { - label: "Tags", - description: "This is NOT case sensitive.", - itemLabel: (props) => props.value, - validation: { length: { min: 1 } }, - }), - }, - }), - authors: collection({ - label: `Authors`, - slugField: "name", - path: `src/content/authors/*/`, - columns: ["name"], - entryLayout: "content", - format: { contentField: "bio" }, - schema: { - name: fields.slug({ - name: { - label: "Name", - validation: { - isRequired: true, - }, - }, - slug: { - label: "SEO-friendly slug", - description: "Never change the slug once this file is published!", - }, - }), - authorImage: fields.image({ - label: "Author avatar", - publicPath: "../", - validation: { isRequired: true }, - }), - authorImageAlt: fields.text({ - label: "Author avatar alt text", - description: "Describe the image for screen readers.", - validation: { isRequired: true }, - }), - role: fields.text({ - label: "Role", - description: "Job + Company", - validation: { isRequired: true }, - }), - email: fields.text({ - label: "The author's email", - description: "This must look something like `you@email.com`", - validation: { isRequired: true }, - }), - authorLink: fields.url({ - label: "Author Website or Social Media Link", - validation: { isRequired: true }, - }), - bio: fields.mdx({ - label: "Full Bio", - description: "The author's full bio", - options: { - bold: true, - italic: true, - strikethrough: true, - code: true, - heading: [2, 3, 4], - blockquote: true, - orderedList: true, - unorderedList: true, - table: false, - link: true, - image: { - directory: "src/content/authors/", - publicPath: "../", - }, - divider: true, - codeBlock: false, - }, - }), - }, - }) + // Collections can be added here when needed }, -}); \ No newline at end of file +}); diff --git a/package-lock.json b/package-lock.json index eae0d78..17bd3fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,14 +18,14 @@ "@astrojs/starlight-tailwind": "^2.0.3", "@astrojs/tailwind": "^5.1.2", "@keystatic/astro": "^5.0.3", - "@keystatic/core": "^0.5.28", + "@keystatic/core": "^0.5.39", "@preline/accordion": "^2.4.1", "@preline/collapse": "^2.4.1", "@preline/dropdown": "^2.4.1", "@preline/overlay": "^2.4.1", "@preline/tabs": "^2.4.1", "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "astro": "^4.16.7", "astro-compressor": "^0.4.1", "astro-icon": "^1.1.1", @@ -1427,9 +1427,9 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", - "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", "license": "MIT", "dependencies": { "@floating-ui/core": "^1.6.0", @@ -1471,53 +1471,53 @@ "license": "MIT" }, "node_modules/@formatjs/ecma402-abstract": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.0.tgz", - "integrity": "sha512-IpM+ev1E4QLtstniOE29W1rqH9eTdx5hQdNL8pzrflMj/gogfaoONZqL83LUeQScHAvyMbpqP5C9MzNf+fFwhQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.3.tgz", + "integrity": "sha512-aElGmleuReGnk2wtYOzYFmNWYoiWWmf1pPPCYg0oiIQSJj0mjc4eUfzUXaSOJ4S8WzI/cLqnCTWjqz904FT2OQ==", "license": "MIT", "dependencies": { - "@formatjs/fast-memoize": "2.2.1", - "@formatjs/intl-localematcher": "0.5.5", - "tslib": "^2.7.0" + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/intl-localematcher": "0.5.7", + "tslib": "2" } }, "node_modules/@formatjs/fast-memoize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.1.tgz", - "integrity": "sha512-XS2RcOSyWxmUB7BUjj3mlPH0exsUzlf6QfhhijgI941WaJhVxXQ6mEWkdUFIdnKi3TuTYxRdelsgv3mjieIGIA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", + "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", "license": "MIT", "dependencies": { - "tslib": "^2.7.0" + "tslib": "2" } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.7.10", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.10.tgz", - "integrity": "sha512-wlQfqCZ7PURkUNL2+8VTEFavPovtADU/isSKLFvDbdFmV7QPZIYqFMkhklaDYgMyLSBJa/h2MVQ2aFvoEJhxgg==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.3.tgz", + "integrity": "sha512-9L99QsH14XjOCIp4TmbT8wxuffJxGK8uLNO1zNhLtcZaVXvv626N0s4A2qgRCKG3dfYWx9psvGlFmvyVBa6u/w==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/icu-skeleton-parser": "1.8.4", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/icu-skeleton-parser": "1.8.7", + "tslib": "2" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.4.tgz", - "integrity": "sha512-LMQ1+Wk1QSzU4zpd5aSu7+w5oeYhupRwZnMQckLPRYhSjf2/8JWQ882BauY9NyHxs5igpuQIXZDgfkaH3PoATg==", + "version": "1.8.7", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.7.tgz", + "integrity": "sha512-fI+6SmS2g7h3srfAKSWa5dwreU5zNEfon2uFo99OToiLF6yxGE+WikvFSbsvMAYkscucvVmTYNlWlaDPp0n5HA==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.3", + "tslib": "2" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.5.tgz", - "integrity": "sha512-t5tOGMgZ/i5+ALl2/offNqAQq/lfUnKLEw0mXQI4N4bqpedhrSE+fyKLpwnd22sK0dif6AV+ufQcTsKShB9J1g==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.7.tgz", + "integrity": "sha512-GGFtfHGQVFe/niOZp24Kal5b2i36eE2bNL0xi9Sg/yd0TR8aLjcteApZdHmismP5QQax1cMnZM9yWySUUjJteA==", "license": "MIT", "dependencies": { - "tslib": "^2.7.0" + "tslib": "2" } }, "node_modules/@graphql-typed-document-node/core": { @@ -2138,9 +2138,9 @@ "license": "Apache-2.0" }, "node_modules/@keystar/ui": { - "version": "0.7.11", - "resolved": "https://registry.npmjs.org/@keystar/ui/-/ui-0.7.11.tgz", - "integrity": "sha512-lBAKglgCsYOj3pYiOnCr14jvKHIvbnaCxkCKCHGsl15nOjRbKylAwbbMvd3vi/cUyXe+qX3kdn/YtAbVwkyjCg==", + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/@keystar/ui/-/ui-0.7.12.tgz", + "integrity": "sha512-dZlr2VYhEVU/jSaC1/o3iRoS2TBYv7o5odqyBD/5qXuuiaFJZjbZ9wO5PrjxLT7SxjLAomOlBdpUgSha0GiTlw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -2245,6 +2245,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/@keystatic/astro/-/astro-5.0.3.tgz", "integrity": "sha512-2zXhv+nHLh1qoku46WvFXw+0uXtTan7/V2Vf+diVlWjE+KLTQSPqlQtIu2qMQHuRxXm8kLzD6kRKO3rBsk4Y2A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@types/react": "^18.2.8", @@ -2258,9 +2259,9 @@ } }, "node_modules/@keystatic/core": { - "version": "0.5.38", - "resolved": "https://registry.npmjs.org/@keystatic/core/-/core-0.5.38.tgz", - "integrity": "sha512-mtvGYBfJldFaTLX6ivTUylJaskvZr35qid8aKID/WjLygxbo5s1xkxRBTeQaJkSPF0Vu4CmpHqLYUjZcpVUvMw==", + "version": "0.5.39", + "resolved": "https://registry.npmjs.org/@keystatic/core/-/core-0.5.39.tgz", + "integrity": "sha512-bOnNXT32ZrAs+s1g/Z1D8QEzkGQ5svVyhsAXM+bcR7kN+4ZoFvWGLMrosyCBflh+b3CuvcxPP1rD2v+stc/1AQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -2269,7 +2270,7 @@ "@emotion/weak-memoize": "^0.3.0", "@floating-ui/react": "^0.24.0", "@internationalized/string": "^3.2.3", - "@keystar/ui": "^0.7.11", + "@keystar/ui": "^0.7.12", "@markdoc/markdoc": "^0.4.0", "@react-aria/focus": "^3.18.1", "@react-aria/i18n": "^3.12.1", @@ -4758,6 +4759,7 @@ "version": "18.3.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -8077,15 +8079,15 @@ "license": "MIT" }, "node_modules/intl-messageformat": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.0.tgz", - "integrity": "sha512-2P06M9jFTqJnEQzE072VGPjbAx6ZG1YysgopAwc8ui0ajSjtwX1MeQ6bXFXIzKcNENJTizKkcJIcZ0zlpl1zSg==", + "version": "10.7.5", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.5.tgz", + "integrity": "sha512-CflbRvJiahVmnfxq/lO+DCM1/8ji4vC4rTnz6ZJEKKodViB+EWgY9M4EqXVRQ+3K0Ng5qwSyqybPP+KSfS4KZw==", "license": "BSD-3-Clause", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/fast-memoize": "2.2.1", - "@formatjs/icu-messageformat-parser": "2.7.10", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/icu-messageformat-parser": "2.9.3", + "tslib": "2" } }, "node_modules/is-alphabetical": { diff --git a/package.json b/package.json index 2171204..99b63e3 100644 --- a/package.json +++ b/package.json @@ -21,14 +21,14 @@ "@astrojs/starlight-tailwind": "^2.0.3", "@astrojs/tailwind": "^5.1.2", "@keystatic/astro": "^5.0.3", - "@keystatic/core": "^0.5.28", + "@keystatic/core": "^0.5.39", "@preline/accordion": "^2.4.1", "@preline/collapse": "^2.4.1", "@preline/dropdown": "^2.4.1", "@preline/overlay": "^2.4.1", "@preline/tabs": "^2.4.1", "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "astro": "^4.16.7", "astro-compressor": "^0.4.1", "astro-icon": "^1.1.1", diff --git a/src/pages/keystatic/[...params].ts b/src/pages/keystatic/[...params].ts new file mode 100644 index 0000000..19dbe0b --- /dev/null +++ b/src/pages/keystatic/[...params].ts @@ -0,0 +1,7 @@ +import { makeHandler } from '@keystatic/astro/api'; +import config from '../../../keystatic.config'; + +export const prerender = false; +export const all = makeHandler({ + config, +}); diff --git a/src/pages/keystatic/index.astro b/src/pages/keystatic/index.astro new file mode 100644 index 0000000..22c2307 --- /dev/null +++ b/src/pages/keystatic/index.astro @@ -0,0 +1,25 @@ +--- +import { Keystatic } from '@keystatic/core/ui'; +import config from '../../../keystatic.config'; +--- + + + + + + + Admin | CommerceQuest + + + +
+ +
+ + From 6a7f2dcd99cdf4ea470a942bff413bf238f10c9f Mon Sep 17 00:00:00 2001 From: Guido X Jansen Date: Mon, 4 Nov 2024 15:08:05 +0100 Subject: [PATCH 03/47] adminpath fix --- src/pages/keystatic/index.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/keystatic/index.astro b/src/pages/keystatic/index.astro index 22c2307..b9718ac 100644 --- a/src/pages/keystatic/index.astro +++ b/src/pages/keystatic/index.astro @@ -19,7 +19,7 @@ import config from '../../../keystatic.config';
- +
From 1689e1ddef9cd4dccc2bd222a9ce7e3307bec8e8 Mon Sep 17 00:00:00 2001 From: "keystatic-cloud[bot]" <127914443+keystatic-cloud[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:49:49 +0000 Subject: [PATCH 04/47] Update src/content/freelancers/guido Co-authored-by: Guido X Jansen --- src/content/freelancers/guido.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/content/freelancers/guido.yaml diff --git a/src/content/freelancers/guido.yaml b/src/content/freelancers/guido.yaml new file mode 100644 index 0000000..421a713 --- /dev/null +++ b/src/content/freelancers/guido.yaml @@ -0,0 +1,11 @@ +firstName: Guido +lastName: Jansen +photo: guido.jpg +location: Amsterdam +countryCode: NL +sprykerCertifications: + backEndDeveloper: false + solutionArchitect: false +skills: [] +contact: test@gui.do +isVisible: true From dac8e388d5abf6849fb2f0d5811e45e974947e91 Mon Sep 17 00:00:00 2001 From: "keystatic-cloud[bot]" <127914443+keystatic-cloud[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:55:13 +0000 Subject: [PATCH 05/47] Update src/content/freelancers/guido Co-authored-by: Guido X Jansen --- src/content/freelancers/guido.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/content/freelancers/guido.yaml b/src/content/freelancers/guido.yaml index 421a713..78f503c 100644 --- a/src/content/freelancers/guido.yaml +++ b/src/content/freelancers/guido.yaml @@ -4,8 +4,10 @@ photo: guido.jpg location: Amsterdam countryCode: NL sprykerCertifications: - backEndDeveloper: false - solutionArchitect: false + backEndDeveloper: true + solutionArchitect: true skills: [] +yearStartedWebDev: 0 +yearStartedSpryker: 2 contact: test@gui.do isVisible: true From f92731355d5e9d2f5b86ce5531ba990326f424e9 Mon Sep 17 00:00:00 2001 From: "keystatic-cloud[bot]" <127914443+keystatic-cloud[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:03:01 +0000 Subject: [PATCH 06/47] Delete src/content/freelancers/guido Co-authored-by: Guido X Jansen --- src/content/freelancers/guido.yaml | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 src/content/freelancers/guido.yaml diff --git a/src/content/freelancers/guido.yaml b/src/content/freelancers/guido.yaml deleted file mode 100644 index 78f503c..0000000 --- a/src/content/freelancers/guido.yaml +++ /dev/null @@ -1,13 +0,0 @@ -firstName: Guido -lastName: Jansen -photo: guido.jpg -location: Amsterdam -countryCode: NL -sprykerCertifications: - backEndDeveloper: true - solutionArchitect: true -skills: [] -yearStartedWebDev: 0 -yearStartedSpryker: 2 -contact: test@gui.do -isVisible: true From a3a96316cb0f0fe597de99be8226c1dc2849cacb Mon Sep 17 00:00:00 2001 From: Guido X Jansen Date: Mon, 4 Nov 2024 17:03:26 +0100 Subject: [PATCH 07/47] Freelancer migration --- keystatic.config.ts | 109 +++++++++++++++++++++++- scripts/migrate-freelancers.mjs | 64 ++++++++++++++ src/content/freelancers/andrey.yaml | 47 ++++++++++ src/content/freelancers/constantin.yaml | 68 +++++++++++++++ src/content/freelancers/david.yaml | 51 +++++++++++ src/content/freelancers/evgeny.yaml | 40 +++++++++ src/content/freelancers/filip.yaml | 41 +++++++++ src/content/freelancers/ivan.yaml | 40 +++++++++ src/content/freelancers/jan.yaml | 43 ++++++++++ src/content/freelancers/javier.yaml | 51 +++++++++++ src/content/freelancers/john.yaml | 33 +++++++ src/content/freelancers/vasily.yaml | 37 ++++++++ src/content/freelancers/volodymyr.yaml | 48 +++++++++++ src/pages/jobs.astro | 32 ++++++- src/pages/keystatic/index.astro | 4 +- src/types.ts | 62 +++----------- 16 files changed, 712 insertions(+), 58 deletions(-) create mode 100644 scripts/migrate-freelancers.mjs create mode 100644 src/content/freelancers/andrey.yaml create mode 100644 src/content/freelancers/constantin.yaml create mode 100644 src/content/freelancers/david.yaml create mode 100644 src/content/freelancers/evgeny.yaml create mode 100644 src/content/freelancers/filip.yaml create mode 100644 src/content/freelancers/ivan.yaml create mode 100644 src/content/freelancers/jan.yaml create mode 100644 src/content/freelancers/javier.yaml create mode 100644 src/content/freelancers/john.yaml create mode 100644 src/content/freelancers/vasily.yaml create mode 100644 src/content/freelancers/volodymyr.yaml diff --git a/keystatic.config.ts b/keystatic.config.ts index 0e54ab4..10aff5d 100644 --- a/keystatic.config.ts +++ b/keystatic.config.ts @@ -1,6 +1,7 @@ -import { config } from '@keystatic/core'; +import type { Config } from '@keystatic/core'; +import { config, fields, collection } from '@keystatic/core'; -export default config({ +const keystaticConfig: Config = { storage: { kind: 'cloud', }, @@ -13,6 +14,106 @@ export default config({ }, }, collections: { - // Collections can be added here when needed + freelancers: collection({ + label: 'Freelancers', + path: 'src/content/freelancers/*', + slugField: 'firstName', + schema: { + firstName: fields.slug({ + name: { label: "First Name" }, + }), + lastName: fields.text({ + label: "Last Name", + validation: { length: { min: 1 } } + }), + photo: fields.text({ + label: "Photo filename", + validation: { length: { min: 1 } } + }), + headline: fields.text({ + label: "Headline", + }), + availability: fields.text({ + label: "Availability", + }), + location: fields.text({ + label: "Location", + validation: { length: { min: 1 } } + }), + countryCode: fields.text({ + label: "Country Code", + validation: { length: { min: 2, max: 2 } } + }), + language: fields.text({ + label: "Languages", + }), + shortPitch: fields.text({ + label: "Short Pitch", + multiline: true, + }), + linkedIn: fields.text({ + label: "LinkedIn URL", + }), + github: fields.text({ + label: "GitHub URL", + }), + sprykerCertifications: fields.object({ + backEndDeveloper: fields.checkbox({ + label: "Backend Developer Certified", + defaultValue: false, + }), + solutionArchitect: fields.checkbox({ + label: "Solution Architect Certified", + defaultValue: false, + }), + }), + skills: fields.array( + fields.text({ label: "Skill" }), + { + label: "Skills", + itemLabel: (props) => props.value, + } + ), + timezoneRange: fields.text({ + label: "Timezone Range", + }), + yearStartedWebDev: fields.integer({ + label: "Year Started Web Development", + }), + yearStartedSpryker: fields.integer({ + label: "Year Started with Spryker", + }), + references: fields.text({ + label: "References", + multiline: true, + }), + idealCustomer: fields.text({ + label: "Ideal Customer", + multiline: true, + }), + locationFlexibility: fields.text({ + label: "Location Flexibility", + }), + otherCertifications: fields.text({ + label: "Other Certifications", + }), + employmentType: fields.text({ + label: "Employment Type", + }), + contact: fields.text({ + label: "Contact Email", + validation: { length: { min: 1 } } + }), + forumProfile: fields.text({ + label: "Forum Profile URL", + }), + isVisible: fields.checkbox({ + label: "Is Visible", + defaultValue: true, + }), + }, + }), }, -}); +}; + +export default keystaticConfig; diff --git a/scripts/migrate-freelancers.mjs b/scripts/migrate-freelancers.mjs new file mode 100644 index 0000000..833ecd0 --- /dev/null +++ b/scripts/migrate-freelancers.mjs @@ -0,0 +1,64 @@ +import fs from 'fs/promises'; +import path from 'path'; +import yaml from 'js-yaml'; + +async function migrateFreelancers() { + // Read the existing JSON data + const jsonData = await fs.readFile('src/data_files/freelancers.json', 'utf-8'); + const freelancers = JSON.parse(jsonData); + + // Create the content directory if it doesn't exist + await fs.mkdir('src/content/freelancers', { recursive: true }); + + // Migrate each freelancer + for (const freelancer of freelancers) { + const slug = freelancer.firstName.toLowerCase(); + + // Format the content + const content = { + firstName: freelancer.firstName, + lastName: freelancer.lastName, + photo: freelancer.photo, + headline: freelancer.headline || '', + availability: freelancer.availability, + location: freelancer.location, + countryCode: freelancer.countryCode, + language: freelancer.language, + shortPitch: freelancer.shortPitch, + linkedIn: freelancer.linkedIn || '', + github: freelancer.github || '', + sprykerCertifications: { + backEndDeveloper: freelancer.sprykerCertifications.backEndDeveloper, + solutionArchitect: freelancer.sprykerCertifications.solutionArchitect, + }, + skills: freelancer.skills || [], + timezoneRange: freelancer.timezoneRange, + yearStartedWebDev: freelancer.yearStartedWebDev || 0, + yearStartedSpryker: freelancer.yearStartedSpryker || 0, + references: freelancer.references || '', + idealCustomer: freelancer.idealCustomer || '', + locationFlexibility: freelancer.locationFlexibility, + otherCertifications: freelancer.otherCertifications || '', + employmentType: freelancer.employmentType, + contact: freelancer.contact, + forumProfile: freelancer.forumProfile || '', + isVisible: freelancer.isVisible, + }; + + // Create the YAML file + const filePath = path.join('src/content/freelancers', `${slug}.yaml`); + await fs.writeFile(filePath, yaml.dump(content)); + } + + // Remove old files + const files = await fs.readdir('src/content/freelancers'); + for (const file of files) { + if (file.endsWith('.json') || file.endsWith('.mdoc')) { + await fs.unlink(path.join('src/content/freelancers', file)); + } + } + + console.log('Migration completed successfully!'); +} + +migrateFreelancers().catch(console.error); diff --git a/src/content/freelancers/andrey.yaml b/src/content/freelancers/andrey.yaml new file mode 100644 index 0000000..601f280 --- /dev/null +++ b/src/content/freelancers/andrey.yaml @@ -0,0 +1,47 @@ +firstName: Andrey +lastName: Lidokhover +photo: andrey-lidokhover.jpg +headline: Senior Spryker Backend Developer +availability: November 2024, fulltime +location: Hamburg +countryCode: DE +language: German, English, Russian +shortPitch: >- + I am a seasoned Lead Backend Developer with a strong background in Spryker + projects. I have deep experience implementing Spryker B2B, B2C & Marketplace + projects, and developing software architecture for e-commerce enterprise + solutions. +linkedIn: https://www.linkedin.com/in/andrej-lidokhover-553b07137/ +github: '' +sprykerCertifications: + backEndDeveloper: true + solutionArchitect: false +skills: + - Backend + - Architecture + - Fullstack + - Tech Lead + - Team Lead +timezoneRange: GMT+4 to GMT-4 +yearStartedWebDev: 1999 +yearStartedSpryker: 2016 +references: >- +

* TOWA GmbH, Spryker Backend Developer, Consultant (Freelance) 2022 - 2023 + Hands-on backend development in the large B2B Spryker Project. Consulting the + client on state-of-the-art technologies, best practices and + feasibility.

* Dept Agency, Tech Lead Enterprise E-Commerce 2022 + Leading of two B2B spryker projects (Scrum, Kanban). Consulting Enterprise + E-commerce clients in the assigned projects on state-of-the-art technologies, + best practices and feasibility. Hands-on spryker backend development.

* + Dept Agency, Lead Developer Backend 2020 - 2022 Technical leading of different + Spryker B2B, B2C and Marketplace Projects Hands-on spryker backend + development.

* Dept Agency, Senior Backend Developer, Project Lead + Developer 2016 - 2020 Spryker backend development. Technical project leading + (Spryker B2C)

+idealCustomer: '' +locationFlexibility: Remote, can travel +otherCertifications: '' +employmentType: Freelance +contact: lidokhover@gmail.com +forumProfile: https://forum.commercequest.space/profile/9068/javier +isVisible: true diff --git a/src/content/freelancers/constantin.yaml b/src/content/freelancers/constantin.yaml new file mode 100644 index 0000000..c13fad4 --- /dev/null +++ b/src/content/freelancers/constantin.yaml @@ -0,0 +1,68 @@ +firstName: Constantin +lastName: Iordan +photo: Constantin-Iordan.jpg +headline: Senior PHP Developer +availability: January 2025, 8h/day, 5 days/week +location: Brasov +countryCode: RO +language: English C1, Romanian native +shortPitch: >- + I am a passionate web developer with over 16 years of experience, specializing + in creating dynamic and robust eCommerce platforms. I thrive on the challenge + of building solutions that power both B2B and B2C businesses, with a focus on + delivering seamless user experiences and efficient back-end systems.
My + expertise spans technologies like PHP, MySQL/MariaDB, JavaScript, HTML, and + CSS, as well as frameworks such as Laravel, Spryker, and Vue.js.
I am + driven by a deep passion for eCommerce and enjoy working on projects that push + the boundaries of online retail. Whether it's developing from scratch or + optimizing existing platforms, I take pride in crafting high-quality, scalable + solutions. New challenges motivate me, and I am always eager to learn and + adopt new technologies to stay at the forefront of the industry.
If you're + looking for a dedicated developer who brings both technical expertise and a + genuine love for building innovative web solutions, let's connect! +linkedIn: https://www.linkedin.com/in/constantiniordan/ +github: '' +sprykerCertifications: + backEndDeveloper: true + solutionArchitect: true +skills: + - Frontend (HTML, CSS, JS) + - Backend + - Fullstack + - Tech Lead +timezoneRange: GMT+3 to GMT-2 +yearStartedWebDev: 2008 +yearStartedSpryker: 2017 +references: >- + Metro Digital 2023 - 2024

I was a part of a team + responsible for developing and maintaining a b2b ecommerce platform developed + with Spryker that was available in multiple countries and had a high number of + customers and daily orders.
I was responsible of:

  1. * Investigate + ways that business specific requirements can be implemented in a Spryker + application.
  2. * Develop and maintain complex new features requested by + the product owners.
  3. * Improve existing functionalities in order to + obtain better user experience and better system performance.
  4. * Ensure + that the application is always up and running for the company's customers by + monitoring the logs.

MediaWave 2022

I was + part o a large team that was developing a ecommerce solution based on Spryker + for automotive industry.
My responsibilities included:

  1. * + Implementing business specific functionalities in a Spryker + application.
  2. * Customization on existing Spryker modules, creating + Glue endpoints and creating new modules.
  3. * Supporting new members of + the team to get up to speed and review their + code.

SportFive 2021 - 2022

I was part + of a team responsable for creating a new ecommerce platform based on Spryker + for a large sport events company. Develop Spryker B2B and B2C solutions based + on customers specific needs. This includes:

  1. * Create custom theme + based on provided designs.
  2. * Extend backoffice with business specific + requirements.
  3. * Customization of login and registration + process.
  4. * Extend and change products and catalog structure.
  5. * + Implement product and customer import.
  6. * Implement changes in product + pricing modules.
+idealCustomer: '' +locationFlexibility: Remote Only +otherCertifications: '' +employmentType: Freelance, open to permanent employment +contact: costi.iordan@gmail.com +forumProfile: '' +isVisible: true diff --git a/src/content/freelancers/david.yaml b/src/content/freelancers/david.yaml new file mode 100644 index 0000000..1708bf3 --- /dev/null +++ b/src/content/freelancers/david.yaml @@ -0,0 +1,51 @@ +firstName: David +lastName: Greiner +photo: david_greiner_spryker_freelancer.jpg +headline: Senior Spryker Backend Developer +availability: Immediate +location: Germany +countryCode: DE +language: English, German +shortPitch: >- + After studying business informatics, I started my professional journey at + Turbine Kreuzberg, where I gained experience with shop systems like Magento + and OXID while working on various projects.
In 2015, I decided to go + freelance, and since 2017, I have focused exclusively on the Spryker Commerce + OS. As a freelancer, I've had the opportunity to deepen my knowledge and + skills across a range of Spryker projects. I’m now excited to take on new + challenges! +linkedIn: https://www.linkedin.com/in/david-greiner-752b2a63/ +github: https://github.com/greinerdavid +sprykerCertifications: + backEndDeveloper: false + solutionArchitect: false +skills: + - Back End + - Tech Lead +timezoneRange: UTC+2 to UTC-2 +yearStartedWebDev: 2008 +yearStartedSpryker: 2017 +references: >- +

I have worked as a Senior Spryker Backend Developer for clients such as + ALDI Süd, Lekkerland, Ratioform, Overkill, Winterhalter/ Fenner (Sonepar), + Intersport, and more. My experience includes direct work with clients as well + as through agencies like Turbine Kreuzberg, Brandung, MediaWave, Valantic, and + Antiloop. For the past year, I’ve been with Lekkerland SE, and in the 24 + months prior, I was involved in developing the shop solution for ALDI Süd's + American market.

More information about me can be found on my websites + https://spryker-freelancer.de and https://davidgreiner.de.

+idealCustomer: >- +

I have no specific preferences and I am also open to anything in this + regard. It is always exciting to explore new industries and immerse myself in + them. I am open to any project that is morally acceptable.

I have + worked on projects (not just Spryker) from various sectors, including pet + food, water pumps, women's fashion, sports goods, electronics, food suppliers, + the photovoltaic industry, mechanical engineering, and real estate.

I + have handled projects related to the healthcare sector as well as those in + retail, covering both B2C and B2B contexts.

+locationFlexibility: Remote Only +otherCertifications: '' +employmentType: Freelance, open to permanent employment +contact: hallo@davidgreiner.de +forumProfile: https://forum.commercequest.space/profile/8590/DavidGreiner +isVisible: true diff --git a/src/content/freelancers/evgeny.yaml b/src/content/freelancers/evgeny.yaml new file mode 100644 index 0000000..34383d5 --- /dev/null +++ b/src/content/freelancers/evgeny.yaml @@ -0,0 +1,40 @@ +firstName: Evgeny +lastName: Nekhamkin +photo: evgeny-nekhamkin.jpg +headline: Senior Webdeveloper & Architect +availability: Mid October / 36-40 Hours +location: Hamburg +countryCode: DE +language: English, German +shortPitch: >- + I am a Freelance Senior Spryker Developer (mainly backend) and consultant with + a focus on code quality. I have more than 7 years of Spryker hands-on project + experience. +linkedIn: https://www.linkedin.com/in/evgeny-nekhamkin-b63312247/ +github: https://github.com/EvgenyNekhamkin +sprykerCertifications: + backEndDeveloper: false + solutionArchitect: false +skills: + - Frontend (HTML, CSS, JS) + - Backend + - Architecture + - Project Management +timezoneRange: GMT to GMT+4 +yearStartedWebDev: 2008 +yearStartedSpryker: 2017 +references: >- +

Here is a selection of my former clients:

  1. * Mobilezone + GmbH
  2. * Mediawave Commerce GmbH
  3. * Team Business IT + GmbH
  4. * DEPT Design & Technology GmbH
  5. * Tom Tailor + GmbH
  6. * Etribes Connect GmbH
  7. * Closed GmbH
  8. My role + in those projects was primarily as a backend developer. Additionally, I also + acted as a consultant, and in some projects, I worked as an architect and tech + lead.

    +idealCustomer: '' +locationFlexibility: Remote Only +otherCertifications: '' +employmentType: Freelance, open to permanent employment +contact: evgeny@nekhamkin.de +forumProfile: '' +isVisible: true diff --git a/src/content/freelancers/filip.yaml b/src/content/freelancers/filip.yaml new file mode 100644 index 0000000..64f6d21 --- /dev/null +++ b/src/content/freelancers/filip.yaml @@ -0,0 +1,41 @@ +firstName: Filip +lastName: Galic +photo: filip-galic.jpeg +headline: Spryker engineer +availability: Immediately +location: Bosnia and Herzegovina, Siroki Brijeg +countryCode: BA +language: Croatian, English, Spanish +shortPitch: >- + Seasoned engineer with 5 years of experience in Spryker. Strong understanding + of e-commerce domain. Worked with leading german brands such as Lidl, + MediaMarkt, saturn. Making scalable solutions. Currently with chess com + working as engineer on a platform that has 180M+ users. If you need someone + with Spryker experience but experience with making extendable systems that + scale, reach out to me. +linkedIn: https://www.linkedin.com/in/filip-galic-8250a988 +github: https://github.com/galion96 +sprykerCertifications: + backEndDeveloper: true + solutionArchitect: true +skills: + - Backend + - Architecture + - Team Lead + - Tech Lead +timezoneRange: GMT - 2, GMT +3 +yearStartedWebDev: 2018 +yearStartedSpryker: 2019 +references: >- +
    • Teufel.de - Worked for 1 year, helped enhancing the platform, removing + bugs etc. (Spryker)
    • Userwerk.com/de - Worked on Spryker project that + was used by leading German ecomerce shops (lidl, mediamarkt...) Did fullstack + work (4 years)
    • Chess.com - Backend engineer on worlds biggest chess + platform serving 180M users.
    +idealCustomer: '' +locationFlexibility: Remote, can travel +otherCertifications: '' +employmentType: Freelance - open to permanent employment +contact: filip.galic10@gmail.com +forumProfile: https://forum.commercequest.space/profile/9068/javier +isVisible: true diff --git a/src/content/freelancers/ivan.yaml b/src/content/freelancers/ivan.yaml new file mode 100644 index 0000000..8b052b7 --- /dev/null +++ b/src/content/freelancers/ivan.yaml @@ -0,0 +1,40 @@ +firstName: Ivan +lastName: Jurisic +photo: ivan-jurisic.jpg +headline: Spryker developer +availability: Immediately +location: Makarska, Croatia +countryCode: HR +language: English, Croatian +shortPitch: >- + With six years of hands-on experience in Spryker, I bring deep expertise in + full-stack development, particularly in backend solutions. I have successfully + worked on more than five diverse projects, spanning both B2B and B2C models. + My experience covers everything from building shops from the ground up to + optimizing and scaling existing systems. I am comfortable with both older + versions of Spryker and the latest cloud-based versions, ensuring adaptability + and up-to-date skills in the evolving e-commerce landscape. My proven ability + to deliver high-quality results makes me a strong candidate for Spryker + development roles. +linkedIn: https://www.linkedin.com/in/ivan-jurisic/ +github: '' +sprykerCertifications: + backEndDeveloper: true + solutionArchitect: true +skills: + - Frontend (HTML, CSS, JS) + - Backend + - Project Management + - Team Lead +timezoneRange: GMT-3 to GMT+4 +yearStartedWebDev: 2018 +yearStartedSpryker: 2018 +references: >- +

    https://drive.google.com/file/d/1I2EYW9yoVTUhKgWtCUwOpwd1RadRW3X-/view?usp=sharing

    https://drive.google.com/file/d/15bGOHFf5XOT6hh6meYwNloYYjM0wcQ1m/view?usp=sharing

    https://drive.google.com/file/d/1CAgTvpoWsRDT_xNJGnfmiRg0ROUYgW5z/view?usp=sharing

    +idealCustomer: '' +locationFlexibility: Remote, can travel +otherCertifications: '' +employmentType: Freelance - open to permanent employment +contact: jurisic.ivan10@gmail.com +forumProfile: https://forum.commercequest.space/profile/9068/javier +isVisible: true diff --git a/src/content/freelancers/jan.yaml b/src/content/freelancers/jan.yaml new file mode 100644 index 0000000..7d0add5 --- /dev/null +++ b/src/content/freelancers/jan.yaml @@ -0,0 +1,43 @@ +firstName: Jan +lastName: Kovács +photo: jan-kovacs.jpg +headline: Experienced Software Engineer & Leader +availability: November 2024, 40 hours/week +location: Hamburg +countryCode: DE +language: English, German (B1), Ukrainian, Hungarian and Russian +shortPitch: >- + Beyond my strong technical background, with 5 years of Spryker experience, I + have also engineer manager experience and skills, therefore I can also help + out with team management from technical and people leadership view. +linkedIn: https://www.linkedin.com/in/jan-v-kovacs/ +github: '' +sprykerCertifications: + backEndDeveloper: true + solutionArchitect: false +skills: + - Backend + - Fullstack + - Team Lead + - Tech Lead +timezoneRange: GMT+2 +yearStartedWebDev: 2010 +yearStartedSpryker: 2017 +references: >- +

    In 2017 I have joined Tom Tailor E-commerce GmbH as Senior Software + Engineer for the project based on Spryker platform, and we have worked closely + together with Spryker to replatform the TT B2C & B2B plaftorms in half a year + - during this time some of the solutions we have chosen at TT were also + adapted by the core Spryker product. After the support of Spryker has been + finished, I took over the leadership of the B2C development team and we + further developed our Spryker based B2C platform, by adopting new Spryker + features and standards also, as well customizing as much as possible to meet + the needs of Tom Tailor.

    I worked in this role until mid of summer + 2022.

    +idealCustomer: '' +locationFlexibility: Remote, can travel +otherCertifications: '' +employmentType: Freelance - open to permanent employment +contact: jan.v.kovacs@gmail.com +forumProfile: '' +isVisible: true diff --git a/src/content/freelancers/javier.yaml b/src/content/freelancers/javier.yaml new file mode 100644 index 0000000..1e8aef3 --- /dev/null +++ b/src/content/freelancers/javier.yaml @@ -0,0 +1,51 @@ +firstName: Javier +lastName: Benito +photo: javier-benito.jpg +headline: Senior Software Engineer +availability: Immediately +location: Madrid +countryCode: ES +language: Spanish, English +shortPitch: >- + With over six years of experience as a Senior Software Engineer specializing + in e-commerce, PHP and Spryker development, I bring a unique blend of + technical expertise and creative problem-solving skills. My ability to + collaborate effectively with cross-functional teams ensures that I deliver + high-quality solutions tailored to meet business needs. I thrive in fast-paced + environments and am dedicated to continuous learning, making me adaptable to + new challenges. Hiring me means investing in a passionate developer who is + committed to driving innovation and achieving results. +linkedIn: https://www.linkedin.com/in/jbenitosantoni/ +github: '' +sprykerCertifications: + backEndDeveloper: true + solutionArchitect: true +skills: + - Frontend (HTML, CSS, JS) + - Backend + - Architecture + - Fullstack +timezoneRange: 7.00 - 18.00 (GMT+2) +yearStartedWebDev: 2019 +yearStartedSpryker: 2020 +references: >- +

    European B2B Marketplace (diva-e) Role: Senior Software Engineer (Spryker) + Description: As part of diva-e, I worked on a high-profile B2B/B2C marketplace + project for a European client in the manufacturing sector. My responsibilities + included leading backend development with Spryker and integrating complex + business logic to meet the customer’s specific needs.

    Atida + – Digital Health Platform Role: Senior Software Engineer (Spryker and + GO) Description: At diva-e, I collaborated with a global team to upgrade the + backend infrastructure of a leading European health platform. My role involved + backend optimization, improving system architecture, and implementing new + features that aligned with business objectives.

    Global E-commerce + Retailer Role: Spryker Developer Description: I contributed to the digital + transformation of a leading e-commerce retailer, focusing on integrating + third-party services to streamline their inventory and checkout processes.

    +idealCustomer: '' +locationFlexibility: Remote, can travel +otherCertifications: '' +employmentType: Freelance - open to permanent employment +contact: javier@javierbenito.me +forumProfile: https://forum.commercequest.space/profile/9068/javier +isVisible: true diff --git a/src/content/freelancers/john.yaml b/src/content/freelancers/john.yaml new file mode 100644 index 0000000..3a4c743 --- /dev/null +++ b/src/content/freelancers/john.yaml @@ -0,0 +1,33 @@ +firstName: John +lastName: Doe +photo: john-doe.jpg +headline: '' +availability: Available from July 1st +location: New York +countryCode: US +language: English +shortPitch: >- + Experienced Spryker developer with a passion for creating scalable e-commerce + solutions. +linkedIn: https://www.linkedin.com/in/johndoe +github: https://github.com/johndoe +sprykerCertifications: + backEndDeveloper: true + solutionArchitect: false +skills: + - Spryker + - PHP + - JavaScript + - Docker + - AWS +timezoneRange: UTC-5 to UTC-4 +yearStartedWebDev: 2010 +yearStartedSpryker: 2018 +references: Available upon request +idealCustomer: E-commerce businesses looking to scale their operations +locationFlexibility: Remote, can travel +otherCertifications: AWS Certified Solutions Architect +employmentType: Freelance - open to permanent employment +contact: evgeny@nekhamkin.de +forumProfile: '' +isVisible: false diff --git a/src/content/freelancers/vasily.yaml b/src/content/freelancers/vasily.yaml new file mode 100644 index 0000000..841faa7 --- /dev/null +++ b/src/content/freelancers/vasily.yaml @@ -0,0 +1,37 @@ +firstName: Vasily +lastName: Rodin +photo: vasily-rodin.jpg +headline: Senior Spryker Developer & Tech Lead +availability: 2025, usually 8h per day +location: Berlin +countryCode: DE +language: English, German, Russian +shortPitch: >- + I've been with Spryker since 2017. I have a successful track record with + dozens of projects! +linkedIn: https://www.linkedin.com/in/rodinv/ +github: https://github.com/RodinVasily +sprykerCertifications: + backEndDeveloper: true + solutionArchitect: false +skills: + - Backend + - Architecture + - Fullstack + - Tech Lead +timezoneRange: CET +yearStartedWebDev: 2008 +yearStartedSpryker: 2017 +references: >- + B2C / B2B / Marketplace projects from 2017 to 2024 with customers from + Germany, Austria, Poland, Croatia and other countries. Mainly in the role of + Senior Backend Developer and Tech Lead. +idealCustomer: >- + B2B or Marketplace project, mid/large size, challenging features, + international team +locationFlexibility: Remote, can travel +otherCertifications: '' +employmentType: Freelance +contact: me@vasilyrodin.de +forumProfile: https://forum.commercequest.space/profile/vasily.rodin +isVisible: true diff --git a/src/content/freelancers/volodymyr.yaml b/src/content/freelancers/volodymyr.yaml new file mode 100644 index 0000000..5d7518d --- /dev/null +++ b/src/content/freelancers/volodymyr.yaml @@ -0,0 +1,48 @@ +firstName: Volodymyr +lastName: Hrychenko +photo: volodymyr-rychenko.jpg +headline: Spryker Developer & Solution Architect +availability: Fulltime +location: Warsaw +countryCode: PL +language: English, Ukrainian, Polish +shortPitch: >- + I am a PHP developer with 10 years of experience in web development. My + technical skills combined with my ability to lead and architect solutions make + me a valuable addition to any team. I am proficient in various back-end + technologies such as PHP, MySQL, PostgreSQL, Redis, Elasticsearch, and various + ORMs.As a technical lead and solution architect, I have successfully delivered + complex web applications across various industries, including e-commerce, + healthcare, and education. My expertise extends to all phases of the software + development lifecycle, including requirements gathering, design, development, + testing, deployment, and maintenance. +linkedIn: https://www.linkedin.com/in/volodymyr-hrychenko-a03aa6a8/ +github: '' +sprykerCertifications: + backEndDeveloper: true + solutionArchitect: false +skills: + - Backend + - Architecture + - Team Lead + - Tech Lead +timezoneRange: Any timezone +yearStartedWebDev: 2014 +yearStartedSpryker: 2017 +references: >- +

    SHOPFLIX.gr Lead Software Engineer August 2023 - May 2024 (10 + months)

    ALDI SÜD Solution Architect July 2022 - June 2023 (1 + year)

    FarmTiger Lead Software Developer October 2021 - June 2023 (1 year + 9 months)

    APOLLOBASE GmbH Senior Spryker Developer December 2020 - June + 2022 (1 year 7 months)

    AutoDoc Senior Back-End Software Developer June + 2020 - September 2021 (1 year 4 months)

    Spryker Systems GmbH PHP + Developer March 2018 - May 2020 (2 years 3 months)

    Rallyware PHP + Developer March 2016 - March 2018 (2 years 1 month)

    Devico Solutions + Junior PHP Developer October 2014 - March 2016 (1 year 6 months)

    +idealCustomer: '' +locationFlexibility: Remote, can travel +otherCertifications: '' +employmentType: Freelance, open to permanent employment +contact: volodymyr.hrychenko@gmail.com +forumProfile: '' +isVisible: true diff --git a/src/pages/jobs.astro b/src/pages/jobs.astro index 991f9dc..4303faa 100644 --- a/src/pages/jobs.astro +++ b/src/pages/jobs.astro @@ -3,13 +3,38 @@ import { Image } from 'astro:assets'; import MainLayout from '../layouts/MainLayout.astro'; import MainSection from "../components/ui/blocks/MainSection.astro"; import FreelancerCard from '../components/FreelancerCard.astro'; -import freelancers from '../data_files/freelancers.json'; import PrimaryCTA from "@components/ui/buttons/PrimaryCTA.astro"; -import type { Freelancer } from '../types.ts'; +import { createReader } from '@keystatic/core/reader'; +import keystaticConfig from '../../keystatic.config'; +import type { Freelancer, KeystaticFreelancer } from '../types.ts'; import { generateNameSlug } from '../utils/utils.js'; const pageTitle = "Available Spryker Developers"; +// Initialize Keystatic reader +const reader = createReader(process.cwd(), keystaticConfig); + +// Get all freelancers from Keystatic +const freelancerEntries = await reader.collections.freelancers.all(); + +// Convert Keystatic entries to Freelancer type +const freelancers: Freelancer[] = await Promise.all( + freelancerEntries.map(async (entry) => { + const content = await reader.collections.freelancers.readOrThrow(entry.slug) as unknown as KeystaticFreelancer; + return { + id: entry.slug, + ...content, + linkedIn: content.linkedIn || null, + github: content.github || null, + headline: content.headline || '', + otherCertifications: content.otherCertifications || '', + forumProfile: content.forumProfile || '', + idealCustomer: content.idealCustomer || '', + references: content.references || '', + }; + }) +); + // Function to shuffle the freelancers array function shuffle(array: Freelancer[]): Freelancer[] { for (let i = array.length - 1; i > 0; i--) { @@ -23,7 +48,6 @@ function shuffle(array: Freelancer[]): Freelancer[] { const visibleFreelancers: Freelancer[] = shuffle( freelancers.filter(freelancer => freelancer.isVisible) ); - --- 3) Non-customers/partners (e.g. freelancers) fill out an Asana form for eligibility review
- \ No newline at end of file + diff --git a/src/pages/keystatic/index.astro b/src/pages/keystatic/index.astro index b9718ac..8a31a24 100644 --- a/src/pages/keystatic/index.astro +++ b/src/pages/keystatic/index.astro @@ -1,6 +1,6 @@ --- import { Keystatic } from '@keystatic/core/ui'; -import config from '../../../keystatic.config'; +import keystaticConfig from '../../../keystatic.config'; --- @@ -19,7 +19,7 @@ import config from '../../../keystatic.config';
- +
diff --git a/src/types.ts b/src/types.ts index e42c860..350437c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,69 +1,35 @@ -interface CommunityToolCreatorInterface { - name: string; - url?: string; -} - -interface CommunityToolContributorInterface { - name: string; - url?: string; -} - -interface CommunityToolLinkInterface { - label: string; - url: string; -} - -export interface NavEntry { - label?: string; - href?: string; - isExternal?: boolean; - submenu?: NavEntry[] | undefined; -} - -export interface CommunityToolInterface { - title: string; - subtitle: string | undefined; - description: string; - tags?: string[]; - license: string; - creators: CommunityToolCreatorInterface[]; - contributors: CommunityToolContributorInterface[]; - links: CommunityToolLinkInterface[]; -} - -export type CommunityToolCollection = CommunityToolInterface[]; - -// Define the Spryker certifications interface export interface SprykerCertifications { backEndDeveloper: boolean; solutionArchitect: boolean; } -// Define the Freelancer type -export type Freelancer = { - id: number; +export interface KeystaticFreelancer { firstName: string; lastName: string; photo: string; - headline?: string; // Optional + headline?: string; availability: string; location: string; - countryCode: string; // ISO Country Code, e.g., "US" + countryCode: string; language: string; shortPitch: string; - linkedIn?: string; // Optional as not all freelancers may have LinkedIn - github?: string; // Optional as not all freelancers may have GitHub + linkedIn: string | null; + github: string | null; sprykerCertifications: SprykerCertifications; skills: string[]; timezoneRange: string; yearStartedWebDev: number; yearStartedSpryker: number; - references?: string; // Optional, could include HTML markup - idealCustomer?: string; // Optional, could include HTML markup + references: string; + idealCustomer: string; locationFlexibility: string; - otherCertifications?: string; // Optional + otherCertifications: string; employmentType: string; contact: string; - forumProfile?: string; + forumProfile: string; isVisible: boolean; -}; \ No newline at end of file +} + +export interface Freelancer extends KeystaticFreelancer { + id: string; +} From 6cf18950423ae0ea9ceac11c22e7b263dda94500 Mon Sep 17 00:00:00 2001 From: Florian Schwarzmeier Date: Mon, 4 Nov 2024 17:13:46 +0100 Subject: [PATCH 08/47] Reverts commit 2c8203e0b46f8f7aa231bc88fcb76141445bd6ea and fixes mobile view navigation alignment --- .../sections/navbar&footer/Navbar.astro | 98 ++++++++++--------- 1 file changed, 52 insertions(+), 46 deletions(-) diff --git a/src/components/sections/navbar&footer/Navbar.astro b/src/components/sections/navbar&footer/Navbar.astro index 455e232..15c1dc6 100644 --- a/src/components/sections/navbar&footer/Navbar.astro +++ b/src/components/sections/navbar&footer/Navbar.astro @@ -11,11 +11,11 @@ import BrandLogo from "@components/BrandLogo.astro"; class="sticky inset-x-0 top-0 z-50 flex w-full flex-wrap text-sm md:flex-nowrap md:justify-start border-b-2 bg-blue-50/100 dark:border-cqDarkPrimary-100/40 dark:bg-cqDarkPrimary-300/100" > - - - From 52bdec6d0cd9c81a7393c35bb7689d17057b402c Mon Sep 17 00:00:00 2001 From: Florian Schwarzmeier Date: Mon, 4 Nov 2024 18:37:25 +0100 Subject: [PATCH 09/47] Fixes ordered list styling --- src/assets/styles/starlight.css | 84 ++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/src/assets/styles/starlight.css b/src/assets/styles/starlight.css index 4558e2d..6639a69 100644 --- a/src/assets/styles/starlight.css +++ b/src/assets/styles/starlight.css @@ -101,6 +101,7 @@ footer .pagination-links a { background-color: var(--sl-color-bg-box); } +/* Lists */ .sl-markdown-content ul:not(:where(.not-content *)) { list-style-type: none; padding-left: 0; @@ -112,7 +113,7 @@ footer .pagination-links a { } .sl-markdown-content li:not(:where(.not-content *)) > ul, -.sl-markdown-content li + li:not(:where(.not-content *)) { +.sl-markdown-content ul li + li:not(:where(.not-content *)) { margin-top: 0.625rem; } @@ -127,6 +128,87 @@ footer .pagination-links a { width: 0.875rem; } +/* Ordered Lists */ +.sl-markdown-content ol:not(:where(.not-content *), .sl-steps) { + --bullet-size: calc(var(--sl-line-height) * 1rem - 1px); + --bullet-margin: 0.375rem; + + list-style: none; + counter-reset: steps-counter 0; + padding-inline-start: 0; +} + +.sl-markdown-content ol:not(:where(.not-content *), .sl-steps) > li { + counter-increment: steps-counter; + position: relative; + padding-inline-start: calc(var(--bullet-size) + 1rem); + /* HACK: Keeps any `margin-bottom` inside the `
  • `’s padding box to avoid gaps in the hairline border. */ + padding-bottom: 1px; + /* Prevent bullets from touching in short list items. */ + min-height: calc(var(--bullet-size) + var(--bullet-margin)); +} + +.sl-markdown-content ol li + li:not(:where(.not-content *)) { + /* Remove margin between steps. */ + margin-top: 0; +} + +.sl-markdown-content li:not(:where(.not-content *)) > ol { + margin-top: 0.625rem; +} + +.sl-markdown-content ol:not(:where(.not-content *), .sl-steps) > li:before { + content: counter(steps-counter); + position: absolute; + top: 0; + inset-inline-start: 0; + width: var(--bullet-size); + height: var(--bullet-size); + line-height: var(--bullet-size); + + font-size: var(--sl-text-xs); + font-weight: 600; + text-align: center; + color: var(--list-marker-color); + border: 1px solid var(--list-marker-color); + border-radius: 99rem; + box-shadow: none; +} + +/* Vertical guideline linking list numbers. */ +.sl-markdown-content ol:not(:where(.not-content *), .sl-steps) > li:after { + --guide-width: 1px; + content: ''; + position: absolute; + top: calc(var(--bullet-size) + var(--bullet-margin)); + bottom: var(--bullet-margin); + inset-inline-start: calc((var(--bullet-size) - var(--guide-width)) / 2); + width: var(--guide-width); + background-color: var(--sl-color-hairline-light); +} + +/* Adjust first item inside a step so that it aligns vertically with the number + even if using a larger font size (e.g. a heading) */ +.sl-markdown-content ol:not(:where(.not-content *), .sl-steps) > li > :first-child { + /* + The `lh` unit is not yet supported by all browsers in our support matrix + — see https://caniuse.com/mdn-css_types_length_lh + In unsupported browsers we approximate this using our known line-heights. + */ + --lh: calc(1em * var(--sl-line-height)); + --shift-y: calc(0.5 * (var(--bullet-size) - var(--lh))); + transform: translateY(var(--shift-y)); + margin-bottom: var(--shift-y); +} +.sl-markdown-content ol:not(:where(.not-content *), .sl-steps) > li > :first-child:where(h1, h2, h3, h4, h5, h6) { + --lh: calc(1em * var(--sl-line-height-headings)); +} +@supports (--prop: 1lh) { + .sl-markdown-content ol:not(:where(.not-content *), .sl-steps) > li > :first-child { + --lh: 1lh; + } +} + /* TODO: move to sth else later */ html:not([data-has-toc]) { --sl-mobile-toc-height: 0rem; From 801ff0b8bb925a19a900055758bf45ce3103ab54 Mon Sep 17 00:00:00 2001 From: Guido X Jansen Date: Mon, 4 Nov 2024 18:57:36 +0100 Subject: [PATCH 10/47] Some content restructuring --- keystatic.config.ts | 67 +++-- scripts/migrate-freelancers.mjs | 64 ----- src/content/freelancers/andrey.yaml | 6 +- src/content/freelancers/constantin.yaml | 8 +- src/content/freelancers/david.yaml | 4 +- src/content/freelancers/evgeny.yaml | 8 +- src/content/freelancers/filip.yaml | 6 +- src/content/freelancers/ivan.yaml | 8 +- src/content/freelancers/jan.yaml | 6 +- src/content/freelancers/javier.yaml | 8 +- src/content/freelancers/john.yaml | 10 +- src/content/freelancers/vasily.yaml | 4 +- src/content/freelancers/volodymyr.yaml | 6 +- src/data_files/freelancers.json | 331 ------------------------ 14 files changed, 65 insertions(+), 471 deletions(-) delete mode 100644 scripts/migrate-freelancers.mjs delete mode 100644 src/data_files/freelancers.json diff --git a/keystatic.config.ts b/keystatic.config.ts index 10aff5d..8d67d00 100644 --- a/keystatic.config.ts +++ b/keystatic.config.ts @@ -3,7 +3,7 @@ import { config, fields, collection } from '@keystatic/core'; const keystaticConfig: Config = { storage: { - kind: 'cloud', + kind: 'local', }, cloud: { project: 'commercequest/cq-astro', @@ -17,19 +17,26 @@ const keystaticConfig: Config = { freelancers: collection({ label: 'Freelancers', path: 'src/content/freelancers/*', - slugField: 'firstName', + slugField: 'slug', schema: { - firstName: fields.slug({ - name: { label: "First Name" }, + firstName: fields.text({ + label: "First Name", + validation: { length: { min: 1 } } }), lastName: fields.text({ label: "Last Name", validation: { length: { min: 1 } } }), - photo: fields.text({ - label: "Photo filename", + slug: fields.text({ + label: "Slug", validation: { length: { min: 1 } } }), + photo: fields.image({ + label: "Photo", + directory: "src/images/freelancers", + publicPath: "/src/images/freelancers", + validation: { isRequired: true } + }), headline: fields.text({ label: "Headline", }), @@ -51,37 +58,45 @@ const keystaticConfig: Config = { label: "Short Pitch", multiline: true, }), - linkedIn: fields.text({ + linkedIn: fields.url({ label: "LinkedIn URL", }), - github: fields.text({ + github: fields.url({ label: "GitHub URL", }), - sprykerCertifications: fields.object({ - backEndDeveloper: fields.checkbox({ - label: "Backend Developer Certified", - defaultValue: false, - }), - solutionArchitect: fields.checkbox({ - label: "Solution Architect Certified", - defaultValue: false, - }), - }), - skills: fields.array( - fields.text({ label: "Skill" }), - { - label: "Skills", - itemLabel: (props) => props.value, - } - ), + certifications: fields.multiselect({ + label: "Certifications", + options: [ + { label: "Backend Developer Certified", value: "Backend Developer" }, + { label: "Solution Architect Certified", value: "Solution Architect" } + ], + }), + sprykerCertifications: fields.text({ + label: "Spryker Certifications", + multiline: true, + }), + skills: fields.multiselect({ + label: "Skills", + options: [ + { label: "Frontend", value: "Frontend" }, + { label: "Back End", value: "Back End" }, + { label: "Architecture", value: "Architecture" }, + { label: "Project Management", value: "Project Management" }, + { label: "Fullstack", value: "Fullstack" }, + { label: "Team Lead", value: "Team Lead" }, + { label: "Tech Lead", value: "Tech Lead" } + ], + }), timezoneRange: fields.text({ label: "Timezone Range", }), yearStartedWebDev: fields.integer({ label: "Year Started Web Development", + validation: { min: 1980, max: 2050 } }), yearStartedSpryker: fields.integer({ label: "Year Started with Spryker", + validation: { min: 2014, max: 2050 } }), references: fields.text({ label: "References", @@ -104,7 +119,7 @@ const keystaticConfig: Config = { label: "Contact Email", validation: { length: { min: 1 } } }), - forumProfile: fields.text({ + forumProfile: fields.url({ label: "Forum Profile URL", }), isVisible: fields.checkbox({ diff --git a/scripts/migrate-freelancers.mjs b/scripts/migrate-freelancers.mjs deleted file mode 100644 index 833ecd0..0000000 --- a/scripts/migrate-freelancers.mjs +++ /dev/null @@ -1,64 +0,0 @@ -import fs from 'fs/promises'; -import path from 'path'; -import yaml from 'js-yaml'; - -async function migrateFreelancers() { - // Read the existing JSON data - const jsonData = await fs.readFile('src/data_files/freelancers.json', 'utf-8'); - const freelancers = JSON.parse(jsonData); - - // Create the content directory if it doesn't exist - await fs.mkdir('src/content/freelancers', { recursive: true }); - - // Migrate each freelancer - for (const freelancer of freelancers) { - const slug = freelancer.firstName.toLowerCase(); - - // Format the content - const content = { - firstName: freelancer.firstName, - lastName: freelancer.lastName, - photo: freelancer.photo, - headline: freelancer.headline || '', - availability: freelancer.availability, - location: freelancer.location, - countryCode: freelancer.countryCode, - language: freelancer.language, - shortPitch: freelancer.shortPitch, - linkedIn: freelancer.linkedIn || '', - github: freelancer.github || '', - sprykerCertifications: { - backEndDeveloper: freelancer.sprykerCertifications.backEndDeveloper, - solutionArchitect: freelancer.sprykerCertifications.solutionArchitect, - }, - skills: freelancer.skills || [], - timezoneRange: freelancer.timezoneRange, - yearStartedWebDev: freelancer.yearStartedWebDev || 0, - yearStartedSpryker: freelancer.yearStartedSpryker || 0, - references: freelancer.references || '', - idealCustomer: freelancer.idealCustomer || '', - locationFlexibility: freelancer.locationFlexibility, - otherCertifications: freelancer.otherCertifications || '', - employmentType: freelancer.employmentType, - contact: freelancer.contact, - forumProfile: freelancer.forumProfile || '', - isVisible: freelancer.isVisible, - }; - - // Create the YAML file - const filePath = path.join('src/content/freelancers', `${slug}.yaml`); - await fs.writeFile(filePath, yaml.dump(content)); - } - - // Remove old files - const files = await fs.readdir('src/content/freelancers'); - for (const file of files) { - if (file.endsWith('.json') || file.endsWith('.mdoc')) { - await fs.unlink(path.join('src/content/freelancers', file)); - } - } - - console.log('Migration completed successfully!'); -} - -migrateFreelancers().catch(console.error); diff --git a/src/content/freelancers/andrey.yaml b/src/content/freelancers/andrey.yaml index 601f280..6df1f85 100644 --- a/src/content/freelancers/andrey.yaml +++ b/src/content/freelancers/andrey.yaml @@ -13,11 +13,9 @@ shortPitch: >- solutions. linkedIn: https://www.linkedin.com/in/andrej-lidokhover-553b07137/ github: '' -sprykerCertifications: - backEndDeveloper: true - solutionArchitect: false +sprykerCertifications: "Backend Developer Certified" skills: - - Backend + - Back End - Architecture - Fullstack - Tech Lead diff --git a/src/content/freelancers/constantin.yaml b/src/content/freelancers/constantin.yaml index c13fad4..51097b4 100644 --- a/src/content/freelancers/constantin.yaml +++ b/src/content/freelancers/constantin.yaml @@ -22,12 +22,10 @@ shortPitch: >- genuine love for building innovative web solutions, let's connect! linkedIn: https://www.linkedin.com/in/constantiniordan/ github: '' -sprykerCertifications: - backEndDeveloper: true - solutionArchitect: true +sprykerCertifications: "Backend Developer Certified, Solution Architect Certified" skills: - - Frontend (HTML, CSS, JS) - - Backend + - Frontend + - Back End - Fullstack - Tech Lead timezoneRange: GMT+3 to GMT-2 diff --git a/src/content/freelancers/david.yaml b/src/content/freelancers/david.yaml index 1708bf3..91d5458 100644 --- a/src/content/freelancers/david.yaml +++ b/src/content/freelancers/david.yaml @@ -16,9 +16,7 @@ shortPitch: >- challenges! linkedIn: https://www.linkedin.com/in/david-greiner-752b2a63/ github: https://github.com/greinerdavid -sprykerCertifications: - backEndDeveloper: false - solutionArchitect: false +sprykerCertifications: "None" skills: - Back End - Tech Lead diff --git a/src/content/freelancers/evgeny.yaml b/src/content/freelancers/evgeny.yaml index 34383d5..f44a4b5 100644 --- a/src/content/freelancers/evgeny.yaml +++ b/src/content/freelancers/evgeny.yaml @@ -12,12 +12,10 @@ shortPitch: >- experience. linkedIn: https://www.linkedin.com/in/evgeny-nekhamkin-b63312247/ github: https://github.com/EvgenyNekhamkin -sprykerCertifications: - backEndDeveloper: false - solutionArchitect: false +sprykerCertifications: "None" skills: - - Frontend (HTML, CSS, JS) - - Backend + - Frontend + - Back End - Architecture - Project Management timezoneRange: GMT to GMT+4 diff --git a/src/content/freelancers/filip.yaml b/src/content/freelancers/filip.yaml index 64f6d21..200ff9f 100644 --- a/src/content/freelancers/filip.yaml +++ b/src/content/freelancers/filip.yaml @@ -15,11 +15,9 @@ shortPitch: >- scale, reach out to me. linkedIn: https://www.linkedin.com/in/filip-galic-8250a988 github: https://github.com/galion96 -sprykerCertifications: - backEndDeveloper: true - solutionArchitect: true +sprykerCertifications: "Backend Developer Certified, Solution Architect Certified" skills: - - Backend + - Back End - Architecture - Team Lead - Tech Lead diff --git a/src/content/freelancers/ivan.yaml b/src/content/freelancers/ivan.yaml index 8b052b7..d4f1744 100644 --- a/src/content/freelancers/ivan.yaml +++ b/src/content/freelancers/ivan.yaml @@ -18,12 +18,10 @@ shortPitch: >- development roles. linkedIn: https://www.linkedin.com/in/ivan-jurisic/ github: '' -sprykerCertifications: - backEndDeveloper: true - solutionArchitect: true +sprykerCertifications: "Backend Developer Certified, Solution Architect Certified" skills: - - Frontend (HTML, CSS, JS) - - Backend + - Frontend + - Back End - Project Management - Team Lead timezoneRange: GMT-3 to GMT+4 diff --git a/src/content/freelancers/jan.yaml b/src/content/freelancers/jan.yaml index 7d0add5..73517c4 100644 --- a/src/content/freelancers/jan.yaml +++ b/src/content/freelancers/jan.yaml @@ -12,11 +12,9 @@ shortPitch: >- out with team management from technical and people leadership view. linkedIn: https://www.linkedin.com/in/jan-v-kovacs/ github: '' -sprykerCertifications: - backEndDeveloper: true - solutionArchitect: false +sprykerCertifications: "Backend Developer Certified" skills: - - Backend + - Back End - Fullstack - Team Lead - Tech Lead diff --git a/src/content/freelancers/javier.yaml b/src/content/freelancers/javier.yaml index 1e8aef3..6bbd0aa 100644 --- a/src/content/freelancers/javier.yaml +++ b/src/content/freelancers/javier.yaml @@ -17,12 +17,10 @@ shortPitch: >- committed to driving innovation and achieving results. linkedIn: https://www.linkedin.com/in/jbenitosantoni/ github: '' -sprykerCertifications: - backEndDeveloper: true - solutionArchitect: true +sprykerCertifications: "Backend Developer Certified, Solution Architect Certified" skills: - - Frontend (HTML, CSS, JS) - - Backend + - Frontend + - Back End - Architecture - Fullstack timezoneRange: 7.00 - 18.00 (GMT+2) diff --git a/src/content/freelancers/john.yaml b/src/content/freelancers/john.yaml index 3a4c743..134de32 100644 --- a/src/content/freelancers/john.yaml +++ b/src/content/freelancers/john.yaml @@ -11,15 +11,9 @@ shortPitch: >- solutions. linkedIn: https://www.linkedin.com/in/johndoe github: https://github.com/johndoe -sprykerCertifications: - backEndDeveloper: true - solutionArchitect: false +sprykerCertifications: "Backend Developer Certified" skills: - - Spryker - - PHP - - JavaScript - - Docker - - AWS + - Frontend timezoneRange: UTC-5 to UTC-4 yearStartedWebDev: 2010 yearStartedSpryker: 2018 diff --git a/src/content/freelancers/vasily.yaml b/src/content/freelancers/vasily.yaml index 841faa7..abd164c 100644 --- a/src/content/freelancers/vasily.yaml +++ b/src/content/freelancers/vasily.yaml @@ -11,9 +11,7 @@ shortPitch: >- dozens of projects! linkedIn: https://www.linkedin.com/in/rodinv/ github: https://github.com/RodinVasily -sprykerCertifications: - backEndDeveloper: true - solutionArchitect: false +sprykerCertifications: "Backend Developer Certified" skills: - Backend - Architecture diff --git a/src/content/freelancers/volodymyr.yaml b/src/content/freelancers/volodymyr.yaml index 5d7518d..ee9558e 100644 --- a/src/content/freelancers/volodymyr.yaml +++ b/src/content/freelancers/volodymyr.yaml @@ -18,11 +18,9 @@ shortPitch: >- testing, deployment, and maintenance. linkedIn: https://www.linkedin.com/in/volodymyr-hrychenko-a03aa6a8/ github: '' -sprykerCertifications: - backEndDeveloper: true - solutionArchitect: false +sprykerCertifications: "Backend Developer Certified" skills: - - Backend + - Back End - Architecture - Team Lead - Tech Lead diff --git a/src/data_files/freelancers.json b/src/data_files/freelancers.json deleted file mode 100644 index b2a1737..0000000 --- a/src/data_files/freelancers.json +++ /dev/null @@ -1,331 +0,0 @@ -[ - { - "id": 1, - "firstName": "John", - "lastName": "Doe", - "photo": "john-doe.jpg", - "availability": "Available from July 1st", - "location": "New York", - "countryCode": "US", - "language": "English", - "shortPitch": "Experienced Spryker developer with a passion for creating scalable e-commerce solutions.", - "linkedIn": "https://www.linkedin.com/in/johndoe", - "github": "https://github.com/johndoe", - "sprykerCertifications": { - "backEndDeveloper": true, - "solutionArchitect": false - }, - "skills": ["Spryker", "PHP", "JavaScript", "Docker", "AWS"], - "timezoneRange": "UTC-5 to UTC-4", - "yearStartedWebDev": 2010, - "yearStartedSpryker": 2018, - "references": "Available upon request", - "idealCustomer": "E-commerce businesses looking to scale their operations", - "locationFlexibility": "Remote, can travel", - "otherCertifications": "AWS Certified Solutions Architect", - "employmentType": "Freelance - open to permanent employment", - "contact": "evgeny@nekhamkin.de", - "forumProfile": "", - "isVisible": false - }, - { - "id": 2, - "firstName": "Evgeny", - "lastName": "Nekhamkin", - "photo": "evgeny-nekhamkin.jpg", - "headline": "Senior Webdeveloper & Architect", - "availability": "Mid October / 36-40 Hours", - "location": "Hamburg", - "countryCode": "DE", - "language": "English, German", - "shortPitch": "I am a Freelance Senior Spryker Developer (mainly backend) and consultant with a focus on code quality. I have more than 7 years of Spryker hands-on project experience.", - "linkedIn": "https://www.linkedin.com/in/evgeny-nekhamkin-b63312247/", - "github": "https://github.com/EvgenyNekhamkin", - "sprykerCertifications": { - "backEndDeveloper": false, - "solutionArchitect": false - }, - "skills": ["Frontend (HTML, CSS, JS)", "Backend","Architecture", "Project Management"], - "timezoneRange": "GMT to GMT+4", - "yearStartedWebDev": 2008, - "yearStartedSpryker": 2017, - "references": "

    Here is a selection of my former clients:

    1. * Mobilezone GmbH
    2. * Mediawave Commerce GmbH
    3. * Team Business IT GmbH
    4. * DEPT Design & Technology GmbH
    5. * Tom Tailor GmbH
    6. * Etribes Connect GmbH
    7. * Closed GmbH
    8. My role in those projects was primarily as a backend developer. Additionally, I also acted as a consultant, and in some projects, I worked as an architect and tech lead.

      ", - "idealCustomer": "", - "locationFlexibility": "Remote Only", - "otherCertifications": "", - "employmentType": "Freelance, open to permanent employment", - "contact": "evgeny@nekhamkin.de", - "forumProfile": "", - "isVisible": true - }, - { - "id": 3, - "firstName": "David", - "lastName": "Greiner", - "photo": "david_greiner_spryker_freelancer.jpg", - "headline": "Senior Spryker Backend Developer", - "availability": "Immediate", - "location": "Germany", - "countryCode": "DE", - "language": "English, German", - "shortPitch": "After studying business informatics, I started my professional journey at Turbine Kreuzberg, where I gained experience with shop systems like Magento and OXID while working on various projects.
      In 2015, I decided to go freelance, and since 2017, I have focused exclusively on the Spryker Commerce OS. As a freelancer, I've had the opportunity to deepen my knowledge and skills across a range of Spryker projects. I’m now excited to take on new challenges!", - "linkedIn": "https://www.linkedin.com/in/david-greiner-752b2a63/", - "github": "https://github.com/greinerdavid", - "sprykerCertifications": { - "backEndDeveloper": false, - "solutionArchitect": false - }, - "skills": ["Back End", "Tech Lead"], - "timezoneRange": "UTC+2 to UTC-2", - "yearStartedWebDev": 2008, - "yearStartedSpryker": 2017, - "references": "

      I have worked as a Senior Spryker Backend Developer for clients such as ALDI Süd, Lekkerland, Ratioform, Overkill, Winterhalter/ Fenner (Sonepar), Intersport, and more. My experience includes direct work with clients as well as through agencies like Turbine Kreuzberg, Brandung, MediaWave, Valantic, and Antiloop. For the past year, I’ve been with Lekkerland SE, and in the 24 months prior, I was involved in developing the shop solution for ALDI Süd's American market.

      More information about me can be found on my websites https://spryker-freelancer.de and https://davidgreiner.de.

      ", - "idealCustomer": "

      I have no specific preferences and I am also open to anything in this regard. It is always exciting to explore new industries and immerse myself in them. I am open to any project that is morally acceptable.

      I have worked on projects (not just Spryker) from various sectors, including pet food, water pumps, women's fashion, sports goods, electronics, food suppliers, the photovoltaic industry, mechanical engineering, and real estate.

      I have handled projects related to the healthcare sector as well as those in retail, covering both B2C and B2B contexts.

      ", - "locationFlexibility": "Remote Only", - "otherCertifications": "", - "employmentType": "Freelance, open to permanent employment", - "contact": "hallo@davidgreiner.de", - "forumProfile": "https://forum.commercequest.space/profile/8590/DavidGreiner", - "isVisible": true - }, - { - "id": 4, - "firstName": "Constantin", - "lastName": "Iordan", - "photo": "Constantin-Iordan.jpg", - "headline": "Senior PHP Developer", - "availability": "January 2025, 8h/day, 5 days/week", - "location": "Brasov", - "countryCode": "RO", - "language": "English C1, Romanian native", - "shortPitch": "I am a passionate web developer with over 16 years of experience, specializing in creating dynamic and robust eCommerce platforms. I thrive on the challenge of building solutions that power both B2B and B2C businesses, with a focus on delivering seamless user experiences and efficient back-end systems.
      My expertise spans technologies like PHP, MySQL/MariaDB, JavaScript, HTML, and CSS, as well as frameworks such as Laravel, Spryker, and Vue.js.
      I am driven by a deep passion for eCommerce and enjoy working on projects that push the boundaries of online retail. Whether it's developing from scratch or optimizing existing platforms, I take pride in crafting high-quality, scalable solutions. New challenges motivate me, and I am always eager to learn and adopt new technologies to stay at the forefront of the industry.
      If you're looking for a dedicated developer who brings both technical expertise and a genuine love for building innovative web solutions, let's connect!", - "linkedIn": "https://www.linkedin.com/in/constantiniordan/", - "github": "", - "sprykerCertifications": { - "backEndDeveloper": true, - "solutionArchitect": true - }, - "skills": ["Frontend (HTML, CSS, JS)", "Backend", "Fullstack", "Tech Lead"], - "timezoneRange": "GMT+3 to GMT-2", - "yearStartedWebDev": 2008, - "yearStartedSpryker": 2017, - "references": "Metro Digital 2023 - 2024

      I was a part of a team responsible for developing and maintaining a b2b ecommerce platform developed with Spryker that was available in multiple countries and had a high number of customers and daily orders.
      I was responsible of:

      1. * Investigate ways that business specific requirements can be implemented in a Spryker application.
      2. * Develop and maintain complex new features requested by the product owners.
      3. * Improve existing functionalities in order to obtain better user experience and better system performance.
      4. * Ensure that the application is always up and running for the company's customers by monitoring the logs.

      MediaWave 2022

      I was part o a large team that was developing a ecommerce solution based on Spryker for automotive industry.
      My responsibilities included:

      1. * Implementing business specific functionalities in a Spryker application.
      2. * Customization on existing Spryker modules, creating Glue endpoints and creating new modules.
      3. * Supporting new members of the team to get up to speed and review their code.

      SportFive 2021 - 2022

      I was part of a team responsable for creating a new ecommerce platform based on Spryker for a large sport events company. Develop Spryker B2B and B2C solutions based on customers specific needs. This includes:

      1. * Create custom theme based on provided designs.
      2. * Extend backoffice with business specific requirements.
      3. * Customization of login and registration process.
      4. * Extend and change products and catalog structure.
      5. * Implement product and customer import.
      6. * Implement changes in product pricing modules.
      ", - "idealCustomer": "", - "locationFlexibility": "Remote Only", - "otherCertifications": "", - "employmentType": "Freelance, open to permanent employment", - "contact": "costi.iordan@gmail.com", - "forumProfile": "", - "isVisible": true - }, - { - "id": 5, - "firstName": "Volodymyr", - "lastName": "Hrychenko", - "photo": "volodymyr-rychenko.jpg", - "contact": "volodymyr.hrychenko@gmail.com", - "headline": "Spryker Developer & Solution Architect", - "language": "English, Ukrainian, Polish", - "location": "Warsaw", - "countryCode": "PL", - "linkedIn": "https://www.linkedin.com/in/volodymyr-hrychenko-a03aa6a8/", - "github": "", - "shortPitch": "I am a PHP developer with 10 years of experience in web development. My technical skills combined with my ability to lead and architect solutions make me a valuable addition to any team. I am proficient in various back-end technologies such as PHP, MySQL, PostgreSQL, Redis, Elasticsearch, and various ORMs.As a technical lead and solution architect, I have successfully delivered complex web applications across various industries, including e-commerce, healthcare, and education. My expertise extends to all phases of the software development lifecycle, including requirements gathering, design, development, testing, deployment, and maintenance.", - "yearStartedWebDev": 2014, - "yearStartedSpryker": 2017, - "sprykerCertifications": { - "backEndDeveloper": true, - "solutionArchitect": false - }, - "references": "

      SHOPFLIX.gr Lead Software Engineer August 2023 - May 2024 (10 months)

      ALDI SÜD Solution Architect July 2022 - June 2023 (1 year)

      FarmTiger Lead Software Developer October 2021 - June 2023 (1 year 9 months)

      APOLLOBASE GmbH Senior Spryker Developer December 2020 - June 2022 (1 year 7 months)

      AutoDoc Senior Back-End Software Developer June 2020 - September 2021 (1 year 4 months)

      Spryker Systems GmbH PHP Developer March 2018 - May 2020 (2 years 3 months)

      Rallyware PHP Developer March 2016 - March 2018 (2 years 1 month)

      Devico Solutions Junior PHP Developer October 2014 - March 2016 (1 year 6 months)

      ", - "employmentType": "Freelance, open to permanent employment", - "locationFlexibility": "Remote, can travel", - "timezoneRange": "Any timezone", - "availability": "Fulltime", - "skills": ["Backend", "Architecture", "Team Lead", "Tech Lead"], - "idealCustomer": "", - "otherCertifications": "", - "forumProfile": "", - "isVisible": true - }, - { - "id": 6, - "firstName": "Vasily", - "lastName": "Rodin", - "photo": "vasily-rodin.jpg", - "contact": "me@vasilyrodin.de", - "headline": "Senior Spryker Developer & Tech Lead", - "language": "English, German, Russian", - "location": "Berlin", - "countryCode": "DE", - "linkedIn": "https://www.linkedin.com/in/rodinv/", - "github": "https://github.com/RodinVasily", - "shortPitch": "I've been with Spryker since 2017. I have a successful track record with dozens of projects!", - "yearStartedWebDev": 2008, - "yearStartedSpryker": 2017, - "sprykerCertifications": { - "backEndDeveloper": true, - "solutionArchitect": false - }, - "references": "B2C / B2B / Marketplace projects from 2017 to 2024 with customers from Germany, Austria, Poland, Croatia and other countries. Mainly in the role of Senior Backend Developer and Tech Lead.", - "employmentType": "Freelance", - "locationFlexibility": "Remote, can travel", - "timezoneRange": "CET", - "availability": "2025, usually 8h per day", - "skills": ["Backend", "Architecture", "Fullstack", "Tech Lead"], - "idealCustomer": "B2B or Marketplace project, mid/large size, challenging features, international team", - "otherCertifications": "", - "forumProfile": "https://forum.commercequest.space/profile/vasily.rodin", - "isVisible": true - }, - { - "id": 7, - "firstName": "Jan", - "lastName": "Kovács", - "photo": "jan-kovacs.jpg", - "contact": "jan.v.kovacs@gmail.com", - "headline": "Experienced Software Engineer & Leader", - "language": "English, German (B1), Ukrainian, Hungarian and Russian", - "location": "Hamburg", - "countryCode": "DE", - "linkedIn": "https://www.linkedin.com/in/jan-v-kovacs/", - "github": "", - "shortPitch": "Beyond my strong technical background, with 5 years of Spryker experience, I have also engineer manager experience and skills, therefore I can also help out with team management from technical and people leadership view.", - "yearStartedWebDev": 2010, - "yearStartedSpryker": 2017, - "sprykerCertifications": { - "backEndDeveloper": true, - "solutionArchitect": false - }, - "references": "

      In 2017 I have joined Tom Tailor E-commerce GmbH as Senior Software Engineer for the project based on Spryker platform, and we have worked closely together with Spryker to replatform the TT B2C & B2B plaftorms in half a year - during this time some of the solutions we have chosen at TT were also adapted by the core Spryker product. After the support of Spryker has been finished, I took over the leadership of the B2C development team and we further developed our Spryker based B2C platform, by adopting new Spryker features and standards also, as well customizing as much as possible to meet the needs of Tom Tailor.

      I worked in this role until mid of summer 2022.

      ", - "employmentType": "Freelance - open to permanent employment", - "locationFlexibility": "Remote, can travel", - "timezoneRange": "GMT+2", - "availability": "November 2024, 40 hours/week", - "skills": ["Backend", "Fullstack", "Team Lead", "Tech Lead"], - "idealCustomer": "", - "otherCertifications": "", - "forumProfile": "", - "isVisible": true - }, - { - "id": 8, - "firstName": "Javier", - "lastName": "Benito", - "photo": "javier-benito.jpg", - "contact": "javier@javierbenito.me", - "headline": "Senior Software Engineer", - "language": "Spanish, English", - "location": "Madrid", - "countryCode": "ES", - "linkedIn": "https://www.linkedin.com/in/jbenitosantoni/", - "github": "", - "shortPitch": "With over six years of experience as a Senior Software Engineer specializing in e-commerce, PHP and Spryker development, I bring a unique blend of technical expertise and creative problem-solving skills. My ability to collaborate effectively with cross-functional teams ensures that I deliver high-quality solutions tailored to meet business needs. I thrive in fast-paced environments and am dedicated to continuous learning, making me adaptable to new challenges. Hiring me means investing in a passionate developer who is committed to driving innovation and achieving results.", - "yearStartedWebDev": 2019, - "yearStartedSpryker": 2020, - "sprykerCertifications": { - "backEndDeveloper": true, - "solutionArchitect": true - }, - "references": "

      European B2B Marketplace (diva-e) Role: Senior Software Engineer (Spryker) Description: As part of diva-e, I worked on a high-profile B2B/B2C marketplace project for a European client in the manufacturing sector. My responsibilities included leading backend development with Spryker and integrating complex business logic to meet the customer’s specific needs.

      Atida – Digital Health Platform Role: Senior Software Engineer (Spryker and GO) Description: At diva-e, I collaborated with a global team to upgrade the backend infrastructure of a leading European health platform. My role involved backend optimization, improving system architecture, and implementing new features that aligned with business objectives.

      Global E-commerce Retailer Role: Spryker Developer Description: I contributed to the digital transformation of a leading e-commerce retailer, focusing on integrating third-party services to streamline their inventory and checkout processes.

      ", - "employmentType": "Freelance - open to permanent employment", - "locationFlexibility": "Remote, can travel", - "timezoneRange": "7.00 - 18.00 (GMT+2)", - "availability": "Immediately", - "skills": ["Frontend (HTML, CSS, JS)", "Backend", "Architecture", "Fullstack"], - "idealCustomer": "", - "otherCertifications": "", - "forumProfile": "https://forum.commercequest.space/profile/9068/javier", - "isVisible": true - }, - { - "id": 9, - "firstName": "Filip", - "lastName": "Galic", - "photo": "filip-galic.jpeg", - "contact": "filip.galic10@gmail.com", - "headline": "Spryker engineer", - "language": "Croatian, English, Spanish", - "location": "Bosnia and Herzegovina, Siroki Brijeg", - "countryCode": "BA", - "linkedIn": "https://www.linkedin.com/in/filip-galic-8250a988", - "github": "https://github.com/galion96", - "shortPitch": "Seasoned engineer with 5 years of experience in Spryker. Strong understanding of e-commerce domain. Worked with leading german brands such as Lidl, MediaMarkt, saturn. Making scalable solutions. Currently with chess com working as engineer on a platform that has 180M+ users. If you need someone with Spryker experience but experience with making extendable systems that scale, reach out to me.", - "yearStartedWebDev": 2018, - "yearStartedSpryker": 2019, - "sprykerCertifications": { - "backEndDeveloper": true, - "solutionArchitect": true - }, - "references": "
      • Teufel.de - Worked for 1 year, helped enhancing the platform, removing bugs etc. (Spryker)
      • Userwerk.com/de - Worked on Spryker project that was used by leading German ecomerce shops (lidl, mediamarkt...) Did fullstack work (4 years)
      • Chess.com - Backend engineer on worlds biggest chess platform serving 180M users.
      ", - "employmentType": "Freelance - open to permanent employment", - "locationFlexibility": "Remote, can travel", - "timezoneRange": "GMT - 2, GMT +3", - "availability": "Immediately", - "skills": ["Backend", "Architecture", "Team Lead", "Tech Lead"], - "idealCustomer": "", - "otherCertifications": "", - "forumProfile": "https://forum.commercequest.space/profile/9068/javier", - "isVisible": true - }, - { - "id": 9, - "firstName": "Ivan", - "lastName": "Jurisic", - "photo": "ivan-jurisic.jpg", - "contact": "jurisic.ivan10@gmail.com", - "headline": "Spryker developer", - "language": "English, Croatian", - "location": "Makarska, Croatia", - "countryCode": "HR", - "linkedIn": "https://www.linkedin.com/in/ivan-jurisic/", - "github": "", - "shortPitch": "With six years of hands-on experience in Spryker, I bring deep expertise in full-stack development, particularly in backend solutions. I have successfully worked on more than five diverse projects, spanning both B2B and B2C models. My experience covers everything from building shops from the ground up to optimizing and scaling existing systems. I am comfortable with both older versions of Spryker and the latest cloud-based versions, ensuring adaptability and up-to-date skills in the evolving e-commerce landscape. My proven ability to deliver high-quality results makes me a strong candidate for Spryker development roles.", - "yearStartedWebDev": 2018, - "yearStartedSpryker": 2018, - "sprykerCertifications": { - "backEndDeveloper": true, - "solutionArchitect": true - }, - "references": "

      https://drive.google.com/file/d/1I2EYW9yoVTUhKgWtCUwOpwd1RadRW3X-/view?usp=sharing

      https://drive.google.com/file/d/15bGOHFf5XOT6hh6meYwNloYYjM0wcQ1m/view?usp=sharing

      https://drive.google.com/file/d/1CAgTvpoWsRDT_xNJGnfmiRg0ROUYgW5z/view?usp=sharing

      ", - "employmentType": "Freelance - open to permanent employment", - "locationFlexibility": "Remote, can travel", - "timezoneRange": "GMT-3 to GMT+4", - "availability": "Immediately", - "skills": ["Frontend (HTML, CSS, JS)", "Backend", "Project Management", "Team Lead"], - "idealCustomer": "", - "otherCertifications": "", - "forumProfile": "https://forum.commercequest.space/profile/9068/javier", - "isVisible": true - }, - { - "id": 10, - "firstName": "Andrey", - "lastName": "Lidokhover", - "photo": "andrey-lidokhover.jpg", - "contact": "lidokhover@gmail.com", - "headline": "Senior Spryker Backend Developer", - "language": "German, English, Russian", - "location": "Hamburg", - "countryCode": "DE", - "linkedIn": "https://www.linkedin.com/in/andrej-lidokhover-553b07137/", - "github": "", - "shortPitch": "I am a seasoned Lead Backend Developer with a strong background in Spryker projects. I have deep experience implementing Spryker B2B, B2C & Marketplace projects, and developing software architecture for e-commerce enterprise solutions.", - "yearStartedWebDev": 1999, - "yearStartedSpryker": 2016, - "sprykerCertifications": { - "backEndDeveloper": true, - "solutionArchitect": false - }, - "references": "

      * TOWA GmbH, Spryker Backend Developer, Consultant (Freelance) 2022 - 2023 Hands-on backend development in the large B2B Spryker Project. Consulting the client on state-of-the-art technologies, best practices and feasibility.

      * Dept Agency, Tech Lead Enterprise E-Commerce 2022 Leading of two B2B spryker projects (Scrum, Kanban). Consulting Enterprise E-commerce clients in the assigned projects on state-of-the-art technologies, best practices and feasibility. Hands-on spryker backend development.

      * Dept Agency, Lead Developer Backend 2020 - 2022 Technical leading of different Spryker B2B, B2C and Marketplace Projects Hands-on spryker backend development.

      * Dept Agency, Senior Backend Developer, Project Lead Developer 2016 - 2020 Spryker backend development. Technical project leading (Spryker B2C)

      ", - "employmentType": "Freelance", - "locationFlexibility": "Remote, can travel", - "timezoneRange": "GMT+4 to GMT-4", - "availability": "November 2024, fulltime", - "skills": ["Backend", "Architecture", "Fullstack", "Tech Lead", "Team Lead"], - "idealCustomer": "", - "otherCertifications": "", - "forumProfile": "https://forum.commercequest.space/profile/9068/javier", - "isVisible": true - } - ] \ No newline at end of file From dbbb2a6a8e92c58493bab696e9e97399fa81152f Mon Sep 17 00:00:00 2001 From: Guido X Jansen Date: Mon, 4 Nov 2024 23:18:04 +0100 Subject: [PATCH 11/47] Jobs detail page transferred --- keystatic.config.ts | 8 +++-- .../{andrey.yaml => Andrey Lidokhover.yaml} | 0 ...constantin.yaml => Constantin Iordan.yaml} | 0 .../{david.yaml => David Greiner.yaml} | 0 .../{evgeny.yaml => Evgeny Nekhamkin.yaml} | 0 .../{filip.yaml => Filip Galic.yaml} | 0 .../{ivan.yaml => Ivan Jurisic.yaml} | 0 .../freelancers/{jan.yaml => Jan Kovacs.yaml} | 0 .../{javier.yaml => Javier Benito.yaml} | 0 .../{vasily.yaml => Vasily Rodin.yaml} | 2 +- ...volodymyr.yaml => Volodymyr Rychenko.yaml} | 0 src/content/freelancers/john.yaml | 27 -------------- src/pages/jobs.astro | 1 - src/pages/jobs/[slug].astro | 36 +++++++++++++++---- 14 files changed, 36 insertions(+), 38 deletions(-) rename src/content/freelancers/{andrey.yaml => Andrey Lidokhover.yaml} (100%) rename src/content/freelancers/{constantin.yaml => Constantin Iordan.yaml} (100%) rename src/content/freelancers/{david.yaml => David Greiner.yaml} (100%) rename src/content/freelancers/{evgeny.yaml => Evgeny Nekhamkin.yaml} (100%) rename src/content/freelancers/{filip.yaml => Filip Galic.yaml} (100%) rename src/content/freelancers/{ivan.yaml => Ivan Jurisic.yaml} (100%) rename src/content/freelancers/{jan.yaml => Jan Kovacs.yaml} (100%) rename src/content/freelancers/{javier.yaml => Javier Benito.yaml} (100%) rename src/content/freelancers/{vasily.yaml => Vasily Rodin.yaml} (98%) rename src/content/freelancers/{volodymyr.yaml => Volodymyr Rychenko.yaml} (100%) delete mode 100644 src/content/freelancers/john.yaml diff --git a/keystatic.config.ts b/keystatic.config.ts index 8d67d00..aa24019 100644 --- a/keystatic.config.ts +++ b/keystatic.config.ts @@ -42,10 +42,11 @@ const keystaticConfig: Config = { }), availability: fields.text({ label: "Availability", + validation: { isRequired: true } }), location: fields.text({ label: "Location", - validation: { length: { min: 1 } } + validation: { isRequired: true, length: { min: 1 } } }), countryCode: fields.text({ label: "Country Code", @@ -53,6 +54,7 @@ const keystaticConfig: Config = { }), language: fields.text({ label: "Languages", + validation: { isRequired: true } }), shortPitch: fields.text({ label: "Short Pitch", @@ -85,7 +87,7 @@ const keystaticConfig: Config = { { label: "Fullstack", value: "Fullstack" }, { label: "Team Lead", value: "Team Lead" }, { label: "Tech Lead", value: "Tech Lead" } - ], + ] }), timezoneRange: fields.text({ label: "Timezone Range", @@ -96,7 +98,7 @@ const keystaticConfig: Config = { }), yearStartedSpryker: fields.integer({ label: "Year Started with Spryker", - validation: { min: 2014, max: 2050 } + validation: { min: 1980, max: 2050 } }), references: fields.text({ label: "References", diff --git a/src/content/freelancers/andrey.yaml b/src/content/freelancers/Andrey Lidokhover.yaml similarity index 100% rename from src/content/freelancers/andrey.yaml rename to src/content/freelancers/Andrey Lidokhover.yaml diff --git a/src/content/freelancers/constantin.yaml b/src/content/freelancers/Constantin Iordan.yaml similarity index 100% rename from src/content/freelancers/constantin.yaml rename to src/content/freelancers/Constantin Iordan.yaml diff --git a/src/content/freelancers/david.yaml b/src/content/freelancers/David Greiner.yaml similarity index 100% rename from src/content/freelancers/david.yaml rename to src/content/freelancers/David Greiner.yaml diff --git a/src/content/freelancers/evgeny.yaml b/src/content/freelancers/Evgeny Nekhamkin.yaml similarity index 100% rename from src/content/freelancers/evgeny.yaml rename to src/content/freelancers/Evgeny Nekhamkin.yaml diff --git a/src/content/freelancers/filip.yaml b/src/content/freelancers/Filip Galic.yaml similarity index 100% rename from src/content/freelancers/filip.yaml rename to src/content/freelancers/Filip Galic.yaml diff --git a/src/content/freelancers/ivan.yaml b/src/content/freelancers/Ivan Jurisic.yaml similarity index 100% rename from src/content/freelancers/ivan.yaml rename to src/content/freelancers/Ivan Jurisic.yaml diff --git a/src/content/freelancers/jan.yaml b/src/content/freelancers/Jan Kovacs.yaml similarity index 100% rename from src/content/freelancers/jan.yaml rename to src/content/freelancers/Jan Kovacs.yaml diff --git a/src/content/freelancers/javier.yaml b/src/content/freelancers/Javier Benito.yaml similarity index 100% rename from src/content/freelancers/javier.yaml rename to src/content/freelancers/Javier Benito.yaml diff --git a/src/content/freelancers/vasily.yaml b/src/content/freelancers/Vasily Rodin.yaml similarity index 98% rename from src/content/freelancers/vasily.yaml rename to src/content/freelancers/Vasily Rodin.yaml index abd164c..c4e9819 100644 --- a/src/content/freelancers/vasily.yaml +++ b/src/content/freelancers/Vasily Rodin.yaml @@ -13,7 +13,7 @@ linkedIn: https://www.linkedin.com/in/rodinv/ github: https://github.com/RodinVasily sprykerCertifications: "Backend Developer Certified" skills: - - Backend + - Back End - Architecture - Fullstack - Tech Lead diff --git a/src/content/freelancers/volodymyr.yaml b/src/content/freelancers/Volodymyr Rychenko.yaml similarity index 100% rename from src/content/freelancers/volodymyr.yaml rename to src/content/freelancers/Volodymyr Rychenko.yaml diff --git a/src/content/freelancers/john.yaml b/src/content/freelancers/john.yaml deleted file mode 100644 index 134de32..0000000 --- a/src/content/freelancers/john.yaml +++ /dev/null @@ -1,27 +0,0 @@ -firstName: John -lastName: Doe -photo: john-doe.jpg -headline: '' -availability: Available from July 1st -location: New York -countryCode: US -language: English -shortPitch: >- - Experienced Spryker developer with a passion for creating scalable e-commerce - solutions. -linkedIn: https://www.linkedin.com/in/johndoe -github: https://github.com/johndoe -sprykerCertifications: "Backend Developer Certified" -skills: - - Frontend -timezoneRange: UTC-5 to UTC-4 -yearStartedWebDev: 2010 -yearStartedSpryker: 2018 -references: Available upon request -idealCustomer: E-commerce businesses looking to scale their operations -locationFlexibility: Remote, can travel -otherCertifications: AWS Certified Solutions Architect -employmentType: Freelance - open to permanent employment -contact: evgeny@nekhamkin.de -forumProfile: '' -isVisible: false diff --git a/src/pages/jobs.astro b/src/pages/jobs.astro index 4303faa..45557ac 100644 --- a/src/pages/jobs.astro +++ b/src/pages/jobs.astro @@ -7,7 +7,6 @@ import PrimaryCTA from "@components/ui/buttons/PrimaryCTA.astro"; import { createReader } from '@keystatic/core/reader'; import keystaticConfig from '../../keystatic.config'; import type { Freelancer, KeystaticFreelancer } from '../types.ts'; -import { generateNameSlug } from '../utils/utils.js'; const pageTitle = "Available Spryker Developers"; diff --git a/src/pages/jobs/[slug].astro b/src/pages/jobs/[slug].astro index e2def61..e7780ec 100644 --- a/src/pages/jobs/[slug].astro +++ b/src/pages/jobs/[slug].astro @@ -1,15 +1,16 @@ --- import MainLayout from '../../layouts/MainLayout.astro'; import MainSection from "../../components/ui/blocks/MainSection.astro"; -import freelancers from '../../data_files/freelancers.json'; -import { generateNameSlug } from '../../utils/utils.js'; import { Image } from 'astro:assets'; import type { ImageMetadata } from 'astro'; -import { hasSprykerCertifications } from '../../utils/utils.js'; +import { hasSprykerCertifications, generateNameSlug } from '../../utils/utils.js'; import { Icon } from 'astro-icon/components'; // social icons import CQIcon from '@components/ui/icons/CQIcon.astro'; import PrimaryCTA from "@components/ui/buttons/PrimaryCTA.astro"; import Flag from '@components/ui/Flag.astro'; +import { createReader } from '@keystatic/core/reader'; +import keystaticConfig from '../../../keystatic.config'; +import type { Freelancer, KeystaticFreelancer } from '../../types.ts'; // Import all images at build time with proper typing const imageFiles: Record = import.meta.glob('/src/images/freelancers/*.{jpeg,jpg,png,gif}', { @@ -17,14 +18,37 @@ const imageFiles: Record = import.meta.glob('/src/images/ import: 'default' }); -export function getStaticPaths() { +export async function getStaticPaths() { + // Initialize Keystatic reader + const reader = createReader(process.cwd(), keystaticConfig); + + // Get all freelancers from Keystatic + const freelancerEntries = await reader.collections.freelancers.all(); + + // Convert Keystatic entries to Freelancer type + const freelancers: Freelancer[] = await Promise.all( + freelancerEntries.map(async (entry) => { + const content = await reader.collections.freelancers.readOrThrow(entry.slug) as unknown as KeystaticFreelancer; + return { + id: entry.slug, + ...content, + linkedIn: content.linkedIn || null, + github: content.github || null, + headline: content.headline || '', + otherCertifications: content.otherCertifications || '', + forumProfile: content.forumProfile || '', + idealCustomer: content.idealCustomer || '', + references: content.references || '', + }; + }) + ); + return freelancers .filter(freelancer => freelancer.isVisible) .map((freelancer) => { - // Generate slug from name const slug = generateNameSlug(freelancer.firstName, freelancer.lastName); return { - params: { slug }, // Use slug instead of id + params: { slug }, props: { freelancer } }; }); From cac5d7231cbe878751a8b741906908ee63614c44 Mon Sep 17 00:00:00 2001 From: Guido X Jansen Date: Mon, 4 Nov 2024 23:31:42 +0100 Subject: [PATCH 12/47] Set Keystatic to use Github as datasource --- keystatic.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystatic.config.ts b/keystatic.config.ts index aa24019..4ef6ae8 100644 --- a/keystatic.config.ts +++ b/keystatic.config.ts @@ -3,7 +3,7 @@ import { config, fields, collection } from '@keystatic/core'; const keystaticConfig: Config = { storage: { - kind: 'local', + kind: 'cloud', }, cloud: { project: 'commercequest/cq-astro', From e269787a99e773e97bb870a9c8a8ed7ba08d2eb1 Mon Sep 17 00:00:00 2001 From: Guido X Jansen Date: Mon, 4 Nov 2024 23:58:18 +0100 Subject: [PATCH 13/47] Solved build issues --- src/data_files/communityTools.json | 1 - src/pages/community-tools.astro | 11 ++++++---- src/types.ts | 35 ++++++++++++++++++++++++++++++ src/utils/navigation.ts | 1 + 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/data_files/communityTools.json b/src/data_files/communityTools.json index f31c323..79ce86a 100644 --- a/src/data_files/communityTools.json +++ b/src/data_files/communityTools.json @@ -16,7 +16,6 @@ "label": "Github", "url": "https://github.com/valantic-CEC-Deutschland-GmbH/spryker-kit-intellij-plugin" } - ] }, { diff --git a/src/pages/community-tools.astro b/src/pages/community-tools.astro index 20b35cc..458a080 100644 --- a/src/pages/community-tools.astro +++ b/src/pages/community-tools.astro @@ -1,9 +1,12 @@ --- -import MainLayout from "@/layouts/MainLayout.astro"; +import MainLayout from "../layouts/MainLayout.astro"; import { SITE } from "@data/constants"; -import MainSection from "@/components/ui/blocks/MainSection.astro"; -import CommunityToolsTable from "@/components/ui/tables/CommunityToolsTable.astro"; -import communityTools from "@data/communityTools.json"; +import MainSection from "../components/ui/blocks/MainSection.astro"; +import CommunityToolsTable from "../components/ui/tables/CommunityToolsTable.astro"; +import communityToolsData from "@data/communityTools.json"; +import type { CommunityToolCollection } from "../types"; + +const communityTools: CommunityToolCollection = communityToolsData as CommunityToolCollection; const pageTitle: string = `Community Tools — ${SITE.title}`; --- diff --git a/src/types.ts b/src/types.ts index 350437c..f6f4274 100644 --- a/src/types.ts +++ b/src/types.ts @@ -33,3 +33,38 @@ export interface KeystaticFreelancer { export interface Freelancer extends KeystaticFreelancer { id: string; } + +export interface NavSubmenuEntry { + label: string; + href?: string; + submenu?: NavSubmenuEntry[]; +} + +export interface NavEntry { + label: string; + href?: string; + submenu?: NavSubmenuEntry[]; +} + +export interface CommunityToolCreator { + name: string; + url: string; +} + +export interface CommunityToolLink { + url: string; + label: string; +} + +export interface CommunityTool { + title: string; + subtitle: string; + description: string; + license: string; + creators: CommunityToolCreator[]; + links: CommunityToolLink[]; + tags?: string[]; + contributors?: string[]; +} + +export type CommunityToolCollection = CommunityTool[]; diff --git a/src/utils/navigation.ts b/src/utils/navigation.ts index f8f4acf..94cd74f 100644 --- a/src/utils/navigation.ts +++ b/src/utils/navigation.ts @@ -145,6 +145,7 @@ const mainNavigation: NavEntry[] = [ href: "/", submenu: [ { + label: "Event Options", // Added missing label submenu: [ { label: "Upcoming Events", From bec494a6e11a2741a48abc1215deefb0e128e2ad Mon Sep 17 00:00:00 2001 From: Guido X Jansen Date: Thu, 7 Nov 2024 00:59:01 +0100 Subject: [PATCH 14/47] Delete LICENSE --- LICENSE | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 LICENSE diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8cc6751..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Emil Gulamov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. From 975c0af4d973b8d9770bd1ad5f0b1a01d609fa31 Mon Sep 17 00:00:00 2001 From: Guido X Jansen Date: Fri, 22 Nov 2024 16:41:59 +0100 Subject: [PATCH 15/47] Solved flag 404 --- public/flag-icons | 1 + src/components/ui/Flag.astro | 47 +++++++++++++++--------------------- src/layouts/MainLayout.astro | 2 +- 3 files changed, 22 insertions(+), 28 deletions(-) create mode 120000 public/flag-icons diff --git a/public/flag-icons b/public/flag-icons new file mode 120000 index 0000000..4c4144d --- /dev/null +++ b/public/flag-icons @@ -0,0 +1 @@ +../node_modules/flag-icons \ No newline at end of file diff --git a/src/components/ui/Flag.astro b/src/components/ui/Flag.astro index 1fa71a5..f15bdc6 100644 --- a/src/components/ui/Flag.astro +++ b/src/components/ui/Flag.astro @@ -1,7 +1,4 @@ --- -import { Image } from 'astro:assets'; -import type { ImageMetadata } from 'astro'; - interface Props { countryCode: string; size?: 'sm' | 'md' | 'lg'; @@ -12,32 +9,28 @@ const { countryCode, size = 'md', class: className = '' } = Astro.props; // Size mappings const sizes = { - sm: { width: 16, height: 12 }, - md: { width: 24, height: 18 }, - lg: { width: 32, height: 24 }, + sm: 'w-4 h-3', + md: 'w-6 h-4.5', + lg: 'w-8 h-6', }; -const { width, height } = sizes[size]; - -// Import all flag SVGs -const flags: Record = import.meta.glob('/public/flags/*.svg', { eager: true }); -const flagPath = `/public/flags/${countryCode.toLowerCase()}.svg`; -const flagSrc = flags[flagPath]; +const sizeClass = sizes[size]; -if (!flagSrc) { - throw new Error(`Flag not found for country code: ${countryCode}`); -} +// Convert country code to lowercase for the flag-icons class +const code = countryCode.toLowerCase(); --- - - {`Flag - + + + diff --git a/src/layouts/MainLayout.astro b/src/layouts/MainLayout.astro index c1bd7c1..0b22ce9 100644 --- a/src/layouts/MainLayout.astro +++ b/src/layouts/MainLayout.astro @@ -29,7 +29,7 @@ We set the language of the page to English and add classes for scrollbar and scr - + {title}