@agence-zef/sdk 0.13.2 → 0.14.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.
@@ -0,0 +1,3 @@
1
+ import type { ApiBusiness } from "./types.js";
2
+ /** Nœud schema.org de l'établissement (`@id` = `<origine>/#organization`). */
3
+ export declare function businessJsonLd(business: ApiBusiness, origin: string): Record<string, unknown>;
@@ -0,0 +1,35 @@
1
+ /*
2
+ * Données structurées de l'établissement (cahier des charges § 5.13) : l'objet schema.org tiré de
3
+ * `site.business`, partagé par `<Seo>` (`@agence-zef/astro`) et l'aperçu du CMS (C-38).
4
+ */
5
+ const absolute = (origin, url) => /^https?:\/\//.test(url) ? url : `${origin}${url.startsWith("/") ? "" : "/"}${url}`;
6
+ /** Nœud schema.org de l'établissement (`@id` = `<origine>/#organization`). */
7
+ export function businessJsonLd(business, origin) {
8
+ const logo = business.logo ? absolute(origin, business.logo.url) : undefined;
9
+ const node = {
10
+ "@type": business.type,
11
+ "@id": `${origin}/#organization`,
12
+ name: business.name,
13
+ url: `${origin}/`,
14
+ logo,
15
+ image: logo,
16
+ description: business.description ?? undefined,
17
+ telephone: business.telephone ?? undefined,
18
+ email: business.email ?? undefined,
19
+ vatID: business.vatId ?? undefined,
20
+ identifier: business.siret
21
+ ? { "@type": "PropertyValue", propertyID: "SIRET", value: business.siret }
22
+ : undefined,
23
+ address: business.address ? { "@type": "PostalAddress", ...business.address } : undefined,
24
+ geo: business.geo ? { "@type": "GeoCoordinates", ...business.geo } : undefined,
25
+ openingHoursSpecification: business.openingHours.length
26
+ ? business.openingHours.map((h) => ({ "@type": "OpeningHoursSpecification", ...h }))
27
+ : undefined,
28
+ sameAs: business.sameAs.length ? business.sameAs : undefined,
29
+ ...business.extra,
30
+ };
31
+ for (const key of Object.keys(node))
32
+ if (node[key] === undefined)
33
+ delete node[key];
34
+ return node;
35
+ }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { ConfigCollections, CustomValuesOf, Registry, ZefConfig } from "@agence-zef/schema";
2
2
  import type { ApiAccess, ApiAccount, ApiAccountSession, ApiAccountUpdate, ApiCart, ApiCheckout, ApiCheckoutInput, ApiGiftCardInput, ApiItem, ApiLayout, ApiLink, ApiList, ApiOrder, ApiPage, ApiPageEntry, ApiPlayback, ApiPreviewDocument, ApiRedirect, ApiRegisterInput, ApiSection, ApiServicePoint, ApiShippingOption, ApiSite, ApiSubscription, ApiSyncResult } from "./types.js";
3
+ export { businessJsonLd } from "./business.js";
3
4
  export type * from "./types.js";
4
5
  /** Erreur renvoyée par l'API (clé invalide, schéma refusé…). */
5
6
  export declare class ZefApiError extends Error {
@@ -65,6 +66,15 @@ export declare function createClient<C extends ZefConfig = ZefConfig>(options: C
65
66
  }) => Promise<ApiSection>;
66
67
  /** Vérifie la clé et enregistre le lien du dépôt (`zef link`). */
67
68
  link: () => Promise<ApiLink>;
69
+ /**
70
+ * Relève une visite sur une adresse inconnue du site (C-38 › Pages introuvables) : appelé par
71
+ * le serveur du site quand il répond 404. Le CMS écarte les robots et les adresses techniques.
72
+ */
73
+ reportNotFound: (input: {
74
+ path: string;
75
+ referrer?: string | null;
76
+ userAgent?: string | null;
77
+ }) => Promise<void>;
68
78
  /**
69
79
  * Module Comptes : comptes des personnes du site. `session` est le jeton gardé dans le cookie
70
80
  * du site ; `ip` l'adresse du visiteur (limites de débit, anti-robot).
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ export { businessJsonLd } from "./business.js";
1
2
  /** Erreur renvoyée par l'API (clé invalide, schéma refusé…). */
