strapi-rest-lite 0.1.5 → 0.1.7

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.
Files changed (47) hide show
  1. package/README.md +53 -27
  2. package/dist/constants/populate.d.ts +15 -0
  3. package/dist/constants/populate.d.ts.map +1 -0
  4. package/dist/constants/populate.js +18 -0
  5. package/dist/constants/populate.js.map +1 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/models/article.d.ts +5 -6
  11. package/dist/models/article.d.ts.map +1 -1
  12. package/dist/models/block.d.ts +6 -0
  13. package/dist/models/block.d.ts.map +1 -0
  14. package/dist/models/block.js +2 -0
  15. package/dist/models/block.js.map +1 -0
  16. package/dist/models/index.d.ts +2 -0
  17. package/dist/models/index.d.ts.map +1 -1
  18. package/dist/models/index.js +2 -0
  19. package/dist/models/index.js.map +1 -1
  20. package/dist/models/page.d.ts +2 -2
  21. package/dist/models/page.d.ts.map +1 -1
  22. package/dist/models/seo.d.ts +11 -0
  23. package/dist/models/seo.d.ts.map +1 -0
  24. package/dist/models/seo.js +2 -0
  25. package/dist/models/seo.js.map +1 -0
  26. package/dist/repositories/collection-repository.d.ts.map +1 -1
  27. package/dist/repositories/collection-repository.js +8 -4
  28. package/dist/repositories/collection-repository.js.map +1 -1
  29. package/dist/repositories/contracts.d.ts +13 -0
  30. package/dist/repositories/contracts.d.ts.map +1 -1
  31. package/dist/services/article-service.d.ts.map +1 -1
  32. package/dist/services/article-service.js +9 -2
  33. package/dist/services/article-service.js.map +1 -1
  34. package/dist/services/category-service.d.ts.map +1 -1
  35. package/dist/services/category-service.js +1 -3
  36. package/dist/services/category-service.js.map +1 -1
  37. package/dist/services/page-service.d.ts.map +1 -1
  38. package/dist/services/page-service.js +2 -1
  39. package/dist/services/page-service.js.map +1 -1
  40. package/dist/services/product-service.d.ts.map +1 -1
  41. package/dist/services/product-service.js +2 -1
  42. package/dist/services/product-service.js.map +1 -1
  43. package/dist/utils/normalize.d.ts +4 -0
  44. package/dist/utils/normalize.d.ts.map +1 -0
  45. package/dist/utils/normalize.js +37 -0
  46. package/dist/utils/normalize.js.map +1 -0
  47. package/package.json +2 -3
package/README.md CHANGED
@@ -1,6 +1,12 @@
1
1
  # strapi-rest-lite
2
2
 
3
- Leichte TypeScript-SDK für Strapi v4 REST-Collections (ESM-only). Sie liefert fertige Repositories/Services für typische Content-Typen sowie generische Helfer, um eigene Collections anzubinden.
3
+ TypeScript-SDK (ESM) für Strapi v4 REST: flache, typisierte Responses, fertige Repositories/Services für Artikel, Kategorien, Pages, Produkte und generische Helfer für eigene Collections.
4
+
5
+ ## Was macht das Paket?
6
+ - Baut auf Strapi REST v4 auf, nimmt dir das Query-Building ab und normalisiert Responses (`data/attributes`, Relationen, Media) zu flachen Objekten.
7
+ - Liefert vorgefertigte Repositories/Services mit sinnvollen Populate-Defaults je Typ.
8
+ - Enthält Models/Typen für die Standard-Content-Types und Exports für eigene Typen/Collections.
9
+ - Ermöglicht Override von Collection-Slugs, Populate-Defaults und eigener Query-Nutzung.
4
10
 
5
11
  ## Installation
6
12
 
@@ -15,39 +21,40 @@ npm install strapi-rest-lite
15
21
  import { createRepositories, createServices } from 'strapi-rest-lite'
16
22
 
17
23
  const apiBase = 'https://cms.example.com/api'
18
-
19
- // Kombinierte Repositories (Articles, Categories, Pages, Products)
20
- const repositories = createRepositories(apiBase)
21
-
22
- // Optionale Services mit sinnvollen Defaults (populate: '*')
23
- const services = createServices(repositories)
24
+ const repositories = createRepositories(apiBase) // Artikel, Kategorien, Pages, Produkte
25
+ const services = createServices(repositories) // mit Populate-Defaults
24
26
 
25
27
  const article = await services.articleService.getBySlug('hello-world', { locale: 'en' })
26
28
  console.log(article.data?.title)
