From 2a2e306d75d98f06e0e9af91ca3d7e13098bda3a Mon Sep 17 00:00:00 2001 From: fpasquet Date: Tue, 29 Oct 2024 10:03:24 +0100 Subject: [PATCH] fix: validate markdown on CI (#1162) --- .github/workflows/checks-and-tests.yml | 2 +- ...s-how-to-combine-delegates-and-closures.md | 2 +- .../fr/2024-01-10-typage-generique-en-php.md | 1 + ...e-comment-utiliser-ce-composant-symfony.md | 1 + ...tre-environnement-de-travail-sous-linux.md | 2 +- .../2024-04-03-retour-sur-la-flowcon-2024.md | 1 + .../fr/2024-05-20-crossplane-kubernetes.md | 54 +++++++++---------- .../2024-08-22-css-anchor-positioning-api.md | 1 - _articles/fr/2024-10-08-paris-web-2024.md | 3 +- ...10-22-applications-mobiles-quels-enjeux.md | 1 - ...2024-10-23-retour-sur-le-forum-php-2024.md | 11 ++-- bin/binHelper.ts | 15 ------ bin/validateMarkdown.ts | 5 +- .../PostDataSchemaValidation.ts | 6 +-- src/helpers/markdownContentManagerHelper.ts | 18 +------ src/hooks/usePostPage.tsx | 2 +- src/types/PageData.ts | 2 +- 17 files changed, 47 insertions(+), 80 deletions(-) delete mode 100644 bin/binHelper.ts diff --git a/.github/workflows/checks-and-tests.yml b/.github/workflows/checks-and-tests.yml index 2714ce211..82bddf8bd 100644 --- a/.github/workflows/checks-and-tests.yml +++ b/.github/workflows/checks-and-tests.yml @@ -14,7 +14,7 @@ jobs: - name: Validate markdown authors and posts id: validate_markdown - run: npm run validate-markdown --ci + run: CI=true npm run validate-markdown - name: Add a comment to the PR after failed markdown validation uses: marocchino/sticky-pull-request-comment@v2 diff --git a/_articles/en/2019-07-09-ios-how-to-combine-delegates-and-closures.md b/_articles/en/2019-07-09-ios-how-to-combine-delegates-and-closures.md index c0143c99d..f54be6577 100644 --- a/_articles/en/2019-07-09-ios-how-to-combine-delegates-and-closures.md +++ b/_articles/en/2019-07-09-ios-how-to-combine-delegates-and-closures.md @@ -158,7 +158,7 @@ Let's take a look on what we just coded. Here is the Swift code for the most excited ones -##### Swift +#### Swift ```Swift protocol RequesterDelegateSwift { diff --git a/_articles/fr/2024-01-10-typage-generique-en-php.md b/_articles/fr/2024-01-10-typage-generique-en-php.md index 2b2128c8a..037d0d30b 100644 --- a/_articles/fr/2024-01-10-typage-generique-en-php.md +++ b/_articles/fr/2024-01-10-typage-generique-en-php.md @@ -6,6 +6,7 @@ slug: typage-generique-php title: "Typage générique en PHP : définition, conseils et exemples" excerpt: "Découvrez comment réaliser du typage générique en PHP : introduction et définition du concept, conseils et explications pas-à-pas de cas pratique." cover: + alt: Typage générique en PHP path: /imgs/articles/2024-01-10-typage-generique-en-php/cover.jpg categories: - php diff --git a/_articles/fr/2024-01-17-expressionlanguage-comment-utiliser-ce-composant-symfony.md b/_articles/fr/2024-01-17-expressionlanguage-comment-utiliser-ce-composant-symfony.md index 1cf9b0329..31e003462 100644 --- a/_articles/fr/2024-01-17-expressionlanguage-comment-utiliser-ce-composant-symfony.md +++ b/_articles/fr/2024-01-17-expressionlanguage-comment-utiliser-ce-composant-symfony.md @@ -7,6 +7,7 @@ title: 'Symfony ExpressionLanguage : Comment utiliser ce composant ?' excerpt: >- Le composant Symfony ExpressionLanguage : qu'est-ce que c'est ? Quand et comment l'utiliser ? Comment créer des expressions lors de cas plus complexes ? cover: + alt: Symfony ExpressionLanguage path: /imgs/articles/2024-01-17-expressionlanguage-comment-utiliser-ce-composant-symfony/cover.jpg categories: - php diff --git a/_articles/fr/2024-02-19-quelques-conseils-pour-optimiser-votre-environnement-de-travail-sous-linux.md b/_articles/fr/2024-02-19-quelques-conseils-pour-optimiser-votre-environnement-de-travail-sous-linux.md index 94b692ea0..d2bd496e3 100644 --- a/_articles/fr/2024-02-19-quelques-conseils-pour-optimiser-votre-environnement-de-travail-sous-linux.md +++ b/_articles/fr/2024-02-19-quelques-conseils-pour-optimiser-votre-environnement-de-travail-sous-linux.md @@ -6,8 +6,8 @@ slug: environnement-travail-linux title: 'Quelques conseils pour optimiser votre environnement de travail sous Linux' excerpt: >- Travailler efficacement sous Linux va bien au-delà des simples commandes du terminal. Dans cet article, découvrez quelques conseils pour optimiser votre environnement de travail et améliorer votre expérience utilisateur. -categories: [] cover: + alt: Optimiser votre environnement de travail sous Linux path: /imgs/articles/2024-02-19-quelques-conseils-pour-optimiser-votre-environnement-de-travail-sous-linux/cover.jpg position: top authors: diff --git a/_articles/fr/2024-04-03-retour-sur-la-flowcon-2024.md b/_articles/fr/2024-04-03-retour-sur-la-flowcon-2024.md index 2c6a9b4d4..4db61e928 100644 --- a/_articles/fr/2024-04-03-retour-sur-la-flowcon-2024.md +++ b/_articles/fr/2024-04-03-retour-sur-la-flowcon-2024.md @@ -7,6 +7,7 @@ title: 'Retour sur la Flowcon 2024' excerpt: >- Trois astronautes reviennent sur la Flowcon, la conférence sur le développement de logiciel en flux, qui a eu lieu les 6 et 7 Mars 2024 cover: + alt: Flowcon 2024 path: /imgs/articles/2024-04-03-retour-sur-la-flowcon-2024/cover.jpg categories: - agile diff --git a/_articles/fr/2024-05-20-crossplane-kubernetes.md b/_articles/fr/2024-05-20-crossplane-kubernetes.md index c042d91e3..ccd022d6d 100644 --- a/_articles/fr/2024-05-20-crossplane-kubernetes.md +++ b/_articles/fr/2024-05-20-crossplane-kubernetes.md @@ -11,6 +11,7 @@ seo: description: >- Découvrez ce qu'est crossplane et apprenez grâce à notre mode d'emploi à le configurer et à l'utiliser étapes par étapes dans votre projet. cover: + alt: Crossplane Kubernetes path: /imgs/articles/2024-05-20-crossplane-kubernetes/cover.jpg categories: - architecture @@ -31,7 +32,7 @@ Si on schématise grossièrement, Crossplane reprend le but initial de Terraform Ce projet open-source lancé par la société Upbound a rejoint la Cloud Native Computing Foundation (CNCF) en 2020 et est aujourd'hui au niveau de maturité _incubating_ depuis septembre 2021. J'ai découvert ce projet lors de la KubeCon de Paris 2024 et il m'a semblé intéressant d'en présenter les principaux concepts pour bien cerner l'étendu de ses capacités. ## Platform engineering kézako ? 🤔 -> En quelques mots, c'est une approche visant à améliorer l'expérience développeur par la mise en place d'une plateforme de service permettant de demander de manière abstraite des ressources d'infrastructure. La complexité est alors gérée par les administrateurs de la plateforme et invisible pour les utilisateurs. +> En quelques mots, c'est une approche visant à améliorer l'expérience développeur par la mise en place d'une plateforme de service permettant de demander de manière abstraite des ressources d'infrastructure. La complexité est alors gérée par les administrateurs de la plateforme et invisible pour les utilisateurs. Appliqué à notre cas, cette plateforme sera alors notre cluster Kubernetes sur lequel nous pourrons demander de l'infrastructure abstraite (e.g. "Un environnement de développement sur AWS") que Crossplane se chargera de mettre en place. @@ -147,9 +148,9 @@ spec: url: type: Static static: http://host.docker.internal:4566 - # Indique pour quels services on remplace l'endpoint par l'URL ci-dessus. + # Indique pour quels services on remplace l'endpoint par l'URL ci-dessus. # Attention, si la liste est vide, aucun service ne verra son URL changer. - services: [s3, rds] + services: [s3, rds] skip_credentials_validation: true skip_metadata_api_check: true skip_requesting_account_id: true @@ -167,7 +168,7 @@ metadata: name: my-rds-instance spec: deletionPolicy: Delete - providerConfigRef: + providerConfigRef: name: provider-family-aws forProvider: engine: postgres @@ -222,7 +223,7 @@ LAST SEEN TYPE REASON OBJECT MESSAGE type: LastAsyncOperation -❯ aws --endpoint-url=http://localhost:4566 s3api list-buckets +❯ aws --endpoint-url=http://localhost:4566 s3api list-buckets { "Buckets": [ { @@ -280,7 +281,7 @@ versioning: mfaDelete: false ``` -Sur le cloud, certaines ressources externes ont des attributs immuables. Par exemple, AWS ne permet pas de modifier le nom d'un bucket S3. Terraform triche un peu avec ça en autorisant la modification des champs immuables mais en proposant alors de recréer ces ressources (i.e. supprimer le bucket et le recréer avec le nouveau nom.) Crossplane, ne dispose pas de ce type de mécanisme et on ne pourra pas modifier les champs immuables. Pour faire l'équivalent, on devra supprimer et recréer nous-même l'objet en question. Le nom de la ressource externe est alors le même que celui de la ressource managée par défaut. +Sur le cloud, certaines ressources externes ont des attributs immuables. Par exemple, AWS ne permet pas de modifier le nom d'un bucket S3. Terraform triche un peu avec ça en autorisant la modification des champs immuables mais en proposant alors de recréer ces ressources (i.e. supprimer le bucket et le recréer avec le nouveau nom.) Crossplane, ne dispose pas de ce type de mécanisme et on ne pourra pas modifier les champs immuables. Pour faire l'équivalent, on devra supprimer et recréer nous-même l'objet en question. Le nom de la ressource externe est alors le même que celui de la ressource managée par défaut. ### Policies @@ -297,8 +298,6 @@ Crossplane permet de configurer comment le provider se comporte quand une ressou Les `managementPolicies` permettent de limiter les droits de Crossplane sur les ressources externes. On les spécifie dans le tableau `spec.managementPolicies` de nos ressources managées. Voici les différentes valeurs (cumulables) possibles : -
- | Policy | Fonctionnement | |---------------- |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | * | (Defaut) Crossplane a tous les droits sur la ressource externe. | @@ -308,9 +307,8 @@ Les `managementPolicies` permettent de limiter les droits de Crossplane sur les | Observe | Crossplane est autorisé à observer les ressources externes. Utile pour importer des ressources externes déjà existante sous forme de ressources managées. | | Update | Crossplane est autorisé à appliquer des changements sur les ressources externes quand des changements sont appliqués sur les ressources managées. | -
-On récapitule différentes combinaisons intéressantes : +On récapitule différentes combinaisons intéressantes : | Create | Delete | LateInitialize | Observe | Update | Description | |:------: |:------: |:--------------: |:-------: |:------: |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | @@ -336,7 +334,7 @@ Nous savons désormais créer des ressources unitaires et paramétrer des droits ### Créer une première abstraction -Attention, là, ça commence à se gâter. Certains termes sont assez proches et on a vite fait de les confondre. +Attention, là, ça commence à se gâter. Certains termes sont assez proches et on a vite fait de les confondre. Pour mettre en place une abstraction, nous allons devoir combiner différents concepts qu'on synthétise dans le schéma ci-dessous. Détaillons chaque élément, en commençant par les compositions. ![Logo Crossplane]({BASE_URL}/imgs/articles/2024-05-20-crossplane-kubernetes/schema_crossplane_end_users.svg) @@ -367,7 +365,7 @@ spec: - name: SubnetGroup base: apiVersion: rds.aws.upbound.io/v1beta1 - kind: SubnetGroup + kind: SubnetGroup spec: forProvider: region: eu-west-3 @@ -398,7 +396,7 @@ spec: - name: IamRole base: apiVersion: iam.aws.upbound.io/v1beta1 - kind: Role + kind: Role spec: forProvider: assumeRolePolicy: | @@ -427,7 +425,7 @@ Pour cela, nous allons créer un objet `CompositeResourceDefinition` similaire ```yaml apiVersion: apiextensions.crossplane.io/v1 kind: CompositeResourceDefinition -metadata: +metadata: name: xrds.custom.api.exemple.org spec: group: custom.api.exemple.org @@ -466,7 +464,7 @@ apiVersion: custom.api.exemple.org/v1alpha1 kind: XRDS metadata: name: my-composite-database - annotations: + annotations: crossplane.io/external-name: my-custom-name spec: type: large @@ -479,7 +477,7 @@ Par définition, les ressources composites (et les ressources managées associé ```yaml apiVersion: apiextensions.crossplane.io/v1 kind: CompositeResourceDefinition -metadata: +metadata: name: xrds.custom.api.exemple.org spec: group: custom.api.exemple.org @@ -575,7 +573,7 @@ spec: - name: SubnetGroup base: apiVersion: rds.aws.upbound.io/v1beta1 - kind: SubnetGroup + kind: SubnetGroup metadata: name: my-subnet-group spec: @@ -623,13 +621,13 @@ La liste ci-dessous ne concerne que les patches de ressources individuelles (res | CombineFromEnvironment | Plusieurs champs issus de l'environnement d'une EnvironmentConfig | Un champ d'une ressource managée patchée. | | CombineToEnvironment | Plusieurs champs d'une ressource managée patchée. | Un champ dans l'environnement d'une EnvironmentConfig | -N.B. : Les sources et destinations de ce tableau ne s'appliquent pas forcément pour les patches de ressource composite via les EnvironmentConfigs (qui seront détaillés dans la section appropriée) +N.B. : Les sources et destinations de ce tableau ne s'appliquent pas forcément pour les patches de ressource composite via les EnvironmentConfigs (qui seront détaillés dans la section appropriée)
#### Nommage dynamique de ressources externes -Les ressources managées issues de Claim/ressources composites héritent d'un nommage en `-`. On peut changer ce comportement en rajoutant l'annotation `crossplane.io/external-name` aux ressources de notre composition. Avec l'aide des patches, on va pouvoir faire du nommage dynamique si on le souhaite. - +Les ressources managées issues de Claim/ressources composites héritent d'un nommage en `-`. On peut changer ce comportement en rajoutant l'annotation `crossplane.io/external-name` aux ressources de notre composition. Avec l'aide des patches, on va pouvoir faire du nommage dynamique si on le souhaite. + Reprenons notre premier exemple de composition. On va récupérer le type d'instance déclaré dans notre Claim/ressource composite et le passer à la ressource managée correspondante dans la composition. Aussi, nous injecterons le type d'instance dans le nom de cette ressource : ```yaml @@ -702,8 +700,8 @@ spec: patches: # On référence un PatchSet - type: PatchSet - patchSetName: my-patchset - # On défini un pattern pour le nom de l'instance RDS qui contient un préfixe statique suivi du type de l'instance. + patchSetName: my-patchset + # On défini un pattern pour le nom de l'instance RDS qui contient un préfixe statique suivi du type de l'instance. # Le type d'instance et récupéré depuis le champ spec.type de notre Claim - type: FromCompositeFieldPath fromFieldPath: spec.type @@ -736,7 +734,7 @@ kind: EnvironmentConfig metadata: name: stagging data: - env: + env: name: stag rds: instanceType: large @@ -784,7 +782,7 @@ spec: # etc. ``` -Une composition peut référencer plusieurs objets `EnvironmentConfig`. Au cours de la création/d'une mise à jour de ressource composite, les différentes `EnvironmentConfig` seront alors fusionnées pendant la création du magasin de donnée. On pourra ensuite lire ces données et les manipuler à travers les patches. On pourra par exemple récupérer une valeur du magasin pour rajouter un préfixe au nom de notre ressource composite et ainsi modifier le pattern de toutes les ressources managées sous-jacente. +Une composition peut référencer plusieurs objets `EnvironmentConfig`. Au cours de la création/d'une mise à jour de ressource composite, les différentes `EnvironmentConfig` seront alors fusionnées pendant la création du magasin de donnée. On pourra ensuite lire ces données et les manipuler à travers les patches. On pourra par exemple récupérer une valeur du magasin pour rajouter un préfixe au nom de notre ressource composite et ainsi modifier le pattern de toutes les ressources managées sous-jacente. ```yaml apiVersion: apiextensions.crossplane.io/v1 @@ -800,7 +798,7 @@ spec: - type: Reference ref: name: stagging - # On récupère le nom de l'environnement dans l'objet `EnvironmentConfig` et on l'injecte dans le nom de notre ressource composite + # On récupère le nom de l'environnement dans l'objet `EnvironmentConfig` et on l'injecte dans le nom de notre ressource composite patches: - type: ToCompositeFieldPath fromFieldPath: env.name @@ -821,7 +819,7 @@ spec: # etc. ``` -Pour les patches déclarés dans `spec.environment.patches`, `ToCompositeFieldPath` copiera la donnée depuis le magasin vers la ressource composite et +Pour les patches déclarés dans `spec.environment.patches`, `ToCompositeFieldPath` copiera la donnée depuis le magasin vers la ressource composite et `FromCompositeFieldPath` copiera la donnée depuis la ressource composite vers le magasin. ### Functions @@ -837,7 +835,7 @@ spec: package: xpkg.upbound.io/crossplane-contrib/function-patch-and-transform:v0.5.0 ``` -Les fonctions s'utilisent dans des compositions séquentielles (`mode: Pipeline`) dans lesquelles on référencera les fonctions dans les différentes _steps_. Quand la composition contient plusieurs steps, elles sont exécutées dans leur ordre d'apparition dans la composition. La sortie d'une step est passée en entrée de la step suivante. +Les fonctions s'utilisent dans des compositions séquentielles (`mode: Pipeline`) dans lesquelles on référencera les fonctions dans les différentes _steps_. Quand la composition contient plusieurs steps, elles sont exécutées dans leur ordre d'apparition dans la composition. La sortie d'une step est passée en entrée de la step suivante. Reprenons notre exemple initial en utilisant la **fonction** patch au lieu des patches du module core. @@ -855,7 +853,7 @@ spec: - step: patch-and-transform # On référence notre fonction ici functionRef: - name: function-patch-and-transform + name: function-patch-and-transform input: apiVersion: pt.fn.crossplane.io/v1beta1 kind: Resources diff --git a/_articles/fr/2024-08-22-css-anchor-positioning-api.md b/_articles/fr/2024-08-22-css-anchor-positioning-api.md index 1de52682a..5b9a854c3 100644 --- a/_articles/fr/2024-08-22-css-anchor-positioning-api.md +++ b/_articles/fr/2024-08-22-css-anchor-positioning-api.md @@ -14,7 +14,6 @@ cover: path: /imgs/articles/2024-08-22-css-anchor-positioning-api/cover.jpg keywords: - css -- javascript --- ## L'anchor positioning API, qu'est-ce que c'est ? diff --git a/_articles/fr/2024-10-08-paris-web-2024.md b/_articles/fr/2024-10-08-paris-web-2024.md index 92d19f514..0196f8d36 100644 --- a/_articles/fr/2024-10-08-paris-web-2024.md +++ b/_articles/fr/2024-10-08-paris-web-2024.md @@ -7,13 +7,12 @@ title: >- Paris Web 2024 : retour d'expérience sur l'événement autour du web accessible et de qualité excerpt: >- La 19ème édition de Paris Web a eu lieu du 26 au 28 septembre 2024 ! Qu'est-ce que c'est ? Un événement composé de deux jours de conférences et une journée d'ateliers sur les thématiques de l'accessibilité et de la qualité du web. -categories: [] authors: - seinhorn - afauquet cover: + alt: Paris Web 2024 path: /imgs/articles/2024-10-08-paris-web-2024/cover.jpg -keywords: [] --- La 19ème édition de Paris Web a eu lieu du 26 au 28 septembre 2024 ! Qu'est-ce que c'est ? Un événement composé de deux jours de conférences et une journée d'ateliers sur les thématiques de l'accessibilité et de la qualité du web. Il s'adresse aux développeurs et développeuses, mais aussi aux designers, experts et expertes accessibilité et performance, chef et cheffe de projet... c'est pour tous les métiers du web. On ne pouvait pas manquer ça ! diff --git a/_articles/fr/2024-10-22-applications-mobiles-quels-enjeux.md b/_articles/fr/2024-10-22-applications-mobiles-quels-enjeux.md index 862b15fb0..9e023a8ee 100644 --- a/_articles/fr/2024-10-22-applications-mobiles-quels-enjeux.md +++ b/_articles/fr/2024-10-22-applications-mobiles-quels-enjeux.md @@ -6,7 +6,6 @@ slug: applications-mobiles-quels-enjeux title: Développement d'une application mobile, quels éléments analyser avant de se lancer ? excerpt: >- Que vous souhaitiez lancer un nouveau produit mobile ou que vous souhaitiez proposer la version mobile d'une application web existante, voici quelques éléments à prendre en compte dans votre réflexion pour décider de sa plu-value business. -categories: [] cover: alt: Astronaute qui consulte son téléphone sur la lune path: /imgs/articles/2024-10-22-applications-mobiles-quels-enjeux/cover.jpg diff --git a/_articles/fr/2024-10-23-retour-sur-le-forum-php-2024.md b/_articles/fr/2024-10-23-retour-sur-le-forum-php-2024.md index 5360fc09f..665824945 100644 --- a/_articles/fr/2024-10-23-retour-sur-le-forum-php-2024.md +++ b/_articles/fr/2024-10-23-retour-sur-le-forum-php-2024.md @@ -13,9 +13,8 @@ cover: alt: Astronaute revenant de mission path: /imgs/articles/2024-10-23-retour-sur-le-forum-php-2024/cover.jpg keywords: -- php -- symfony -- développement web + - symfony + - développement web --- Les 10 & 11 octobre a eu lieu le mythique Forum PHP 2024 organisé par l'[AFUP](https://afup.org/home), qui a élu domicile depuis quelques années maintenant à Disneyland Paris (dans le très classe Hôtel New York). @@ -38,7 +37,7 @@ Je suis allé à cette première conférence en pensant naïvement qu'on allait Mais c'est mal connaître [Pascal Martin](https://x.com/pascal_martin), qui à chaque fois fait mouche lors de ses talks grâce à son grand talent de speaker, et son story-telling léché. Pascal est parti d'une question qu'il adore poser en entretien technique : **"Quel est le chemin d'une requête HTTP ?"** et s'est rendu compte que les réponses étaient très différentes selon les profils. -Et pour autant, il n'y a pas qu'une seule bonne réponse, bien qu'il existe un début de réponse classique et très cartésien : +Et pour autant, il n'y a pas qu'une seule bonne réponse, bien qu'il existe un début de réponse classique et très cartésien : >Ma requête interroge un serveur ***DNS*** pour la résolution de mon URL en adresse IP, cette résolution va se transmettre de serveur en serveur jusqu'à atterrir au niveau du serveur que je vise, etc... @@ -80,7 +79,7 @@ En résumé -## Conférence n°2 : Et si on repensait les ORMs ? +## Conférence n°2 : Et si on repensait les ORMs ? Pour la deuxième conférence de la journée, il est temps de rejoindre [Baptiste Langlade](https://x.com/Baptouuuu) pour sa présentation sur l'[ORM Formal](https://formal-php.org/orm/). @@ -181,7 +180,7 @@ Encore une fois pour l'optimisation de la mémoire, les données retournées par À noter que l'on peut également utiliser des méthodes chaînées pour configurer les résultats. Ici, on souhaite éliminer les **1000** premiers résultats, puis récupérer les **100** suivants. -Il est possible d'aller plus loin avec le *specification pattern* comme par exemple : +Il est possible d'aller plus loin avec le *specification pattern* comme par exemple : ```php use Formal\ORM\Specification\Entity; diff --git a/bin/binHelper.ts b/bin/binHelper.ts deleted file mode 100644 index 908d11103..000000000 --- a/bin/binHelper.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const getArgs = (): TArgs => { - const args = process.argv.slice(2); - const formattedArgs: { [key: string]: boolean | string | number } = {}; - - for (let i = 0; i < args.length; i++) { - const arg = args[i]; - - if (arg.startsWith('--')) { - const [key, value] = arg.substring(2).split('='); - formattedArgs[key] = value ? value : true; - } - } - - return formattedArgs as TArgs; -}; diff --git a/bin/validateMarkdown.ts b/bin/validateMarkdown.ts index e97b15a86..6e3eab3f1 100644 --- a/bin/validateMarkdown.ts +++ b/bin/validateMarkdown.ts @@ -1,14 +1,13 @@ import { MarkdownInvalidError, validateMarkdown } from '@/helpers/markdownHelper'; -import { getArgs } from './binHelper'; +const IS_CI = Boolean(process.env.CI); (async (): Promise => { - const args = getArgs<{ ci: boolean }>(); try { validateMarkdown(); } catch (e) { const markdownInvalidError = e as MarkdownInvalidError; - if (args.ci) { + if (IS_CI) { console.log(`::set-output name=filePath::${markdownInvalidError.markdownFilePathRelative}`); console.log(`::set-output name=reason::${markdownInvalidError.reason}`); if (markdownInvalidError.line && markdownInvalidError.column) { diff --git a/src/config/schemaValidation/PostDataSchemaValidation.ts b/src/config/schemaValidation/PostDataSchemaValidation.ts index e7440c9e7..8254a681c 100644 --- a/src/config/schemaValidation/PostDataSchemaValidation.ts +++ b/src/config/schemaValidation/PostDataSchemaValidation.ts @@ -18,10 +18,10 @@ export const PostDataSchemaValidation = z.object({ .object({ path: z.string(), position: z.nativeEnum(IMAGE_POSITIONS).optional(), - alt: z.string(), + alt: z.string().optional(), }) .optional(), - categories: z.array(z.enum(CATEGORIES)), + categories: z.array(z.enum(CATEGORIES)).optional(), authors: z.array(z.string()), keywords: z .array(z.string()) @@ -44,7 +44,7 @@ export const PostDataSchemaValidation = z.object({ .optional(), seo: z .object({ - title: z.string().max(60).optional(), + title: z.string().max(62).optional(), description: z.string().max(155).optional(), }) .optional(), diff --git a/src/helpers/markdownContentManagerHelper.ts b/src/helpers/markdownContentManagerHelper.ts index 4b4eb7a82..af78000dd 100644 --- a/src/helpers/markdownContentManagerHelper.ts +++ b/src/helpers/markdownContentManagerHelper.ts @@ -121,17 +121,10 @@ export const getArticles = (): TransformedArticleData[] => getCollection(MARKDOWN_CONTENT_TYPES.ARTICLE).reduce( (currentArticles, { data, content, html }) => { currentArticles.push({ - contentType: data.contentType, - lang: data.lang, - slug: data.slug, - cover: data.cover, + ...data, date: new Date(data.date).toISOString(), - title: data.title, - excerpt: data.excerpt, summary: extractHeaders(content), readingTime: getReadingTime(content), - authors: data.authors, - categories: data.categories, content: html, }); return currentArticles; @@ -159,16 +152,9 @@ export const getTutorials = (): TransformedTutorialData[] => { return currentSteps; }, []); currentTutorials.push({ - contentType: data.contentType, - lang: data.lang, - slug: data.slug, - cover: data.cover, + ...data, date: new Date(data.date).toISOString(), - title: data.title, - excerpt: data.excerpt, readingTime: steps.reduce((currentReadingTime, step) => currentReadingTime + getReadingTime(step.content), 0), - authors: data.authors, - categories: data.categories, steps, }); return currentTutorials; diff --git a/src/hooks/usePostPage.tsx b/src/hooks/usePostPage.tsx index 06b31e0e2..1193a12a2 100644 --- a/src/hooks/usePostPage.tsx +++ b/src/hooks/usePostPage.tsx @@ -21,7 +21,7 @@ export const usePostPage = (post: PostPageData): Omit