kmcom-nuxt-layers 5.0.5 → 5.0.6
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/README.md +10 -10
- package/docs/USAGE.md +100 -60
- package/layers/content/nuxt.config.ts +8 -0
- package/layers/data/auth/server/routes/auth/github.get.ts +2 -0
- package/layers/data/database/server/utils/drizzle.ts +1 -0
- package/layers/data/database/server/utils/sql.ts +2 -0
- package/layers/data/forms/server/api/contact.post.ts +1 -0
- package/layers/data/forms/server/api/forms/status.get.ts +1 -0
- package/layers/data/mailer/server/utils/config.ts +2 -0
- package/layers/data/metadata/providers/comicvine/server/plugins/comicvine-register.ts +4 -0
- package/layers/data/metadata/providers/comicvine/server/utils/metadata-comicvine/client.ts +1 -0
- package/layers/data/metadata/providers/comicvine/server/utils/metadata-comicvine/provider.ts +7 -0
- package/layers/data/metadata/providers/google-books/server/plugins/google-books-register.ts +4 -0
- package/layers/data/metadata/providers/google-books/server/utils/metadata-google-books/client.ts +1 -0
- package/layers/data/metadata/providers/google-books/server/utils/metadata-google-books/normalise.ts +1 -0
- package/layers/data/metadata/providers/google-books/server/utils/metadata-google-books/provider.ts +2 -0
- package/layers/data/metadata/providers/openlibrary/server/plugins/openlibrary-register.ts +4 -0
- package/layers/data/metadata/providers/openlibrary/server/utils/metadata-openlibrary/normalise.ts +1 -0
- package/layers/data/metadata/providers/openlibrary/server/utils/metadata-openlibrary/provider.ts +6 -0
- package/layers/data/metadata/providers/themoviedb/server/plugins/tmdb-register.ts +4 -0
- package/layers/data/metadata/providers/themoviedb/server/utils/metadata-tmdb/client.ts +1 -0
- package/layers/data/metadata/providers/themoviedb/server/utils/metadata-tmdb/normalise.ts +1 -0
- package/layers/data/metadata/providers/themoviedb/server/utils/metadata-tmdb/provider.ts +2 -0
- package/layers/data/metadata/server/api/metadata/lookup.get.ts +3 -0
- package/layers/data/metadata/server/api/metadata/providers.get.ts +3 -0
- package/layers/data/metadata/server/api/metadata/search.get.ts +2 -0
- package/layers/data/metadata/server/api/metadata/status.get.ts +3 -0
- package/layers/data/metadata/server/api/metadata/sync.post.ts +3 -0
- package/layers/data/metadata/server/utils/metadata/cache.ts +1 -0
- package/layers/data/metadata/server/utils/metadata/search.ts +2 -0
- package/layers/delivery/feeds/server/routes/feed/[collection]/atom/all.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/[collection]/atom.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/[collection]/json/all.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/[collection]/json.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/[collection]/rss/all.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/[collection]/rss.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/atom/all.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/atom.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/demo.get.ts +4 -0
- package/layers/delivery/feeds/server/routes/feed/index.get.ts +2 -0
- package/layers/delivery/feeds/server/routes/feed/json/all.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/json.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/rss/all.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/rss.get.ts +5 -0
- package/layers/delivery/feeds/server/routes/feed/style.xsl.get.ts +2 -0
- package/layers/delivery/feeds/server/utils/cache.ts +1 -1
- package/layers/delivery/feeds/server/utils/content-adapter.ts +1 -1
- package/layers/delivery/feeds/server/utils/feed-service.ts +3 -1
- package/layers/render/shader/app/types/index.ts +1 -1
- package/layers/render/shader/app/types/renderer.ts +1 -1
- package/layers/structure/routing/server/api/feature-flags.get.ts +2 -0
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ npm install kmcom-nuxt-layers
|
|
|
13
13
|
export default defineNuxtConfig({
|
|
14
14
|
extends: [
|
|
15
15
|
'kmcom-nuxt-layers/layers/core',
|
|
16
|
-
'kmcom-nuxt-layers/layers/
|
|
16
|
+
'kmcom-nuxt-layers/layers/typography',
|
|
17
17
|
// add more layers as needed
|
|
18
18
|
]
|
|
19
19
|
})
|
|
@@ -23,16 +23,16 @@ export default defineNuxtConfig({
|
|
|
23
23
|
|
|
24
24
|
| Layer | Description |
|
|
25
25
|
|-------|-------------|
|
|
26
|
-
| **core** | Foundation — Nuxt UI, VueUse, Pinia, loading screen, error handling,
|
|
27
|
-
| **
|
|
28
|
-
| **layout** |
|
|
29
|
-
| **motion** | Animations — GSAP, Locomotive Scroll |
|
|
30
|
-
| **shader** | 3D / WebGPU — Three.js, TresJS |
|
|
31
|
-
| **forms** | Validation — Zod-based form system |
|
|
32
|
-
| **database** | Storage — Drizzle ORM + Neon Postgres |
|
|
33
|
-
| **auth** | Authentication — nuxt-auth-utils + GitHub OAuth |
|
|
34
|
-
| **theme** | Theming — color mode, accent colors |
|
|
26
|
+
| **core** | Foundation — Nuxt UI, VueUse, Pinia, loading screen, error handling, Element primitives |
|
|
27
|
+
| **theming** / **typography** / **visual** | Design system — accents, type, gradients, modals |
|
|
28
|
+
| **layout** / **navigation** / **routing** | Structure — grids, stacks, nav components, feature flags |
|
|
35
29
|
| **content** | CMS — @nuxt/content, Nuxt Studio |
|
|
30
|
+
| **database** / **auth** / **metadata** / **mailer** / **forms** | Data — Drizzle + Neon, GitHub OAuth, metadata providers, Resend, Zod forms |
|
|
31
|
+
| **scroll** / **animations** / **transitions** / **page-transitions** / **motion** | Motion — GSAP, Locomotive Scroll |
|
|
32
|
+
| **canvas** / **shader** | Render — TresJS, WebGPU/TSL |
|
|
33
|
+
| **seo** / **scripts** / **feeds** | Delivery — @nuxtjs/seo, @nuxt/scripts, RSS/Atom/JSON feeds |
|
|
34
|
+
|
|
35
|
+
Upgrading from v2: `ui` → `typography` + `navigation` + `visual`, `theme` → `theming`, `starter` removed.
|
|
36
36
|
|
|
37
37
|
All layers depend on `core`. Always list `core` first in `extends`.
|
|
38
38
|
|
package/docs/USAGE.md
CHANGED
|
@@ -10,106 +10,146 @@ npm install kmcom-nuxt-layers
|
|
|
10
10
|
|
|
11
11
|
## Basic Usage
|
|
12
12
|
|
|
13
|
-
Add layers to the `extends` array in your `nuxt.config.ts`. Each layer is
|
|
13
|
+
Add layers to the `extends` array in your `nuxt.config.ts`. Each layer is an entry in the package `exports` map:
|
|
14
14
|
|
|
15
15
|
```ts
|
|
16
16
|
// nuxt.config.ts
|
|
17
17
|
export default defineNuxtConfig({
|
|
18
|
-
extends: ['kmcom-nuxt-layers/layers/core', 'kmcom-nuxt-layers/layers/
|
|
18
|
+
extends: ['kmcom-nuxt-layers/layers/core', 'kmcom-nuxt-layers/layers/typography'],
|
|
19
19
|
})
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Every non-core layer declares its own `extends`, so you only list what you want. A misspelled or
|
|
23
|
+
removed layer name is **not** an error: Nuxt only warns `Cannot extend config from ...` and the
|
|
24
|
+
layer is silently skipped. Check the dev log for that warning after changing `extends`.
|
|
23
25
|
|
|
24
|
-
##
|
|
26
|
+
## Requirements
|
|
27
|
+
|
|
28
|
+
- `nuxt >= 4.6.1` (older 4.x resolves a mismatched `@nuxt/schema` and breaks Nitro config types).
|
|
29
|
+
- `typescript.strict: true`. The layers' sources are pulled into your `vue-tsc` graph and are
|
|
30
|
+
written for strict mode.
|
|
31
|
+
- If `@nuxtjs/seo` is enabled, pin `unhead` to a single version (pnpm `overrides`) so Nitro's
|
|
32
|
+
file trace includes `unhead/dist/legacy.mjs`.
|
|
33
|
+
|
|
34
|
+
### Expected warning: `NUXT_B5023`
|
|
35
|
+
|
|
36
|
+
On `nuxt dev`, `build` and `prepare` you will see one warning per layer:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
WARN [NUXT_B5023] The config file .../layers/core/nuxt.config.ts was loaded through jiti
|
|
40
|
+
because the runtime could not load it: Stripping types is currently unsupported for files
|
|
41
|
+
under node_modules
|
|
42
|
+
```
|
|
25
43
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
| **core** | `kmcom-nuxt-layers/layers/core` | — | `nuxt`, `@nuxt/ui`, `pinia`, `@vueuse/nuxt`, `@nuxtjs/device` |
|
|
29
|
-
| **ui** | `kmcom-nuxt-layers/layers/ui` | core | — |
|
|
30
|
-
| **layout** | `kmcom-nuxt-layers/layers/layout` | core | — |
|
|
31
|
-
| **motion** | `kmcom-nuxt-layers/layers/motion` | core | `gsap`, `locomotive-scroll` |
|
|
32
|
-
| **shader** | `kmcom-nuxt-layers/layers/shader` | core | `three`, `@tresjs/nuxt`, `@tresjs/core`, `@tresjs/cientos`, `@tresjs/post-processing` |
|
|
33
|
-
| **forms** | `kmcom-nuxt-layers/layers/forms` | core | `zod` |
|
|
34
|
-
| **theme** | `kmcom-nuxt-layers/layers/theme` | core | — |
|
|
35
|
-
| **content** | `kmcom-nuxt-layers/layers/content` | core | `@nuxt/content`, `better-sqlite3` |
|
|
44
|
+
This is expected and harmless. The layers ship `.ts` configs, Node refuses to strip types under
|
|
45
|
+
`node_modules`, and Nuxt falls back to jiti. Nothing is broken; startup is slightly slower.
|
|
36
46
|
|
|
37
|
-
##
|
|
47
|
+
## Available Layers
|
|
38
48
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
| Layer | Extends Path | Depends On |
|
|
50
|
+
| -------------------- | ------------------------------------------- | ------------------------------------ |
|
|
51
|
+
| **core** | `kmcom-nuxt-layers/layers/core` | — |
|
|
52
|
+
| **theming** | `kmcom-nuxt-layers/layers/theming` | core |
|
|
53
|
+
| **typography** | `kmcom-nuxt-layers/layers/typography` | core |
|
|
54
|
+
| **visual** | `kmcom-nuxt-layers/layers/visual` | core |
|
|
55
|
+
| **layout** | `kmcom-nuxt-layers/layers/layout` | core |
|
|
56
|
+
| **navigation** | `kmcom-nuxt-layers/layers/navigation` | core, scroll, layout, typography |
|
|
57
|
+
| **routing** | `kmcom-nuxt-layers/layers/routing` | core |
|
|
58
|
+
| **content** | `kmcom-nuxt-layers/layers/content` | core |
|
|
59
|
+
| **database** | `kmcom-nuxt-layers/layers/database` | core |
|
|
60
|
+
| **auth** | `kmcom-nuxt-layers/layers/auth` | core |
|
|
61
|
+
| **metadata** | `kmcom-nuxt-layers/layers/metadata` | core |
|
|
62
|
+
| **mailer** | `kmcom-nuxt-layers/layers/mailer` | core |
|
|
63
|
+
| **forms** | `kmcom-nuxt-layers/layers/forms` | mailer |
|
|
64
|
+
| **scroll** | `kmcom-nuxt-layers/layers/scroll` | core |
|
|
65
|
+
| **animations** | `kmcom-nuxt-layers/layers/animations` | scroll |
|
|
66
|
+
| **transitions** | `kmcom-nuxt-layers/layers/transitions` | core |
|
|
67
|
+
| **page-transitions** | `kmcom-nuxt-layers/layers/page-transitions` | core |
|
|
68
|
+
| **motion** | `kmcom-nuxt-layers/layers/motion` | scroll, animations, transitions, ... |
|
|
69
|
+
| **canvas** | `kmcom-nuxt-layers/layers/canvas` | core |
|
|
70
|
+
| **shader** | `kmcom-nuxt-layers/layers/shader` | canvas |
|
|
71
|
+
| **seo** | `kmcom-nuxt-layers/layers/seo` | core |
|
|
72
|
+
| **scripts** | `kmcom-nuxt-layers/layers/scripts` | core |
|
|
73
|
+
| **feeds** | `kmcom-nuxt-layers/layers/feeds` | core, content |
|
|
74
|
+
|
|
75
|
+
Metadata providers: `kmcom-nuxt-layers/layers/metadata/providers/{comicvine,openlibrary,google-books,themoviedb}`.
|
|
76
|
+
|
|
77
|
+
### Upgrading from v2
|
|
78
|
+
|
|
79
|
+
| v2 | v5 |
|
|
80
|
+
| --------- | ----------------------------------------- |
|
|
81
|
+
| `ui` | `typography` + `navigation` + `visual` |
|
|
82
|
+
| `theme` | `theming` |
|
|
83
|
+
| `starter` | removed (now `apps/starter`, not a layer) |
|
|
42
84
|
|
|
43
85
|
## Layer-Specific Dependencies
|
|
44
86
|
|
|
45
87
|
Install additional dependencies only for the layers you use:
|
|
46
88
|
|
|
47
89
|
```bash
|
|
48
|
-
#
|
|
90
|
+
# motion / animations / scroll
|
|
49
91
|
npm install gsap locomotive-scroll
|
|
50
92
|
|
|
51
|
-
#
|
|
93
|
+
# canvas / shader
|
|
52
94
|
npm install three @tresjs/nuxt @tresjs/core @tresjs/cientos @tresjs/post-processing
|
|
53
95
|
|
|
54
|
-
#
|
|
96
|
+
# forms
|
|
55
97
|
npm install zod
|
|
56
98
|
|
|
57
|
-
#
|
|
99
|
+
# content
|
|
58
100
|
npm install @nuxt/content better-sqlite3
|
|
101
|
+
|
|
102
|
+
# scripts (baseline-status badge)
|
|
103
|
+
npm install @nuxt/scripts baseline-status
|
|
59
104
|
```
|
|
60
105
|
|
|
61
|
-
##
|
|
106
|
+
## Content layer contract
|
|
62
107
|
|
|
63
|
-
|
|
108
|
+
The `Blog`, `Portfolio` and `Gallery` components and the `useBlogPosts` / `useGalleryItems`
|
|
109
|
+
composables are typed against collections named `blog`, `portfolio` and `gallery`. Define them in
|
|
110
|
+
your app's `content.config.ts` (empty collections are fine):
|
|
64
111
|
|
|
65
112
|
```ts
|
|
66
|
-
export default
|
|
67
|
-
|
|
113
|
+
export default defineContentConfig({
|
|
114
|
+
collections: {
|
|
115
|
+
content: defineCollection({ type: 'page', source: '**/*.md' }),
|
|
116
|
+
blog: defineCollection({ type: 'page', source: 'blog/**/*.md' }),
|
|
117
|
+
portfolio: defineCollection({ type: 'page', source: 'portfolio/**/*.md' }),
|
|
118
|
+
gallery: defineCollection({ type: 'page', source: 'gallery/**/*.md' }),
|
|
119
|
+
},
|
|
68
120
|
})
|
|
69
121
|
```
|
|
70
122
|
|
|
71
|
-
|
|
123
|
+
Do not pass `schema:` to `defineCollection`; the layer's `collections.d.ts` augments the item types.
|
|
124
|
+
|
|
125
|
+
## Configuration Examples
|
|
126
|
+
|
|
127
|
+
### Design system
|
|
72
128
|
|
|
73
129
|
```ts
|
|
74
130
|
export default defineNuxtConfig({
|
|
75
131
|
extends: [
|
|
76
132
|
'kmcom-nuxt-layers/layers/core',
|
|
77
|
-
'kmcom-nuxt-layers/layers/
|
|
78
|
-
'kmcom-nuxt-layers/layers/
|
|
133
|
+
'kmcom-nuxt-layers/layers/theming',
|
|
134
|
+
'kmcom-nuxt-layers/layers/typography',
|
|
135
|
+
'kmcom-nuxt-layers/layers/visual',
|
|
79
136
|
],
|
|
80
137
|
})
|
|
81
138
|
```
|
|
82
139
|
|
|
83
|
-
###
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
npm install gsap locomotive-scroll
|
|
87
|
-
```
|
|
140
|
+
### Page structure + navigation
|
|
88
141
|
|
|
89
142
|
```ts
|
|
90
143
|
export default defineNuxtConfig({
|
|
91
|
-
extends: ['kmcom-nuxt-layers/layers/core', 'kmcom-nuxt-layers/layers/
|
|
144
|
+
extends: ['kmcom-nuxt-layers/layers/core', 'kmcom-nuxt-layers/layers/navigation'],
|
|
92
145
|
})
|
|
93
146
|
```
|
|
94
147
|
|
|
95
|
-
###
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
npm install gsap locomotive-scroll three @tresjs/nuxt @tresjs/core @tresjs/cientos @tresjs/post-processing zod @nuxt/content better-sqlite3
|
|
99
|
-
```
|
|
148
|
+
### Motion
|
|
100
149
|
|
|
101
150
|
```ts
|
|
102
151
|
export default defineNuxtConfig({
|
|
103
|
-
extends: [
|
|
104
|
-
'kmcom-nuxt-layers/layers/core',
|
|
105
|
-
'kmcom-nuxt-layers/layers/ui',
|
|
106
|
-
'kmcom-nuxt-layers/layers/layout',
|
|
107
|
-
'kmcom-nuxt-layers/layers/motion',
|
|
108
|
-
'kmcom-nuxt-layers/layers/shader',
|
|
109
|
-
'kmcom-nuxt-layers/layers/forms',
|
|
110
|
-
'kmcom-nuxt-layers/layers/theme',
|
|
111
|
-
'kmcom-nuxt-layers/layers/content',
|
|
112
|
-
],
|
|
152
|
+
extends: ['kmcom-nuxt-layers/layers/core', 'kmcom-nuxt-layers/layers/motion'],
|
|
113
153
|
})
|
|
114
154
|
```
|
|
115
155
|
|
|
@@ -138,7 +178,7 @@ export default defineAppConfig({
|
|
|
138
178
|
},
|
|
139
179
|
},
|
|
140
180
|
|
|
141
|
-
//
|
|
181
|
+
// Theming layer overrides
|
|
142
182
|
themeLayer: {
|
|
143
183
|
defaultAccent: 'indigo', // Change default accent color
|
|
144
184
|
accents: ['blue', 'indigo', 'violet', 'purple'], // Limit palette
|
|
@@ -148,19 +188,19 @@ export default defineAppConfig({
|
|
|
148
188
|
|
|
149
189
|
### Available Config Namespaces
|
|
150
190
|
|
|
151
|
-
| Namespace | Layer
|
|
152
|
-
| ----------------------- |
|
|
153
|
-
| `coreLayer.loading` | core
|
|
154
|
-
| `coreLayer.scrollGuard` | core
|
|
155
|
-
| `coreLayer.errors` | core
|
|
156
|
-
| `coreLayer.notFound` | core
|
|
157
|
-
| `motion` | motion
|
|
158
|
-
| `themeLayer` |
|
|
191
|
+
| Namespace | Layer | Key Options |
|
|
192
|
+
| ----------------------- | ------- | -------------------------------------------------------------------------- |
|
|
193
|
+
| `coreLayer.loading` | core | `enabled`, `minDuration`, `maxDuration`, `background`, `textColor` |
|
|
194
|
+
| `coreLayer.scrollGuard` | core | `enabled`, `strict`, `excludeSelectors`, `debug` |
|
|
195
|
+
| `coreLayer.errors` | core | `logToConsole`, `logToExternal`, `externalUrl` |
|
|
196
|
+
| `coreLayer.notFound` | core | `icon`, `title`, `description`, `showHomeButton`, `actions`, `suggestions` |
|
|
197
|
+
| `motion` | motion | `gsapScrollTrigger`, `lenis.*` (duration, smoothWheel, smoothTouch, etc.) |
|
|
198
|
+
| `themeLayer` | theming | `accents`, `defaultAccent` |
|
|
159
199
|
|
|
160
200
|
## Optional Modules
|
|
161
201
|
|
|
162
202
|
Some modules used in the layers are optional or dev-only:
|
|
163
203
|
|
|
164
204
|
- **`@nuxt/eslint`** — Loaded only in development (`NODE_ENV !== 'production'`). Install if you want layer-provided ESLint config during dev.
|
|
165
|
-
- **`@vite-pwa/nuxt`** —
|
|
205
|
+
- **`@vite-pwa/nuxt`** — Currently disabled in the core layer (commented out). Add it to your own `modules` if you want PWA support; the layer does not type the `pwa` config key for you.
|
|
166
206
|
- **`nuxt-studio`** — Optional peer dependency of the content layer. Install for Nuxt Studio CMS integration.
|
|
@@ -33,6 +33,14 @@ export default defineNuxtConfig({
|
|
|
33
33
|
|
|
34
34
|
css: ['#layers/content/app/assets/css/content.css'],
|
|
35
35
|
|
|
36
|
+
// Nuxt only references layer .d.ts files that live in generated .nuxt types, so register
|
|
37
|
+
// the @nuxt/content frontmatter augmentation explicitly for consumers.
|
|
38
|
+
hooks: {
|
|
39
|
+
'prepare:types': ({ references }) => {
|
|
40
|
+
references.push({ path: `${import.meta.dirname}/app/types/collections.d.ts` })
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
36
44
|
compatibilityDate: '2026-01-24',
|
|
37
45
|
|
|
38
46
|
typescript: {
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { registerProvider } from '#layers/metadata/server/utils/metadata/provider-registry'
|
|
2
|
+
import { comicVineProvider } from '../utils/metadata-comicvine/provider'
|
|
3
|
+
import { defineNitroPlugin } from 'nitropack/runtime'
|
|
4
|
+
|
|
1
5
|
export default defineNitroPlugin(() => {
|
|
2
6
|
registerProvider(comicVineProvider)
|
|
3
7
|
})
|
package/layers/data/metadata/providers/comicvine/server/utils/metadata-comicvine/provider.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import { normaliseComicVineIssue, normaliseComicVineVolume } from './normalise'
|
|
2
|
+
import {
|
|
3
|
+
fetchComicVineIssue,
|
|
4
|
+
fetchComicVineVolume,
|
|
5
|
+
searchComicVineIssues,
|
|
6
|
+
searchComicVineVolumes,
|
|
7
|
+
} from './client'
|
|
1
8
|
import type { MetadataProvider } from '#layers/metadata/shared/types'
|
|
2
9
|
|
|
3
10
|
import type { ComicVineIssue, ComicVineVolume } from './types'
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { registerProvider } from '#layers/metadata/server/utils/metadata/provider-registry'
|
|
2
|
+
import { googleBooksProvider } from '../utils/metadata-google-books/provider'
|
|
3
|
+
import { defineNitroPlugin } from 'nitropack/runtime'
|
|
4
|
+
|
|
1
5
|
export default defineNitroPlugin(() => {
|
|
2
6
|
registerProvider(googleBooksProvider)
|
|
3
7
|
})
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { registerProvider } from '#layers/metadata/server/utils/metadata/provider-registry'
|
|
2
|
+
import { openLibraryProvider } from '../utils/metadata-openlibrary/provider'
|
|
3
|
+
import { defineNitroPlugin } from 'nitropack/runtime'
|
|
4
|
+
|
|
1
5
|
export default defineNitroPlugin(() => {
|
|
2
6
|
registerProvider(openLibraryProvider)
|
|
3
7
|
})
|
package/layers/data/metadata/providers/openlibrary/server/utils/metadata-openlibrary/provider.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normaliseOpenLibraryEdition,
|
|
3
|
+
normaliseOpenLibrarySearchDoc,
|
|
4
|
+
normaliseOpenLibraryWork,
|
|
5
|
+
} from './normalise'
|
|
6
|
+
import { lookupOpenLibraryEdition, lookupOpenLibraryWork, searchOpenLibrary } from './client'
|
|
1
7
|
import type { MetadataProvider } from '#layers/metadata/shared/types'
|
|
2
8
|
|
|
3
9
|
export const openLibraryProvider: MetadataProvider = {
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { registerProvider } from '#layers/metadata/server/utils/metadata/provider-registry'
|
|
2
|
+
import { tmdbProvider } from '../utils/metadata-tmdb/provider'
|
|
3
|
+
import { defineNitroPlugin } from 'nitropack/runtime'
|
|
4
|
+
|
|
1
5
|
export default defineNitroPlugin(() => {
|
|
2
6
|
registerProvider(tmdbProvider)
|
|
3
7
|
})
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { normaliseTmdbMovie, normaliseTmdbSearchResult, normaliseTmdbTV } from './normalise'
|
|
2
|
+
import { fetchTmdbMovie, fetchTmdbTV, findByImdbId, searchTmdb } from './client'
|
|
1
3
|
import type { MetadataProvider } from '#layers/metadata/shared/types'
|
|
2
4
|
|
|
3
5
|
export const tmdbProvider: MetadataProvider = {
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { getCacheRecord, makeCacheKey, setCacheRecord } from '../../utils/metadata/cache'
|
|
2
|
+
import { getProvider } from '../../utils/metadata/provider-registry'
|
|
3
|
+
import { createError, defineEventHandler, getQuery } from 'h3'
|
|
1
4
|
import type { MetadataProviderId } from '#layers/metadata/shared/types'
|
|
2
5
|
|
|
3
6
|
// fallow-ignore-next-line complexity
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { getCacheRecord, makeCacheKey, setCacheRecord } from '../../utils/metadata/cache'
|
|
2
|
+
import { getProvider } from '../../utils/metadata/provider-registry'
|
|
3
|
+
import { createError, defineEventHandler, readBody } from 'h3'
|
|
1
4
|
import type { MetadataProviderId, MetadataSyncInput } from '#layers/metadata/shared/types'
|
|
2
5
|
|
|
3
6
|
// fallow-ignore-next-line complexity
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { getSearchCache, hashQuery, makeCacheKey, setSearchCache } from './cache'
|
|
2
|
+
import { getProviders } from './provider-registry'
|
|
1
3
|
import type { MetadataSearchInput, MetadataSearchResult } from '#layers/metadata/shared/types'
|
|
2
4
|
|
|
3
5
|
// fallow-ignore-next-line complexity
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../../../utils/cache'
|
|
3
|
+
import { toAtom } from '../../../../utils/formats/atom'
|
|
4
|
+
import { defineEventHandler, getRouterParam, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const collection = getRouterParam(event, 'collection')
|
|
3
8
|
const { items, config } = await buildFeed(event, collection, { unlimited: true })
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../../utils/cache'
|
|
3
|
+
import { toAtom } from '../../../utils/formats/atom'
|
|
4
|
+
import { defineEventHandler, getRouterParam, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const collection = getRouterParam(event, 'collection')
|
|
3
8
|
const { items, config } = await buildFeed(event, collection)
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../../../utils/cache'
|
|
3
|
+
import { toJSONFeed } from '../../../../utils/formats/json'
|
|
4
|
+
import { defineEventHandler, getRouterParam, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const collection = getRouterParam(event, 'collection')
|
|
3
8
|
const { items, config } = await buildFeed(event, collection, { unlimited: true })
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../../utils/cache'
|
|
3
|
+
import { toJSONFeed } from '../../../utils/formats/json'
|
|
4
|
+
import { defineEventHandler, getRouterParam, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const collection = getRouterParam(event, 'collection')
|
|
3
8
|
const { items, config } = await buildFeed(event, collection)
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../../../utils/cache'
|
|
3
|
+
import { toRSS } from '../../../../utils/formats/rss'
|
|
4
|
+
import { defineEventHandler, getRouterParam, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const collection = getRouterParam(event, 'collection')
|
|
3
8
|
const { items, config } = await buildFeed(event, collection, { unlimited: true })
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../../utils/cache'
|
|
3
|
+
import { toRSS } from '../../../utils/formats/rss'
|
|
4
|
+
import { defineEventHandler, getRouterParam, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const collection = getRouterParam(event, 'collection')
|
|
3
8
|
const { items, config } = await buildFeed(event, collection)
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../../utils/cache'
|
|
3
|
+
import { toAtom } from '../../../utils/formats/atom'
|
|
4
|
+
import { defineEventHandler, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const { items, config } = await buildFeed(event, undefined, { unlimited: true })
|
|
3
8
|
const content = toAtom(items, config)
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../utils/cache'
|
|
3
|
+
import { toAtom } from '../../utils/formats/atom'
|
|
4
|
+
import { defineEventHandler, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const { items, config } = await buildFeed(event)
|
|
3
8
|
const content = toAtom(items, config)
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { buildFeed } from '../../utils/feed-service'
|
|
2
|
+
import { defineEventHandler, getRequestURL, setHeader } from 'h3'
|
|
3
|
+
import { useAppConfig } from 'nitropack/runtime'
|
|
4
|
+
|
|
1
5
|
const RSS_ICON = `<svg viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
2
6
|
<path d="M2.5 3a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5H3a.5.5 0 0 1-.5-.5V3Z"/>
|
|
3
7
|
<path d="M4 8a6 6 0 0 1 6 6H8.5A4.5 4.5 0 0 0 4 9.5V8Z"/>
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../../utils/cache'
|
|
3
|
+
import { toJSONFeed } from '../../../utils/formats/json'
|
|
4
|
+
import { defineEventHandler, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const { items, config } = await buildFeed(event, undefined, { unlimited: true })
|
|
3
8
|
const content = toJSONFeed(items, config)
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../utils/cache'
|
|
3
|
+
import { toJSONFeed } from '../../utils/formats/json'
|
|
4
|
+
import { defineEventHandler, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const { items, config } = await buildFeed(event)
|
|
3
8
|
const body = toJSONFeed(items, config)
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../../utils/cache'
|
|
3
|
+
import { toRSS } from '../../../utils/formats/rss'
|
|
4
|
+
import { defineEventHandler, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const { items, config } = await buildFeed(event, undefined, { unlimited: true })
|
|
3
8
|
const content = toRSS(items, config)
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { buildFeed } from '../../utils/feed-service'
|
|
2
|
+
import { setFeedCacheHeaders } from '../../utils/cache'
|
|
3
|
+
import { toRSS } from '../../utils/formats/rss'
|
|
4
|
+
import { defineEventHandler, setHeader } from 'h3'
|
|
5
|
+
|
|
1
6
|
export default defineEventHandler(async (event) => {
|
|
2
7
|
const { items, config } = await buildFeed(event)
|
|
3
8
|
const content = toRSS(items, config)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { setHeader, type H3Event } from 'h3'
|
|
1
2
|
import { createHash } from 'node:crypto'
|
|
2
|
-
import type { H3Event } from 'h3'
|
|
3
3
|
|
|
4
4
|
export function setFeedCacheHeaders(event: H3Event, content: string): void {
|
|
5
5
|
const etag = `"${createHash('md5').update(content).digest('hex')}"`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from '
|
|
1
|
+
export * from '../../../canvas/app/types/renderer'
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kmcom-nuxt-layers",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "5.0.
|
|
4
|
+
"version": "5.0.6",
|
|
5
5
|
"description": "Composable Nuxt 4 layers for building scalable Vue applications",
|
|
6
6
|
"exports": {
|
|
7
7
|
"./layers/core": "./layers/core/nuxt.config.ts",
|
|
@@ -84,10 +84,11 @@
|
|
|
84
84
|
"@tresjs/post-processing": "^3.7.2",
|
|
85
85
|
"@vite-pwa/nuxt": "^1.1.1",
|
|
86
86
|
"@vueuse/nuxt": "^14.3.0 || ^15.0.0",
|
|
87
|
+
"baseline-status": "^1.1.1",
|
|
87
88
|
"better-sqlite3": "^12.10.0 || ^13.0.0",
|
|
88
89
|
"gsap": "^3.15.0",
|
|
89
90
|
"locomotive-scroll": "^5.0.1",
|
|
90
|
-
"nuxt": "^4.
|
|
91
|
+
"nuxt": "^4.6.1",
|
|
91
92
|
"pinia": "^3.0.4 || ^4.1.0",
|
|
92
93
|
"tailwindcss": "^4.3.0",
|
|
93
94
|
"three": ">=0.184.0",
|
|
@@ -145,6 +146,9 @@
|
|
|
145
146
|
},
|
|
146
147
|
"v-gsap-nuxt": {
|
|
147
148
|
"optional": true
|
|
149
|
+
},
|
|
150
|
+
"baseline-status": {
|
|
151
|
+
"optional": true
|
|
148
152
|
}
|
|
149
153
|
},
|
|
150
154
|
"devDependencies": {
|