27
29
  ```
28
30
 
29
- Mit eigenen Collection-Slugs (z.B. abweichendes Strapi-Schema):
31
+ Eigene Collection-Slugs (wenn dein Strapi andere Routen nutzt):
30
32
 
31
33
  ```ts
32
34
  import { createRepositories, CollectionName } from 'strapi-rest-lite'
33
35
 
34
36
  const repositories = createRepositories(apiBase, {
35
37
  product: 'shop-products',
36
- page: CollectionName.Page, // enum für Defaults
38
+ page: CollectionName.Page, // Enum für Defaults
37
39
  })
38
40
  ```
39
41
 
42
+ Populate überschreiben pro Call (statt Defaults):
43
+
44
+ ```ts
45
+ await services.articleService.getBySlug('hello-world', { populate: ['author', 'seo'] })
46
+ ```
47
+
40
48
  ## Bausteine
41
49
 
42
- - `createStrapiClient(apiBase)`: dünner `ofetch`-Wrapper mit Querystring-Building.
43
- - `createCollectionRepository(collectionName, httpClient)`: generisches Repository mit `findAll`, `findOneById`, `findOneBySlug` (Slug via Filter).
44
- - Vorkonfigurierte Repositories: `createArticleRepository`, `createCategoryRepository`, `createPageRepository`, `createProductRepository` (jeweils optionaler `collectionName`-Parameter).
45
- - `createRepositories(apiBase, collections?)`: bündelt die o.g. Repos; `collections` erlaubt Overrides pro Typ.
46
- - `CollectionName`-Enum: zentrale Default-Slugs (`articles`, `categories`, `pages`, `products`).
47
- - `createCollectionService(repository)`: Service mit semantischen Methoden (`list`, `getById`, `getBySlug`).
48
- - `withDefaults(factory, defaults)`: merged Default-Queries (z.B. `populate: '*'`) in jeden Service-Call.
49
- - Vorkonfigurierte Services: `createArticleService`, `createCategoryService`, `createPageService`, `createProductService`, plus `createServices(repositories)`.
50
- - Typen/Models: `RepositoryQuery`, `CollectionRepository`, `CollectionService`, Strapi-Response-Typen und Models (`Article`, `Category`, `Page`, `Product`, `Author`).
50
+ - `createStrapiClient(apiBase)`: `ofetch`-Wrapper mit Query-Serializer.
51
+ - `createCollectionRepository(collectionName, httpClient)`: generisches Repo mit `findAll`, `findOneById`, `findOneBySlug`.
52
+ - Vorkonfigurierte Repositories: `createArticleRepository`, `createCategoryRepository`, `createPageRepository`, `createProductRepository`.
53
+ - `createRepositories(apiBase, collections?)`: bündelt die Repos, erlaubt Slug-Overrides.
54
+ - `CollectionName`-Enum: Default-Slugs (`articles`, `categories`, `pages`, `products`).
55
+ - Services: `createCollectionService`, `withDefaults` (mergt Default-Queries), plus fertige Services für Artikel/Kategorie/Page/Produkt.
56
+ - Populate-Enums: `ArticlePopulate`, `PagePopulate`, `ProductPopulate` (für klare Defaults/Overrides).
57
+ - Normalizer: `normalizeCollectionResponse`, `normalizeSingleResponse` machen Strapi-REST flach.
51
58
 
52
59
  ### Eigene Collection anbinden
53
60
 
@@ -59,29 +66,48 @@ type FAQ = { id: number; question: string; answer: string }
59
66
  const client = createStrapiClient('https://cms.example.com/api')
60
67
  const faqRepository = createCollectionRepository<FAQ>('faqs', client)
61
68
 
62
- const faqs = await faqRepository.findAll({ locale: 'de' })
69
+ const faqs = await faqRepository.findAll({ locale: 'de', populate: ['seo'] })
63
70
  ```
64
71
 
65
72
  ## Queries (RepositoryQuery)
66
73
 
67
74
  Unterstützt Strapi-Standardparameter:
68
-
69
- - `populate`: `'*'` oder Feldnamen/Arrays.
75
+ - `populate`: `'*'` oder Feldnamen/Arrays (siehe Populate-Enums).
70
76
  - `filters`: beliebige Filter-Objekte (werden korrekt zu Querystring serialisiert).
71
77
  - `sort`, `fields`, `pagination`, `locale`, weitere Schlüssel möglich.
72
78
 
