katanakit-js 4.0.4 → 5.2.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/README.md +184 -10
- package/dist/adapters/insforge/index.d.ts +3 -0
- package/dist/adapters/insforge/index.d.ts.map +1 -0
- package/dist/adapters/insforge/index.js +2 -0
- package/dist/adapters/insforge/index.js.map +1 -0
- package/dist/adapters/insforge/insforge.service.d.ts +116 -0
- package/dist/adapters/insforge/insforge.service.d.ts.map +1 -0
- package/dist/adapters/insforge/insforge.service.js +437 -0
- package/dist/adapters/insforge/insforge.service.js.map +1 -0
- package/dist/adapters/notion/notion.service.d.ts.map +1 -1
- package/dist/adapters/notion/notion.service.js +72 -54
- package/dist/adapters/notion/notion.service.js.map +1 -1
- package/dist/adapters/wordpress/wordpress.service.d.ts.map +1 -1
- package/dist/adapters/wordpress/wordpress.service.js +163 -85
- package/dist/adapters/wordpress/wordpress.service.js.map +1 -1
- package/dist/config/seo.service.d.ts.map +1 -1
- package/dist/config/seo.service.js +42 -4
- package/dist/config/seo.service.js.map +1 -1
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/services/error.service.d.ts +21 -1
- package/dist/core/services/error.service.d.ts.map +1 -1
- package/dist/core/services/error.service.js +39 -0
- package/dist/core/services/error.service.js.map +1 -1
- package/dist/core/services/faker.service.d.ts +160 -0
- package/dist/core/services/faker.service.d.ts.map +1 -0
- package/dist/core/services/faker.service.js +235 -0
- package/dist/core/services/faker.service.js.map +1 -0
- package/dist/core/services/http.service.d.ts.map +1 -1
- package/dist/core/services/http.service.js +10 -16
- package/dist/core/services/http.service.js.map +1 -1
- package/dist/core/services/media.service.d.ts +97 -0
- package/dist/core/services/media.service.d.ts.map +1 -0
- package/dist/core/services/media.service.js +239 -0
- package/dist/core/services/media.service.js.map +1 -0
- package/dist/core/services/reactive.service.d.ts.map +1 -1
- package/dist/core/services/reactive.service.js +5 -14
- package/dist/core/services/reactive.service.js.map +1 -1
- package/dist/core/services/result.service.d.ts +41 -0
- package/dist/core/services/result.service.d.ts.map +1 -0
- package/dist/core/services/result.service.js +60 -0
- package/dist/core/services/result.service.js.map +1 -0
- package/dist/core/services/validation.service.d.ts +22 -0
- package/dist/core/services/validation.service.d.ts.map +1 -0
- package/dist/core/services/validation.service.js +41 -0
- package/dist/core/services/validation.service.js.map +1 -0
- package/dist/core/services/youtube.service.d.ts +79 -0
- package/dist/core/services/youtube.service.d.ts.map +1 -0
- package/dist/core/services/youtube.service.js +388 -0
- package/dist/core/services/youtube.service.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/filesystem/filesystem.service.d.ts +267 -0
- package/dist/infrastructure/filesystem/filesystem.service.d.ts.map +1 -0
- package/dist/infrastructure/filesystem/filesystem.service.js +453 -0
- package/dist/infrastructure/filesystem/filesystem.service.js.map +1 -0
- package/dist/infrastructure/filesystem/path.service.d.ts +115 -0
- package/dist/infrastructure/filesystem/path.service.d.ts.map +1 -0
- package/dist/infrastructure/filesystem/path.service.js +154 -0
- package/dist/infrastructure/filesystem/path.service.js.map +1 -0
- package/dist/infrastructure/index.d.ts +3 -0
- package/dist/infrastructure/index.d.ts.map +1 -1
- package/dist/infrastructure/index.js +3 -0
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/infrastructure/media/media.service.d.ts +15 -0
- package/dist/infrastructure/media/media.service.d.ts.map +1 -0
- package/dist/infrastructure/media/media.service.js +44 -0
- package/dist/infrastructure/media/media.service.js.map +1 -0
- package/dist/infrastructure/storage/storage.service.d.ts.map +1 -1
- package/dist/infrastructure/storage/storage.service.js +10 -8
- package/dist/infrastructure/storage/storage.service.js.map +1 -1
- package/dist/schemas/access.schema.d.ts +69 -0
- package/dist/schemas/access.schema.d.ts.map +1 -0
- package/dist/schemas/access.schema.js +36 -0
- package/dist/schemas/access.schema.js.map +1 -0
- package/dist/schemas/ai.schema.d.ts +53 -0
- package/dist/schemas/ai.schema.d.ts.map +1 -0
- package/dist/schemas/ai.schema.js +34 -0
- package/dist/schemas/ai.schema.js.map +1 -0
- package/dist/schemas/common.schema.d.ts +49 -0
- package/dist/schemas/common.schema.d.ts.map +1 -0
- package/dist/schemas/common.schema.js +23 -0
- package/dist/schemas/common.schema.js.map +1 -0
- package/dist/schemas/core.schema.d.ts +164 -0
- package/dist/schemas/core.schema.d.ts.map +1 -0
- package/dist/schemas/core.schema.js +109 -0
- package/dist/schemas/core.schema.js.map +1 -0
- package/dist/schemas/faker.schema.d.ts +12 -0
- package/dist/schemas/faker.schema.d.ts.map +1 -0
- package/dist/schemas/faker.schema.js +12 -0
- package/dist/schemas/faker.schema.js.map +1 -0
- package/dist/schemas/filesystem.schema.d.ts +71 -0
- package/dist/schemas/filesystem.schema.d.ts.map +1 -0
- package/dist/schemas/filesystem.schema.js +56 -0
- package/dist/schemas/filesystem.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +13 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +13 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/insforge.schema.d.ts +69 -0
- package/dist/schemas/insforge.schema.d.ts.map +1 -0
- package/dist/schemas/insforge.schema.js +82 -0
- package/dist/schemas/insforge.schema.js.map +1 -0
- package/dist/schemas/media.schema.d.ts +51 -0
- package/dist/schemas/media.schema.d.ts.map +1 -0
- package/dist/schemas/media.schema.js +50 -0
- package/dist/schemas/media.schema.js.map +1 -0
- package/dist/schemas/notion.schema.d.ts +1058 -0
- package/dist/schemas/notion.schema.d.ts.map +1 -0
- package/dist/schemas/notion.schema.js +248 -0
- package/dist/schemas/notion.schema.js.map +1 -0
- package/dist/schemas/rss.schema.d.ts +35 -0
- package/dist/schemas/rss.schema.d.ts.map +1 -0
- package/dist/schemas/rss.schema.js +44 -0
- package/dist/schemas/rss.schema.js.map +1 -0
- package/dist/schemas/wordpress.schema.d.ts +1304 -0
- package/dist/schemas/wordpress.schema.d.ts.map +1 -0
- package/dist/schemas/wordpress.schema.js +404 -0
- package/dist/schemas/wordpress.schema.js.map +1 -0
- package/dist/schemas/youtube.schema.d.ts +122 -0
- package/dist/schemas/youtube.schema.d.ts.map +1 -0
- package/dist/schemas/youtube.schema.js +113 -0
- package/dist/schemas/youtube.schema.js.map +1 -0
- package/dist/types/index.d.ts +191 -800
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +40 -15
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { SmartVideoOptionsSchema } from "../../schemas/media.schema.js";
|
|
2
|
+
import { useValidate } from "./validation.service.js";
|
|
3
|
+
const YOUTUBE_ID_PATTERN = /^[A-Za-z0-9_-]{11}$/;
|
|
4
|
+
const VIMEO_ID_PATTERN = /^\d{6,12}$/;
|
|
5
|
+
const DIRECT_FILE_PATTERN = /\.(mp4|webm|ogv|mov|m4v)(\?|#|$)/i;
|
|
6
|
+
/**
|
|
7
|
+
* Escapes HTML special chars for safe attribute/text interpolation.
|
|
8
|
+
*
|
|
9
|
+
* @param value - Raw string to escape.
|
|
10
|
+
* @returns Escaped string safe for HTML contexts.
|
|
11
|
+
*/
|
|
12
|
+
function escapeHtml(value) {
|
|
13
|
+
return value
|
|
14
|
+
.replace(/&/g, "&")
|
|
15
|
+
.replace(/</g, "<")
|
|
16
|
+
.replace(/>/g, ">")
|
|
17
|
+
.replace(/"/g, """)
|
|
18
|
+
.replace(/'/g, "'");
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extracts a YouTube video id from a watch / shorts / live / embed /
|
|
22
|
+
* `youtu.be` URL or a bare 11-char id. Returns `null` when not matched.
|
|
23
|
+
*
|
|
24
|
+
* @param input - URL or bare video id.
|
|
25
|
+
* @returns The 11-char video id or `null`.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* useGetYoutubeVideoId("https://www.youtube.com/watch?v=dQw4w9WgXcQ"); // "dQw4w9WgXcQ"
|
|
30
|
+
* useGetYoutubeVideoId("https://youtu.be/dQw4w9WgXcQ"); // "dQw4w9WgXcQ"
|
|
31
|
+
* useGetYoutubeVideoId("dQw4w9WgXcQ"); // "dQw4w9WgXcQ"
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function useGetYoutubeVideoId(input) {
|
|
35
|
+
const value = input.trim();
|
|
36
|
+
if (!value)
|
|
37
|
+
return null;
|
|
38
|
+
if (YOUTUBE_ID_PATTERN.test(value))
|
|
39
|
+
return value;
|
|
40
|
+
let url;
|
|
41
|
+
try {
|
|
42
|
+
url = new URL(value.startsWith("http") ? value : `https://${value}`);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const host = url.hostname.replace(/^www\./, "").toLowerCase();
|
|
48
|
+
const path = url.pathname;
|
|
49
|
+
if (host === "youtu.be") {
|
|
50
|
+
const id = path.split("/").filter(Boolean)[0] ?? "";
|
|
51
|
+
return YOUTUBE_ID_PATTERN.test(id) ? id : null;
|
|
52
|
+
}
|
|
53
|
+
if (host.endsWith("youtube.com") || host.endsWith("youtube-nocookie.com")) {
|
|
54
|
+
const paramId = url.searchParams.get("v") ?? "";
|
|
55
|
+
if (YOUTUBE_ID_PATTERN.test(paramId))
|
|
56
|
+
return paramId;
|
|
57
|
+
const segments = path.split("/").filter(Boolean);
|
|
58
|
+
const prefix = segments[0] ?? "";
|
|
59
|
+
const candidate = segments[1] ?? "";
|
|
60
|
+
if (["embed", "shorts", "live", "v"].includes(prefix) && YOUTUBE_ID_PATTERN.test(candidate)) {
|
|
61
|
+
return candidate;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Extracts a Vimeo video id from a URL or bare numeric id.
|
|
68
|
+
*
|
|
69
|
+
* @param input - URL or bare numeric id.
|
|
70
|
+
* @returns The numeric id or `null`.
|
|
71
|
+
*/
|
|
72
|
+
export function useGetVimeoVideoId(input) {
|
|
73
|
+
const value = input.trim();
|
|
74
|
+
if (!value)
|
|
75
|
+
return null;
|
|
76
|
+
if (VIMEO_ID_PATTERN.test(value))
|
|
77
|
+
return value;
|
|
78
|
+
try {
|
|
79
|
+
const url = new URL(value.startsWith("http") ? value : `https://${value}`);
|
|
80
|
+
if (!url.hostname.toLowerCase().includes("vimeo.com"))
|
|
81
|
+
return null;
|
|
82
|
+
const candidate = url.pathname.split("/").filter(Boolean).pop() ?? "";
|
|
83
|
+
return VIMEO_ID_PATTERN.test(candidate) ? candidate : null;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Normalizes any supported input into a {@link MediaSource}.
|
|
91
|
+
* Pure and SSR-safe: no DOM, no fetch.
|
|
92
|
+
*
|
|
93
|
+
* @param input - YouTube/Vimeo URL or id, or direct video file URL.
|
|
94
|
+
* @returns Normalized `{ provider, id, raw }`.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```ts
|
|
98
|
+
* useParseMediaSource("https://youtu.be/dQw4w9WgXcQ");
|
|
99
|
+
* // { provider: "youtube", id: "dQw4w9WgXcQ", raw: "…" }
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export function useParseMediaSource(input) {
|
|
103
|
+
const raw = input;
|
|
104
|
+
const value = input.trim();
|
|
105
|
+
const youtubeId = useGetYoutubeVideoId(value);
|
|
106
|
+
if (youtubeId)
|
|
107
|
+
return { provider: "youtube", id: youtubeId, raw };
|
|
108
|
+
const vimeoId = useGetVimeoVideoId(value);
|
|
109
|
+
if (vimeoId)
|
|
110
|
+
return { provider: "vimeo", id: vimeoId, raw };
|
|
111
|
+
if (DIRECT_FILE_PATTERN.test(value))
|
|
112
|
+
return { provider: "file", id: value, raw };
|
|
113
|
+
return { provider: "unknown", id: value, raw };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Builds the privacy-enhanced YouTube embed URL (`youtube-nocookie`).
|
|
117
|
+
*
|
|
118
|
+
* @param videoId - 11-char YouTube video id.
|
|
119
|
+
* @param options - Player options (start/end/autoplay/extra params).
|
|
120
|
+
* @returns Embed URL ready for `<iframe src>`.
|
|
121
|
+
*/
|
|
122
|
+
export function useBuildYoutubeEmbedUrl(videoId, options = {}) {
|
|
123
|
+
const url = new URL(`https://www.youtube-nocookie.com/embed/${videoId}`);
|
|
124
|
+
const params = { rel: "0" };
|
|
125
|
+
if (options.autoplay)
|
|
126
|
+
params["autoplay"] = "1";
|
|
127
|
+
if (options.start !== undefined)
|
|
128
|
+
params["start"] = String(options.start);
|
|
129
|
+
if (options.end !== undefined)
|
|
130
|
+
params["end"] = String(options.end);
|
|
131
|
+
for (const [key, value] of Object.entries(options.params ?? {})) {
|
|
132
|
+
params[key] = String(value);
|
|
133
|
+
}
|
|
134
|
+
for (const [key, value] of Object.entries(params)) {
|
|
135
|
+
url.searchParams.set(key, value);
|
|
136
|
+
}
|
|
137
|
+
return url.toString();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Builds the Vimeo player embed URL with privacy defaults.
|
|
141
|
+
*
|
|
142
|
+
* @param videoId - Numeric Vimeo video id.
|
|
143
|
+
* @returns Player URL ready for `<iframe src>`.
|
|
144
|
+
*/
|
|
145
|
+
export function useBuildVimeoEmbedUrl(videoId) {
|
|
146
|
+
const url = new URL(`https://player.vimeo.com/video/${videoId}`);
|
|
147
|
+
url.searchParams.set("dnt", "1");
|
|
148
|
+
return url.toString();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Builds the public YouTube thumbnail URL (no API key needed).
|
|
152
|
+
*
|
|
153
|
+
* @param videoId - 11-char YouTube video id.
|
|
154
|
+
* @param quality - Thumbnail quality (defaults to `hqdefault`).
|
|
155
|
+
* @returns Thumbnail image URL.
|
|
156
|
+
*/
|
|
157
|
+
export function useBuildYoutubeThumbnail(videoId, quality = "hqdefault") {
|
|
158
|
+
return `https://i.ytimg.com/vi/${videoId}/${quality}.jpg`;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Validates unknown input (parsed JSON, frontmatter, CMS payloads) against
|
|
162
|
+
* the `SmartVideoOptions` schema. Returns a Safe Result instead of throwing.
|
|
163
|
+
*
|
|
164
|
+
* @param input - Unknown value to validate.
|
|
165
|
+
* @returns `FetchResult<SmartVideoOptions>` with typed options or a `Validation Error`.
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```ts
|
|
169
|
+
* const result = useParseSmartVideoOptions(JSON.parse(raw));
|
|
170
|
+
* if (result.ok) useBuildVideoEmbed(result.data);
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
export function useParseSmartVideoOptions(input) {
|
|
174
|
+
return useValidate(SmartVideoOptionsSchema, input);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Builds the semantically correct embed HTML for any supported source.
|
|
178
|
+
*
|
|
179
|
+
* - Direct files (`.mp4`/`.webm`) → `<figure><video controls …>` (native).
|
|
180
|
+
* - YouTube / Vimeo → `<figure><iframe …>` (embedded context), or a
|
|
181
|
+
* click-to-play facade (`<button>` + thumbnail) when `facade: true`
|
|
182
|
+
* so `.md/.mdx` posts never pay the iframe cost on load.
|
|
183
|
+
*
|
|
184
|
+
* Pure string builder: SSR-safe, no DOM access. Escape is applied to
|
|
185
|
+
* all interpolated attributes.
|
|
186
|
+
*
|
|
187
|
+
* @param options - Source + a11y + presentation options.
|
|
188
|
+
* @returns `{ provider, id, html }` with the ready-to-inject markup.
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```ts
|
|
192
|
+
* const { html } = useBuildVideoEmbed({ src: "https://youtu.be/…", title: "My talk" });
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export function useBuildVideoEmbed(options) {
|
|
196
|
+
const { src, title, caption, poster, className, aspect = "16/9", facade = true } = options;
|
|
197
|
+
const source = useParseMediaSource(src);
|
|
198
|
+
const safeTitle = escapeHtml(title);
|
|
199
|
+
const safeCaption = caption ? `<figcaption>${escapeHtml(caption)}</figcaption>` : "";
|
|
200
|
+
const figureClass = ["katanakit-video", className].filter(Boolean).join(" ");
|
|
201
|
+
const ratio = escapeHtml(aspect);
|
|
202
|
+
if (source.provider === "file") {
|
|
203
|
+
const safeSrc = escapeHtml(source.id);
|
|
204
|
+
const safePoster = poster ? ` poster="${escapeHtml(poster)}"` : "";
|
|
205
|
+
const html = `<figure class="${escapeHtml(figureClass)}" style="aspect-ratio:${ratio}">` +
|
|
206
|
+
`<video controls preload="metadata"${safePoster} aria-label="${safeTitle}">` +
|
|
207
|
+
`<source src="${safeSrc}" />` +
|
|
208
|
+
`</video>${safeCaption}</figure>`;
|
|
209
|
+
return { ...source, html };
|
|
210
|
+
}
|
|
211
|
+
if (source.provider === "youtube" || source.provider === "vimeo") {
|
|
212
|
+
const embedUrl = source.provider === "youtube"
|
|
213
|
+
? useBuildYoutubeEmbedUrl(source.id, {
|
|
214
|
+
autoplay: facade,
|
|
215
|
+
...(options.youtube ?? {}),
|
|
216
|
+
})
|
|
217
|
+
: useBuildVimeoEmbedUrl(source.id);
|
|
218
|
+
const safeEmbed = escapeHtml(embedUrl);
|
|
219
|
+
const thumb = poster ?? (source.provider === "youtube" ? useBuildYoutubeThumbnail(source.id) : undefined);
|
|
220
|
+
const safeThumb = thumb ? escapeHtml(thumb) : "";
|
|
221
|
+
if (facade && safeThumb) {
|
|
222
|
+
const html = `<figure class="${escapeHtml(figureClass)}" style="aspect-ratio:${ratio}">` +
|
|
223
|
+
`<button type="button" data-video-facade="${safeEmbed}" aria-label="${safeTitle}" ` +
|
|
224
|
+
`style="background-image:url('${safeThumb}')">` +
|
|
225
|
+
`<span aria-hidden="true">▶</span></button>${safeCaption}</figure>`;
|
|
226
|
+
return { ...source, html };
|
|
227
|
+
}
|
|
228
|
+
const html = `<figure class="${escapeHtml(figureClass)}" style="aspect-ratio:${ratio}">` +
|
|
229
|
+
`<iframe src="${safeEmbed}" title="${safeTitle}" loading="lazy" ` +
|
|
230
|
+
`allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" ` +
|
|
231
|
+
`referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>${safeCaption}</figure>`;
|
|
232
|
+
return { ...source, html };
|
|
233
|
+
}
|
|
234
|
+
const safeSrc = escapeHtml(src);
|
|
235
|
+
const html = `<figure class="${escapeHtml(figureClass)}" style="aspect-ratio:${ratio}">` +
|
|
236
|
+
`<a href="${safeSrc}">${safeTitle}</a>${safeCaption}</figure>`;
|
|
237
|
+
return { ...source, html };
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=media.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../../src/core/services/media.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/reactive.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,YAAY,EAEZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,MAAM,sBAAsB,CAAC;AAqB9B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CA+BtF;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EACnC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,GAC9B,MAAM,IAAI,CAwCZ;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC9B,WAAW,EAAE,MAAM,CAAC,EACpB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,GAC9B,YAAY,CAAC,CAAC,CAAC,CAQjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,YAAY,UAAQ,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAKjG;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACvC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,CAAC,EAChB,MAAM,GAAE,aAA8B,GACpC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"reactive.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/reactive.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,YAAY,EAEZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,MAAM,sBAAsB,CAAC;AAqB9B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CA+BtF;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EACnC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,GAC9B,MAAM,IAAI,CAwCZ;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC9B,WAAW,EAAE,MAAM,CAAC,EACpB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,GAC9B,YAAY,CAAC,CAAC,CAAC,CAQjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,YAAY,UAAQ,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAKjG;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACvC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,CAAC,EAChB,MAAM,GAAE,aAA8B,GACpC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAsBpC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EACzC,YAAY,EAAE,CAAC,EACf,OAAO,SAAM,GACX,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CAuBhE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAmB/D"}
|
|
@@ -199,25 +199,16 @@ export function useCreateToggle(initialValue = false) {
|
|
|
199
199
|
*/
|
|
200
200
|
export function useCreateStorageSignal(key, fallbackValue, target = "localStorage") {
|
|
201
201
|
let initial = fallbackValue;
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
catch (error) {
|
|
209
|
-
useLogger(`[createStorageSignal] Error reading from ${target}:`, error, "error");
|
|
202
|
+
// StorageStrategy implementations never throw: unavailable backends return null.
|
|
203
|
+
const stored = useGetStorage(key, target);
|
|
204
|
+
if (stored !== null && stored !== undefined) {
|
|
205
|
+
initial = stored;
|
|
210
206
|
}
|
|
211
207
|
const [get, set] = useCreateSignal(initial);
|
|
212
208
|
const setWithStorage = (nextValue) => {
|
|
213
209
|
set((prev) => {
|
|
214
210
|
const newValue = typeof nextValue === "function" ? nextValue(prev) : nextValue;
|
|
215
|
-
|
|
216
|
-
useSetStorage(key, newValue, target);
|
|
217
|
-
}
|
|
218
|
-
catch (error) {
|
|
219
|
-
useLogger(`[createStorageSignal] Error writing to ${target}:`, error, "error");
|
|
220
|
-
}
|
|
211
|
+
useSetStorage(key, newValue, target);
|
|
221
212
|
return newValue;
|
|
222
213
|
});
|
|
223
214
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive.service.js","sourceRoot":"","sources":["../../../src/core/services/reactive.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"reactive.service.js","sourceRoot":"","sources":["../../../src/core/services/reactive.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ApiError, SafeResult } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Runs an operation (sync or async) and captures any throw as a Safe Result.
|
|
4
|
+
*
|
|
5
|
+
* The canonical replacement for ad-hoc `try/catch` at service boundaries: the
|
|
6
|
+
* mapper defaults to {@link useErrorNormalize}, so SDK errors, `Error`
|
|
7
|
+
* instances and plain strings all come back normalized.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam T - Success value type.
|
|
10
|
+
* @param operation - The operation to run.
|
|
11
|
+
* @param mapError - Optional error mapper (default: `useErrorNormalize`).
|
|
12
|
+
* @returns `{ data, error, ok }` — never throws.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { useAttempt } from "katanakit-js";
|
|
17
|
+
*
|
|
18
|
+
* const result = await useAttempt(() => sdk.insert("posts", row));
|
|
19
|
+
* if (result.ok) console.log(result.data);
|
|
20
|
+
* else console.error(result.error.message);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function useAttempt<T>(operation: () => T | Promise<T>, mapError?: (error: unknown) => ApiError): Promise<SafeResult<T>>;
|
|
24
|
+
/**
|
|
25
|
+
* Parses JSON without throwing; failures come back as a Safe Result.
|
|
26
|
+
*
|
|
27
|
+
* Consumers keep their own fallback policy (raw string, `null`, retry, …) by
|
|
28
|
+
* checking `ok` instead of nesting `try/catch`.
|
|
29
|
+
*
|
|
30
|
+
* @typeParam T - Expected parsed shape.
|
|
31
|
+
* @param text - Raw JSON text.
|
|
32
|
+
* @returns `{ data, error, ok }` with `error.status = 0` on parse failure.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const parsed = useTryJsonParse<{ id: number }>(raw);
|
|
37
|
+
* return parsed.ok ? parsed.data : raw;
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function useTryJsonParse<T = unknown>(text: string): SafeResult<T>;
|
|
41
|
+
//# sourceMappingURL=result.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/result.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGjE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,UAAU,CAAC,CAAC,EACjC,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC/B,QAAQ,GAAE,CAAC,KAAK,EAAE,OAAO,KAAK,QAA4B,GACxD,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAMxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAWxE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useErrorNormalize } from "./error.service.js";
|
|
2
|
+
/**
|
|
3
|
+
* Runs an operation (sync or async) and captures any throw as a Safe Result.
|
|
4
|
+
*
|
|
5
|
+
* The canonical replacement for ad-hoc `try/catch` at service boundaries: the
|
|
6
|
+
* mapper defaults to {@link useErrorNormalize}, so SDK errors, `Error`
|
|
7
|
+
* instances and plain strings all come back normalized.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam T - Success value type.
|
|
10
|
+
* @param operation - The operation to run.
|
|
11
|
+
* @param mapError - Optional error mapper (default: `useErrorNormalize`).
|
|
12
|
+
* @returns `{ data, error, ok }` — never throws.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { useAttempt } from "katanakit-js";
|
|
17
|
+
*
|
|
18
|
+
* const result = await useAttempt(() => sdk.insert("posts", row));
|
|
19
|
+
* if (result.ok) console.log(result.data);
|
|
20
|
+
* else console.error(result.error.message);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export async function useAttempt(operation, mapError = useErrorNormalize) {
|
|
24
|
+
try {
|
|
25
|
+
return { data: await operation(), error: null, ok: true };
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return { data: null, error: mapError(error), ok: false };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Parses JSON without throwing; failures come back as a Safe Result.
|
|
33
|
+
*
|
|
34
|
+
* Consumers keep their own fallback policy (raw string, `null`, retry, …) by
|
|
35
|
+
* checking `ok` instead of nesting `try/catch`.
|
|
36
|
+
*
|
|
37
|
+
* @typeParam T - Expected parsed shape.
|
|
38
|
+
* @param text - Raw JSON text.
|
|
39
|
+
* @returns `{ data, error, ok }` with `error.status = 0` on parse failure.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* const parsed = useTryJsonParse<{ id: number }>(raw);
|
|
44
|
+
* return parsed.ok ? parsed.data : raw;
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export function useTryJsonParse(text) {
|
|
48
|
+
try {
|
|
49
|
+
return { data: JSON.parse(text), error: null, ok: true };
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
const raw = error instanceof Error ? error.message : "Invalid JSON";
|
|
53
|
+
return {
|
|
54
|
+
data: null,
|
|
55
|
+
error: { message: raw.slice(0, 300), status: 0 },
|
|
56
|
+
ok: false,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=result.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.service.js","sourceRoot":"","sources":["../../../src/core/services/result.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,SAA+B,EAC/B,WAAyC,iBAAiB;IAE1D,IAAI,CAAC;QACJ,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC1D,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAAc,IAAY;IACxD,IAAI,CAAC;QACJ,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;QACpE,OAAO;YACN,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;YAChD,EAAE,EAAE,KAAK;SACT,CAAC;IACH,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { FetchResult } from "../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Validates unknown data (API responses, configs, user input) against a
|
|
5
|
+
* Zod schema and returns a Safe Result instead of throwing.
|
|
6
|
+
* Framework-agnostic and pure: no I/O, SSR-safe.
|
|
7
|
+
*
|
|
8
|
+
* @typeParam T - The validated output type (`z.infer` of the schema).
|
|
9
|
+
* @param schema - Any Zod schema.
|
|
10
|
+
* @param data - Unknown input to validate.
|
|
11
|
+
* @returns `FetchResult<T>` with typed data or a `Validation Error`.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { SmartVideoOptionsSchema } from "katanakit-js/schemas";
|
|
16
|
+
*
|
|
17
|
+
* const result = useValidate(SmartVideoOptionsSchema, JSON.parse(raw));
|
|
18
|
+
* if (result.ok) useBuildVideoEmbed(result.data);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function useValidate<T>(schema: z.ZodType<T>, data: unknown): FetchResult<T>;
|
|
22
|
+
//# sourceMappingURL=validation.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/validation.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAqBlF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates unknown data (API responses, configs, user input) against a
|
|
3
|
+
* Zod schema and returns a Safe Result instead of throwing.
|
|
4
|
+
* Framework-agnostic and pure: no I/O, SSR-safe.
|
|
5
|
+
*
|
|
6
|
+
* @typeParam T - The validated output type (`z.infer` of the schema).
|
|
7
|
+
* @param schema - Any Zod schema.
|
|
8
|
+
* @param data - Unknown input to validate.
|
|
9
|
+
* @returns `FetchResult<T>` with typed data or a `Validation Error`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { SmartVideoOptionsSchema } from "katanakit-js/schemas";
|
|
14
|
+
*
|
|
15
|
+
* const result = useValidate(SmartVideoOptionsSchema, JSON.parse(raw));
|
|
16
|
+
* if (result.ok) useBuildVideoEmbed(result.data);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function useValidate(schema, data) {
|
|
20
|
+
const parsed = schema.safeParse(data);
|
|
21
|
+
if (parsed.success) {
|
|
22
|
+
return { data: parsed.data, error: null, url: "", status: 200, ok: true };
|
|
23
|
+
}
|
|
24
|
+
const details = parsed.error.issues.map((issue) => ({
|
|
25
|
+
path: issue.path.join("."),
|
|
26
|
+
message: issue.message,
|
|
27
|
+
}));
|
|
28
|
+
const summary = details.map((d) => (d.path ? `${d.path}: ${d.message}` : d.message)).join("; ");
|
|
29
|
+
return {
|
|
30
|
+
data: null,
|
|
31
|
+
error: {
|
|
32
|
+
message: `Validation Error: ${summary || "invalid data"}`,
|
|
33
|
+
status: 400,
|
|
34
|
+
details,
|
|
35
|
+
},
|
|
36
|
+
url: "",
|
|
37
|
+
status: 400,
|
|
38
|
+
ok: false,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=validation.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.service.js","sourceRoot":"","sources":["../../../src/core/services/validation.service.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CAAI,MAAoB,EAAE,IAAa;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC3E,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;KACtB,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChG,OAAO;QACN,IAAI,EAAE,IAAI;QACV,KAAK,EAAE;YACN,OAAO,EAAE,qBAAqB,OAAO,IAAI,cAAc,EAAE;YACzD,MAAM,EAAE,GAAG;YACX,OAAO;SACP;QACD,GAAG,EAAE,EAAE;QACP,MAAM,EAAE,GAAG;QACX,EAAE,EAAE,KAAK;KACT,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { FetchResult, YoutubeApiConfig, YoutubeListParams, YoutubeVideoNormalized, YoutubeVideoPage } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Registers the YouTube APIs (`youtube` + keyless `youtubeFeed`) and
|
|
4
|
+
* stores the default channel. Call once per app, server/build-time —
|
|
5
|
+
* the API key must never ship to the browser.
|
|
6
|
+
*
|
|
7
|
+
* @param config - API key + default channel id.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* useInitYoutube({ apiKey: process.env.YOUTUBE_API_KEY!, channelId: "UC…" });
|
|
12
|
+
* const page = await useGetChannelVideos({ maxResults: 6 });
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function useInitYoutube(config: YoutubeApiConfig): void;
|
|
16
|
+
/**
|
|
17
|
+
* Returns a shallow copy of the YouTube config (safe to mutate locally).
|
|
18
|
+
*
|
|
19
|
+
* @returns The current `{ apiKey, channelId }`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function useGetYoutubeConfig(): YoutubeApiConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Builds the public channel RSS feed URL. Needs no API key and
|
|
24
|
+
* costs zero quota — ideal for "latest videos" widgets.
|
|
25
|
+
*
|
|
26
|
+
* @param channelId - Channel id (`UC…`).
|
|
27
|
+
* @returns Feed URL.
|
|
28
|
+
*/
|
|
29
|
+
export declare function useBuildYoutubeRssUrl(channelId: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Parses an ISO 8601 duration (`PT1H2M3S`) into seconds.
|
|
32
|
+
* Pure and SSR-safe.
|
|
33
|
+
*
|
|
34
|
+
* @param input - Duration string from `contentDetails.duration`.
|
|
35
|
+
* @returns Total seconds (`0` for invalid input).
|
|
36
|
+
*/
|
|
37
|
+
export declare function useParseIso8601Duration(input: string): number;
|
|
38
|
+
/**
|
|
39
|
+
* Resolves a channel id to its `uploads` playlist id (quota cost: 1 unit).
|
|
40
|
+
* Prefer passing `playlistId` to `useGetChannelVideos` to skip this call.
|
|
41
|
+
*
|
|
42
|
+
* @param channelId - Channel id (defaults to the configured one).
|
|
43
|
+
* @returns Safe Result with the uploads playlist id.
|
|
44
|
+
*/
|
|
45
|
+
export declare function useGetUploadsPlaylistId(channelId?: string): Promise<FetchResult<string>>;
|
|
46
|
+
/**
|
|
47
|
+
* Lists channel videos via the quota-cheap path
|
|
48
|
+
* (`channels` → `playlistItems`, never `search.list` which costs 100 units).
|
|
49
|
+
* Call server/build-time and cache the response (1h) to share quota
|
|
50
|
+
* across every repo using the same GCP project.
|
|
51
|
+
*
|
|
52
|
+
* @param params - Channel/playlist, page size (1–50) and page token.
|
|
53
|
+
* @returns Safe Result with normalized videos + pagination.
|
|
54
|
+
*/
|
|
55
|
+
export declare function useGetChannelVideos(params?: YoutubeListParams): Promise<FetchResult<YoutubeVideoPage>>;
|
|
56
|
+
/**
|
|
57
|
+
* Enriches videos with duration and view count (`videos.list`, 1 unit).
|
|
58
|
+
*
|
|
59
|
+
* @param ids - Up to 50 video ids.
|
|
60
|
+
* @returns Safe Result with enriched videos.
|
|
61
|
+
*/
|
|
62
|
+
export declare function useGetVideoDetails(ids: string[]): Promise<FetchResult<YoutubeVideoNormalized[]>>;
|
|
63
|
+
/**
|
|
64
|
+
* Parses a YouTube channel RSS feed (`feeds/videos.xml`) into normalized
|
|
65
|
+
* videos. Pure and SSR-safe — no network, no DOM parser.
|
|
66
|
+
*
|
|
67
|
+
* @param xml - Raw feed XML.
|
|
68
|
+
* @returns Normalized videos (newest first, as served by the feed).
|
|
69
|
+
*/
|
|
70
|
+
export declare function useParseYoutubeRss(xml: string): YoutubeVideoNormalized[];
|
|
71
|
+
/**
|
|
72
|
+
* Fetches the keyless channel RSS feed and parses it. Zero quota,
|
|
73
|
+
* limited to the latest ~15 videos with basic metadata.
|
|
74
|
+
*
|
|
75
|
+
* @param channelId - Channel id (defaults to the configured one).
|
|
76
|
+
* @returns Safe Result with normalized videos.
|
|
77
|
+
*/
|
|
78
|
+
export declare function useGetChannelVideosRss(channelId?: string): Promise<FetchResult<YoutubeVideoNormalized[]>>;
|
|
79
|
+
//# sourceMappingURL=youtube.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/youtube.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACX,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,MAAM,sBAAsB,CAAC;AAe9B;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAqB7D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAI/D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAyB7D;AAgED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC5C,SAAS,SAA0B,GACjC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CA0C9B;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACxC,MAAM,GAAE,iBAAsB,GAC5B,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CA8ExC;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,MAAM,EAAE,GACX,OAAO,CAAC,WAAW,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAmDhD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAuBxE;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC3C,SAAS,SAA0B,GACjC,OAAO,CAAC,WAAW,CAAC,sBAAsB,EAAE,CAAC,CAAC,CA6BhD"}
|