Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
403cc46966 | |||
71343ce56f | |||
99cc3c4359 | |||
a716982652 | |||
caa14b480e | |||
dea6ab6823 | |||
5715c7cc11 | |||
e5642145a7 |
@ -3,12 +3,14 @@ import markdownIntegration from '@astropub/md'
|
||||
import sitemap from '@astrojs/sitemap';
|
||||
import mdx from '@astrojs/mdx';
|
||||
|
||||
|
||||
export default defineConfig({
|
||||
output: 'static',
|
||||
compressHTML: true,
|
||||
site: process.env.ASTRO_SITE,
|
||||
trailingSlash: 'always',
|
||||
image: {
|
||||
domains: ['assets.codyops.com','assets.codyops.com.br','assets.codyops.com.es'],
|
||||
},
|
||||
integrations: [
|
||||
markdownIntegration({
|
||||
remarkPlugins: [],
|
||||
@ -25,4 +27,9 @@ export default defineConfig({
|
||||
format: 'directory',
|
||||
inlineStylesheets: 'never',
|
||||
},
|
||||
redirects: {
|
||||
'/awsdevops': '/carreras/aws-devops',
|
||||
'/cloudops': '/carreras/cloudops',
|
||||
'/devops': '/carreras/devops',
|
||||
},
|
||||
});
|
||||
|
240
package-lock.json
generated
240
package-lock.json
generated
@ -1152,9 +1152,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.0.tgz",
|
||||
"integrity": "sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz",
|
||||
"integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@ -1165,9 +1165,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-android-arm64": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.0.tgz",
|
||||
"integrity": "sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz",
|
||||
"integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -1178,9 +1178,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.0.tgz",
|
||||
"integrity": "sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz",
|
||||
"integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -1191,9 +1191,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-darwin-x64": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.0.tgz",
|
||||
"integrity": "sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz",
|
||||
"integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -1204,9 +1204,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-freebsd-arm64": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.0.tgz",
|
||||
"integrity": "sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz",
|
||||
"integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -1217,9 +1217,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-freebsd-x64": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.0.tgz",
|
||||
"integrity": "sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz",
|
||||
"integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -1230,9 +1230,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.0.tgz",
|
||||
"integrity": "sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz",
|
||||
"integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@ -1243,9 +1243,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.0.tgz",
|
||||
"integrity": "sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz",
|
||||
"integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@ -1256,9 +1256,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.0.tgz",
|
||||
"integrity": "sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz",
|
||||
"integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -1269,9 +1269,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.0.tgz",
|
||||
"integrity": "sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz",
|
||||
"integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -1282,9 +1282,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.0.tgz",
|
||||
"integrity": "sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz",
|
||||
"integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==",
|
||||
"cpu": [
|
||||
"loong64"
|
||||
],
|
||||
@ -1294,10 +1294,10 @@
|
||||
"linux"
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.0.tgz",
|
||||
"integrity": "sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==",
|
||||
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz",
|
||||
"integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@ -1308,9 +1308,22 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.0.tgz",
|
||||
"integrity": "sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz",
|
||||
"integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-riscv64-musl": {
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz",
|
||||
"integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
@ -1321,9 +1334,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.0.tgz",
|
||||
"integrity": "sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz",
|
||||
"integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
@ -1334,9 +1347,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.0.tgz",
|
||||
"integrity": "sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz",
|
||||
"integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -1347,9 +1360,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.0.tgz",
|
||||
"integrity": "sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz",
|
||||
"integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -1360,9 +1373,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.0.tgz",
|
||||
"integrity": "sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz",
|
||||
"integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -1373,9 +1386,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.0.tgz",
|
||||
"integrity": "sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz",
|
||||
"integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@ -1386,9 +1399,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.0.tgz",
|
||||
"integrity": "sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz",
|
||||
"integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -1492,9 +1505,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@types/estree": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
|
||||
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
|
||||
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/estree-jsx": {
|
||||
@ -1552,10 +1565,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "17.0.45",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
|
||||
"integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
|
||||
"license": "MIT"
|
||||
"version": "24.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz",
|
||||
"integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": "~7.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/sax": {
|
||||
"version": "1.2.7",
|
||||
@ -1858,17 +1874,6 @@
|
||||
"node": "^18.17.1 || ^20.3.0 || >=22.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/astro/node_modules/@types/node": {
|
||||
"version": "22.10.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz",
|
||||
"integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~6.20.0"
|
||||
}
|
||||
},
|
||||
"node_modules/astro/node_modules/vite": {
|
||||
"version": "6.0.11",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz",
|
||||
@ -4532,9 +4537,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "3.3.8",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
|
||||
"integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
|
||||
"version": "3.3.11",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
|
||||
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
@ -4770,9 +4775,9 @@
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/picomatch": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
|
||||
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
|
||||
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
@ -4803,9 +4808,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.5.1",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
|
||||
"integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
|
||||
"version": "8.5.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
|
||||
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@ -4822,7 +4827,7 @@
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.8",
|
||||
"nanoid": "^3.3.11",
|
||||
"picocolors": "^1.1.1",
|
||||
"source-map-js": "^1.2.1"
|
||||
},
|
||||
@ -5295,12 +5300,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/rollup": {
|
||||
"version": "4.32.0",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.0.tgz",
|
||||
"integrity": "sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==",
|
||||
"version": "4.46.2",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz",
|
||||
"integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/estree": "1.0.6"
|
||||
"@types/estree": "1.0.8"
|
||||
},
|
||||
"bin": {
|
||||
"rollup": "dist/bin/rollup"
|
||||
@ -5310,25 +5315,26 @@
|
||||
"npm": ">=8.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@rollup/rollup-android-arm-eabi": "4.32.0",
|
||||
"@rollup/rollup-android-arm64": "4.32.0",
|
||||
"@rollup/rollup-darwin-arm64": "4.32.0",
|
||||
"@rollup/rollup-darwin-x64": "4.32.0",
|
||||
"@rollup/rollup-freebsd-arm64": "4.32.0",
|
||||
"@rollup/rollup-freebsd-x64": "4.32.0",
|
||||
"@rollup/rollup-linux-arm-gnueabihf": "4.32.0",
|
||||
"@rollup/rollup-linux-arm-musleabihf": "4.32.0",
|
||||
"@rollup/rollup-linux-arm64-gnu": "4.32.0",
|
||||
"@rollup/rollup-linux-arm64-musl": "4.32.0",
|
||||
"@rollup/rollup-linux-loongarch64-gnu": "4.32.0",
|
||||
"@rollup/rollup-linux-powerpc64le-gnu": "4.32.0",
|
||||
"@rollup/rollup-linux-riscv64-gnu": "4.32.0",
|
||||
"@rollup/rollup-linux-s390x-gnu": "4.32.0",
|
||||
"@rollup/rollup-linux-x64-gnu": "4.32.0",
|
||||
"@rollup/rollup-linux-x64-musl": "4.32.0",
|
||||
"@rollup/rollup-win32-arm64-msvc": "4.32.0",
|
||||
"@rollup/rollup-win32-ia32-msvc": "4.32.0",
|
||||
"@rollup/rollup-win32-x64-msvc": "4.32.0",
|
||||
"@rollup/rollup-android-arm-eabi": "4.46.2",
|
||||
"@rollup/rollup-android-arm64": "4.46.2",
|
||||
"@rollup/rollup-darwin-arm64": "4.46.2",
|
||||
"@rollup/rollup-darwin-x64": "4.46.2",
|
||||
"@rollup/rollup-freebsd-arm64": "4.46.2",
|
||||
"@rollup/rollup-freebsd-x64": "4.46.2",
|
||||
"@rollup/rollup-linux-arm-gnueabihf": "4.46.2",
|
||||
"@rollup/rollup-linux-arm-musleabihf": "4.46.2",
|
||||
"@rollup/rollup-linux-arm64-gnu": "4.46.2",
|
||||
"@rollup/rollup-linux-arm64-musl": "4.46.2",
|
||||
"@rollup/rollup-linux-loongarch64-gnu": "4.46.2",
|
||||
"@rollup/rollup-linux-ppc64-gnu": "4.46.2",
|
||||
"@rollup/rollup-linux-riscv64-gnu": "4.46.2",
|
||||
"@rollup/rollup-linux-riscv64-musl": "4.46.2",
|
||||
"@rollup/rollup-linux-s390x-gnu": "4.46.2",
|
||||
"@rollup/rollup-linux-x64-gnu": "4.46.2",
|
||||
"@rollup/rollup-linux-x64-musl": "4.46.2",
|
||||
"@rollup/rollup-win32-arm64-msvc": "4.46.2",
|
||||
"@rollup/rollup-win32-ia32-msvc": "4.46.2",
|
||||
"@rollup/rollup-win32-x64-msvc": "4.46.2",
|
||||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
@ -5873,6 +5879,12 @@
|
||||
"npm": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sitemap/node_modules/@types/node": {
|
||||
"version": "17.0.45",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
|
||||
"integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/source-map": {
|
||||
"version": "0.7.4",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
|
||||
@ -6131,12 +6143,10 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "6.20.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
|
||||
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
"version": "7.10.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
|
||||
"integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/unenv": {
|
||||
"version": "1.10.0",
|
||||
|
Before Width: | Height: | Size: 255 KiB After Width: | Height: | Size: 255 KiB |
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 192 KiB |
@ -1,31 +0,0 @@
|
||||
---
|
||||
import { Image } from 'astro:assets';
|
||||
|
||||
type Props = {
|
||||
as?: HTMLElement;
|
||||
className?: string;
|
||||
id?: string;
|
||||
backgroundImage: any;
|
||||
backgroundAlt: string;
|
||||
};
|
||||
|
||||
const {
|
||||
as = 'div',
|
||||
className = '',
|
||||
id = '',
|
||||
backgroundImage,
|
||||
backgroundAlt,
|
||||
}: Props = Astro.props;
|
||||
|
||||
const Tag: HTMLElement = as;
|
||||
---
|
||||
|
||||
<Tag class={`${className}`} id={id}>
|
||||
<div class="banner py-10 position-relative">
|
||||
<figure class="banner__background-container-image">
|
||||
<div class="overlay"></div>
|
||||
<Image src={backgroundImage} alt={backgroundAlt} />
|
||||
</figure>
|
||||
<slot />
|
||||
</div>
|
||||
</Tag>
|
@ -7,7 +7,19 @@ type Props = {
|
||||
|
||||
const { course }: Props = Astro.props;
|
||||
|
||||
const courseDurations = course.modules.flatMap((time:any) => (time.duration));
|
||||
const isDev = import.meta.env.DEV;
|
||||
const statusFilter = isDev ? { '_neq': 'archived' } : { '_eq': 'published' };
|
||||
|
||||
const filteredModules = course.modules.filter((module: any) => {
|
||||
if (statusFilter._neq) {
|
||||
return module.status !== statusFilter._neq;
|
||||
} else if (statusFilter._eq) {
|
||||
return module.status === statusFilter._eq;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
const courseDurations = filteredModules.flatMap((time:any) => (time.duration));
|
||||
const totalCourseDuration = sumTimes(courseDurations);
|
||||
---
|
||||
|
||||
@ -28,7 +40,7 @@ const totalCourseDuration = sumTimes(courseDurations);
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion accordion-btn-icon-start">
|
||||
{course.modules.map((item: any, index:number) => (
|
||||
{filteredModules.map((item: any, index:number) => (
|
||||
<div class="accordion-item">
|
||||
<div class="accordion-header" id={`headingCourse${index}`}>
|
||||
<a
|
||||
|
@ -16,10 +16,10 @@ const tier_one = getPrices('price_tier_one',import.meta.env.ASTRO_CURRENCY.toLow
|
||||
<figure class="figure">
|
||||
<Image
|
||||
class="card-img"
|
||||
src={`${import.meta.env.ASTRO_DIRECTUS_API}/assets/${course.image}`}
|
||||
alt="Image Description"
|
||||
width=-1
|
||||
height=-1
|
||||
src={`${import.meta.env.ASTRO_ASSETS}/${course.image}`}
|
||||
alt={`${course.name} Image Description`}
|
||||
width={325}
|
||||
height={455}
|
||||
/>
|
||||
</figure>
|
||||
</a>
|
||||
|
@ -19,12 +19,12 @@ const { course }: Props = Astro.props;
|
||||
<div class="d-flex align-items-center flex-wrap">
|
||||
<div class="d-flex align-items-center me-4">
|
||||
<div class="flex-shrink-0 avatar-group avatar-group-xs">
|
||||
{course?.image && (
|
||||
{course.user_created.avatar && (
|
||||
<figure class="avatar avatar-xs avatar-circle">
|
||||
<Image
|
||||
class="avatar-img"
|
||||
src={`${import.meta.env.ASTRO_DIRECTUS_API}/assets/${course.user_created.avatar}`}
|
||||
alt="Course Image"
|
||||
src={`${import.meta.env.ASTRO_ASSETS}/${course.user_created.avatar}`}
|
||||
alt={`${course.user_created.first_name} Avatar`}
|
||||
width={40}
|
||||
height={40}
|
||||
/>
|
||||
@ -42,12 +42,15 @@ const { course }: Props = Astro.props;
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex gap-2 mt-3">
|
||||
<p>-Faltan Carreras-</p>
|
||||
{course.carrers && course.carrers.map((carrer: any) => (
|
||||
<div class="btn btn-outline-success mb-1">{carrer}</div>
|
||||
))}
|
||||
<div class="mt-3">
|
||||
<h3>Incluido en Carreras:</h3>
|
||||
</div>
|
||||
<div class="d-flex gap-2 mt-3">
|
||||
{course.codyops_careers.map((career: any) => (
|
||||
<a class="btn btn-outline-success mb-1" href={`/carreras/${career.codyops_careers_id.slug}/`}>
|
||||
{career.codyops_careers_id.name}
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
|
@ -71,10 +71,10 @@ const getOverallRating = (reviews: any) => {
|
||||
<div class="flex-shrink-0">
|
||||
<Image
|
||||
class="avatar avatar-sm avatar-circle"
|
||||
src={`${import.meta.env.ASTRO_DIRECTUS_API}/assets/${review.user_created.avatar}`}
|
||||
alt="Image Description"
|
||||
width="50"
|
||||
height="50"
|
||||
src={`${import.meta.env.ASTRO_ASSETS}/${review.user_created.avatar}`}
|
||||
alt={`${review.user_created.avatar} Avatar`}
|
||||
width={50}
|
||||
height={50}
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
@ -2,11 +2,13 @@
|
||||
import { Image } from 'astro:assets';
|
||||
import Logo from '../../assets/svg/logo.svg';
|
||||
import { getAllCourses, filterCoursesByCloud } from '../../libs/courses';
|
||||
import { getCareers } from '../../libs/careers';
|
||||
import { slugifyCourse } from '../../utils/text';
|
||||
|
||||
const awsCourses = filterCoursesByCloud(getAllCourses(), ['aws']);
|
||||
const gcpCourses = filterCoursesByCloud(getAllCourses(), ['gcp']);
|
||||
const azrCourses = filterCoursesByCloud(getAllCourses(), ['azr']);
|
||||
const careers = await getCareers();
|
||||
---
|
||||
|
||||
<header id="header" class={`navbar navbar-expand-lg navbar-end navbar-sticky-top navbar-dark root`}>
|
||||
@ -49,30 +51,17 @@ const azrCourses = filterCoursesByCloud(getAllCourses(), ['azr']);
|
||||
aria-labelledby="dropdownSubMenu"
|
||||
style="min-width: 14rem"
|
||||
>
|
||||
{careers.map((career: any) => (
|
||||
<a
|
||||
class="dropdown-item text-white"
|
||||
id="devops_header"
|
||||
href=`/carreras/devops/`
|
||||
id={career.slug + '_header'}
|
||||
href={`/carreras/${career.slug}/`}
|
||||
role="button"
|
||||
aria-expanded="false"
|
||||
>DevOps Engineer
|
||||
</a>
|
||||
<a
|
||||
class="dropdown-item text-white"
|
||||
id="cloud_header"
|
||||
href=`/carreras/cloudops/`
|
||||
role="button"
|
||||
aria-expanded="false"
|
||||
>Cloud Engineer
|
||||
</a>
|
||||
<a
|
||||
class="dropdown-item text-white"
|
||||
id="aws_devops_header"
|
||||
href=`/carreras/aws-devops/`
|
||||
role="button"
|
||||
aria-expanded="false"
|
||||
>AWS DevOps
|
||||
>
|
||||
{career.name}
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
<div class="nav-indicator nav-indicator--blue"></div>
|
||||
</li>
|
||||
|
@ -11,8 +11,8 @@ const { post }: Props = Astro.props;
|
||||
<figure class="shape-container">
|
||||
<Image
|
||||
class="card-img img-fluid"
|
||||
src={`${import.meta.env.ASTRO_DIRECTUS_API}/assets/${post.cover_image}`}
|
||||
alt="Image placeholder"
|
||||
src={`${import.meta.env.ASTRO_ASSETS}/${post.cover_image}`}
|
||||
alt={`${post.title} Image`}
|
||||
inferSize={true}
|
||||
/>
|
||||
<div class="shape shape-bottom zi-1" style="margin-bottom: -0.25rem">
|
||||
@ -29,7 +29,7 @@ const { post }: Props = Astro.props;
|
||||
|
||||
<div class="card-body p-4">
|
||||
<h3 class="card-title">
|
||||
<a class="text-dark" href={`./${post.slug}/ `}>{post.title}</a>
|
||||
<a class="text-dark" href={`/blog/${post.slug}/ `}>{post.title}</a>
|
||||
</h3>
|
||||
|
||||
<p class="card-text">
|
||||
|
@ -12,8 +12,8 @@ const { post }: Props = Astro.props;
|
||||
<figure class="shape-container overflow-hidden" style="height: 100%">
|
||||
<Image
|
||||
class="card-img"
|
||||
src={`${import.meta.env.ASTRO_DIRECTUS_API}/assets/${post.cover_image}`}
|
||||
alt="Image placeholder"
|
||||
src={`${import.meta.env.ASTRO_ASSETS}/${post.cover_image}`}
|
||||
alt={`${post.title} Image`}
|
||||
style="height: 100%"
|
||||
inferSize={true}
|
||||
/>
|
||||
|
@ -1,276 +0,0 @@
|
||||
import { CourseLevel, PriceBox } from '../enums';
|
||||
import type { Accordion, CareerPrice } from '../types';
|
||||
|
||||
export const awsDevopsCareerPrices: CareerPrice[] = [
|
||||
{
|
||||
description: 'Ejemplo 1: Al contado con un 60% de descuento.',
|
||||
discount: true,
|
||||
prices: [
|
||||
{
|
||||
title: 'Precio regular',
|
||||
price: 'USD 300',
|
||||
type: PriceBox.DiscountPrice,
|
||||
nextSign: '-',
|
||||
},
|
||||
{
|
||||
title: 'Dscto. 60%',
|
||||
price: 'USD 180',
|
||||
nextSign: '=',
|
||||
},
|
||||
{
|
||||
title: 'Precio final',
|
||||
price: 'USD 120',
|
||||
type: PriceBox.FinalPrice,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
description: 'Ejemplo 2: En tres cuotas mensuales con 40% de descuento.',
|
||||
prices: [
|
||||
{
|
||||
title: 'Cuota 1 (mes 1)',
|
||||
price: 'USD 60',
|
||||
type: PriceBox.CuotePrice,
|
||||
nextSign: '+',
|
||||
},
|
||||
{
|
||||
title: 'Cuota 2 (mes 2)',
|
||||
price: 'USD 60',
|
||||
type: PriceBox.CuotePrice,
|
||||
nextSign: '+',
|
||||
},
|
||||
{
|
||||
title: 'Cuota 3 (mes 3)',
|
||||
price: 'USD 60',
|
||||
type: PriceBox.CuotePrice,
|
||||
nextSign: '+',
|
||||
},
|
||||
{
|
||||
title: 'Precio al finalizar el tercer mes',
|
||||
price: 'USD 180',
|
||||
type: PriceBox.FinalPrice,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
export const awsDevopsCareerProgram: Accordion[] = [
|
||||
{
|
||||
title: 'Security, Identity & Compliance',
|
||||
hours: '40 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Identity and Access Management (AWS IAM)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Certificate Manager',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Secrets Manager',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Key Management Service (AWS KMS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Computing & Networking',
|
||||
hours: '60 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Virtual Private Cloud ( AWS VPC)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Elastic Compute Cloud (AWS EC2)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Route 53',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon CloudFront',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Elastic Load Balancing',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon App Runner',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Serverless',
|
||||
hours: '50 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Simple Notification Service (AWS SNS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon API Gateway',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon EventBridge (Amazon CloudWatch Events)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Lambda',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Simple Queue Service (AWS SQS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Infrastructure & Orchestration',
|
||||
hours: '10 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon CloudFormation',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Monitoring & Alerting',
|
||||
hours: '20 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon CloudWatch',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon CloudTrail ',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Continuous Integration',
|
||||
hours: '50 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon CodeArtifact',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon CodeBuild',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon CodeDeploy',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon CodePipeline',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon CodeStar',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Collaboration & Management',
|
||||
hours: '10 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon CodeCommit',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Containers Orchestration',
|
||||
hours: '40 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Elastic Container Registry (AWS ECR)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Fargate',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Elastic Container Service (AWS ECS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Elastic Kubernetes Service (AWS EKS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Store',
|
||||
hours: '50 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Simple Storage Service (AWS S3)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Elastic Block Store (AWS EBS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Elastic File System (AWS EFS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Relational Database Service (AWS RDS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon DynamoDB',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
@ -1,309 +0,0 @@
|
||||
// eslint-disable-next-line import/extensions
|
||||
import { CourseLevel, PriceBox } from '../enums';
|
||||
import type { Accordion, CareerPrice } from '../types';
|
||||
|
||||
export const cloudopsCareerPrices: CareerPrice[] = [
|
||||
{
|
||||
description: 'Ejemplo 1: Al contado con un 60% de descuento.',
|
||||
discount: true,
|
||||
prices: [
|
||||
{
|
||||
title: 'Precio regular',
|
||||
price: 'USD 300',
|
||||
type: PriceBox.DiscountPrice,
|
||||
nextSign: '-',
|
||||
},
|
||||
{
|
||||
title: 'Dscto. 60%',
|
||||
price: 'USD 180',
|
||||
nextSign: '=',
|
||||
},
|
||||
{
|
||||
title: 'Precio final',
|
||||
price: 'USD 120',
|
||||
type: PriceBox.FinalPrice,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
description: 'Ejemplo 2: En tres cuotas mensuales con 40% de descuento.',
|
||||
prices: [
|
||||
{
|
||||
title: 'Cuota 1 (mes 1)',
|
||||
price: 'USD 60',
|
||||
type: PriceBox.CuotePrice,
|
||||
nextSign: '+',
|
||||
},
|
||||
{
|
||||
title: 'Cuota 2 (mes 2)',
|
||||
price: 'USD 60',
|
||||
type: PriceBox.CuotePrice,
|
||||
nextSign: '+',
|
||||
},
|
||||
{
|
||||
title: 'Cuota 3 (mes 3)',
|
||||
price: 'USD 60',
|
||||
type: PriceBox.CuotePrice,
|
||||
nextSign: '=',
|
||||
},
|
||||
{
|
||||
title: 'Precio al finalizar el tercer mes',
|
||||
price: 'USD 180',
|
||||
type: PriceBox.FinalPrice,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export const cloudopsCareerProgram: Accordion[] = [
|
||||
{
|
||||
title: 'Collaboration and Productivity',
|
||||
hours: '20 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Google Workspace I (Gmail - Classroom - Calendar - Drive)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Google Workspace II (Chat & Space - Meet - Docs - Sheets)',
|
||||
courseLevel: CourseLevel.Intermediate,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Development & Scripting',
|
||||
hours: '18 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Bourne Again SHell (Bash)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '8 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Bourne Again SHell (Bash)',
|
||||
courseLevel: CourseLevel.Intermediate,
|
||||
hours: '8 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Google Cloud Shell',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '2 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Infrastructure Orchestration',
|
||||
hours: '54 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Terraform',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Terragrunt ',
|
||||
courseLevel: CourseLevel.Intermediate,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Pulumi ',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '14 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Software Control Managment',
|
||||
hours: '14 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Git & GitHub',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '14 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Containers Orchestration',
|
||||
hours: '60 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Docker',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Kubernetes',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Elastic Container Registry (ECR)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Elastic Kubernetes Service (EKS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Continuous Integration',
|
||||
hours: '14 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'GitHub Actions',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '14 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Serverless',
|
||||
hours: '10 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Simple Notification Service (SNS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Deployment Automation',
|
||||
hours: '10 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Helm Charts',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Public Cloud Services',
|
||||
hours: '20 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Web Services',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Compute',
|
||||
hours: '10 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Elastic Compute Cloud (EC2)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Administration & Government',
|
||||
hours: '30 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon CloudWatch',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'AWS CloudFormation',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'AWS Systems Manager',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Security, Identity and Compliance',
|
||||
hours: '40 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'AWS Certificate Manager',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'AWS Identity and Access Management (IAM) ',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'AWS Key Management Service (KMS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'AWS Secrets Manager ',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Networking & Content Delivery',
|
||||
hours: '40 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Virtual Private Cloud (VPC)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'AWS Route53',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'AWS Elastic Load Balancing',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon CloudFront',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Storage',
|
||||
hours: '20 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Simple Storage Service (S3)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Amazon Elastic File System (EFS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Database',
|
||||
hours: '10 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Relational Database Service (RDS)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
@ -1,237 +0,0 @@
|
||||
import { CourseLevel, PriceBox } from '../enums';
|
||||
import type { Accordion, CareerPrice } from '../types';
|
||||
|
||||
export const devopsCareerPrices: CareerPrice[] = [
|
||||
{
|
||||
description: 'Ejemplo 1: Al contado con un 60% de descuento.',
|
||||
discount: true,
|
||||
prices: [
|
||||
{
|
||||
title: 'Precio regular',
|
||||
price: 'USD 180',
|
||||
type: PriceBox.DiscountPrice,
|
||||
nextSign: '-',
|
||||
},
|
||||
{
|
||||
title: 'Dscto. 60%',
|
||||
price: 'USD 108',
|
||||
nextSign: '=',
|
||||
},
|
||||
{
|
||||
title: 'Precio final',
|
||||
price: 'USD 72',
|
||||
type: PriceBox.FinalPrice,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
description: 'Ejemplo 2: En tres cuotas mensuales con 40% de descuento.',
|
||||
prices: [
|
||||
{
|
||||
title: 'Cuota 1 (mes 1)',
|
||||
price: 'USD 36',
|
||||
type: PriceBox.CuotePrice,
|
||||
nextSign: '+',
|
||||
},
|
||||
{
|
||||
title: 'Cuota 2 (mes 2)',
|
||||
price: 'USD 36',
|
||||
type: PriceBox.CuotePrice,
|
||||
nextSign: '+',
|
||||
},
|
||||
{
|
||||
title: 'Cuota 3 (mes 3)',
|
||||
price: 'USD 36',
|
||||
type: PriceBox.CuotePrice,
|
||||
nextSign: '=',
|
||||
},
|
||||
{
|
||||
title: 'Precio al finalizar el tercer mes',
|
||||
price: 'USD 108',
|
||||
type: PriceBox.FinalPrice,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
export const devopsCareerProgram: Accordion[] = [
|
||||
{
|
||||
title: 'Collaboration and Productivity',
|
||||
hours: '20 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Google Workspace I (Gmail - Classroom - Calendar - Drive)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Google Workspace II (Chat & Space - Meet - Docs - Sheets)',
|
||||
courseLevel: CourseLevel.Intermediate,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Development & Scripting',
|
||||
hours: '108 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Python 3',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '45 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Python 3',
|
||||
courseLevel: CourseLevel.Intermediate,
|
||||
hours: '45 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Bourne Again SHell (Bash)',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '8 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Bourne Again SHell (Bash)',
|
||||
courseLevel: CourseLevel.Intermediate,
|
||||
hours: '8 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Google Cloud Shell',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '2 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Infrastructure Orchestration',
|
||||
hours: '54 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Terraform',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Terragrunt ',
|
||||
courseLevel: CourseLevel.Intermediate,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Pulumi ',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '14 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Software Control Managment',
|
||||
hours: '20 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Git & GitHub',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '14 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Metodologias Ágiles',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '6 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Containers Orchestration',
|
||||
hours: '50 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Docker',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Kubernetes',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Minikube ',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Continuous Integration',
|
||||
hours: '28 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'GitHub Actions',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '14 Horas',
|
||||
},
|
||||
{
|
||||
title: 'GitLab CI',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '14 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'DataBases',
|
||||
hours: '10 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'MongoDB',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Deployment Automation',
|
||||
hours: '20 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Helm Charts',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Kustomize',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Public Cloud Services',
|
||||
hours: '20 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Amazon Web Services',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Monitoring & Alerting',
|
||||
hours: '50 Horas',
|
||||
children: [
|
||||
{
|
||||
title: 'Prometheus',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
{
|
||||
title: 'Gafana',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '20 Horas',
|
||||
},
|
||||
{
|
||||
title: 'AlertManager ',
|
||||
courseLevel: CourseLevel.Introduction,
|
||||
hours: '10 Horas',
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
@ -1,6 +1,3 @@
|
||||
export * from './aws-devops-career.ts';
|
||||
export * from './cloudops-career.ts';
|
||||
export * from './devops-career.ts';
|
||||
export * from './features.ts';
|
||||
export * from './icon-blocks.ts';
|
||||
export * from './testimonials.ts';
|
||||
|
76
src/libs/careers.ts
Normal file
76
src/libs/careers.ts
Normal file
@ -0,0 +1,76 @@
|
||||
import directus from './directus';
|
||||
import { readItems, type Query } from '@directus/sdk';
|
||||
import type { CodyopsCareers, Careers } from '../types/codyops-careers';
|
||||
import { sumTimes } from '../utils/time';
|
||||
|
||||
const isDev = import.meta.env.DEV; // Astro's way to check for development mode
|
||||
|
||||
export async function getCareers(): Promise<Careers[]> {
|
||||
const careers = await directus.request(
|
||||
readItems<CodyopsCareers, 'codyops_careers', Query<CodyopsCareers, Careers>>('codyops_careers', {
|
||||
fields: [
|
||||
'slug',
|
||||
'status',
|
||||
'name',
|
||||
'description',
|
||||
'banner',
|
||||
{
|
||||
courses: [
|
||||
{
|
||||
codyops_courses_id: [
|
||||
'name',
|
||||
'level',
|
||||
'category',
|
||||
{
|
||||
modules: [
|
||||
'duration'
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
filter: {
|
||||
status: isDev ? { '_neq': 'archived' } : { '_eq': 'published' }
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
const careersWithCalculatedHours = careers.map(career => {
|
||||
let totalCareerMinutes = 0;
|
||||
|
||||
const coursesWithCalculatedHours = career.courses.map(courseItem => {
|
||||
const course = courseItem.codyops_courses_id;
|
||||
if (course && course.modules) {
|
||||
const moduleDurations = course.modules
|
||||
.map(module => module.duration)
|
||||
.filter((duration): duration is string => duration !== undefined && duration !== null); // Filter out undefined/null
|
||||
const { hours, minutes } = sumTimes(moduleDurations);
|
||||
const totalCourseMinutes = (hours * 60) + minutes;
|
||||
totalCareerMinutes += totalCourseMinutes;
|
||||
return {
|
||||
...courseItem,
|
||||
codyops_courses_id: {
|
||||
...course,
|
||||
totalCourseHours: hours + (minutes / 60), // Store as decimal hours
|
||||
totalCourseMinutes: totalCourseMinutes,
|
||||
}
|
||||
};
|
||||
}
|
||||
return courseItem;
|
||||
});
|
||||
|
||||
const totalCareerHours = Math.floor(totalCareerMinutes / 60);
|
||||
const remainingCareerMinutes = totalCareerMinutes % 60;
|
||||
|
||||
return {
|
||||
...career,
|
||||
courses: coursesWithCalculatedHours,
|
||||
totalCareerHours: totalCareerHours + (remainingCareerMinutes / 60), // Store as decimal hours
|
||||
totalCareerMinutes: totalCareerMinutes,
|
||||
};
|
||||
});
|
||||
|
||||
return careersWithCalculatedHours;
|
||||
}
|
@ -1,13 +1,53 @@
|
||||
import directus from "./directus";
|
||||
import { readItems } from "@directus/sdk";
|
||||
import { readItems, type Query } from "@directus/sdk";
|
||||
import type { CodyopsCourses, Courses } from "../types/codyops-courses";
|
||||
|
||||
const isDev = import.meta.env.DEV; // Astro's way to check for development mode
|
||||
|
||||
export const courses = await directus.request(
|
||||
readItems("codyops_courses", {
|
||||
readItems<CodyopsCourses, 'codyops_courses', Query<CodyopsCourses, Courses>>("codyops_courses", {
|
||||
fields: [
|
||||
'*',
|
||||
'user_created.*',
|
||||
'modules.*'
|
||||
]}
|
||||
'id',
|
||||
'name',
|
||||
'level',
|
||||
'category',
|
||||
'cloud',
|
||||
'image',
|
||||
'description',
|
||||
'features',
|
||||
'status',
|
||||
{
|
||||
codyops_careers: [
|
||||
{
|
||||
codyops_careers_id: [
|
||||
'name',
|
||||
'slug'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
user_created: [
|
||||
'first_name',
|
||||
'last_name',
|
||||
'avatar',
|
||||
'url'
|
||||
]
|
||||
},
|
||||
{
|
||||
modules: [
|
||||
'duration',
|
||||
'title',
|
||||
'description',
|
||||
'video',
|
||||
'status'
|
||||
]
|
||||
}
|
||||
],
|
||||
filter: {
|
||||
status: isDev ? { '_neq': 'archived' } : { '_eq': 'published' }
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
@ -28,4 +68,3 @@ export function filterCoursesByCategory(courses: any, category: any) {
|
||||
export function filterCoursesByCloud(courses: any, clouds: string[]) {
|
||||
return courses.filter((course: any) => course.cloud?.includes(clouds));
|
||||
};
|
||||
|
||||
|
@ -30,12 +30,15 @@ type Course = {
|
||||
modules: [];
|
||||
}
|
||||
|
||||
import type { Careers } from '../types/codyops-careers';
|
||||
|
||||
type Schema = {
|
||||
codyops_posts: Post[];
|
||||
codyops_courses: Course[];
|
||||
codyops_campaigns: [];
|
||||
codyops_reviews: [];
|
||||
codyops_currencies: [];
|
||||
codyops_careers: Careers[];
|
||||
}
|
||||
|
||||
const directus = createDirectus<Schema>(import.meta.env.ASTRO_DIRECTUS_API)
|
||||
|
@ -1,11 +1,29 @@
|
||||
import directus from "./directus";
|
||||
import { readItems } from "@directus/sdk";
|
||||
import { readItems, type Query } from "@directus/sdk";
|
||||
import type { Post, DirectusSchema } from "../types/codyops-post";
|
||||
|
||||
const isDev = import.meta.env.DEV; // Astro's way to check for development mode
|
||||
|
||||
export const posts = await directus.request(
|
||||
readItems("codyops_posts", {
|
||||
fields: ['*']
|
||||
readItems<DirectusSchema, 'codyops_posts', Query<DirectusSchema, Post>>("codyops_posts", {
|
||||
fields: [
|
||||
'slug',
|
||||
'status',
|
||||
'sort',
|
||||
'user_created',
|
||||
'user_updated',
|
||||
'date_created',
|
||||
'date_updated',
|
||||
'title',
|
||||
'description',
|
||||
'tags',
|
||||
'cover_image',
|
||||
'content'
|
||||
],
|
||||
filter: {
|
||||
status: isDev ? { '_neq': 'archived' } : { '_eq': 'published' }
|
||||
}
|
||||
)
|
||||
})
|
||||
);
|
||||
|
||||
export function getAllPosts() {
|
||||
@ -21,4 +39,3 @@ export function getUniqueTags(posts: any ) {
|
||||
export function filterPostsByTag(posts: any, tag: any) {
|
||||
return posts.filter((post: any) => post.tags.includes(tag));
|
||||
};
|
||||
|
@ -1,9 +1,27 @@
|
||||
import directus from "./directus";
|
||||
import { readItems } from "@directus/sdk";
|
||||
import { readItems, type Query } from "@directus/sdk";
|
||||
import type { DirectusSchema, Review } from "../types/codyops-reviews";
|
||||
|
||||
const isDev = import.meta.env.DEV; // Astro's way to check for development mode
|
||||
|
||||
export const reviews = await directus.request(
|
||||
readItems("codyops_reviews", {
|
||||
fields: ['*', 'user_created.*']
|
||||
readItems<DirectusSchema, 'codyops_reviews', Query<DirectusSchema, Review>>("codyops_reviews", {
|
||||
fields: [
|
||||
'stars',
|
||||
'date_created',
|
||||
'course_id',
|
||||
'feedback',
|
||||
{
|
||||
user_created: [
|
||||
'first_name',
|
||||
'last_name',
|
||||
'avatar'
|
||||
]
|
||||
},
|
||||
],
|
||||
filter: {
|
||||
status: isDev ? { '_neq': 'archived' } : { '_eq': 'published' }
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
|
@ -26,8 +26,8 @@ const { post } = Astro.props;
|
||||
<h1 class="h2 text-white text-center">{post.title}</h1><br>
|
||||
<Image
|
||||
class="card-img"
|
||||
src={`${import.meta.env.ASTRO_DIRECTUS_API}/assets/${post.cover_image}`}
|
||||
alt="Image placeholder"
|
||||
src={`${import.meta.env.ASTRO_ASSETS}/${post.cover_image}`}
|
||||
alt={`${post.title} Image`}
|
||||
inferSize={true}
|
||||
/>
|
||||
<div class="container content-space-1">
|
||||
|
54
src/pages/carreras/[slug].astro
Normal file
54
src/pages/carreras/[slug].astro
Normal file
@ -0,0 +1,54 @@
|
||||
---
|
||||
import Root from '../../layouts/Root.astro';
|
||||
import Main from '../../layouts/Bundle.astro';
|
||||
import CareerProgram from '../../sections/global/career-program/career-program.astro';
|
||||
import CareerSection from '../../sections/global/career-section/career-section.astro';
|
||||
import Cta from '../../sections/global/cta/cta.astro';
|
||||
import { getCareers } from '../../libs/careers';
|
||||
import type { Careers } from '../../types/codyops-careers';
|
||||
import { Image } from 'astro:assets';
|
||||
|
||||
export async function getStaticPaths() {
|
||||
const careers = await getCareers();
|
||||
|
||||
return careers.map((career: Careers) => {
|
||||
return {
|
||||
params: { slug: career.slug },
|
||||
props: { career },
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
interface Props {
|
||||
career: Careers;
|
||||
}
|
||||
|
||||
const { career } = Astro.props;
|
||||
|
||||
// Dynamically import the description and features components based on the slug
|
||||
const DescriptionComponent = (await import(`../../sections/${career.slug}/${career.slug}-description.astro`)).default;
|
||||
const FeaturesComponent = (await import(`../../sections/${career.slug}/${career.slug}-features.astro`)).default;
|
||||
---
|
||||
|
||||
<Root
|
||||
title={`Carrera ${career.name}`}
|
||||
description={career.description}
|
||||
path={`/${career.slug}/`}>
|
||||
<Main className=''>
|
||||
<section id="featureSection" class="content-space-t-4">
|
||||
<div class="banner py-10 position-relative">
|
||||
<figure class="banner__background-container-image">
|
||||
<div class="overlay"></div>
|
||||
<Image src={`${import.meta.env.ASTRO_ASSETS}/${career.banner}`} alt={`${career.name} image`} width={1920} height={475} />
|
||||
</figure>
|
||||
<FeaturesComponent />
|
||||
</div>
|
||||
</section>
|
||||
<CareerSection>
|
||||
<DescriptionComponent />
|
||||
</CareerSection>
|
||||
<Cta />
|
||||
<CareerProgram career={career} />
|
||||
<Cta />
|
||||
</Main>
|
||||
</Root>
|
@ -1,35 +0,0 @@
|
||||
---
|
||||
import Root from '../../layouts/Root.astro';
|
||||
import Main from '../../layouts/Bundle.astro';
|
||||
import AwsdevopsImage from '../../assets/img/careers/awsdevops-banner-desktop.webp';
|
||||
import Banner from '../../components/banner/banner.astro';
|
||||
import { awsDevopsCareerProgram } from '../../data';
|
||||
import AwsCloudopsDescription from '../../sections/aws-devops/aws-devops-description.astro';
|
||||
import AwsDevopsFeatures from '../../sections/aws-devops/aws-devops-features.astro';
|
||||
import CareerProgram from '../../sections/global/career-program/career-program.astro';
|
||||
import CareerSection from '../../sections/global/career-section/career-section.astro';
|
||||
import Cta from '../../sections/global/cta/cta.astro';
|
||||
|
||||
const programLink:string = 'https://drive.google.com/file/d/12lYUSAcN0qI9R0_N63oPTimBKIYRKOh9/preview';
|
||||
---
|
||||
<Root
|
||||
title='Carrera AWS DevOps Engineer'
|
||||
description='Nuestra carrera AWS DevOps tiene exactamente lo que necesitas para salir rapidamente al mercado laboral. Incluye los cursos mas demandados y usados en toda empresa. Nuestro programa de estudio se realizo bajo un exhaustivo trabajo de investigacion con las principales empresas del mercado mundial.'
|
||||
path='/awsdevops/'>
|
||||
<Main className='' id='awsdevops'>
|
||||
<Banner
|
||||
as="section"
|
||||
id="featureSection"
|
||||
className="content-space-t-4"
|
||||
backgroundImage={AwsdevopsImage}
|
||||
backgroundAlt="AwsDevOps image">
|
||||
<AwsDevopsFeatures />
|
||||
</Banner>
|
||||
<CareerSection>
|
||||
<AwsCloudopsDescription />
|
||||
</CareerSection>
|
||||
<Cta />
|
||||
<CareerProgram href={programLink} list={awsDevopsCareerProgram} download="AWS Programa de carrera"/>
|
||||
<Cta />
|
||||
</Main>
|
||||
</Root>
|
@ -1,36 +0,0 @@
|
||||
---
|
||||
import Root from '../../layouts/Root.astro';
|
||||
import Main from '../../layouts/Bundle.astro';
|
||||
import CloudopsImage from '../../assets/img/careers/cloud-engineer-banner.webp';
|
||||
import Banner from '../../components/banner/banner.astro';
|
||||
import { cloudopsCareerProgram } from '../../data';
|
||||
import CloudopsDescription from '../../sections/cloudops/cloudops-description.astro';
|
||||
import CloudopsFeatures from '../../sections/cloudops/cloudops-features.astro';
|
||||
import CareerSection from '../../sections/global/career-section/career-section.astro';
|
||||
import CareerProgram from '../../sections/global/career-program/career-program.astro';
|
||||
import Cta from '../../sections/global/cta/cta.astro';
|
||||
|
||||
const programLink:string = 'https://drive.google.com/file/d/1IQVPvhikLos-xs8s3gJazN7Nj45ZSNYL/preview';
|
||||
---
|
||||
|
||||
<Root
|
||||
title='Carrera Cloud Engineer'
|
||||
description='Nuestra carrera CloudOps tiene exactamente lo que necesitas para salir rapidamente al mercado laboral. Incluye los cursos mas demandados y usados en toda empresa. Nuestro programa de estudio se realizo bajo un exhaustivo trabajo de investigacion con las principales empresas del mercado mundial.'
|
||||
path='/cloudops/'>
|
||||
<Main className="" id="cloudops">
|
||||
<Banner
|
||||
as="section"
|
||||
id="featureSection"
|
||||
className="content-space-t-4"
|
||||
backgroundImage={CloudopsImage}
|
||||
backgroundAlt="Cloudops image">
|
||||
<CloudopsFeatures />
|
||||
</Banner>
|
||||
<CareerSection>
|
||||
<CloudopsDescription />
|
||||
</CareerSection>
|
||||
<Cta />
|
||||
<CareerProgram href={programLink} list={cloudopsCareerProgram} />
|
||||
<Cta />
|
||||
</Main>
|
||||
</Root>
|
@ -1,36 +0,0 @@
|
||||
---
|
||||
import Root from '../../layouts/Root.astro';
|
||||
import Main from '../../layouts/Bundle.astro';
|
||||
import DevopsImage from '../../assets/img/careers/devops-banner-desktop.webp';
|
||||
import Banner from '../../components/banner/banner.astro';
|
||||
import { devopsCareerProgram } from '../../data';
|
||||
import DevopsDescription from '../../sections/devops/devops-description.astro';
|
||||
import DevopsFeatures from '../../sections/devops/devops-features.astro';
|
||||
import CareerProgram from '../../sections/global/career-program/career-program.astro';
|
||||
import CareerSection from '../../sections/global/career-section/career-section.astro';
|
||||
import Cta from '../../sections/global/cta/cta.astro';
|
||||
|
||||
const programLink:string = 'https://drive.google.com/file/d/1wz_TeKtrt_d8AHiySGDsYX1VVq48j_Ie/preview';
|
||||
---
|
||||
|
||||
<Root
|
||||
title='Carrera DevOps Engineer'
|
||||
description='Nuestra carrera DevOps tiene exactamente lo que necesitas para salir rapidamente al mercado laboral. Incluye los cursos mas demandados y usados en toda empresa. Nuestro programa de estudio se realizo bajo un exhaustivo trabajo de investigacion con las principales empresas del mercado mundial.'
|
||||
path='/devops/'>
|
||||
<Main className='' id='devops'>
|
||||
<Banner
|
||||
as="section"
|
||||
id="featureSection"
|
||||
className="content-space-t-4"
|
||||
backgroundImage={DevopsImage}
|
||||
backgroundAlt="DevOps Image">
|
||||
<DevopsFeatures />
|
||||
</Banner>
|
||||
<CareerSection>
|
||||
<DevopsDescription />
|
||||
</CareerSection>
|
||||
<Cta />
|
||||
<CareerProgram href={programLink} list={devopsCareerProgram} />
|
||||
<Cta />
|
||||
</Main>
|
||||
</Root>
|
@ -1,34 +1,54 @@
|
||||
---
|
||||
import { Accordion, CareerCourse } from '../../../types';
|
||||
import { toSnakeCase } from '../../../utils';
|
||||
import type { Courses } from '../../../types/codyops-courses';
|
||||
import type { Careers } from '../../../types/codyops-careers';
|
||||
import { toSnakeCase, fromSnakeCase } from '../../../utils';
|
||||
import { slugifyCourse } from '../../../utils/text';
|
||||
|
||||
type Props = {
|
||||
href: string;
|
||||
list?: Accordion[];
|
||||
download?: string;
|
||||
career: Careers;
|
||||
};
|
||||
|
||||
const { href, list, download }: Props = Astro.props;
|
||||
const { career }: Props = Astro.props;
|
||||
|
||||
// Group courses by category
|
||||
const groupedCourses = career.courses?.reduce((acc, courseItem) => {
|
||||
const course = courseItem.codyops_courses_id;
|
||||
if (course) {
|
||||
const category = course.category;
|
||||
if (!acc[category]) {
|
||||
acc[category] = { courses: [], totalCategoryMinutes: 0 };
|
||||
}
|
||||
acc[category].courses.push(course);
|
||||
if (course.totalCourseMinutes) {
|
||||
acc[category].totalCategoryMinutes += course.totalCourseMinutes;
|
||||
}
|
||||
}
|
||||
return acc;
|
||||
}, {} as Record<string, { courses: Courses[]; totalCategoryMinutes: number }>);
|
||||
|
||||
---
|
||||
|
||||
<section id="program" class="container content-space-t-3 career__section">
|
||||
<h2 class="career-subtitle text-white text-center mb-5">Programa de Carrera</h2>
|
||||
<div class="text-center text-white mb-4">
|
||||
Total Carrera: {career.totalCareerHours?.toFixed(1)} horas
|
||||
</div>
|
||||
<div class="accordion accordion-btn-icon-start">
|
||||
{list && list.map(({children, hours, title}: Accordion) => (
|
||||
{groupedCourses && Object.entries(groupedCourses).map(([category, { courses, totalCategoryMinutes }]) => (
|
||||
<div class="accordion-item">
|
||||
<div class="accordion-header" id="headingBasics1">
|
||||
<div class="accordion-header" id={`heading-${toSnakeCase(category)}`}>
|
||||
<a
|
||||
class="accordion-button collapsed"
|
||||
id="collab&produc_devopspage"
|
||||
id={`collab&produc_devopspage-${toSnakeCase(category)}`}
|
||||
role="button"
|
||||
data-bs-toggle="collapse"
|
||||
data-bs-target=`#${toSnakeCase(title)}`
|
||||
data-bs-target={`#${toSnakeCase(category)}`}
|
||||
aria-expanded="true"
|
||||
aria-controls={toSnakeCase(title)}
|
||||
aria-controls={toSnakeCase(category)}
|
||||
>
|
||||
<div class="flex-grow-1 ps-3">
|
||||
<div class="row">
|
||||
<div class="col-8 text-white">{title}</div>
|
||||
<div class="col-8 text-white">{fromSnakeCase(category)}</div>
|
||||
<!-- End Col -->
|
||||
|
||||
<div class="col-4 text-end">
|
||||
@ -37,7 +57,7 @@ const { href, list, download }: Props = Astro.props;
|
||||
<!-- End Col -->
|
||||
|
||||
<div class="col-lg-6">
|
||||
<span class="small text-muted fw-normal">{hours}</span>
|
||||
<span class="small text-white">{(totalCategoryMinutes / 60).toFixed(1)} hours</span>
|
||||
</div>
|
||||
<!-- End Col -->
|
||||
</div>
|
||||
@ -49,12 +69,12 @@ const { href, list, download }: Props = Astro.props;
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div id={toSnakeCase(title)} class="accordion-collapse collapse" aria-labelledby="headingBasics1">
|
||||
<div id={toSnakeCase(category)} class="accordion-collapse collapse" aria-labelledby={`heading-${toSnakeCase(category)}`}>
|
||||
<div class="accordion-body" style='margin-top: 1rem;'>
|
||||
<!-- List Group -->
|
||||
<div class="list-group list-group-flush list-group-no-gutters">
|
||||
{
|
||||
children && children.map(({courseLevel, hours, title}: CareerCourse)=>(
|
||||
courses.map((course: Courses)=>(
|
||||
<div class="list-group-item text-muted">
|
||||
<div class="row">
|
||||
<div class="col-8">
|
||||
@ -63,9 +83,9 @@ const { href, list, download }: Props = Astro.props;
|
||||
<i class="bi bi bi-arrow-right"></i>
|
||||
</div>
|
||||
<div class="flex-grow-1 ms-2">
|
||||
<span class="small text-white"
|
||||
>{title}
|
||||
<span class="badge bg-course text-dark rounded-pill ms-1">{courseLevel}</span></span
|
||||
<a href={`/cursos/${slugifyCourse(course.name+'-'+course.level)}/`} class="small text-white"
|
||||
>{course.name}
|
||||
<span class="badge bg-course text-dark rounded-pill ms-1">{course.level}</span></a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@ -78,7 +98,7 @@ const { href, list, download }: Props = Astro.props;
|
||||
<!-- End Col -->
|
||||
|
||||
<div class="col-lg-6">
|
||||
<span class="small">{hours}</span>
|
||||
<span class="small text-white">{course.totalCourseHours?.toFixed(1)} hours</span>
|
||||
</div>
|
||||
<!-- End Col -->
|
||||
</div>
|
||||
@ -97,15 +117,5 @@ const { href, list, download }: Props = Astro.props;
|
||||
</div>
|
||||
))}
|
||||
|
||||
<div class="container text-center mt-5">
|
||||
<a
|
||||
class="btn btn-primary btn-transition fw-bold"
|
||||
id="downloadprogram_devopspage"
|
||||
href={href}
|
||||
style="border-radius: 0.9rem"
|
||||
download={download}
|
||||
>Descargar Programa Completo
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
@ -1,4 +1,4 @@
|
||||
import type { CareerCourse } from '@/types/career.ts';
|
||||
import type { CareerCourse } from './career.ts';
|
||||
|
||||
type Position = 'left' | 'right';
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import type { CourseLevel, PriceBox } from '@/enums';
|
||||
import type { CourseLevel, PriceBox } from '../enums';
|
||||
|
||||
export type Career = {
|
||||
image: any;
|
||||
|
25
src/types/codyops-careers.ts
Normal file
25
src/types/codyops-careers.ts
Normal file
@ -0,0 +1,25 @@
|
||||
import type { Courses } from './codyops-courses';
|
||||
import type { Users } from './codyops-users';
|
||||
|
||||
export interface Careers {
|
||||
id: string;
|
||||
slug: string;
|
||||
status: string;
|
||||
sort: number | null;
|
||||
user_created: Users;
|
||||
user_updated: Users;
|
||||
date_created: string | null;
|
||||
date_updated: string | null;
|
||||
name: string;
|
||||
description: string;
|
||||
banner: string;
|
||||
courses: {
|
||||
codyops_courses_id: Courses;
|
||||
}[];
|
||||
totalCareerHours?: number;
|
||||
totalCareerMinutes?: number;
|
||||
}
|
||||
|
||||
export interface CodyopsCareers {
|
||||
codyops_careers: Careers;
|
||||
}
|
34
src/types/codyops-courses.ts
Normal file
34
src/types/codyops-courses.ts
Normal file
@ -0,0 +1,34 @@
|
||||
import type { Modules } from "./codyops-modules";
|
||||
import type { Careers } from "./codyops-careers";
|
||||
import type { Users } from "./codyops-users";
|
||||
|
||||
export interface Courses {
|
||||
id: string;
|
||||
status: string;
|
||||
sort: number | null;
|
||||
user_created?: Partial<Users>;
|
||||
user_updated: Users;
|
||||
date_created: string | null;
|
||||
date_updated: string | null;
|
||||
name: string;
|
||||
description: string;
|
||||
level: string;
|
||||
type: string;
|
||||
category: string;
|
||||
language: string;
|
||||
features: string;
|
||||
version: string;
|
||||
image: string;
|
||||
modules?: Partial<Modules>[];
|
||||
content: string;
|
||||
cloud: string;
|
||||
codyops_careers?: {
|
||||
codyops_careers_id?: Partial<Careers>;
|
||||
};
|
||||
totalCourseHours?: number;
|
||||
totalCourseMinutes?: number;
|
||||
}
|
||||
|
||||
export interface CodyopsCourses {
|
||||
codyops_courses: Courses[];
|
||||
}
|
15
src/types/codyops-modules.ts
Normal file
15
src/types/codyops-modules.ts
Normal file
@ -0,0 +1,15 @@
|
||||
export interface Modules {
|
||||
id: string;
|
||||
status: string;
|
||||
sort: number | null;
|
||||
user_created: string | null;
|
||||
user_updated: string | null;
|
||||
date_created: string | null;
|
||||
date_updated: string | null;
|
||||
title: string;
|
||||
description: string;
|
||||
video_theory: string;
|
||||
video_practice: string;
|
||||
duration: string;
|
||||
courses_id: string;
|
||||
}
|
18
src/types/codyops-post.ts
Normal file
18
src/types/codyops-post.ts
Normal file
@ -0,0 +1,18 @@
|
||||
export interface Post {
|
||||
slug: string;
|
||||
status: string;
|
||||
sort: number | null;
|
||||
user_created: string | null;
|
||||
user_updated: string | null;
|
||||
date_created: string | null;
|
||||
date_updated: string | null;
|
||||
title: string;
|
||||
description: string;
|
||||
tags: string[];
|
||||
cover_image: string | null;
|
||||
content: string;
|
||||
}
|
||||
|
||||
export interface DirectusSchema {
|
||||
codyops_posts: Post[];
|
||||
}
|
17
src/types/codyops-reviews.ts
Normal file
17
src/types/codyops-reviews.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import type { Users } from "./codyops-users";
|
||||
|
||||
export interface Review {
|
||||
slug: string;
|
||||
status: string;
|
||||
user_created?: Partial<Users>;
|
||||
user_updated: string | null;
|
||||
date_created: string | null;
|
||||
date_updated: string | null;
|
||||
stars: number;
|
||||
course_id: number;
|
||||
feedback: string;
|
||||
}
|
||||
|
||||
export interface DirectusSchema {
|
||||
codyops_reviews: Review[];
|
||||
}
|
6
src/types/codyops-users.ts
Normal file
6
src/types/codyops-users.ts
Normal file
@ -0,0 +1,6 @@
|
||||
export interface Users {
|
||||
first_name: string;
|
||||
last_name: string;
|
||||
avatar: string;
|
||||
url: string;
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import type { Accordion } from '@/types/accordion.ts';
|
||||
import type { Accordion } from './accordion.ts';
|
||||
|
||||
export type Course = {
|
||||
title: string;
|
||||
|
@ -1,28 +1,26 @@
|
||||
import type { CollectionEntry } from 'astro:content';
|
||||
import type { Courses } from '../types/codyops-courses';
|
||||
|
||||
export const getUniqueCategories = (
|
||||
courses: Array<CollectionEntry<'courses'>>
|
||||
courses: Courses[]
|
||||
) => {
|
||||
const coursesEntries = courses.flatMap(
|
||||
// @ts-ignore
|
||||
// eslint-disable-next-line no-unsafe-optional-chaining
|
||||
(course: CollectionEntry<'courses'>) => [...course?.data?.categories]
|
||||
(course: Courses) => [...course.category]
|
||||
);
|
||||
return [...new Set(coursesEntries)];
|
||||
};
|
||||
|
||||
export const getUniqueLevels = (courses: CollectionEntry<'courses'>[]) => {
|
||||
export const getUniqueLevels = (courses: Courses[]) => {
|
||||
const coursesEntries = courses.map(
|
||||
(course: CollectionEntry<'courses'>) => course.data.level
|
||||
(course: Courses) => course.level
|
||||
);
|
||||
return [...new Set(coursesEntries)];
|
||||
};
|
||||
|
||||
export const sortCoursesByDate = (posts: CollectionEntry<'courses'>[]) =>
|
||||
posts
|
||||
.filter(({ data }) => !data?.draft)
|
||||
export const sortCoursesByDate = (courses: Courses[]) =>
|
||||
courses
|
||||
.filter((course) => course.status !== 'draft') // Assuming 'draft' status is used instead of a 'draft' property
|
||||
.sort(
|
||||
(a, b) =>
|
||||
Math.floor(new Date(b?.data?.date).getTime() / 1000) -
|
||||
Math.floor(new Date(a?.data?.date).getTime() / 1000)
|
||||
Math.floor(new Date(b.date_created || '').getTime() / 1000) -
|
||||
Math.floor(new Date(a.date_created || '').getTime() / 1000)
|
||||
);
|
||||
|
@ -1,3 +1,3 @@
|
||||
export const fromSnakeCase = (text: any) => {
|
||||
return text.replace(/-/g, ' ').replace(/\b\w/g, (word) => word.toUpperCase());
|
||||
export const fromSnakeCase = (text: string) => {
|
||||
return text.replace(/-/g, ' ').replace(/\b\w/g, (word: string) => word.toUpperCase());
|
||||
};
|
||||
|
@ -1,23 +1,35 @@
|
||||
function parseTime(time) {
|
||||
const [hours, minutes, milliseconds] = time.split(':').map(Number);
|
||||
interface TimeParts {
|
||||
hours: number;
|
||||
minutes: number;
|
||||
milliseconds: number;
|
||||
}
|
||||
|
||||
interface TimeResult {
|
||||
hours: number;
|
||||
minutes: number;
|
||||
}
|
||||
|
||||
function parseTime(time: string | null | undefined): TimeParts {
|
||||
const safeTime = time || '0:0:0'; // Provide a default string if time is null/undefined/empty
|
||||
const [hours, minutes, milliseconds] = safeTime.split(':').map(Number);
|
||||
return { hours, minutes, milliseconds };
|
||||
}
|
||||
|
||||
function timeToMilliseconds({ hours, minutes, milliseconds }) {
|
||||
function timeToMilliseconds({ hours, minutes, milliseconds }: TimeParts): number {
|
||||
return (hours * 60 * 60 * 1000) + (minutes * 60 * 1000) + milliseconds;
|
||||
}
|
||||
|
||||
function millisecondsToTime(ms) {
|
||||
function millisecondsToTime(ms: number): TimeResult {
|
||||
const totalMinutes = Math.floor(ms / (60 * 1000));
|
||||
const hours = Math.floor(totalMinutes / 60);
|
||||
const minutes = totalMinutes % 60;
|
||||
return { hours, minutes };
|
||||
}
|
||||
|
||||
export function sumTimes(times) {
|
||||
export function sumTimes(times: string[]): TimeResult {
|
||||
const totalMilliseconds = times
|
||||
.map(parseTime)
|
||||
.map(timeToMilliseconds)
|
||||
.reduce((acc, ms) => acc + ms, 0);
|
||||
.reduce((acc: number, ms: number) => acc + ms, 0);
|
||||
return millisecondsToTime(totalMilliseconds);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user