2
3
  export class ZefApiError extends Error {
3
4
  status;
@@ -95,6 +96,13 @@ export function createClient(options) {
95
96
  },
96
97
  /** Vérifie la clé et enregistre le lien du dépôt (`zef link`). */
97
98
  link: async () => required(await request("/link", { method: "POST" }), "Lien"),
99
+ /**
100
+ * Relève une visite sur une adresse inconnue du site (C-38 › Pages introuvables) : appelé par
101
+ * le serveur du site quand il répond 404. Le CMS écarte les robots et les adresses techniques.
102
+ */
103
+ reportNotFound: async (input) => {
104
+ await request("/not-found", { method: "POST", body: input });
105
+ },
98
106
  /**
99
107
  * Module Comptes : comptes des personnes du site. `session` est le jeton gardé dans le cookie
100
108
  * du site ; `ip` l'adresse du visiteur (limites de débit, anti-robot).
package/dist/types.d.ts CHANGED
@@ -29,6 +29,59 @@ export type ApiSite = {
29
29
  ga4: null;
30
30
  /** Réglages publics du module Comptes (U-03), `null` s'il n'est pas activé. */
31
31
  accounts: ApiAccountsSettings | null;
32
+ /**
33
+ * Établissement déclaré dans Référencement › Données structurées (C-38), `null` tant que
34
+ * rien n'est déclaré : `<Seo>` en tire les données structurées, le footer peut l'afficher.
35
+ */
36
+ business?: ApiBusiness | null;
37
+ /** Code personnalisé (C-38) : blocs actifs, déjà préparés pour le bandeau cookies. */
38
+ customCode?: ApiCodeBlock[];
39
+ };
40
+ /** Bloc de code personnalisé servi au site. */
41
+ export type ApiCodeBlock = {
42
+ placement: "head_start" | "head_end" | "body_end";
43
+ /**
44
+ * HTML à écrire tel quel. Bloc d'une catégorie de cookies facultative : ses scripts sont en
45
+ * `type="text/plain"` avec `data-category`, lancés par le bandeau après l'accord.
46
+ */
47
+ html: string;
48
+ /** Adresses des pages qui reçoivent le bloc (toutes les langues), `null` = tout le site. */
49
+ paths: string[] | null;
50
+ };
51
+ /** Établissement du site, prêt pour schema.org. */
52
+ export type ApiBusiness = {
53
+ /** Type schema.org (`LiquorStore`, `Restaurant`, `Organization`…). */
54
+ type: string;
55
+ name: string;
56
+ logo: Media | null;
57
+ description: string | null;
58
+ siret: string | null;
59
+ vatId: string | null;
60
+ telephone: string | null;
61
+ email: string | null;
62
+ address: {
63
+ streetAddress: string;
64
+ postalCode: string;
65
+ addressLocality: string;
66
+ /** Code pays (`FR`). */
67
+ addressCountry: string;
68
+ } | null;
69
+ geo: {
70
+ latitude: number;
71
+ longitude: number;
72
+ } | null;
73
+ /** `OpeningHoursSpecification` ; une fermeture exceptionnelle va de 00:00 à 00:00. */
74
+ openingHours: {
75
+ dayOfWeek: string[];
76
+ opens: string;
77
+ closes: string;
78
+ validFrom?: string;
79
+ validThrough?: string;
80
+ }[];
81
+ /** Profils en ligne : fiche Google, réseaux sociaux, annuaires. */
82
+ sameAs: string[];
83
+ /** Propriétés propres au type (`priceRange`, `servesCuisine`, `hasMenu`…). */
84
+ extra: Record<string, string | string[]>;
32
85
  };
33
86
  /** Ce que le site doit savoir pour ses formulaires de compte. */
34
87
  export type ApiAccountsSettings = {
@@ -66,6 +119,11 @@ export type ApiSeo = {
66
119
  canonical: string | null;
67
120
  /** Image de partage (1200 × 630 conseillé), sinon `null` : celle du gabarit du site. */
68
121
  image: Media | null;
122
+ /**
123
+ * JSON-LD en plus de la page (onglet SEO de l'éditeur), déjà validé : `<Seo>` l'ajoute au graphe.
124
+ * Absent quand il n'y en a pas.
125
+ */
126
+ jsonLd?: Record<string, unknown>[];
69
127
  };
70
128
  export type ApiPage = {
71
129
  id: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agence-zef/sdk",
3
- "version": "0.13.2",
3
+ "version": "0.14.0",
4
4
  "description": "Client typé de l'API d'un CMS ZEF (client.agence-zef.fr/api/v1).",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -17,7 +17,7 @@
17
17
  "access": "public"
18
18
  },
19
19
  "dependencies": {
20
- "@agence-zef/schema": "0.17.1"
20
+ "@agence-zef/schema": "0.18.0"
21
21
  },
22
22
  "homepage": "https://agence-zef.fr",
23
23
  "scripts": {