73
- `mergeFilters(query, filters)` hilft, zusätzliche Filter mit bestehenden zu kombinieren.
79
+ `mergeFilters(query, filters)` hilft, zusätzliche Filter mit bestehenden zu kombinieren (z. B. Slug).
80
+
81
+ ## Strapi-Schema (erforderliche Felder)
82
+
83
+ Damit die SDK-Typen ohne zusätzliches Mapping funktionieren, sollten die Content-Types in Strapi so aussehen (die SDK normalisiert `data/attributes` automatisch):
84
+
85
+ - **Article (`articles`)**
86
+ - Felder: `title`, `description`, `slug` (UID), `cover` (Media → URL), `blocks` (Dynamic Zone/Component mit `body` o. ä.), `seo` (Component mit `metaTitle`, `metaDescription`, `shareImage`/`metaImage`), optional `documentId`.
87
+ - Relationen: `author`, `category`.
88
+ - Erwartet flach: `cover` als String/URL, `blocks` als Array `{ __component, id?, body? }`, `seo` flach.
89
+
90
+ - **Page (`pages`)**
91
+ - Felder: `title`, `description?`, `slug` (UID), `primarypage` (Boolean), `dynamic` (DZ, z. B. `shared.rich-text`, `shared.seo`), `seo`.
92
+ - DZ als Array mit `__component`, `id` etc.
74
93
 
75
- ## Typen
94
+ - **Category (`categories`)**: `name`, `slug` (UID), `description?`, optional `documentId`.
95
+ - **Author (`authors`)**: `name`, `email?`, `avatar?` (Media → URL), optional `documentId`.
96
+ - **Product (`products`)**: `title`, `slug` (UID), `description?`, `price?`, `sku?`, `cover?` (Media → URL), optional `documentId`.
76
97
 
77
- Die Modelle sind in `src/models` definiert und über den Package-Export verfügbar. Sie orientieren sich an den Strapi-Content-Types (Artikel, Kategorie, Seite, Produkt, Author).
98
+ ### Populate-Defaults der Services
99
+ - Article: `author`, `category`, `blocks`, `seo`, `cover`
100
+ - Page: `dynamic`, `seo`
101
+ - Product: `cover`
102
+ - Category: keine Defaults
103
+ Diese Defaults kannst du pro Call überschreiben.
78
104
 
79
105
  ## Build / Release
80
106
 
81
107
  ```bash
82
108
  npm run build # erzeugt dist/ mit ESM + .d.ts
83
- npm pack # optional zum Prüfen des tarballs
84
- # vor dem Publish: Repository-Felder im package.json anpassen, npm publish --cache .npm-cache
109
+ npm pack # optional zum Prüfen des Tarballs
110
+ # Publish: npm publish --access public --otp <code>
85
111
  ```
86
112
 
87
- Das Paket ist ESM-only (`"type": "module"`, `moduleResolution: NodeNext`) und exportiert den Root-Eintragspunkt über das `exports`-Feld.
113
+ Das Paket ist ESM-only (`"type": "module"`, `moduleResolution: NodeNext`) und exportiert den Root-Eintragspunkt über `exports`.
@@ -0,0 +1,15 @@
1
+ export declare enum ArticlePopulate {
2
+ Author = "author",
3
+ Category = "category",
4
+ Blocks = "blocks",
5
+ Seo = "seo",
6
+ Cover = "cover"
7
+ }
8
+ export declare enum PagePopulate {
9
+ Dynamic = "dynamic",
10
+ Seo = "seo"
11
+ }
12
+ export declare enum ProductPopulate {
13
+ Cover = "cover"
14
+ }
15
+ //# sourceMappingURL=populate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populate.d.ts","sourceRoot":"","sources":["../../src/constants/populate.ts"],"names":[],"mappings":"AAAA,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,MAAM,WAAW;IACjB,GAAG,QAAQ;IACX,KAAK,UAAU;CAChB;AAED,oBAAY,YAAY;IACtB,OAAO,YAAY;IACnB,GAAG,QAAQ;CACZ;AAED,oBAAY,eAAe;IACzB,KAAK,UAAU;CAChB"}
@@ -0,0 +1,18 @@
1
+ export var ArticlePopulate;
2
+ (function (ArticlePopulate) {
3
+ ArticlePopulate["Author"] = "author";
4
+ ArticlePopulate["Category"] = "category";
5
+ ArticlePopulate["Blocks"] = "blocks";
6
+ ArticlePopulate["Seo"] = "seo";
7
+ ArticlePopulate["Cover"] = "cover";
8
+ })(ArticlePopulate || (ArticlePopulate = {}));
9
+ export var PagePopulate;
10
+ (function (PagePopulate) {
11
+ PagePopulate["Dynamic"] = "dynamic";
12
+ PagePopulate["Seo"] = "seo";
13
+ })(PagePopulate || (PagePopulate = {}));
14
+ export var ProductPopulate;
15
+ (function (ProductPopulate) {
16
+ ProductPopulate["Cover"] = "cover";
17
+ })(ProductPopulate || (ProductPopulate = {}));
18
+ //# sourceMappingURL=populate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populate.js","sourceRoot":"","sources":["../../src/constants/populate.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,wCAAqB,CAAA;IACrB,oCAAiB,CAAA;IACjB,8BAAW,CAAA;IACX,kCAAe,CAAA;AACjB,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B;AAED,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,mCAAmB,CAAA;IACnB,2BAAW,CAAA;AACb,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAED,MAAM,CAAN,IAAY,eAEX;AAFD,WAAY,eAAe;IACzB,kCAAe,CAAA;AACjB,CAAC,EAFW,eAAe,KAAf,eAAe,QAE1B"}
package/dist/index.d.ts CHANGED
@@ -15,4 +15,6 @@ export * from './services/category-service.js';
15
15
  export * from './services/page-service.js';
