@echoppe/content 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +31 -0
- package/README.md +80 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +72 -0
- package/dist/cli.js.map +1 -0
- package/dist/define.d.ts +13 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +32 -0
- package/dist/define.js.map +1 -0
- package/dist/field.d.ts +40 -0
- package/dist/field.d.ts.map +1 -0
- package/dist/field.js +50 -0
- package/dist/field.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/link.d.ts +20 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +15 -0
- package/dist/link.js.map +1 -0
- package/dist/narrow.d.ts +13 -0
- package/dist/narrow.d.ts.map +1 -0
- package/dist/narrow.js +18 -0
- package/dist/narrow.js.map +1 -0
- package/dist/serialize.d.ts +3 -0
- package/dist/serialize.d.ts.map +1 -0
- package/dist/serialize.js +101 -0
- package/dist/serialize.js.map +1 -0
- package/dist/sync.d.ts +20 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +64 -0
- package/dist/sync.js.map +1 -0
- package/dist/types.d.ts +172 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Licence CeCILL v2.1
|
|
2
|
+
|
|
3
|
+
Ce logiciel est régi par la Licence CeCILL version 2.1 soumise au droit français et compatible avec la licence GNU GPL. Vous pouvez utiliser, modifier et redistribuer ce logiciel selon les termes de cette licence.
|
|
4
|
+
|
|
5
|
+
Le texte complet de la licence est disponible ici : [CeCILL v2.1 (français)](https://cecill.info/licences/Licence_CeCILL_V2.1-fr.html)
|
|
6
|
+
|
|
7
|
+
## Résumé des droits et obligations
|
|
8
|
+
|
|
9
|
+
- **Utilisation** : vous pouvez utiliser ce logiciel pour tout usage, privé ou commercial.
|
|
10
|
+
- **Modification** : vous pouvez modifier le logiciel et redistribuer vos modifications.
|
|
11
|
+
- **Redistribution** : toute redistribution du logiciel original ou modifié doit se faire sous la même licence CeCILL v2.1.
|
|
12
|
+
- **Garantie** : ce logiciel est fourni "tel quel", sans garantie d'aucune sorte.
|
|
13
|
+
|
|
14
|
+
Pour plus de détails, consultez le texte complet de la licence via le lien ci-dessus.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# CeCILL v2.1 License – Échoppe
|
|
19
|
+
|
|
20
|
+
This software, Échoppe, is governed by the CeCILL Version 2.1 License, under French law and compatible with the GNU GPL. You may use, modify, and redistribute this software under the terms of this license.
|
|
21
|
+
|
|
22
|
+
The full license text is available here: [CeCILL v2.1 (English)](https://cecill.info/licences/Licence_CeCILL_V2.1-en.html)
|
|
23
|
+
|
|
24
|
+
## Summary of Rights and Obligations
|
|
25
|
+
|
|
26
|
+
- **Use**: You may use this software for any private or professional purpose.
|
|
27
|
+
- **Modification**: You may modify the software and redistribute your modifications.
|
|
28
|
+
- **Redistribution**: Any redistribution of the original or modified software must be under the same CeCILL v2.1 license.
|
|
29
|
+
- **Warranty**: This software is provided "as is", without any warranty of any kind.
|
|
30
|
+
|
|
31
|
+
For full details, please refer to the complete license text via the link above.
|
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# @echoppe/content
|
|
2
|
+
|
|
3
|
+
Déclaration de contenu **config-as-code** pour [Échoppe](https://github.com/Axiome-Apps/echoppe).
|
|
4
|
+
Le développeur décrit ses **sections** de page et ses **components** réutilisables en TypeScript ;
|
|
5
|
+
la CLI sérialise ces définitions vers l'API (registre) et génère les types du front.
|
|
6
|
+
|
|
7
|
+
C'est un outil **build/dev-time** : il s'installe en `devDependency` et ne fait aucun appel runtime.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pnpm add -D @echoppe/content
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Concepts
|
|
16
|
+
|
|
17
|
+
Trois verbes, trois niveaux :
|
|
18
|
+
|
|
19
|
+
- **`defineComponent`** — un atom/molecule : un groupe de champs nommé et **réutilisable**
|
|
20
|
+
(`button`, `card`…). Non insérable seul dans une page ; s'imbrique dans d'autres définitions.
|
|
21
|
+
- **`defineSection`** — un **bloc de page** : ce que l'éditeur ajoute dans une page et que le
|
|
22
|
+
front fetch puis boucle (`hero`, `cardGroup`…).
|
|
23
|
+
- **`defineContent`** — la racine, le **seul** point que lit la CLI. On y liste les sections ;
|
|
24
|
+
les components sont **collectés automatiquement** en suivant les références.
|
|
25
|
+
|
|
26
|
+
## Exemple
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { defineComponent, defineSection, defineContent, field as f, link } from '@echoppe/content';
|
|
30
|
+
|
|
31
|
+
const card = defineComponent('card', {
|
|
32
|
+
label: 'Carte',
|
|
33
|
+
fields: {
|
|
34
|
+
title: f.text({ required: true, maxLength: 80 }),
|
|
35
|
+
body: f.richText(), // Markdown
|
|
36
|
+
image: f.image(),
|
|
37
|
+
cta: link, // component livré : { label, href, newTab }
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const hero = defineSection('hero', {
|
|
42
|
+
label: 'Héros',
|
|
43
|
+
fields: {
|
|
44
|
+
title: f.text({ required: true }),
|
|
45
|
+
variant: f.enum({ options: ['clair', 'sombre'] }),
|
|
46
|
+
cta: link,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const cardGroup = defineSection('cardGroup', {
|
|
51
|
+
label: 'Groupe de cartes',
|
|
52
|
+
fields: {
|
|
53
|
+
heading: f.text(),
|
|
54
|
+
cards: f.list(card), // répète un component nommé
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
export default defineContent({ sections: [hero, cardGroup] });
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Champs (`field`, alias `f`)
|
|
62
|
+
|
|
63
|
+
**Primitifs** — `text`, `richText` (stocké en Markdown), `number` (`{ integer }`),
|
|
64
|
+
`boolean`, `date` (stocké en ISO 8601, `{ time }`), `enum` (`{ options, multiple }`).
|
|
65
|
+
|
|
66
|
+
**Fonctionnels** :
|
|
67
|
+
|
|
68
|
+
- `image()` — un média (UUID), résolu au read.
|
|
69
|
+
- `ref({ to })` — une référence catalogue (`product` | `collection` | `category`),
|
|
70
|
+
résolue au read en projection d'entité.
|
|
71
|
+
- `list(component)` — répète un **component nommé** (by-reference).
|
|
72
|
+
- `repeater({ fields })` — répète un **groupe inline anonyme**, imbricable à la main
|
|
73
|
+
(`repeater` dans `repeater` = menus à sous-niveaux).
|
|
74
|
+
|
|
75
|
+
Options communes : `label`, `hint`, `required`, `default`, plus des contraintes par type
|
|
76
|
+
(`minLength`/`maxLength`, `min`/`max`, `placeholder`, `format`).
|
|
77
|
+
|
|
78
|
+
## Licence
|
|
79
|
+
|
|
80
|
+
CeCILL-2.1
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Entrée CLI de `@echoppe/content`. Exécutée par un runtime qui gère le TS — Bun, ou `tsx` à la
|
|
2
|
+
// volée (`npx tsx` / `pnpm dlx tsx`), cf. les scripts `content:push` / `content:check` scaffoldés
|
|
3
|
+
// par create-echoppe. Elle N'EST PAS un `bin` node (un shim node ne saurait importer le `.ts` de
|
|
4
|
+
// config du dev).
|
|
5
|
+
//
|
|
6
|
+
// ECHOPPE_API_KEY=eck_… PUBLIC_API_URL=http://localhost:7532 <runtime> cli.js push
|
|
7
|
+
// ECHOPPE_API_KEY=eck_… PUBLIC_API_URL=http://localhost:7532 <runtime> cli.js check
|
|
8
|
+
import { resolve } from 'node:path';
|
|
9
|
+
import { pathToFileURL } from 'node:url';
|
|
10
|
+
import { checkRegistry, pushRegistry } from './sync.js';
|
|
11
|
+
// Charge le point d'entrée de contenu du dev (défaut : src/content/index.ts). Le runtime TS
|
|
12
|
+
// (Bun/tsx) résout et transpile ce `.ts` — d'où l'absence de loader embarqué.
|
|
13
|
+
async function loadContent() {
|
|
14
|
+
const configPath = resolve(process.cwd(), process.env.ECHOPPE_CONTENT_CONFIG ?? 'src/content/index.ts');
|
|
15
|
+
const mod = await import(pathToFileURL(configPath).href);
|
|
16
|
+
const content = mod.default;
|
|
17
|
+
if (content?.kind !== 'content' || !Array.isArray(content.sections)) {
|
|
18
|
+
throw new Error(`${configPath} doit exporter par défaut un defineContent(...).`);
|
|
19
|
+
}
|
|
20
|
+
return content;
|
|
21
|
+
}
|
|
22
|
+
function fail(message) {
|
|
23
|
+
console.error(`✗ ${message}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
function readEnv() {
|
|
27
|
+
const apiUrl = process.env.PUBLIC_API_URL ?? process.env.API_URL;
|
|
28
|
+
const apiKey = process.env.ECHOPPE_API_KEY;
|
|
29
|
+
if (!apiUrl)
|
|
30
|
+
fail('PUBLIC_API_URL (ou API_URL) manquant dans l’environnement.');
|
|
31
|
+
if (!apiKey)
|
|
32
|
+
fail('ECHOPPE_API_KEY manquant dans l’environnement.');
|
|
33
|
+
return { apiUrl, apiKey };
|
|
34
|
+
}
|
|
35
|
+
// `push` : sérialise + pousse le registre (remplace-tout). Scope requis : write:content.
|
|
36
|
+
async function runPush() {
|
|
37
|
+
const { apiUrl, apiKey } = readEnv();
|
|
38
|
+
const content = await loadContent();
|
|
39
|
+
const result = await pushRegistry(content, { apiUrl, apiKey });
|
|
40
|
+
if (result.ok) {
|
|
41
|
+
console.log('✓ Registre de contenu synchronisé.');
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}
|
|
44
|
+
fail(`Échec de la synchronisation (${result.status})${result.message ? ` : ${result.message}` : ''}`);
|
|
45
|
+
}
|
|
46
|
+
// `check` : compare le registre local au déployé, SANS écrire. Garde-fou anti-dérive (CI, pre-build).
|
|
47
|
+
// Sort en 1 si divergent → oubli de `content:push`. Scope requis : read:content.
|
|
48
|
+
async function runCheck() {
|
|
49
|
+
const { apiUrl, apiKey } = readEnv();
|
|
50
|
+
const content = await loadContent();
|
|
51
|
+
const result = await checkRegistry(content, { apiUrl, apiKey });
|
|
52
|
+
if (!result.ok) {
|
|
53
|
+
fail(`Échec de la vérification (${result.status})${result.message ? ` : ${result.message}` : ''}`);
|
|
54
|
+
}
|
|
55
|
+
if (result.synced) {
|
|
56
|
+
console.log('✓ Registre local synchronisé avec l’API.');
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
fail('Registre local différent du registre déployé. Lancez « content push » pour synchroniser.');
|
|
60
|
+
}
|
|
61
|
+
async function main() {
|
|
62
|
+
const command = process.argv[2];
|
|
63
|
+
if (command === 'push')
|
|
64
|
+
return void (await runPush());
|
|
65
|
+
if (command === 'check')
|
|
66
|
+
return void (await runCheck());
|
|
67
|
+
fail('Usage : content <push|check>');
|
|
68
|
+
}
|
|
69
|
+
main().catch((error) => {
|
|
70
|
+
fail(error instanceof Error ? error.message : String(error));
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/define.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ContentDefinition, Definition, Fields } from './types.js';
|
|
2
|
+
export interface DefinitionConfig<F extends Fields> {
|
|
3
|
+
label?: string;
|
|
4
|
+
icon?: string;
|
|
5
|
+
fields: F;
|
|
6
|
+
}
|
|
7
|
+
export declare function defineComponent<const F extends Fields, Name extends string>(name: Name, config: DefinitionConfig<F>): Definition<F, Name>;
|
|
8
|
+
export declare function defineSection<const F extends Fields, Name extends string>(name: Name, config: DefinitionConfig<F>): Definition<F, Name>;
|
|
9
|
+
export interface ContentConfig<S extends readonly Definition[]> {
|
|
10
|
+
sections: S;
|
|
11
|
+
}
|
|
12
|
+
export declare function defineContent<const S extends readonly Definition[]>(config: ContentConfig<S>): ContentDefinition<S>;
|
|
13
|
+
//# sourceMappingURL=define.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,CAAC,CAAC;CACX;AAeD,wBAAgB,eAAe,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,EACzE,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC1B,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAErB;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,EACvE,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC1B,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAErB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS,UAAU,EAAE;IAC5D,QAAQ,EAAE,CAAC,CAAC;CACb;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,EAAE,EACjE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GACvB,iBAAiB,CAAC,CAAC,CAAC,CAStB"}
|
package/dist/define.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Les trois verbes de déclaration (naming validé) :
|
|
2
|
+
// - defineComponent : atom/molecule — groupe de champs nommé RÉUTILISABLE, non insérable en page.
|
|
3
|
+
// - defineSection : bloc de page — va dans `page.sections`, fetché + bouclé par le front.
|
|
4
|
+
// - defineContent : racine — LE seul point lu par la CLI ; les components sont AUTO-COLLECTÉS
|
|
5
|
+
// en marchant les références des sections.
|
|
6
|
+
//
|
|
7
|
+
// Génériques : `defineSection`/`defineComponent` capturent les champs `F` (const) et le nom `Name`
|
|
8
|
+
// (littéral), `defineContent` capture le tuple `S` des sections. Cette préservation alimente
|
|
9
|
+
// l'inférence de types côté front (`InferData` / `InferSections`, cf. types.ts).
|
|
10
|
+
const define = (role, name, config) => ({
|
|
11
|
+
kind: 'definition',
|
|
12
|
+
role,
|
|
13
|
+
name,
|
|
14
|
+
label: config.label,
|
|
15
|
+
icon: config.icon,
|
|
16
|
+
fields: config.fields,
|
|
17
|
+
});
|
|
18
|
+
export function defineComponent(name, config) {
|
|
19
|
+
return define('component', name, config);
|
|
20
|
+
}
|
|
21
|
+
export function defineSection(name, config) {
|
|
22
|
+
return define('section', name, config);
|
|
23
|
+
}
|
|
24
|
+
export function defineContent(config) {
|
|
25
|
+
for (const section of config.sections) {
|
|
26
|
+
if (section.role !== 'section') {
|
|
27
|
+
throw new Error(`defineContent : « ${section.name} » est un component, pas une section. Seules les sections (defineSection) sont insérables en page.`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return { kind: 'content', sections: config.sections };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=define.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,oGAAoG;AACpG,8FAA8F;AAC9F,kGAAkG;AAClG,iEAAiE;AACjE,EAAE;AACF,mGAAmG;AACnG,6FAA6F;AAC7F,iFAAiF;AAUjF,MAAM,MAAM,GAAG,CACb,IAAwB,EACxB,IAAU,EACV,MAA2B,EACN,EAAE,CAAC,CAAC;IACzB,IAAI,EAAE,YAAY;IAClB,IAAI;IACJ,IAAI;IACJ,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM;CACtB,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAC7B,IAAU,EACV,MAA2B;IAE3B,OAAO,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAU,EACV,MAA2B;IAE3B,OAAO,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAMD,MAAM,UAAU,aAAa,CAC3B,MAAwB;IAExB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,qBAAqB,OAAO,CAAC,IAAI,oGAAoG,CACtI,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;AACxD,CAAC"}
|
package/dist/field.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { BooleanField, DateField, Definition, EnumField, EnumOption, ImageField, ListField, NumberField, RefField, RepeaterField, RichTextField, TextField } from './types.js';
|
|
2
|
+
type Options<T extends {
|
|
3
|
+
kind: string;
|
|
4
|
+
}> = Omit<T, 'kind'>;
|
|
5
|
+
export declare const field: {
|
|
6
|
+
text<const O extends Options<TextField> = object>(options?: O): {
|
|
7
|
+
kind: "text";
|
|
8
|
+
} & O;
|
|
9
|
+
richText<const O extends Options<RichTextField> = object>(options?: O): {
|
|
10
|
+
kind: "richText";
|
|
11
|
+
} & O;
|
|
12
|
+
number<const O extends Options<NumberField> = object>(options?: O): {
|
|
13
|
+
kind: "number";
|
|
14
|
+
} & O;
|
|
15
|
+
boolean<const O extends Options<BooleanField> = object>(options?: O): {
|
|
16
|
+
kind: "boolean";
|
|
17
|
+
} & O;
|
|
18
|
+
date<const O extends Options<DateField> = object>(options?: O): {
|
|
19
|
+
kind: "date";
|
|
20
|
+
} & O;
|
|
21
|
+
enum<const O extends Options<EnumField>>(options: O): {
|
|
22
|
+
kind: "enum";
|
|
23
|
+
} & O;
|
|
24
|
+
image<const O extends Options<ImageField> = object>(options?: O): {
|
|
25
|
+
kind: "image";
|
|
26
|
+
} & O;
|
|
27
|
+
ref<const O extends Options<RefField>>(options: O): {
|
|
28
|
+
kind: "ref";
|
|
29
|
+
} & O;
|
|
30
|
+
list<const D extends Definition, const O extends Omit<Options<ListField>, "of"> = object>(of: D, options?: O): {
|
|
31
|
+
kind: "list";
|
|
32
|
+
of: D;
|
|
33
|
+
} & O;
|
|
34
|
+
repeater<const O extends Options<RepeaterField>>(options: O): {
|
|
35
|
+
kind: "repeater";
|
|
36
|
+
} & O;
|
|
37
|
+
};
|
|
38
|
+
export type Field = typeof field;
|
|
39
|
+
export type { EnumOption };
|
|
40
|
+
//# sourceMappingURL=field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,UAAU,EACV,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,QAAQ,EACR,aAAa,EACb,aAAa,EACb,SAAS,EACV,MAAM,YAAY,CAAC;AAGpB,KAAK,OAAO,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAW3D,eAAO,MAAM,KAAK;eACL,CAAC,SAAS,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,CAAC;mBAIrE,CAAC,SAAS,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,GAAG;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,CAAC;iBAInF,CAAC,SAAS,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,GAAG;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,CAAC;kBAI5E,CAAC,SAAS,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,GAAG;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,GAAG,CAAC;eAIlF,CAAC,SAAS,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,CAAC;eAIzE,CAAC,SAAS,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,CAAC;gBAI9D,CAAC,SAAS,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG,CAAC;cAI7E,CAAC,SAAS,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE,GAAG,CAAC;eAM5D,CAAC,SAAS,UAAU,QAAQ,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,eACzE,CAAC,YACK,CAAC,GACV;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC;mBAMf,CAAC,SAAS,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,CAAC;CAGvF,CAAC;AAGF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC;AAGjC,YAAY,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/field.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Builders de champs. `field` (alias court `f`) est un objet de fabriques : chaque méthode
|
|
2
|
+
// retourne un descripteur de champ (cf. types.ts). Aucune validation ici — juste la construction
|
|
3
|
+
// du descripteur. La validation des données éditées vit côté API (P2b), pilotée par le registre.
|
|
4
|
+
//
|
|
5
|
+
// Les fabriques sont GÉNÉRIQUES avec des `const` type params : elles capturent littéralement les
|
|
6
|
+
// options passées (`required: true`, options d'enum, `of` d'une liste…) pour que l'inférence de
|
|
7
|
+
// types (`InferData`, cf. types.ts) puisse dériver la forme exacte de la donnée. La normalisation
|
|
8
|
+
// (ex. options d'enum) n'a PAS lieu ici mais à la sérialisation, afin de préserver les littéraux.
|
|
9
|
+
// Construction générique d'un descripteur. Cette fonction concentre l'UNIQUE assertion interne du
|
|
10
|
+
// module : TypeScript ne peut pas prouver que `{ kind, ...options }` (options optionnelles) produit
|
|
11
|
+
// `{ kind: K } & O`, alors que c'est vrai par construction (O est inféré des options réelles). Même
|
|
12
|
+
// nature que `asSections` : assertion de frontière côté lib, jamais du cast métier.
|
|
13
|
+
const make = (kind, options) => ({ kind, ...options });
|
|
14
|
+
export const field = {
|
|
15
|
+
text(options) {
|
|
16
|
+
return make('text', options);
|
|
17
|
+
},
|
|
18
|
+
richText(options) {
|
|
19
|
+
return make('richText', options);
|
|
20
|
+
},
|
|
21
|
+
number(options) {
|
|
22
|
+
return make('number', options);
|
|
23
|
+
},
|
|
24
|
+
boolean(options) {
|
|
25
|
+
return make('boolean', options);
|
|
26
|
+
},
|
|
27
|
+
date(options) {
|
|
28
|
+
return make('date', options);
|
|
29
|
+
},
|
|
30
|
+
enum(options) {
|
|
31
|
+
return make('enum', options);
|
|
32
|
+
},
|
|
33
|
+
image(options) {
|
|
34
|
+
return make('image', options);
|
|
35
|
+
},
|
|
36
|
+
ref(options) {
|
|
37
|
+
return make('ref', options);
|
|
38
|
+
},
|
|
39
|
+
// `list(of)` répète un type nommé (component). `of` est passé par référence pour l'auto-collecte
|
|
40
|
+
// ET l'inférence (`InferData<of>[]`).
|
|
41
|
+
list(of, options) {
|
|
42
|
+
// Même assertion interne que `make` (cf. plus haut) : la fusion de `of` empêche de router par
|
|
43
|
+
// `make`, on construit donc directement le descripteur `list`.
|
|
44
|
+
return { kind: 'list', of, ...options };
|
|
45
|
+
},
|
|
46
|
+
repeater(options) {
|
|
47
|
+
return make('repeater', options);
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field.js","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,iGAAiG;AACjG,iGAAiG;AACjG,EAAE;AACF,iGAAiG;AACjG,gGAAgG;AAChG,kGAAkG;AAClG,kGAAkG;AAoBlG,kGAAkG;AAClG,oGAAoG;AACpG,oGAAoG;AACpG,oFAAoF;AACpF,MAAM,IAAI,GAAG,CACX,IAAO,EACP,OAAW,EACM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAoB,CAAC;AAEhE,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,CAA8C,OAAW;QAC3D,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,QAAQ,CAAkD,OAAW;QACnE,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAgD,OAAW;QAC/D,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAiD,OAAW;QACjE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,CAA8C,OAAW;QAC3D,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAqC,OAAU;QACjD,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAA+C,OAAW;QAC7D,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,GAAG,CAAoC,OAAU;QAC/C,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,iGAAiG;IACjG,sCAAsC;IACtC,IAAI,CACF,EAAK,EACL,OAAW;QAEX,8FAA8F;QAC9F,+DAA+D;QAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,EAAiC,CAAC;IACzE,CAAC;IAED,QAAQ,CAAyC,OAAU;QACzD,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;CACF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type { ContentConfig, DefinitionConfig } from './define.js';
|
|
2
|
+
export { defineComponent, defineContent, defineSection } from './define.js';
|
|
3
|
+
export type { EnumOption, Field } from './field.js';
|
|
4
|
+
export { field, field as f } from './field.js';
|
|
5
|
+
export { link } from './link.js';
|
|
6
|
+
export type { RawSection } from './narrow.js';
|
|
7
|
+
export { asSections } from './narrow.js';
|
|
8
|
+
export { serialize } from './serialize.js';
|
|
9
|
+
export type { CheckResult, PushOptions, PushResult } from './sync.js';
|
|
10
|
+
export { checkRegistry, pushRegistry } from './sync.js';
|
|
11
|
+
export type { BooleanField, ContentDefinition, DateField, Definition, DefinitionRole, EnumField, Fields, ImageField, InferData, InferSections, ListField, NumberField, RefField, RefTarget, Registry, RepeaterField, RichTextField, SerializedDefinition, SerializedField, TextField, } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,MAAM,EACN,UAAU,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,WAAW,EACX,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,SAAS,GACV,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Surface publique de `@echoppe/content` — l'outillage build/dev-time de déclaration de contenu.
|
|
2
|
+
// Importé en devDependency du repo front du dev. Ne fait AUCUN appel runtime : il déclare, la CLI
|
|
3
|
+
// sérialise vers le registre de l'API (P2b) et le front INFÈRE ses types depuis la déclaration (P2c,
|
|
4
|
+
// `InferData`/`InferSections`) — pas de codegen, le registre poussé ne sert qu'à l'admin.
|
|
5
|
+
export { defineComponent, defineContent, defineSection } from './define.js';
|
|
6
|
+
export { field, field as f } from './field.js';
|
|
7
|
+
export { link } from './link.js';
|
|
8
|
+
export { asSections } from './narrow.js';
|
|
9
|
+
export { serialize } from './serialize.js';
|
|
10
|
+
export { checkRegistry, pushRegistry } from './sync.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,kGAAkG;AAClG,qGAAqG;AACrG,0FAA0F;AAG1F,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/link.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const link: import("./types.js").Definition<{
|
|
2
|
+
readonly label: {
|
|
3
|
+
kind: "text";
|
|
4
|
+
} & {
|
|
5
|
+
readonly label: "Libellé";
|
|
6
|
+
readonly required: true;
|
|
7
|
+
};
|
|
8
|
+
readonly href: {
|
|
9
|
+
kind: "text";
|
|
10
|
+
} & {
|
|
11
|
+
readonly label: "Cible";
|
|
12
|
+
readonly required: true;
|
|
13
|
+
};
|
|
14
|
+
readonly newTab: {
|
|
15
|
+
kind: "boolean";
|
|
16
|
+
} & {
|
|
17
|
+
readonly label: "Ouvrir dans un nouvel onglet";
|
|
18
|
+
};
|
|
19
|
+
}, "link">;
|
|
20
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;UAQf,CAAC"}
|
package/dist/link.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Component `link` LIVRÉ avec le package. Remplace le champ `url` (retiré) : un lien n'est pas
|
|
2
|
+
// une simple chaîne mais un couple libellé + cible, avec ouverture dans un nouvel onglet
|
|
3
|
+
// optionnelle. Le dev le pose comme n'importe quel component : `cta: link`.
|
|
4
|
+
import { defineComponent } from './define.js';
|
|
5
|
+
import { field as f } from './field.js';
|
|
6
|
+
export const link = defineComponent('link', {
|
|
7
|
+
label: 'Lien',
|
|
8
|
+
icon: 'link',
|
|
9
|
+
fields: {
|
|
10
|
+
label: f.text({ label: 'Libellé', required: true }),
|
|
11
|
+
href: f.text({ label: 'Cible', required: true }),
|
|
12
|
+
newTab: f.boolean({ label: 'Ouvrir dans un nouvel onglet' }),
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=link.js.map
|
package/dist/link.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,yFAAyF;AACzF,4EAA4E;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE;IAC1C,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACnD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAChD,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;KAC7D;CACF,CAAC,CAAC"}
|
package/dist/narrow.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ContentDefinition, InferSections } from './types.js';
|
|
2
|
+
/** Forme brute d'une section telle que renvoyée par le SDK. */
|
|
3
|
+
export interface RawSection {
|
|
4
|
+
id: string;
|
|
5
|
+
type: string;
|
|
6
|
+
data: unknown;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Retype les sections brutes du SDK selon la déclaration `content`. `content` ne sert qu'à porter
|
|
10
|
+
* le type `C` (inutilisé au runtime — identité). Zéro validation : l'API a validé à l'écriture.
|
|
11
|
+
*/
|
|
12
|
+
export declare function asSections<C extends ContentDefinition>(_content: C, raw: readonly RawSection[]): InferSections<C>[];
|
|
13
|
+
//# sourceMappingURL=narrow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"narrow.d.ts","sourceRoot":"","sources":["../src/narrow.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnE,+DAA+D;AAC/D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,iBAAiB,EACpD,QAAQ,EAAE,CAAC,EACX,GAAG,EAAE,SAAS,UAAU,EAAE,GACzB,aAAa,CAAC,CAAC,CAAC,EAAE,CAEpB"}
|
package/dist/narrow.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Franchissement `unknown → typé` côté front (P2c).
|
|
2
|
+
//
|
|
3
|
+
// Le SDK (`@echoppe/client`) type les sections d'une page comme `{ id, type: string, data: unknown }`
|
|
4
|
+
// — il ne PEUT pas connaître le registre déclaré par le dev (contrat OpenAPI agnostique). `asSections`
|
|
5
|
+
// retype ce tableau brut en union discriminée inférée de la déclaration du dev (`InferSections<C>`).
|
|
6
|
+
//
|
|
7
|
+
// C'est l'UNIQUE cast de frontière de la partie front : légitime car l'API a déjà validé la donnée
|
|
8
|
+
// à l'écriture (cf. validateur registre-dérivé, P2b) → on truste, exactement comme le storefront
|
|
9
|
+
// truste déjà les types du SDK pour tout le catalogue. Le dev n'écrit donc jamais de `as` lui-même :
|
|
10
|
+
// il appelle `asSections(content, page.sections)` à sa frontière (typiquement `src/lib/api.ts`).
|
|
11
|
+
/**
|
|
12
|
+
* Retype les sections brutes du SDK selon la déclaration `content`. `content` ne sert qu'à porter
|
|
13
|
+
* le type `C` (inutilisé au runtime — identité). Zéro validation : l'API a validé à l'écriture.
|
|
14
|
+
*/
|
|
15
|
+
export function asSections(_content, raw) {
|
|
16
|
+
return raw;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=narrow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"narrow.js","sourceRoot":"","sources":["../src/narrow.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,EAAE;AACF,sGAAsG;AACtG,uGAAuG;AACvG,qGAAqG;AACrG,EAAE;AACF,mGAAmG;AACnG,iGAAiG;AACjG,qGAAqG;AACrG,iGAAiG;AAWjG;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,QAAW,EACX,GAA0B;IAE1B,OAAO,GAAyB,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,iBAAiB,EAIjB,QAAQ,EAGT,MAAM,YAAY,CAAC;AAuGpB,wBAAgB,SAAS,CAAC,OAAO,EAAE,iBAAiB,GAAG,QAAQ,CAc9D"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Compilation d'une `ContentDefinition` (authoring, références par objet) vers le `Registry`
|
|
2
|
+
// JSON (références par nom). C'est ce registre qui est poussé vers l'API (P2b) et lu par le
|
|
3
|
+
// générateur de formulaires admin (P3). Le typage du front, lui, ne passe PAS par ici : il est
|
|
4
|
+
// inféré directement des déclarations (cf. `InferData`/`InferSections`, types.ts).
|
|
5
|
+
//
|
|
6
|
+
// En marchant les sections, les components référencés (champ imbriqué `cta: link`, ou
|
|
7
|
+
// `f.list(card)`) sont AUTO-COLLECTÉS dans `registry.components`. Deux garde-fous :
|
|
8
|
+
// - collision de nom : deux définitions distinctes sous le même nom → erreur explicite.
|
|
9
|
+
// - cycle : un component qui se référence (directement ou non) ne boucle pas — on enregistre
|
|
10
|
+
// le nom AVANT de sérialiser ses champs, la ré-rencontre s'arrête sur l'identité déjà vue.
|
|
11
|
+
//
|
|
12
|
+
// C'est aussi ici qu'a lieu la NORMALISATION des options d'enum (`string` → `{ value, label }`) :
|
|
13
|
+
// l'authoring garde les littéraux (pour l'inférence), le registre est canonique.
|
|
14
|
+
const collision = (name) => new Error(`Collision de nom « ${name} » : deux définitions distinctes portent le même nom. Chaque component/section doit avoir un nom unique.`);
|
|
15
|
+
const normalizeEnumOptions = (options) => options.map((option) => (typeof option === 'string' ? { value: option, label: option } : option));
|
|
16
|
+
function serializeField(value, registry, registered) {
|
|
17
|
+
// Component imbriqué by-reference (ex. `cta: link`) → ref par nom + auto-collecte.
|
|
18
|
+
if (value.kind === 'definition') {
|
|
19
|
+
collectComponent(value, registry, registered);
|
|
20
|
+
return { kind: 'component', of: value.name };
|
|
21
|
+
}
|
|
22
|
+
switch (value.kind) {
|
|
23
|
+
case 'enum':
|
|
24
|
+
return {
|
|
25
|
+
kind: 'enum',
|
|
26
|
+
options: normalizeEnumOptions(value.options),
|
|
27
|
+
multiple: value.multiple,
|
|
28
|
+
label: value.label,
|
|
29
|
+
hint: value.hint,
|
|
30
|
+
required: value.required,
|
|
31
|
+
default: value.default,
|
|
32
|
+
};
|
|
33
|
+
case 'list': {
|
|
34
|
+
collectComponent(value.of, registry, registered);
|
|
35
|
+
return {
|
|
36
|
+
kind: 'list',
|
|
37
|
+
of: value.of.name,
|
|
38
|
+
label: value.label,
|
|
39
|
+
hint: value.hint,
|
|
40
|
+
required: value.required,
|
|
41
|
+
min: value.min,
|
|
42
|
+
max: value.max,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
case 'repeater': {
|
|
46
|
+
return {
|
|
47
|
+
kind: 'repeater',
|
|
48
|
+
fields: serializeFields(value.fields, registry, registered),
|
|
49
|
+
label: value.label,
|
|
50
|
+
hint: value.hint,
|
|
51
|
+
required: value.required,
|
|
52
|
+
min: value.min,
|
|
53
|
+
max: value.max,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
default:
|
|
57
|
+
// Primitives, image, ref : le descripteur est déjà la forme JSON du registre.
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function serializeFields(fields, registry, registered) {
|
|
62
|
+
const out = {};
|
|
63
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
64
|
+
out[key] = serializeField(value, registry, registered);
|
|
65
|
+
}
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
function serializeDefinition(def, registry, registered) {
|
|
69
|
+
return {
|
|
70
|
+
name: def.name,
|
|
71
|
+
label: def.label,
|
|
72
|
+
icon: def.icon,
|
|
73
|
+
fields: serializeFields(def.fields, registry, registered),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function collectComponent(def, registry, registered) {
|
|
77
|
+
const existing = registered.get(def.name);
|
|
78
|
+
if (existing) {
|
|
79
|
+
if (existing !== def) {
|
|
80
|
+
throw collision(def.name);
|
|
81
|
+
}
|
|
82
|
+
return; // déjà collecté — coupe les cycles
|
|
83
|
+
}
|
|
84
|
+
registered.set(def.name, def);
|
|
85
|
+
registry.components[def.name] = serializeDefinition(def, registry, registered);
|
|
86
|
+
}
|
|
87
|
+
// Compile la racine `defineContent` en registre JSON.
|
|
88
|
+
export function serialize(content) {
|
|
89
|
+
const registry = { version: 1, sections: {}, components: {} };
|
|
90
|
+
const registered = new Map();
|
|
91
|
+
for (const section of content.sections) {
|
|
92
|
+
const existing = registered.get(section.name);
|
|
93
|
+
if (existing && existing !== section) {
|
|
94
|
+
throw collision(section.name);
|
|
95
|
+
}
|
|
96
|
+
registered.set(section.name, section);
|
|
97
|
+
registry.sections[section.name] = serializeDefinition(section, registry, registered);
|
|
98
|
+
}
|
|
99
|
+
return registry;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=serialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"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"}
|
package/dist/sync.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ContentDefinition } from './types.js';
|
|
2
|
+
export interface PushOptions {
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
apiKey: string;
|
|
5
|
+
fetch?: typeof fetch;
|
|
6
|
+
}
|
|
7
|
+
export interface PushResult {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
status: number;
|
|
10
|
+
message?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CheckResult {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
status: number;
|
|
15
|
+
synced?: boolean;
|
|
16
|
+
message?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function pushRegistry(content: ContentDefinition, options: PushOptions): Promise<PushResult>;
|
|
19
|
+
export declare function checkRegistry(content: ContentDefinition, options: PushOptions): Promise<CheckResult>;
|
|
20
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+BD,wBAAsB,YAAY,CAChC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAkBrB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CActB"}
|
package/dist/sync.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Synchronisation du registre vers l'API (P2b) + vérification de dérive (P2c). Fonctions de lib
|
|
2
|
+
// DEP-FREE (fetch natif) : le dev peut les appeler depuis son propre script, ou via la CLI
|
|
3
|
+
// (cli.ts). `pushRegistry` sérialise et pousse en `PUT /content/registry` ; `checkRegistry` compare
|
|
4
|
+
// le registre local au registre déployé (GET) pour détecter un oubli de push. Auth par clé (Bearer).
|
|
5
|
+
import { serialize } from './serialize.js';
|
|
6
|
+
// Tente de récupérer le message d'erreur structuré de l'API ({ message }).
|
|
7
|
+
async function extractMessage(response) {
|
|
8
|
+
try {
|
|
9
|
+
const body = await response.json();
|
|
10
|
+
if (body && typeof body === 'object' && 'message' in body && typeof body.message === 'string') {
|
|
11
|
+
return body.message;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// corps non-JSON — message indéfini
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
// Sérialisation canonique (clés triées, `undefined` omis comme le fait JSON) : rend la comparaison
|
|
20
|
+
// insensible à l'ordre des clés et aligne le local (qui porte des `undefined`) sur le distant (JSON).
|
|
21
|
+
function canonical(value) {
|
|
22
|
+
if (Array.isArray(value)) {
|
|
23
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
24
|
+
}
|
|
25
|
+
if (value && typeof value === 'object') {
|
|
26
|
+
const record = value;
|
|
27
|
+
const keys = Object.keys(record)
|
|
28
|
+
.filter((key) => record[key] !== undefined)
|
|
29
|
+
.sort();
|
|
30
|
+
return `{${keys.map((key) => `${JSON.stringify(key)}:${canonical(record[key])}`).join(',')}}`;
|
|
31
|
+
}
|
|
32
|
+
return JSON.stringify(value) ?? 'null';
|
|
33
|
+
}
|
|
34
|
+
export async function pushRegistry(content, options) {
|
|
35
|
+
const registry = serialize(content);
|
|
36
|
+
const doFetch = options.fetch ?? fetch;
|
|
37
|
+
const url = new URL('/content/registry', options.apiUrl);
|
|
38
|
+
const response = await doFetch(url, {
|
|
39
|
+
method: 'PUT',
|
|
40
|
+
headers: {
|
|
41
|
+
'content-type': 'application/json',
|
|
42
|
+
authorization: `Bearer ${options.apiKey}`,
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify(registry),
|
|
45
|
+
});
|
|
46
|
+
if (response.ok) {
|
|
47
|
+
return { ok: true, status: response.status };
|
|
48
|
+
}
|
|
49
|
+
return { ok: false, status: response.status, message: await extractMessage(response) };
|
|
50
|
+
}
|
|
51
|
+
export async function checkRegistry(content, options) {
|
|
52
|
+
const local = serialize(content);
|
|
53
|
+
const doFetch = options.fetch ?? fetch;
|
|
54
|
+
const url = new URL('/content/registry', options.apiUrl);
|
|
55
|
+
const response = await doFetch(url, {
|
|
56
|
+
headers: { authorization: `Bearer ${options.apiKey}` },
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
return { ok: false, status: response.status, message: await extractMessage(response) };
|
|
60
|
+
}
|
|
61
|
+
const remote = await response.json();
|
|
62
|
+
return { ok: true, status: response.status, synced: canonical(local) === canonical(remote) };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=sync.js.map
|
package/dist/sync.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
export interface FieldMeta {
|
|
2
|
+
label?: string;
|
|
3
|
+
hint?: string;
|
|
4
|
+
required?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface TextField extends FieldMeta {
|
|
7
|
+
kind: 'text';
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
default?: string;
|
|
10
|
+
minLength?: number;
|
|
11
|
+
maxLength?: number;
|
|
12
|
+
format?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RichTextField extends FieldMeta {
|
|
15
|
+
kind: 'richText';
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
default?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface NumberField extends FieldMeta {
|
|
20
|
+
kind: 'number';
|
|
21
|
+
placeholder?: string;
|
|
22
|
+
default?: number;
|
|
23
|
+
integer?: boolean;
|
|
24
|
+
min?: number;
|
|
25
|
+
max?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface BooleanField extends FieldMeta {
|
|
28
|
+
kind: 'boolean';
|
|
29
|
+
default?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface DateField extends FieldMeta {
|
|
32
|
+
kind: 'date';
|
|
33
|
+
default?: string;
|
|
34
|
+
time?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface EnumOption {
|
|
37
|
+
value: string;
|
|
38
|
+
label: string;
|
|
39
|
+
}
|
|
40
|
+
export interface EnumField extends FieldMeta {
|
|
41
|
+
kind: 'enum';
|
|
42
|
+
options: ReadonlyArray<string | EnumOption>;
|
|
43
|
+
multiple?: boolean;
|
|
44
|
+
default?: string | string[];
|
|
45
|
+
}
|
|
46
|
+
export type RefTarget = 'product' | 'collection' | 'category';
|
|
47
|
+
export interface ImageField extends FieldMeta {
|
|
48
|
+
kind: 'image';
|
|
49
|
+
}
|
|
50
|
+
export interface RefField extends FieldMeta {
|
|
51
|
+
kind: 'ref';
|
|
52
|
+
to: RefTarget;
|
|
53
|
+
}
|
|
54
|
+
export interface ListField extends FieldMeta {
|
|
55
|
+
kind: 'list';
|
|
56
|
+
of: Definition;
|
|
57
|
+
min?: number;
|
|
58
|
+
max?: number;
|
|
59
|
+
}
|
|
60
|
+
export interface RepeaterField extends FieldMeta {
|
|
61
|
+
kind: 'repeater';
|
|
62
|
+
fields: Fields;
|
|
63
|
+
min?: number;
|
|
64
|
+
max?: number;
|
|
65
|
+
}
|
|
66
|
+
export type FieldNode = TextField | RichTextField | NumberField | BooleanField | DateField | EnumField | ImageField | RefField | ListField | RepeaterField;
|
|
67
|
+
export type FieldValue = FieldNode | Definition;
|
|
68
|
+
export type Fields = Record<string, FieldValue>;
|
|
69
|
+
export type DefinitionRole = 'section' | 'component';
|
|
70
|
+
export interface Definition<F extends Fields = Fields, Name extends string = string> {
|
|
71
|
+
kind: 'definition';
|
|
72
|
+
role: DefinitionRole;
|
|
73
|
+
name: Name;
|
|
74
|
+
label?: string;
|
|
75
|
+
icon?: string;
|
|
76
|
+
fields: F;
|
|
77
|
+
}
|
|
78
|
+
export interface ContentDefinition<S extends readonly Definition[] = readonly Definition[]> {
|
|
79
|
+
kind: 'content';
|
|
80
|
+
sections: S;
|
|
81
|
+
}
|
|
82
|
+
type Prettify<T> = {
|
|
83
|
+
[K in keyof T]: T[K];
|
|
84
|
+
} & {};
|
|
85
|
+
type EnumValueOf<O> = O extends ReadonlyArray<infer Item> ? Item extends string ? Item : Item extends {
|
|
86
|
+
value: infer V extends string;
|
|
87
|
+
} ? V : never : never;
|
|
88
|
+
type ValueOf<F> = F extends {
|
|
89
|
+
kind: 'text' | 'richText' | 'date' | 'image' | 'ref';
|
|
90
|
+
} ? string : F extends {
|
|
91
|
+
kind: 'number';
|
|
92
|
+
} ? number : F extends {
|
|
93
|
+
kind: 'boolean';
|
|
94
|
+
} ? boolean : F extends {
|
|
95
|
+
kind: 'enum';
|
|
96
|
+
options: infer O;
|
|
97
|
+
} ? F extends {
|
|
98
|
+
multiple: true;
|
|
99
|
+
} ? EnumValueOf<O>[] : EnumValueOf<O> : F extends {
|
|
100
|
+
kind: 'list';
|
|
101
|
+
of: infer D;
|
|
102
|
+
} ? D extends Definition ? InferData<D>[] : never : F extends {
|
|
103
|
+
kind: 'repeater';
|
|
104
|
+
fields: infer FF;
|
|
105
|
+
} ? FF extends Fields ? Prettify<InferFields<FF>>[] : never : F extends {
|
|
106
|
+
kind: 'definition';
|
|
107
|
+
fields: infer DF;
|
|
108
|
+
} ? DF extends Fields ? Prettify<InferFields<DF>> : never : never;
|
|
109
|
+
type RequiredKeys<F extends Fields> = {
|
|
110
|
+
[K in keyof F]: F[K] extends {
|
|
111
|
+
required: true;
|
|
112
|
+
} ? K : never;
|
|
113
|
+
}[keyof F];
|
|
114
|
+
type InferFields<F extends Fields> = {
|
|
115
|
+
[K in keyof F as K extends RequiredKeys<F> ? K : never]: ValueOf<F[K]>;
|
|
116
|
+
} & {
|
|
117
|
+
[K in keyof F as K extends RequiredKeys<F> ? never : K]?: ValueOf<F[K]>;
|
|
118
|
+
};
|
|
119
|
+
/** Forme de la donnée éditée d'une section/component. */
|
|
120
|
+
export type InferData<D extends Definition> = D extends Definition<infer F> ? Prettify<InferFields<F>> : never;
|
|
121
|
+
/** Union discriminée `{ id, type, data }` des sections d'un `defineContent`. */
|
|
122
|
+
export type InferSections<C extends ContentDefinition> = C extends ContentDefinition<infer S> ? {
|
|
123
|
+
[I in keyof S]: S[I] extends Definition<infer F, infer N> ? {
|
|
124
|
+
id: string;
|
|
125
|
+
type: N;
|
|
126
|
+
data: Prettify<InferFields<F>>;
|
|
127
|
+
} : never;
|
|
128
|
+
}[number] : never;
|
|
129
|
+
export type SerializedField = TextField | RichTextField | NumberField | BooleanField | DateField | {
|
|
130
|
+
kind: 'enum';
|
|
131
|
+
options: EnumOption[];
|
|
132
|
+
multiple?: boolean;
|
|
133
|
+
label?: string;
|
|
134
|
+
hint?: string;
|
|
135
|
+
required?: boolean;
|
|
136
|
+
default?: string | string[];
|
|
137
|
+
} | ImageField | RefField | {
|
|
138
|
+
kind: 'component';
|
|
139
|
+
of: string;
|
|
140
|
+
label?: string;
|
|
141
|
+
hint?: string;
|
|
142
|
+
required?: boolean;
|
|
143
|
+
} | {
|
|
144
|
+
kind: 'list';
|
|
145
|
+
of: string;
|
|
146
|
+
label?: string;
|
|
147
|
+
hint?: string;
|
|
148
|
+
required?: boolean;
|
|
149
|
+
min?: number;
|
|
150
|
+
max?: number;
|
|
151
|
+
} | {
|
|
152
|
+
kind: 'repeater';
|
|
153
|
+
fields: Record<string, SerializedField>;
|
|
154
|
+
label?: string;
|
|
155
|
+
hint?: string;
|
|
156
|
+
required?: boolean;
|
|
157
|
+
min?: number;
|
|
158
|
+
max?: number;
|
|
159
|
+
};
|
|
160
|
+
export interface SerializedDefinition {
|
|
161
|
+
name: string;
|
|
162
|
+
label?: string;
|
|
163
|
+
icon?: string;
|
|
164
|
+
fields: Record<string, SerializedField>;
|
|
165
|
+
}
|
|
166
|
+
export interface Registry {
|
|
167
|
+
version: 1;
|
|
168
|
+
sections: Record<string, SerializedDefinition>;
|
|
169
|
+
components: Record<string, SerializedDefinition>;
|
|
170
|
+
}
|
|
171
|
+
export {};
|
|
172
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Représentation interne des définitions de contenu (descripteurs). Ces objets sont produits par
|
|
2
|
+
// les builders `field`/`f` et par `defineComponent`/`defineSection`, puis sérialisés en JSON
|
|
3
|
+
// (registre) par `serialize.ts`. Aucune logique ici — uniquement des formes de données + les
|
|
4
|
+
// utilitaires d'INFÉRENCE de types (P2c) qui dérivent, à la compilation, le type de la donnée
|
|
5
|
+
// éditée à partir des descripteurs. Le front n'a donc PAS de codegen : il infère depuis sa propre
|
|
6
|
+
// déclaration (`InferData` / `InferSections`), le registre poussé ne sert qu'à l'admin.
|
|
7
|
+
//
|
|
8
|
+
// Deux mondes :
|
|
9
|
+
// - AUTHORING (ce fichier, en haut) : descripteurs riches manipulés dans le repo du dev. Les
|
|
10
|
+
// champs `list`/composant imbriqué portent la Definition **par référence** (l'objet), ce qui
|
|
11
|
+
// permet l'auto-collecte des components ET l'inférence de type.
|
|
12
|
+
// - REGISTRE (en bas) : forme JSON sérialisable, références résolues **par nom** — c'est ce qui
|
|
13
|
+
// est poussé vers l'API (P2b) et lu par l'admin (P3).
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,6FAA6F;AAC7F,6FAA6F;AAC7F,8FAA8F;AAC9F,kGAAkG;AAClG,wFAAwF;AACxF,EAAE;AACF,gBAAgB;AAChB,+FAA+F;AAC/F,iGAAiG;AACjG,oEAAoE;AACpE,kGAAkG;AAClG,0DAA0D"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@echoppe/content",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Déclaration de contenu config-as-code pour Échoppe — components, sections et champs typés, synchronisés vers l'API.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc -p tsconfig.build.json",
|
|
26
|
+
"type-check": "tsc --noEmit"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"echoppe",
|
|
30
|
+
"ecommerce",
|
|
31
|
+
"content",
|
|
32
|
+
"page-builder",
|
|
33
|
+
"headless"
|
|
34
|
+
],
|
|
35
|
+
"author": "Axiome-Apps",
|
|
36
|
+
"license": "CECILL-2.1",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/Axiome-Apps/echoppe.git",
|
|
40
|
+
"directory": "packages/content"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/Axiome-Apps/echoppe#readme",
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/node": "^22.10.2",
|
|
45
|
+
"typescript": "6.0.3"
|
|
46
|
+
}
|
|
47
|
+
}
|