Skip to content

Commit 2e4c4d7

Browse files
authored
feat: ✨ use twoslash for code blocks (#13)
1 parent dba7b41 commit 2e4c4d7

File tree

15 files changed

+2023
-948
lines changed

15 files changed

+2023
-948
lines changed

docs/.vitepress/config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1+
import { transformerTwoslash } from '@shikijs/vitepress-twoslash'
12
import { defineConfig } from 'vitepress'
23

34
// https://vitepress.dev/reference/site-config
45
export default defineConfig({
6+
markdown: {
7+
codeTransformers: [
8+
transformerTwoslash()
9+
]
10+
},
511
title: "Projets JS/TS",
612
description: "Conventions de la Fabrique Numérique",
713
themeConfig: {

docs/.vitepress/theme/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
// https://vitepress.dev/guide/custom-theme
2+
import type { EnhanceAppContext } from 'vitepress'
3+
24
import { h } from 'vue'
35
import Theme from 'vitepress/theme'
46
import './style.css'
57

8+
import TwoSlashFloatingVue from '@shikijs/vitepress-twoslash/client'
9+
import '@shikijs/vitepress-twoslash/style.css'
10+
611
export default {
712
...Theme,
813
outlineTitle: 'Sur cette page',
@@ -11,7 +16,7 @@ export default {
1116
// https://vitepress.dev/guide/extending-default-theme#layout-slots
1217
})
1318
},
14-
enhanceApp({ app, router, siteData }) {
15-
// ...
19+
enhanceApp({ app, router, siteData }: EnhanceAppContext) {
20+
app.use(TwoSlashFloatingVue)
1621
}
1722
}

docs/api-examples.md

Lines changed: 0 additions & 49 deletions
This file was deleted.

docs/client/toaster.md

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,30 @@
22

33
## Le composable `useToaster`
44

5-
```typescript
5+
```ts twoslash
6+
const reactive = <T>(val: T): T => val
7+
// ---cut---
68
// use-toaster.ts
7-
import { reactive } from 'vue'
8-
9-
const alphanumBase = 'abcdefghijklmnopqrstuvwyz0123456789'
10-
11-
const alphanum = alphanumBase.repeat(10)
12-
13-
const getRandomAlphaNum = () => {
14-
const randomIndex = Math.floor(Math.random() * alphanum.length)
15-
return alphanum[randomIndex]
16-
}
17-
18-
const getRandomHtmlId = (prefix = '', suffix = '') => {
19-
return (prefix ? prefix + '-' : '') + getRandomString(5) + (suffix ? '-' + suffix : '')
20-
}
21-
const getRandomString = (length: number) => {
22-
return Array.from({ length })
23-
.map(getRandomAlphaNum).join('')
24-
}
9+
import { getRandomId, type TitleTag } from '@gouvminint/vue-dsfr'
2510

2611
export type Message = {
2712
id?: string;
2813
title?: string;
2914
description: string;
3015
type: 'info' | 'success' | 'warning' | 'error';
3116
closeable: boolean;
32-
titleTag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
17+
titleTag: TitleTag;
3318
timeout?: number;
3419
style?: Record<string, string>;
3520
class?: string | Record<string, string> | Array<string | Record<string, string>>;
3621
}
3722

3823
const timeouts: Record<string, number> = {}
39-
const messages: Message[] = reactive([])
24+
const messages: Message[] = reactive<Message[]>([])
4025

4126
const useToaster = () => {
4227

43-
function removeMessage (id: string) {
28+
const removeMessage = (id: string): void => {
4429
const index = messages.findIndex(message => message.id === id)
4530
clearTimeout(timeouts[id])
4631
if (index === -1) {
@@ -49,8 +34,8 @@ const useToaster = () => {
4934
messages.splice(index, 1)
5035
}
5136

52-
function addMessage (message: Message) {
53-
message.id ??= getRandomHtmlId('toaster')
37+
const addMessage = (message: Message): void => {
38+
message.id ??= getRandomId('toaster')
5439
messages.push({ ...message, description: `${message.description} (${message.timeout})` })
5540
timeouts[message.id] = window.setTimeout(() => removeMessage(message.id as string), message.timeout)
5641
}
@@ -202,7 +187,7 @@ setTimeout(() => toaster.addMessage({ // Ajout d’un troisième message...
202187
v-model="searchQuery"
203188
:service-title="serviceTitle"
204189
:service-description="serviceDescription"
205-
:logo-text="logoText"****
190+
:logo-text="logoText"
206191
:quick-links="quickLinks"
207192
show-search
208193
/>
@@ -216,6 +201,4 @@ setTimeout(() => toaster.addMessage({ // Ajout d’un troisième message...
216201
@close-message="toaster.removeMessage($event)"
217202
/>
218203
</template>
219-
220-
221204
```

docs/client/vue3.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@ Le projet généré contient tout ce qu’il faut pour commencer à travailler
2424
- une application d’exemple avec un en-tête
2525
- un router minimal avec deux routes intégré à l’application
2626
- un store minimal intégré à l’application
27+
- les plugins [unplugin-auto-import](https://github.com/unplugin/unplugin-auto-import) et [unplugin-vue-components](https://github.com/unplugin/unplugin-vue-components)
2728

2829
## Ce qu’on peut rajouter
2930

30-
- [prettier](https://prettier.io/)
31-
- [auto-imports](https://github.com/antfu/unplugin-auto-import) (sera peut-être fait dans une prochaine version de `create-vue-dsfr`)
3231
- [date-fns](https://date-fns.org/) si le projet manipule et/ou affiche des dates

docs/conventions/api.rest

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
@protocol = http
2+
@host = localhost
3+
@port = 3000
4+
@apiPrefix = /api/v1
5+
@baseUrl = {{protocol}}://{{host}}:{{port}}{{apiPrefix}}
6+
7+
###
8+
9+
{{baseUrl}}/version
10+
11+
12+
###
13+
# @name login
14+
POST {{baseUrl}}/auth/token HTTP/1.1
15+
Content-Type: application/json
16+
17+
{
18+
"email": "[email protected]",
19+
"password": "53CR37P455!"
20+
}
21+
22+
###
23+
POST {{baseUrl}}/docs HTTP/1.1
24+
Content-Type: application/json
25+
Authorization: Bearer {{login.response.body.token}}
26+
27+
{
28+
"title": "Conventions",
29+
"description": "Ensemble des conventions (fortement) recommandées pour les projets de la Fabrique Numérique",
30+
"tags": ["conventions", "javascript", "typescript"],
31+
"content": "Lorem ipsum dolor sit amet, consectetur"
32+
}
33+
34+
###
35+
PATCH {{baseUrl}}/docs/1 HTTP/1.1
36+
Content-Type: application/json
37+
Authorization: Bearer {{login.response.body.token}}
38+
39+
{
40+
"tags": ["conventions", "javascript", "typescript", "dossiers"],
41+
}
42+
43+
###
44+
DELETE {{baseUrl}}/docs/1 HTTP/1.1
45+
Authorization: Bearer {{login.response.body.token}}

docs/conventions/lint-formattage.md

Lines changed: 6 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ insert_final_newline = true
2626

2727
Le code doit être *lint*é et formaté. Le minimum est ESLint avec [standard](https://standardjs.com/) et les seules règles à modifier par rapport à standard sont les suivantes :
2828

29-
- [comma-dangle](https://eslint.org/docs/latest/rules/comma-dangle)
30-
- [no-irregular-whitespace](https://eslint.org/docs/latest/rules/no-irregular-whitespace)
29+
- [comma-dangle](https://eslint.org/docs/latest/rules/comma-dangle) : `['error', 'always-multiline']`
30+
- [no-irregular-whitespace](https://eslint.org/docs/latest/rules/no-irregular-whitespace) : `'warning'`
3131

3232
```javascript
3333
rules: {
@@ -37,101 +37,14 @@ rules: {
3737
}
3838
```
3939

40-
Pour NestJS, il faut aussi rajouter ces règles pour les injections de dépendances :
40+
Pour NestJS, il faut aussi désactiver la règle `no-unused-vars` pour les **injections de dépendances**, autrement dit surcharger les valeurs pour ces 2 règles :
4141

4242
```javascript
4343
rules: {
4444
'no-unused-vars': 'off',
45-
'@typescript-eslint/no-unused-vars': 'off',
45+
'@typescript-eslint/no-unused-vars': 'off', // Si vous n’utilisez pas @antfu/eslint-config
46+
// 'ts/no-unused-vars': 'off', // Si vous utilisez @antfu/eslint-config
4647
}
4748
```
4849

49-
Un fichier de configuration ESLint pour NestJS :
50-
51-
```javascript
52-
/* eslint-env node */
53-
require('@rushstack/eslint-patch/modern-module-resolution')
54-
55-
module.exports = {
56-
parser: '@typescript-eslint/parser',
57-
plugins: [
58-
'prettier', //
59-
],
60-
extends: [
61-
'eslint:recommended', //
62-
'plugin:vue/vue3-recommended',
63-
'@vue/eslint-config-typescript/recommended',
64-
'standard',
65-
],
66-
root: true,
67-
env: {
68-
node: true,
69-
jest: true,
70-
'vue/setup-compiler-macros': true,
71-
},
72-
ignorePatterns: ['.eslintrc.js'],
73-
rules: {
74-
'@typescript-eslint/interface-name-prefix': 'off', //
75-
'@typescript-eslint/explicit-function-return-type': 'off',
76-
'@typescript-eslint/explicit-module-boundary-types': 'off',
77-
'comma-dangle': ['error', 'always-multiline'],
78-
},
79-
overrides: [
80-
{
81-
files: ['cypress/support/*.{js,ts,jsx,tsx}', 'cypress/integration/*.{spec,e2e}.{js,ts,jsx,tsx}', 'src/**/*.ct.{js,ts,jsx,tsx}'],
82-
extends: ['plugin:cypress/recommended'],
83-
},
84-
{
85-
files: ['src/**/*.{spec,test}.{js,ts,jsx,tsx}'],
86-
env: {
87-
jest: true,
88-
},
89-
},
90-
],
91-
}
92-
```
93-
94-
## Optionnellement [Prettier](https://prettier.io/)
95-
96-
Si prettier (>3.0.0) est utilisé en plus d’ESLint, il doit l’être avec la version ces options :
97-
98-
```json
99-
{
100-
"singleQuote": true,
101-
"semi": false,
102-
"singleAttributePerLine": true
103-
}
104-
```
105-
106-
et ESLint doit être utilisé avec [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier),
107-
et il faut ajouter cette ligne à la configuration eslint :
108-
109-
```diff
110-
extends: [
111-
'eslint:recommended', //
112-
'plugin:vue/vue3-recommended',
113-
'@vue/eslint-config-typescript/recommended',
114-
'standard',
115-
+ 'plugin:prettier/recommended',
116-
],
117-
```
118-
119-
### Les scripts de lint et de formattage
120-
121-
Les scripts de formattage et de fix doivent être séparés :
122-
123-
```json
124-
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\"",
125-
"format": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
126-
```
127-
128-
Si prettier est utilisé :
129-
130-
```json
131-
"format": "run-s prettify lint:fix",
132-
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\"",
133-
"lint:fix": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
134-
"prettify": "prettier --write \"{src,apps,libs,test}/**/*.ts\"",
135-
```
136-
137-
`run-s` est issu du package npm [`npm-run-all`](https://github.com/mysticatea/npm-run-all) et signifie « exécution en série », `npm-run-all` a aussi `run-p` qui permet d’exécuter des scripts en parallèle.
50+
Plus de [détails ici](../outils/eslint.md).

docs/conventions/test-api.rest

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{{baseUrl}}
2+
###
3+
4+
POST {{baseUrl}} HTTP/1.1
5+
Content-Type: application/json
6+
7+
{
8+
"email": "{{adminUser}}",
9+
"password": "{{adminPassword}}"
10+
}

docs/conventions/typescript.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@ enum HttpMethod {
2727
}
2828
```
2929

30-
Au lieu d’utiliser les namespaces, il faut utiliser les modules. Cf. Cette réponse sur [SO](https://stackoverflow.com/questions/56059351/tslint-namespace-and-module-are-disallowed#56061134), par exemple.
30+
Au lieu d’utiliser les namespaces, il faut utiliser les modules. Cf. cette réponse sur [StackOverflow](https://stackoverflow.com/questions/56059351/tslint-namespace-and-module-are-disallowed#56061134), par exemple.

0 commit comments

Comments
 (0)