16
16
  export * from './services/product-service.js';
17
17
  export * from './services/index.js';
18
+ export * from './utils/normalize.js';
19
+ export * from './constants/populate.js';
18
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AAEjC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yCAAyC,CAAA;AACvD,cAAc,sCAAsC,CAAA;AACpD,cAAc,uCAAuC,CAAA;AACrD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA;AACpD,cAAc,yBAAyB,CAAA;AAEvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AAEjC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yCAAyC,CAAA;AACvD,cAAc,sCAAsC,CAAA;AACpD,cAAc,uCAAuC,CAAA;AACrD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA;AACpD,cAAc,yBAAyB,CAAA;AAEvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,qBAAqB,CAAA;AAEnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA"}
package/dist/index.js CHANGED
@@ -15,4 +15,6 @@ export * from './services/category-service.js';
15
15
  export * from './services/page-service.js';
16
16
  export * from './services/product-service.js';
17
17
  export * from './services/index.js';
18
+ export * from './utils/normalize.js';
19
+ export * from './constants/populate.js';
18
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AAEjC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yCAAyC,CAAA;AACvD,cAAc,sCAAsC,CAAA;AACpD,cAAc,uCAAuC,CAAA;AACrD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA;AACpD,cAAc,yBAAyB,CAAA;AAEvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AAEjC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yCAAyC,CAAA;AACvD,cAAc,sCAAsC,CAAA;AACpD,cAAc,uCAAuC,CAAA;AACrD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA;AACpD,cAAc,yBAAyB,CAAA;AAEvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,qBAAqB,CAAA;AAEnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA"}
@@ -1,21 +1,20 @@
1
1
  import type { Author } from './author.js';
2
2
  import type { Category } from './category.js';
3
+ import type { Block } from './block.js';
4
+ import type { SeoMeta } from './seo.js';
3
5
  export interface Article {
4
6
  id: number;
5
7
  documentId: string;
6
8
  title: string;
7
9
  description: string;
8
10
  slug: string;
9
- cover?: string | null;
11
+ cover: string | null;
10
12
  createdAt: string;
11
13
  updatedAt: string;
12
14
  publishedAt: string;
13
15
  author: Author;
14
16
  category: Category;
15
- blocks?: Array<{
16
- id?: number;
17
- body?: string;
18
- }>;
19
- seo?: Record<string, unknown>;
17
+ blocks: Block[];
18
+ seo?: SeoMeta;
20
19
  }
21
20
  //# sourceMappingURL=article.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"article.d.ts","sourceRoot":"","sources":["../../src/models/article.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B"}
1
+ {"version":3,"file":"article.d.ts","sourceRoot":"","sources":["../../src/models/article.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAEvC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;CACd"}
@@ -0,0 +1,6 @@
1
+ export interface Block {
2
+ __component: string;
3
+ id?: number;
4
+ body?: string;
5
+ }
6
+ //# sourceMappingURL=block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../src/models/block.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/models/block.ts"],"names":[],"mappings":""}
@@ -3,4 +3,6 @@ export * from './category.js';
3
3
  export * from './page.js';
4
4
  export * from './article.js';
5
5
  export * from './product.js';
6
+ export * from './block.js';
7
+ export * from './seo.js';
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA"}
@@ -3,4 +3,6 @@ export * from './category.js';
3
3
  export * from './page.js';
4
4
  export * from './article.js';
5
5
  export * from './product.js';
6
+ export * from './block.js';
7
+ export * from './seo.js';
6
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA"}
@@ -1,7 +1,7 @@
1
1
  export interface Page {
2
2
  id: number;
3
3
  documentId: string;
4
- Title: string;
4
+ title: string;
5
5
  slug: string;
6
6
  primarypage: boolean;
7
7
  description?: string | null;
@@ -10,7 +10,7 @@ export interface Page {
10
10
  id: number;
11
11
  [key: string]: any;
12
12
  }>;
13
- seo?: Record<string, unknown>;
13
+ seo?: import('./seo.js').SeoMeta;
14
14
  createdAt: string;
15
15
  updatedAt: string;
16
16
  publishedAt: string;
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/models/page.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,WAAW,EAAE,MAAM,CAAA;QACnB,EAAE,EAAE,MAAM,CAAA;QACV,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAC,CAAA;IACF,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/models/page.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,WAAW,EAAE,MAAM,CAAA;QACnB,EAAE,EAAE,MAAM,CAAA;QACV,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAC,CAAA;IACF,GAAG,CAAC,EAAE,OAAO,UAAU,EAAE,OAAO,CAAA;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB"}
@@ -0,0 +1,11 @@
1
+ export interface SeoMeta {
2
+ metaTitle?: string | null;
3
+ metaDescription?: string | null;
4
+ shareImage?: string | {
5
+ url?: string | null;
6
+ } | null;
7
+ metaImage?: string | {
8
+ url?: string | null;
9
+ } | null;
10
+ }
11
+ //# sourceMappingURL=seo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../src/models/seo.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;IACpD,SAAS,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CACpD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=seo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.js","sourceRoot":"","sources":["../../src/models/seo.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"collection-repository.d.ts","sourceRoot":"","sources":["../../src/repositories/collection-repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,UAAU,EAIX,MAAM,gBAAgB,CAAA;AAGvB;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAC1C,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,UAAU,GACf,oBAAoB,CAAC,CAAC,CAAC,CA2BzB"}
1
+ {"version":3,"file":"collection-repository.d.ts","sourceRoot":"","sources":["../../src/repositories/collection-repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,UAAU,EAIX,MAAM,gBAAgB,CAAA;AAIvB;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAC1C,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,UAAU,GACf,oBAAoB,CAAC,CAAC,CAAC,CA8BzB"}
@@ -1,4 +1,5 @@
1
1
  import { mergeFilters } from './strapi-client.js';
2
+ import { normalizeCollectionResponse, normalizeSingleResponse } from '../utils/normalize.js';
2
3
  /**
3
4
  * Erstellt ein Repository für eine Strapi-Collection.
4
5
  * Dieses Repository kapselt alle API-Aufrufe für eine bestimmte Daten-Collection.
@@ -7,21 +8,24 @@ export function createCollectionRepository(collectionName, http) {
7
8
  const baseUrl = `/${collectionName}`;
8
9
  return {
9
10
  async findAll(query) {
10
- return http.get(baseUrl, query);
11
+ const response = await http.get(baseUrl, query);
12
+ return normalizeCollectionResponse(response);
11
13
  },
12
14
  async findOneById(id, query) {
13
15
  const url = `${baseUrl}/${id}`;
14
- return http.get(url, query);
16
+ const response = await http.get(url, query);
17
+ return normalizeSingleResponse(response);
15
18
  },
16
19
  async findOneBySlug(slug, query) {
17
20
  const finalQuery = mergeFilters(query, {
18
21
  slug: { $eq: slug },
19
22
  });
20
23
  const result = await http.get(baseUrl, finalQuery);
24
+ const normalized = normalizeCollectionResponse(result);
21
25
  // Strapi gibt ein Array zurück
22
26
  return {
23
- data: result.data[0] ?? null,
24
- meta: result.meta,
27
+ data: normalized.data[0] ?? null,
28
+ meta: normalized.meta,
25
29
  };
26
30
  },
27
31
  };
@@ -1 +1 @@
1
- {"version":3,"file":"collection-repository.js","sourceRoot":"","sources":["../../src/repositories/collection-repository.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,cAAsB,EACtB,IAAgB;IAEhB,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAA;IAEpC,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,KAAuB;YACnC,OAAO,IAAI,CAAC,GAAG,CAA8B,OAAO,EAAE,KAAK,CAAC,CAAA;QAC9D,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,EAAmB,EAAE,KAAuB;YAC5D,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,EAAE,EAAE,CAAA;YAC9B,OAAO,IAAI,CAAC,GAAG,CAA0B,GAAG,EAAE,KAAK,CAAC,CAAA;QACtD,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,KAAuB;YACvD,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE;gBACrC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;aACpB,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAA8B,OAAO,EAAE,UAAU,CAAC,CAAA;YAE/E,+BAA+B;YAC/B,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI;gBAC5B,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"collection-repository.js","sourceRoot":"","sources":["../../src/repositories/collection-repository.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAE5F;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,cAAsB,EACtB,IAAgB;IAEhB,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAA;IAEpC,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,KAAuB;YACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAA8B,OAAO,EAAE,KAAK,CAAC,CAAA;YAC5E,OAAO,2BAA2B,CAAI,QAAQ,CAAC,CAAA;QACjD,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,EAAmB,EAAE,KAAuB;YAC5D,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,EAAE,EAAE,CAAA;YAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAA0B,GAAG,EAAE,KAAK,CAAC,CAAA;YACpE,OAAO,uBAAuB,CAAI,QAAQ,CAAC,CAAA;QAC7C,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,KAAuB;YACvD,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE;gBACrC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;aACpB,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAA8B,OAAO,EAAE,UAAU,CAAC,CAAA;YAC/E,MAAM,UAAU,GAAG,2BAA2B,CAAI,MAAM,CAAC,CAAA;YAEzD,+BAA+B;YAC/B,OAAO;gBACL,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI;gBAChC,IAAI,EAAE,UAAU,CAAC,IAAI;aACtB,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -17,6 +17,19 @@ export interface StrapiSingleResponse<T> {
17
17
  meta?: StrapiMeta;
18
18
  }
19
19
  export type StrapiPopulate = '*' | string | string[];
20
+ export interface StrapiRestEntity<T> {
21
+ id: number | string;
22
+ attributes: T;
23
+ [key: string]: unknown;
24
+ }
25
+ export interface StrapiRestCollection<T> {
26
+ data: Array<StrapiRestEntity<T>>;
27
+ meta: StrapiMeta;
28
+ }
29
+ export interface StrapiRestSingle<T> {
30
+ data: StrapiRestEntity<T> | null;
31
+ meta?: StrapiMeta;
32
+ }
20
33
  export interface RepositoryQuery {
21
34
  populate?: StrapiPopulate;
22
35
  sort?: string | string[];
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/repositories/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAElD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAA;CAC9B;AAED,MAAM,WAAW,wBAAwB,CAAC,CAAC;IACzC,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AAEpD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,gBAAgB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACtE;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAA;IACtE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3F,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;CACvF"}
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/repositories/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAElD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAA;CAC9B;AAED,MAAM,WAAW,wBAAwB,CAAC,CAAC;IACzC,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AAGpD,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,UAAU,EAAE,CAAC,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,IAAI,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;IAChC,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAChC,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,gBAAgB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACtE;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAA;IACtE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3F,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;CACvF"}
@@ -1 +1 @@
1
- {"version":3,"file":"article-service.d.ts","sourceRoot":"","sources":["../../src/services/article-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAQnD,eAAO,MAAM,oBAAoB,4DAE/B,CAAA"}
1
+ {"version":3,"file":"article-service.d.ts","sourceRoot":"","sources":["../../src/services/article-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AASnD,eAAO,MAAM,oBAAoB,4DAQ/B,CAAA"}
@@ -1,7 +1,14 @@
1
1
  import { createCollectionService, withDefaults } from './collection-service.js';
2
+ import { ArticlePopulate } from '../constants/populate.js';
2
3
  const createBaseArticleService = (repository) => createCollectionService(repository);
3
- // Default populate to fetch related author/category/blocks unless overridden.
4
+ // Default populate to fetch related author/category/blocks/seo unless overridden.
4
5
  export const createArticleService = withDefaults(createBaseArticleService, {
5
- populate: '*',
6
+ populate: [
7
+ ArticlePopulate.Author,
8
+ ArticlePopulate.Category,
9
+ ArticlePopulate.Blocks,
10
+ ArticlePopulate.Seo,
11
+ ArticlePopulate.Cover,
12
+ ],
6
13
  });
7
14
  //# sourceMappingURL=article-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"article-service.js","sourceRoot":"","sources":["../../src/services/article-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE/E,MAAM,wBAAwB,GAAG,CAAC,UAAyC,EAAE,EAAE,CAC7E,uBAAuB,CAAU,UAAU,CAAC,CAAA;AAE9C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAU,wBAAwB,EAAE;IAClF,QAAQ,EAAE,GAAG;CACd,CAAC,CAAA"}
1
+ {"version":3,"file":"article-service.js","sourceRoot":"","sources":["../../src/services/article-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,MAAM,wBAAwB,GAAG,CAAC,UAAyC,EAAE,EAAE,CAC7E,uBAAuB,CAAU,UAAU,CAAC,CAAA;AAE9C,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAU,wBAAwB,EAAE;IAClF,QAAQ,EAAE;QACR,eAAe,CAAC,MAAM;QACtB,eAAe,CAAC,QAAQ;QACxB,eAAe,CAAC,MAAM;QACtB,eAAe,CAAC,GAAG;QACnB,eAAe,CAAC,KAAK;KACtB;CACF,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"category-service.d.ts","sourceRoot":"","sources":["../../src/services/category-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAOrD,eAAO,MAAM,qBAAqB,6DAEhC,CAAA"}
1
+ {"version":3,"file":"category-service.d.ts","sourceRoot":"","sources":["../../src/services/category-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAOrD,eAAO,MAAM,qBAAqB,6DAAwD,CAAA"}
@@ -1,6 +1,4 @@
1
1
  import { createCollectionService, withDefaults } from './collection-service.js';
2
2
  const createBaseCategoryService = (repository) => createCollectionService(repository);
3
- export const createCategoryService = withDefaults(createBaseCategoryService, {
4
- populate: '*',
5
- });
3
+ export const createCategoryService = withDefaults(createBaseCategoryService, {});
6
4
  //# sourceMappingURL=category-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"category-service.js","sourceRoot":"","sources":["../../src/services/category-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE/E,MAAM,yBAAyB,GAAG,CAAC,UAA0C,EAAE,EAAE,CAC/E,uBAAuB,CAAW,UAAU,CAAC,CAAA;AAE/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAW,yBAAyB,EAAE;IACrF,QAAQ,EAAE,GAAG;CACd,CAAC,CAAA"}
1
+ {"version":3,"file":"category-service.js","sourceRoot":"","sources":["../../src/services/category-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE/E,MAAM,yBAAyB,GAAG,CAAC,UAA0C,EAAE,EAAE,CAC/E,uBAAuB,CAAW,UAAU,CAAC,CAAA;AAE/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAW,yBAAyB,EAAE,EAAE,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"page-service.d.ts","sourceRoot":"","sources":["../../src/services/page-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAO7C,eAAO,MAAM,iBAAiB,yDAE5B,CAAA"}
1
+ {"version":3,"file":"page-service.d.ts","sourceRoot":"","sources":["../../src/services/page-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAQ7C,eAAO,MAAM,iBAAiB,yDAE5B,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { createCollectionService, withDefaults } from './collection-service.js';
2
+ import { PagePopulate } from '../constants/populate.js';
2
3
  const createBasePageService = (repository) => createCollectionService(repository);
3
4
  export const createPageService = withDefaults(createBasePageService, {
4
- populate: '*',
5
+ populate: [PagePopulate.Dynamic, PagePopulate.Seo],
5
6
  });
6
7
  //# sourceMappingURL=page-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"page-service.js","sourceRoot":"","sources":["../../src/services/page-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE/E,MAAM,qBAAqB,GAAG,CAAC,UAAsC,EAAE,EAAE,CACvE,uBAAuB,CAAO,UAAU,CAAC,CAAA;AAE3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAO,qBAAqB,EAAE;IACzE,QAAQ,EAAE,GAAG;CACd,CAAC,CAAA"}
1
+ {"version":3,"file":"page-service.js","sourceRoot":"","sources":["../../src/services/page-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEvD,MAAM,qBAAqB,GAAG,CAAC,UAAsC,EAAE,EAAE,CACvE,uBAAuB,CAAO,UAAU,CAAC,CAAA;AAE3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAO,qBAAqB,EAAE;IACzE,QAAQ,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC;CACnD,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"product-service.d.ts","sourceRoot":"","sources":["../../src/services/product-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAOnD,eAAO,MAAM,oBAAoB,4DAE/B,CAAA"}
1
+ {"version":3,"file":"product-service.d.ts","sourceRoot":"","sources":["../../src/services/product-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAQnD,eAAO,MAAM,oBAAoB,4DAE/B,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { createCollectionService, withDefaults } from './collection-service.js';
2
+ import { ProductPopulate } from '../constants/populate.js';
2
3
  const createBaseProductService = (repository) => createCollectionService(repository);
3
4
  export const createProductService = withDefaults(createBaseProductService, {
4
- populate: '*',
5
+ populate: [ProductPopulate.Cover],
5
6
  });
6
7
  //# sourceMappingURL=product-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"product-service.js","sourceRoot":"","sources":["../../src/services/product-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE/E,MAAM,wBAAwB,GAAG,CAAC,UAAyC,EAAE,EAAE,CAC7E,uBAAuB,CAAU,UAAU,CAAC,CAAA;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAU,wBAAwB,EAAE;IAClF,QAAQ,EAAE,GAAG;CACd,CAAC,CAAA"}
1
+ {"version":3,"file":"product-service.js","sourceRoot":"","sources":["../../src/services/product-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,MAAM,wBAAwB,GAAG,CAAC,UAAyC,EAAE,EAAE,CAC7E,uBAAuB,CAAU,UAAU,CAAC,CAAA;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAU,wBAAwB,EAAE;IAClF,QAAQ,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;CAClC,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { StrapiCollectionResponse, StrapiRestCollection, StrapiRestSingle, StrapiSingleResponse } from '../repositories/contracts.js';
2
+ export declare const normalizeCollectionResponse: <T>(input: StrapiCollectionResponse<T> | StrapiRestCollection<T> | any) => StrapiCollectionResponse<T>;
3
+ export declare const normalizeSingleResponse: <T>(input: StrapiSingleResponse<T> | StrapiRestSingle<T> | any) => StrapiSingleResponse<T>;
4
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,8BAA8B,CAAA;AAuCrC,eAAO,MAAM,2BAA2B,GAAI,CAAC,EAC3C,OAAO,wBAAwB,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,GAAG,GAAG,KACjE,wBAAwB,CAAC,CAAC,CAG5B,CAAA;AAED,eAAO,MAAM,uBAAuB,GAAI,CAAC,EACvC,OAAO,oBAAoB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,GAAG,KACzD,oBAAoB,CAAC,CAAC,CAGxB,CAAA"}
@@ -0,0 +1,37 @@
1
+ const normalizeValue = (value) => {
2
+ if (value === null || value === undefined)
3
+ return value;
4
+ if (Array.isArray(value)) {
5
+ return value.map(normalizeValue);
6
+ }
7
+ if (typeof value !== 'object') {
8
+ return value;
9
+ }
10
+ // Relations/Media: { data: ... }
11
+ if ('data' in value) {
12
+ return normalizeValue(value.data);
13
+ }
14
+ // Strapi entity: { id, attributes }
15
+ if ('attributes' in value && 'id' in value) {
16
+ const { id, attributes, ...rest } = value;
17
+ const normalizedAttributes = normalizeValue(attributes);
18
+ const normalizedRest = normalizeObject(rest);
19
+ // Media objects often expose url; if attributes already normalized to primitive/url, keep it.
20
+ return normalizeValue({ id, ...normalizedAttributes, ...normalizedRest });
21
+ }
22
+ // Media objects: prefer url if present
23
+ if ('url' in value && typeof value.url === 'string') {
24
+ return value.url;
25
+ }
26
+ return normalizeObject(value);
27
+ };
28
+ const normalizeObject = (obj) => Object.fromEntries(Object.entries(obj).map(([key, val]) => [key, normalizeValue(val)]));
29
+ export const normalizeCollectionResponse = (input) => {
30
+ const data = Array.isArray(input?.data) ? input.data.map((item) => normalizeValue(item)) : [];
31
+ return { data, meta: input?.meta ?? {} };
32
+ };
33
+ export const normalizeSingleResponse = (input) => {
34
+ const entity = normalizeValue(input?.data ?? null);
35
+ return { data: entity, meta: input?.meta ?? {} };
36
+ };
37
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAOA,MAAM,cAAc,GAAG,CAAC,KAAU,EAAO,EAAE;IACzC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAEvD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAClC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,iCAAiC;IACjC,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,OAAO,cAAc,CAAE,KAA2B,CAAC,IAAI,CAAC,CAAA;IAC1D,CAAC;IAED,oCAAoC;IACpC,IAAI,YAAY,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;QAC3C,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,KAAmE,CAAA;QACvG,MAAM,oBAAoB,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;QACvD,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;QAE5C,8FAA8F;QAC9F,OAAO,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,oBAAoB,EAAE,GAAG,cAAc,EAAE,CAAC,CAAA;IAC3E,CAAC;IAED,uCAAuC;IACvC,IAAI,KAAK,IAAI,KAAK,IAAI,OAAQ,KAA2B,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC3E,OAAQ,KAA0B,CAAC,GAAG,CAAA;IACxC,CAAC;IAED,OAAO,eAAe,CAAC,KAAgC,CAAC,CAAA;AAC1D,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,GAA4B,EAA2B,EAAE,CAChF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAEzF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,KAAkE,EACrC,EAAE;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACvG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,KAA0D,EACjC,EAAE;IAC3B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAa,CAAA;IAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,CAAA;AAClD,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strapi-rest-lite",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -30,8 +30,7 @@
30
30
  },
31
31
  "homepage": "https://github.com/yakku361/strapi-rest-lite",
32
32
  "dependencies": {
33
- "ofetch": "^1.4.0",
34
- "strapi-rest-lite": "^0.1.3"
33
+ "ofetch": "^1.4.0"
35
34
  },
36
35
  "peerDependencies": {
37
36
  "nitropack": "^2.9.0"