@mailoo/blog 0.0.0-stage → 1.32.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +16 -0
- package/README.md +142 -2
- package/dist/client/article-body.cjs +115 -0
- package/dist/client/article-body.cjs.map +1 -0
- package/dist/client/article-body.d.cts +15 -0
- package/dist/client/article-body.d.ts +15 -0
- package/dist/client/article-body.js +80 -0
- package/dist/client/article-body.js.map +1 -0
- package/dist/client/index.cjs +776 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +6 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +731 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/linked-links.cjs +125 -0
- package/dist/client/linked-links.cjs.map +1 -0
- package/dist/client/linked-links.d.cts +31 -0
- package/dist/client/linked-links.d.ts +31 -0
- package/dist/client/linked-links.js +100 -0
- package/dist/client/linked-links.js.map +1 -0
- package/dist/client/marks.cjs +300 -0
- package/dist/client/marks.cjs.map +1 -0
- package/dist/client/marks.d.cts +30 -0
- package/dist/client/marks.d.ts +30 -0
- package/dist/client/marks.js +276 -0
- package/dist/client/marks.js.map +1 -0
- package/dist/client/printable.cjs +106 -0
- package/dist/client/printable.cjs.map +1 -0
- package/dist/client/printable.d.cts +12 -0
- package/dist/client/printable.d.ts +12 -0
- package/dist/client/printable.js +82 -0
- package/dist/client/printable.js.map +1 -0
- package/dist/client/share.cjs +234 -0
- package/dist/client/share.cjs.map +1 -0
- package/dist/client/share.d.cts +41 -0
- package/dist/client/share.d.ts +41 -0
- package/dist/client/share.js +205 -0
- package/dist/client/share.js.map +1 -0
- package/dist/index.cjs +89 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/routes/index.cjs +266 -0
- package/dist/routes/index.cjs.map +1 -0
- package/dist/routes/index.d.cts +87 -0
- package/dist/routes/index.d.ts +87 -0
- package/dist/routes/index.js +240 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/server/index.cjs +368 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.cts +132 -0
- package/dist/server/index.d.ts +132 -0
- package/dist/server/index.js +339 -0
- package/dist/server/index.js.map +1 -0
- package/dist/utils-DXbN9MTi.d.cts +120 -0
- package/dist/utils-DXbN9MTi.d.ts +120 -0
- package/package.json +110 -3
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/routes/index.ts
|
|
21
|
+
var routes_exports = {};
|
|
22
|
+
__export(routes_exports, {
|
|
23
|
+
createBlogCategoriesHandler: () => createBlogCategoriesHandler,
|
|
24
|
+
createBlogCategoryDescriptionHandler: () => createBlogCategoryDescriptionHandler,
|
|
25
|
+
createBlogFeedbackHandler: () => createBlogFeedbackHandler,
|
|
26
|
+
createBlogJsonLdHandler: () => createBlogJsonLdHandler,
|
|
27
|
+
createBlogListHandler: () => createBlogListHandler,
|
|
28
|
+
createBlogReactionHandler: () => createBlogReactionHandler,
|
|
29
|
+
createBlogSlugHandler: () => createBlogSlugHandler,
|
|
30
|
+
createBlogTagSlugHandler: () => createBlogTagSlugHandler,
|
|
31
|
+
createBlogTagsHandler: () => createBlogTagsHandler,
|
|
32
|
+
createMailooBlogRoutes: () => createMailooBlogRoutes
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(routes_exports);
|
|
35
|
+
var import_next_core2 = require("@mailoo/next-core");
|
|
36
|
+
|
|
37
|
+
// src/server/client.ts
|
|
38
|
+
var import_navigation = require("next/navigation");
|
|
39
|
+
var import_next_core = require("@mailoo/next-core");
|
|
40
|
+
var import_images = require("@mailoo/images");
|
|
41
|
+
function getMailooBlogConfigFromEnv() {
|
|
42
|
+
return (0, import_next_core.readMailooIntegrationConfig)({ prefix: "MAILOO_BLOG" });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/routes/index.ts
|
|
46
|
+
function resolveConfig(options) {
|
|
47
|
+
return options?.getConfig?.() ?? getMailooBlogConfigFromEnv();
|
|
48
|
+
}
|
|
49
|
+
function notConfigured(logger) {
|
|
50
|
+
logger.error(
|
|
51
|
+
"MAILOO_BLOG_PROJECT_UID, MAILOO_BLOG_INTEGRATION_ID, MAILOO_BLOG_API and MAILOO_BLOG_API_KEY must be set"
|
|
52
|
+
);
|
|
53
|
+
return (0, import_next_core2.jsonError)({ error: "Blog API not configured" }, 503);
|
|
54
|
+
}
|
|
55
|
+
async function proxyGet(config, pathSuffix, searchParams) {
|
|
56
|
+
const url = new URL(
|
|
57
|
+
`${config.apiBaseUrl}/api/v1/blog/${config.projectUid}/integrations/${config.integrationId}${pathSuffix}`
|
|
58
|
+
);
|
|
59
|
+
if (searchParams) {
|
|
60
|
+
searchParams.forEach((value, key) => {
|
|
61
|
+
url.searchParams.append(key, value);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const response = await fetch(url.toString(), {
|
|
65
|
+
method: "GET",
|
|
66
|
+
headers: {
|
|
67
|
+
"Content-Type": "application/json",
|
|
68
|
+
"X-API-Key": config.apiKey
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
const data = await response.json();
|
|
72
|
+
return new Response(JSON.stringify(data), {
|
|
73
|
+
status: response.status,
|
|
74
|
+
headers: { "Content-Type": "application/json" }
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function createBlogListHandler(options) {
|
|
78
|
+
const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
|
|
79
|
+
return async function GET(request) {
|
|
80
|
+
const config = resolveConfig(options);
|
|
81
|
+
if (!config) return notConfigured(logger);
|
|
82
|
+
try {
|
|
83
|
+
return await proxyGet(config, "", request.nextUrl.searchParams);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
logger.logException?.(error, "Blog API proxy error");
|
|
86
|
+
return (0, import_next_core2.jsonError)({ error: "Internal server error" }, 500);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function createBlogSlugHandler(options) {
|
|
91
|
+
const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
|
|
92
|
+
return async function GET(request, ctx) {
|
|
93
|
+
const config = resolveConfig(options);
|
|
94
|
+
if (!config) return notConfigured(logger);
|
|
95
|
+
const { slug } = await ctx.params;
|
|
96
|
+
try {
|
|
97
|
+
const locale = request.nextUrl.searchParams.get("locale");
|
|
98
|
+
const qs = new URLSearchParams();
|
|
99
|
+
if (locale) qs.set("locale", locale);
|
|
100
|
+
return await proxyGet(config, `/slug/${encodeURIComponent(slug)}`, qs);
|
|
101
|
+
} catch (error) {
|
|
102
|
+
logger.logException?.(error, "Blog slug API proxy error");
|
|
103
|
+
return (0, import_next_core2.jsonError)({ error: "Internal server error" }, 500);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function createBlogCategoriesHandler(options) {
|
|
108
|
+
const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
|
|
109
|
+
return async function GET(request) {
|
|
110
|
+
const config = resolveConfig(options);
|
|
111
|
+
if (!config) return notConfigured(logger);
|
|
112
|
+
try {
|
|
113
|
+
return await proxyGet(config, "/categories", request.nextUrl.searchParams);
|
|
114
|
+
} catch (error) {
|
|
115
|
+
logger.logException?.(error, "Blog categories API proxy error");
|
|
116
|
+
return (0, import_next_core2.jsonError)({ error: "Internal server error" }, 500);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function createBlogTagsHandler(options) {
|
|
121
|
+
const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
|
|
122
|
+
return async function GET(request) {
|
|
123
|
+
const config = resolveConfig(options);
|
|
124
|
+
if (!config) return notConfigured(logger);
|
|
125
|
+
try {
|
|
126
|
+
return await proxyGet(config, "/tags", request.nextUrl.searchParams);
|
|
127
|
+
} catch (error) {
|
|
128
|
+
logger.logException?.(error, "Blog tags API proxy error");
|
|
129
|
+
return (0, import_next_core2.jsonError)({ error: "Internal server error" }, 500);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function createBlogTagSlugHandler(options) {
|
|
134
|
+
const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
|
|
135
|
+
return async function GET(request, ctx) {
|
|
136
|
+
const config = resolveConfig(options);
|
|
137
|
+
if (!config) return notConfigured(logger);
|
|
138
|
+
const { slug } = await ctx.params;
|
|
139
|
+
try {
|
|
140
|
+
return await proxyGet(
|
|
141
|
+
config,
|
|
142
|
+
`/tags/slug/${encodeURIComponent(slug)}`,
|
|
143
|
+
request.nextUrl.searchParams
|
|
144
|
+
);
|
|
145
|
+
} catch (error) {
|
|
146
|
+
logger.logException?.(error, "Blog tag slug API proxy error");
|
|
147
|
+
return (0, import_next_core2.jsonError)({ error: "Internal server error" }, 500);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function createBlogCategoryDescriptionHandler(options) {
|
|
152
|
+
const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
|
|
153
|
+
return async function GET(request, ctx) {
|
|
154
|
+
const config = resolveConfig(options);
|
|
155
|
+
if (!config) return notConfigured(logger);
|
|
156
|
+
const { slug } = await ctx.params;
|
|
157
|
+
try {
|
|
158
|
+
const locale = request.nextUrl.searchParams.get("locale");
|
|
159
|
+
const qs = new URLSearchParams();
|
|
160
|
+
if (locale) qs.set("locale", locale);
|
|
161
|
+
return await proxyGet(
|
|
162
|
+
config,
|
|
163
|
+
`/categories/slug/${encodeURIComponent(slug)}/description`,
|
|
164
|
+
qs
|
|
165
|
+
);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
logger.logException?.(error, "Blog category description API proxy error");
|
|
168
|
+
return (0, import_next_core2.jsonError)({ error: "Internal server error" }, 500);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function createBlogJsonLdHandler(options) {
|
|
173
|
+
const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
|
|
174
|
+
return async function GET(request, ctx) {
|
|
175
|
+
const config = resolveConfig(options);
|
|
176
|
+
if (!config) return notConfigured(logger);
|
|
177
|
+
const { slug } = await ctx.params;
|
|
178
|
+
try {
|
|
179
|
+
const locale = request.nextUrl.searchParams.get("locale");
|
|
180
|
+
const qs = new URLSearchParams();
|
|
181
|
+
if (locale) qs.set("locale", locale);
|
|
182
|
+
return await proxyGet(
|
|
183
|
+
config,
|
|
184
|
+
`/slug/${encodeURIComponent(slug)}/json-ld`,
|
|
185
|
+
qs
|
|
186
|
+
);
|
|
187
|
+
} catch (error) {
|
|
188
|
+
logger.logException?.(error, "Blog JSON-LD API proxy error");
|
|
189
|
+
return (0, import_next_core2.jsonError)({ error: "Internal server error" }, 500);
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
async function proxyMarkPost(options, request, slug, pathKind, logLabel) {
|
|
194
|
+
const logger = options?.logger ?? import_next_core2.defaultMailooLogger;
|
|
195
|
+
const config = resolveConfig(options);
|
|
196
|
+
if (!config) return notConfigured(logger);
|
|
197
|
+
let body;
|
|
198
|
+
try {
|
|
199
|
+
body = await request.json();
|
|
200
|
+
} catch {
|
|
201
|
+
return (0, import_next_core2.jsonError)({ error: "Invalid JSON body" }, 400);
|
|
202
|
+
}
|
|
203
|
+
const url = `${config.apiBaseUrl}/api/v1/blog/${config.projectUid}/integrations/${config.integrationId}/slug/${encodeURIComponent(slug)}/${pathKind}`;
|
|
204
|
+
try {
|
|
205
|
+
return await (0, import_next_core2.proxyMailooWebhookJsonPost)({
|
|
206
|
+
request,
|
|
207
|
+
url,
|
|
208
|
+
apiKey: config.apiKey,
|
|
209
|
+
body
|
|
210
|
+
});
|
|
211
|
+
} catch (error) {
|
|
212
|
+
logger.logException?.(error, logLabel);
|
|
213
|
+
return (0, import_next_core2.jsonError)({ error: "Internal server error" }, 500);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function createBlogReactionHandler(options) {
|
|
217
|
+
return async function POST(request, ctx) {
|
|
218
|
+
const { slug } = await ctx.params;
|
|
219
|
+
return proxyMarkPost(
|
|
220
|
+
options,
|
|
221
|
+
request,
|
|
222
|
+
slug,
|
|
223
|
+
"reaction",
|
|
224
|
+
"Blog reaction proxy error"
|
|
225
|
+
);
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function createBlogFeedbackHandler(options) {
|
|
229
|
+
return async function POST(request, ctx) {
|
|
230
|
+
const { slug } = await ctx.params;
|
|
231
|
+
return proxyMarkPost(
|
|
232
|
+
options,
|
|
233
|
+
request,
|
|
234
|
+
slug,
|
|
235
|
+
"feedback",
|
|
236
|
+
"Blog feedback proxy error"
|
|
237
|
+
);
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function createMailooBlogRoutes(options) {
|
|
241
|
+
return {
|
|
242
|
+
list: createBlogListHandler(options),
|
|
243
|
+
slug: createBlogSlugHandler(options),
|
|
244
|
+
jsonLd: createBlogJsonLdHandler(options),
|
|
245
|
+
categories: createBlogCategoriesHandler(options),
|
|
246
|
+
tags: createBlogTagsHandler(options),
|
|
247
|
+
tagSlug: createBlogTagSlugHandler(options),
|
|
248
|
+
categoryDescription: createBlogCategoryDescriptionHandler(options),
|
|
249
|
+
reaction: createBlogReactionHandler(options),
|
|
250
|
+
feedback: createBlogFeedbackHandler(options)
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
254
|
+
0 && (module.exports = {
|
|
255
|
+
createBlogCategoriesHandler,
|
|
256
|
+
createBlogCategoryDescriptionHandler,
|
|
257
|
+
createBlogFeedbackHandler,
|
|
258
|
+
createBlogJsonLdHandler,
|
|
259
|
+
createBlogListHandler,
|
|
260
|
+
createBlogReactionHandler,
|
|
261
|
+
createBlogSlugHandler,
|
|
262
|
+
createBlogTagSlugHandler,
|
|
263
|
+
createBlogTagsHandler,
|
|
264
|
+
createMailooBlogRoutes
|
|
265
|
+
});
|
|
266
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/index.ts","../../src/server/client.ts"],"sourcesContent":["import type { NextRequest } from 'next/server'\nimport {\n defaultMailooLogger,\n jsonError,\n proxyMailooWebhookJsonPost,\n type MailooIntegrationConfig,\n type MailooLogger,\n} from '@mailoo/next-core'\nimport { getMailooBlogConfigFromEnv } from '../server/client.js'\n\nexport type CreateBlogRoutesOptions = {\n /** Explicit config; defaults to MAILOO_BLOG_* env */\n getConfig?: () => MailooIntegrationConfig | null\n logger?: MailooLogger\n}\n\nfunction resolveConfig(\n options?: CreateBlogRoutesOptions\n): MailooIntegrationConfig | null {\n return options?.getConfig?.() ?? getMailooBlogConfigFromEnv()\n}\n\nfunction notConfigured(logger: MailooLogger): Response {\n logger.error(\n 'MAILOO_BLOG_PROJECT_UID, MAILOO_BLOG_INTEGRATION_ID, MAILOO_BLOG_API and MAILOO_BLOG_API_KEY must be set'\n )\n return jsonError({ error: 'Blog API not configured' }, 503)\n}\n\nasync function proxyGet(\n config: MailooIntegrationConfig,\n pathSuffix: string,\n searchParams?: URLSearchParams\n): Promise<Response> {\n const url = new URL(\n `${config.apiBaseUrl}/api/v1/blog/${config.projectUid}/integrations/${config.integrationId}${pathSuffix}`\n )\n if (searchParams) {\n searchParams.forEach((value, key) => {\n url.searchParams.append(key, value)\n })\n }\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': config.apiKey,\n },\n })\n const data = await response.json()\n return new Response(JSON.stringify(data), {\n status: response.status,\n headers: { 'Content-Type': 'application/json' },\n })\n}\n\n/** Factory: GET list posts — mount at `app/api/v1/blog/route.ts` */\nexport function createBlogListHandler(options?: CreateBlogRoutesOptions) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(request: NextRequest): Promise<Response> {\n const config = resolveConfig(options)\n if (!config) return notConfigured(logger)\n try {\n return await proxyGet(config, '', request.nextUrl.searchParams)\n } catch (error) {\n logger.logException?.(error, 'Blog API proxy error')\n return jsonError({ error: 'Internal server error' }, 500)\n }\n }\n}\n\n/** Factory: GET post by slug — mount at `app/api/v1/blog/slug/[slug]/route.ts` */\nexport function createBlogSlugHandler(options?: CreateBlogRoutesOptions) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(\n request: NextRequest,\n ctx: { params: Promise<{ slug: string }> }\n ): Promise<Response> {\n const config = resolveConfig(options)\n if (!config) return notConfigured(logger)\n const { slug } = await ctx.params\n try {\n const locale = request.nextUrl.searchParams.get('locale')\n const qs = new URLSearchParams()\n if (locale) qs.set('locale', locale)\n return await proxyGet(config, `/slug/${encodeURIComponent(slug)}`, qs)\n } catch (error) {\n logger.logException?.(error, 'Blog slug API proxy error')\n return jsonError({ error: 'Internal server error' }, 500)\n }\n }\n}\n\n/** Factory: GET categories */\nexport function createBlogCategoriesHandler(options?: CreateBlogRoutesOptions) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(request: NextRequest): Promise<Response> {\n const config = resolveConfig(options)\n if (!config) return notConfigured(logger)\n try {\n return await proxyGet(config, '/categories', request.nextUrl.searchParams)\n } catch (error) {\n logger.logException?.(error, 'Blog categories API proxy error')\n return jsonError({ error: 'Internal server error' }, 500)\n }\n }\n}\n\n/** Factory: GET tags */\nexport function createBlogTagsHandler(options?: CreateBlogRoutesOptions) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(request: NextRequest): Promise<Response> {\n const config = resolveConfig(options)\n if (!config) return notConfigured(logger)\n try {\n return await proxyGet(config, '/tags', request.nextUrl.searchParams)\n } catch (error) {\n logger.logException?.(error, 'Blog tags API proxy error')\n return jsonError({ error: 'Internal server error' }, 500)\n }\n }\n}\n\n/** Factory: GET tag by slug */\nexport function createBlogTagSlugHandler(options?: CreateBlogRoutesOptions) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(\n request: NextRequest,\n ctx: { params: Promise<{ slug: string }> }\n ): Promise<Response> {\n const config = resolveConfig(options)\n if (!config) return notConfigured(logger)\n const { slug } = await ctx.params\n try {\n return await proxyGet(\n config,\n `/tags/slug/${encodeURIComponent(slug)}`,\n request.nextUrl.searchParams\n )\n } catch (error) {\n logger.logException?.(error, 'Blog tag slug API proxy error')\n return jsonError({ error: 'Internal server error' }, 500)\n }\n }\n}\n\n/** Factory: GET category description by slug */\nexport function createBlogCategoryDescriptionHandler(\n options?: CreateBlogRoutesOptions\n) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(\n request: NextRequest,\n ctx: { params: Promise<{ slug: string }> }\n ): Promise<Response> {\n const config = resolveConfig(options)\n if (!config) return notConfigured(logger)\n const { slug } = await ctx.params\n try {\n const locale = request.nextUrl.searchParams.get('locale')\n const qs = new URLSearchParams()\n if (locale) qs.set('locale', locale)\n return await proxyGet(\n config,\n `/categories/slug/${encodeURIComponent(slug)}/description`,\n qs\n )\n } catch (error) {\n logger.logException?.(error, 'Blog category description API proxy error')\n return jsonError({ error: 'Internal server error' }, 500)\n }\n }\n}\n\n/** Factory: GET JSON-LD by slug — mount at `app/api/v1/blog/slug/[slug]/json-ld/route.ts` */\nexport function createBlogJsonLdHandler(options?: CreateBlogRoutesOptions) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(\n request: NextRequest,\n ctx: { params: Promise<{ slug: string }> }\n ): Promise<Response> {\n const config = resolveConfig(options)\n if (!config) return notConfigured(logger)\n const { slug } = await ctx.params\n try {\n const locale = request.nextUrl.searchParams.get('locale')\n const qs = new URLSearchParams()\n if (locale) qs.set('locale', locale)\n return await proxyGet(\n config,\n `/slug/${encodeURIComponent(slug)}/json-ld`,\n qs\n )\n } catch (error) {\n logger.logException?.(error, 'Blog JSON-LD API proxy error')\n return jsonError({ error: 'Internal server error' }, 500)\n }\n }\n}\n\nasync function proxyMarkPost(\n options: CreateBlogRoutesOptions | undefined,\n request: NextRequest,\n slug: string,\n pathKind: 'reaction' | 'feedback',\n logLabel: string\n): Promise<Response> {\n const logger = options?.logger ?? defaultMailooLogger\n const config = resolveConfig(options)\n if (!config) return notConfigured(logger)\n let body: unknown\n try {\n body = await request.json()\n } catch {\n return jsonError({ error: 'Invalid JSON body' }, 400)\n }\n const url = `${config.apiBaseUrl}/api/v1/blog/${config.projectUid}/integrations/${config.integrationId}/slug/${encodeURIComponent(slug)}/${pathKind}`\n try {\n return await proxyMailooWebhookJsonPost({\n request,\n url,\n apiKey: config.apiKey,\n body,\n })\n } catch (error) {\n logger.logException?.(error, logLabel)\n return jsonError({ error: 'Internal server error' }, 500)\n }\n}\n\n/** Factory: POST reaction — mount at `app/api/v1/blog/slug/[slug]/reaction/route.ts` */\nexport function createBlogReactionHandler(options?: CreateBlogRoutesOptions) {\n return async function POST(\n request: NextRequest,\n ctx: { params: Promise<{ slug: string }> }\n ): Promise<Response> {\n const { slug } = await ctx.params\n return proxyMarkPost(\n options,\n request,\n slug,\n 'reaction',\n 'Blog reaction proxy error'\n )\n }\n}\n\n/** Factory: POST feedback — mount at `app/api/v1/blog/slug/[slug]/feedback/route.ts` */\nexport function createBlogFeedbackHandler(options?: CreateBlogRoutesOptions) {\n return async function POST(\n request: NextRequest,\n ctx: { params: Promise<{ slug: string }> }\n ): Promise<Response> {\n const { slug } = await ctx.params\n return proxyMarkPost(\n options,\n request,\n slug,\n 'feedback',\n 'Blog feedback proxy error'\n )\n }\n}\n\nexport function createMailooBlogRoutes(options?: CreateBlogRoutesOptions) {\n return {\n list: createBlogListHandler(options),\n slug: createBlogSlugHandler(options),\n jsonLd: createBlogJsonLdHandler(options),\n categories: createBlogCategoriesHandler(options),\n tags: createBlogTagsHandler(options),\n tagSlug: createBlogTagSlugHandler(options),\n categoryDescription: createBlogCategoryDescriptionHandler(options),\n reaction: createBlogReactionHandler(options),\n feedback: createBlogFeedbackHandler(options),\n }\n}\n","import { unstable_rethrow } from 'next/navigation'\nimport type { MailooIntegrationConfig } from '@mailoo/next-core'\nimport { readMailooIntegrationConfig } from '@mailoo/next-core'\nimport {\n rewriteMailooBlogMediaUrls,\n rewriteMailooPublicImageUrls,\n rewriteMailooPublicImageUrlsAnyHost,\n} from '@mailoo/images'\nimport type {\n BlogArticleMarkState,\n BlogCategoryApi,\n BlogTagApi,\n BlogListPagination,\n BlogListQuery,\n BlogPostApiData,\n MailooBlogFetchOptions,\n SetBlogFeedbackInput,\n SetBlogReactionInput,\n} from '../types.js'\n\nexport type MailooBlogConfig = MailooIntegrationConfig\nexport type { MailooBlogFetchOptions }\n\n/** Host image proxy. Omit to keep canonical Mailoo embed URLs. */\nexport type CreateMailooBlogClientOptions = {\n /**\n * Integrator prefix ending with `?id=` (absolute or same-origin path).\n * Example: `/api/v1/images/public/content?id=`\n */\n imageProxyPrefixWithIdEquals?: string\n}\n\nconst DEFAULT_REVALIDATE = 60\n\n/** Read MAILOO_BLOG_* env (API, API_KEY, PROJECT_UID, INTEGRATION_ID). */\nexport function getMailooBlogConfigFromEnv(): MailooBlogConfig | null {\n return readMailooIntegrationConfig({ prefix: 'MAILOO_BLOG' })\n}\n\nfunction blogBasePath(config: MailooBlogConfig): string {\n return `${config.apiBaseUrl}/api/v1/blog/${config.projectUid}/integrations/${config.integrationId}`\n}\n\nfunction resolveRevalidate(options?: MailooBlogFetchOptions): number {\n return options?.revalidate ?? DEFAULT_REVALIDATE\n}\n\nasync function blogFetchJson(\n config: MailooBlogConfig,\n path: string,\n query?: Record<string, string | undefined>,\n options?: MailooBlogFetchOptions\n): Promise<\n { ok: true; json: unknown; status: number } | { ok: false; status: number }\n> {\n const url = new URL(`${blogBasePath(config)}${path}`)\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== '') url.searchParams.set(k, v)\n }\n }\n try {\n const revalidate = resolveRevalidate(options)\n const res = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': config.apiKey,\n },\n next: { revalidate },\n } as RequestInit)\n if (!res.ok) {\n return { ok: false, status: res.status }\n }\n return { ok: true, json: await res.json(), status: res.status }\n } catch (error) {\n unstable_rethrow(error)\n return { ok: false, status: 500 }\n }\n}\n\nasync function blogPostJson(\n config: MailooBlogConfig,\n path: string,\n body: unknown\n): Promise<\n | { ok: true; data: BlogArticleMarkState; status: number }\n | { ok: false; status: number }\n> {\n try {\n const res = await fetch(`${blogBasePath(config)}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': config.apiKey,\n },\n body: JSON.stringify(body),\n cache: 'no-store',\n })\n if (!res.ok) {\n return { ok: false, status: res.status }\n }\n const json = (await res.json()) as { data?: BlogArticleMarkState }\n if (!json.data || typeof json.data !== 'object') {\n return { ok: false, status: 500 }\n }\n return { ok: true, data: json.data, status: res.status }\n } catch (error) {\n unstable_rethrow(error)\n return { ok: false, status: 500 }\n }\n}\n\nasync function blogGet<T>(\n config: MailooBlogConfig,\n path: string,\n query?: Record<string, string | undefined>,\n options?: MailooBlogFetchOptions\n): Promise<\n { ok: true; data: T; status: number } | { ok: false; status: number }\n> {\n const fetched = await blogFetchJson(config, path, query, options)\n if (!fetched.ok) return fetched\n const json = fetched.json as { data?: T } & T\n const data =\n (json as { data?: T }).data !== undefined\n ? (json as { data: T }).data\n : (json as T)\n return { ok: true, data, status: fetched.status }\n}\n\nfunction isBlogListPagination(value: unknown): value is BlogListPagination {\n if (value === null || typeof value !== 'object') return false\n const p = value as Record<string, unknown>\n return (\n typeof p.page === 'number' &&\n typeof p.limit === 'number' &&\n typeof p.total === 'number' &&\n typeof p.totalPages === 'number' &&\n typeof p.hasNextPage === 'boolean' &&\n typeof p.hasPrevPage === 'boolean'\n )\n}\n\nfunction queryRecord(query: BlogListQuery): Record<string, string | undefined> {\n const q: Record<string, string | undefined> = {}\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue\n q[k] = String(v)\n }\n return q\n}\n\nfunction imageProxyPrefix(\n options?: CreateMailooBlogClientOptions\n): string | undefined {\n const raw = options?.imageProxyPrefixWithIdEquals?.trim()\n return raw || undefined\n}\n\nfunction rewritePost(\n post: BlogPostApiData,\n canonicalPrefixWithIdEquals: string,\n proxyPrefixWithIdEquals: string\n): BlogPostApiData {\n return rewriteMailooBlogMediaUrls(post, {\n canonicalPrefixWithIdEquals,\n proxyPrefixWithIdEquals,\n })\n}\n\ntype CategoryDescription = {\n description?: string\n descriptionHtml?: string\n imagePublicEmbedBaseUrl?: string\n}\n\nexport function createMailooBlogClient(\n config: MailooBlogConfig,\n clientOptions?: CreateMailooBlogClientOptions\n) {\n const proxyPrefix = imageProxyPrefix(clientOptions)\n return {\n async listPosts(\n query: BlogListQuery = {},\n options?: MailooBlogFetchOptions\n ): Promise<\n | {\n ok: true\n data: BlogPostApiData[]\n pagination: BlogListPagination\n imagePublicEmbedBaseUrl: string\n status: number\n }\n | { ok: false; status: number }\n > {\n const fetched = await blogFetchJson(\n config,\n '',\n queryRecord(query),\n options\n )\n if (!fetched.ok) return fetched\n const json = fetched.json\n if (json === null || typeof json !== 'object') {\n return { ok: false, status: 500 }\n }\n const body = json as {\n data?: unknown\n pagination?: unknown\n imagePublicEmbedBaseUrl?: unknown\n }\n const imagePublicEmbedBaseUrl =\n typeof body.imagePublicEmbedBaseUrl === 'string'\n ? body.imagePublicEmbedBaseUrl.trim()\n : ''\n if (\n !Array.isArray(body.data) ||\n !isBlogListPagination(body.pagination) ||\n !imagePublicEmbedBaseUrl\n ) {\n return { ok: false, status: 500 }\n }\n const posts = body.data as BlogPostApiData[]\n return {\n ok: true,\n data: proxyPrefix\n ? posts.map((post) =>\n rewritePost(post, imagePublicEmbedBaseUrl, proxyPrefix)\n )\n : posts,\n pagination: body.pagination,\n imagePublicEmbedBaseUrl,\n status: fetched.status,\n }\n },\n\n async getPostBySlug(\n slug: string,\n locale?: string,\n options?: MailooBlogFetchOptions\n ) {\n const result = await blogGet<BlogPostApiData>(\n config,\n `/slug/${encodeURIComponent(slug)}`,\n locale ? { locale } : undefined,\n options\n )\n if (!result.ok || !proxyPrefix) return result\n const canonical = result.data.imagePublicEmbedBaseUrl?.trim()\n if (!canonical) return { ok: false as const, status: 500 }\n return {\n ...result,\n data: rewritePost(result.data, canonical, proxyPrefix),\n }\n },\n\n async getPostJsonLd(\n slug: string,\n locale?: string,\n options?: MailooBlogFetchOptions\n ) {\n const result = await blogGet<{ jsonLd: Record<string, unknown> }>(\n config,\n `/slug/${encodeURIComponent(slug)}/json-ld`,\n locale ? { locale } : undefined,\n options\n )\n if (!result.ok || !proxyPrefix) return result\n const rewritten = rewriteMailooPublicImageUrlsAnyHost(\n JSON.stringify(result.data.jsonLd),\n proxyPrefix\n )\n try {\n return {\n ...result,\n data: { jsonLd: JSON.parse(rewritten) as Record<string, unknown> },\n }\n } catch {\n return { ok: false as const, status: 500 }\n }\n },\n\n async listCategories(locale?: string, options?: MailooBlogFetchOptions) {\n return blogGet<BlogCategoryApi[]>(\n config,\n '/categories',\n locale ? { locale } : undefined,\n options\n )\n },\n\n async listTags(locale?: string, options?: MailooBlogFetchOptions) {\n return blogGet<BlogTagApi[]>(\n config,\n '/tags',\n locale ? { locale } : undefined,\n options\n )\n },\n\n async getTagBySlug(\n slug: string,\n locale?: string,\n options?: MailooBlogFetchOptions\n ) {\n return blogGet<BlogTagApi>(\n config,\n `/tags/slug/${encodeURIComponent(slug)}`,\n locale ? { locale } : undefined,\n options\n )\n },\n\n async getCategoryDescription(\n slug: string,\n locale?: string,\n options?: MailooBlogFetchOptions\n ) {\n const result = await blogGet<CategoryDescription>(\n config,\n `/categories/slug/${encodeURIComponent(slug)}/description`,\n locale ? { locale } : undefined,\n options\n )\n if (!result.ok || !proxyPrefix) return result\n const canonical = result.data.imagePublicEmbedBaseUrl?.trim()\n if (!canonical) return { ok: false as const, status: 500 }\n const opts = {\n canonicalPrefixWithIdEquals: canonical,\n proxyPrefixWithIdEquals: proxyPrefix,\n }\n return {\n ...result,\n data: {\n ...result.data,\n description:\n typeof result.data.description === 'string'\n ? rewriteMailooPublicImageUrls(result.data.description, opts)\n : result.data.description,\n descriptionHtml:\n typeof result.data.descriptionHtml === 'string'\n ? rewriteMailooPublicImageUrls(result.data.descriptionHtml, opts)\n : result.data.descriptionHtml,\n },\n }\n },\n\n async setReaction(slug: string, input: SetBlogReactionInput) {\n return blogPostJson(\n config,\n `/slug/${encodeURIComponent(slug)}/reaction`,\n input\n )\n },\n\n async setFeedback(slug: string, input: SetBlogFeedbackInput) {\n return blogPostJson(\n config,\n `/slug/${encodeURIComponent(slug)}/feedback`,\n input\n )\n },\n }\n}\n\nexport type MailooBlogClient = ReturnType<typeof createMailooBlogClient>\n"],"mappings":"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","names":["import_next_core"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { NextRequest } from 'next/server';
|
|
2
|
+
import { MailooIntegrationConfig, MailooLogger } from '@mailoo/next-core';
|
|
3
|
+
|
|
4
|
+
type CreateBlogRoutesOptions = {
|
|
5
|
+
/** Explicit config; defaults to MAILOO_BLOG_* env */
|
|
6
|
+
getConfig?: () => MailooIntegrationConfig | null;
|
|
7
|
+
logger?: MailooLogger;
|
|
8
|
+
};
|
|
9
|
+
/** Factory: GET list posts — mount at `app/api/v1/blog/route.ts` */
|
|
10
|
+
declare function createBlogListHandler(options?: CreateBlogRoutesOptions): (request: NextRequest) => Promise<Response>;
|
|
11
|
+
/** Factory: GET post by slug — mount at `app/api/v1/blog/slug/[slug]/route.ts` */
|
|
12
|
+
declare function createBlogSlugHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
13
|
+
params: Promise<{
|
|
14
|
+
slug: string;
|
|
15
|
+
}>;
|
|
16
|
+
}) => Promise<Response>;
|
|
17
|
+
/** Factory: GET categories */
|
|
18
|
+
declare function createBlogCategoriesHandler(options?: CreateBlogRoutesOptions): (request: NextRequest) => Promise<Response>;
|
|
19
|
+
/** Factory: GET tags */
|
|
20
|
+
declare function createBlogTagsHandler(options?: CreateBlogRoutesOptions): (request: NextRequest) => Promise<Response>;
|
|
21
|
+
/** Factory: GET tag by slug */
|
|
22
|
+
declare function createBlogTagSlugHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
23
|
+
params: Promise<{
|
|
24
|
+
slug: string;
|
|
25
|
+
}>;
|
|
26
|
+
}) => Promise<Response>;
|
|
27
|
+
/** Factory: GET category description by slug */
|
|
28
|
+
declare function createBlogCategoryDescriptionHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
29
|
+
params: Promise<{
|
|
30
|
+
slug: string;
|
|
31
|
+
}>;
|
|
32
|
+
}) => Promise<Response>;
|
|
33
|
+
/** Factory: GET JSON-LD by slug — mount at `app/api/v1/blog/slug/[slug]/json-ld/route.ts` */
|
|
34
|
+
declare function createBlogJsonLdHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
35
|
+
params: Promise<{
|
|
36
|
+
slug: string;
|
|
37
|
+
}>;
|
|
38
|
+
}) => Promise<Response>;
|
|
39
|
+
/** Factory: POST reaction — mount at `app/api/v1/blog/slug/[slug]/reaction/route.ts` */
|
|
40
|
+
declare function createBlogReactionHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
41
|
+
params: Promise<{
|
|
42
|
+
slug: string;
|
|
43
|
+
}>;
|
|
44
|
+
}) => Promise<Response>;
|
|
45
|
+
/** Factory: POST feedback — mount at `app/api/v1/blog/slug/[slug]/feedback/route.ts` */
|
|
46
|
+
declare function createBlogFeedbackHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
47
|
+
params: Promise<{
|
|
48
|
+
slug: string;
|
|
49
|
+
}>;
|
|
50
|
+
}) => Promise<Response>;
|
|
51
|
+
declare function createMailooBlogRoutes(options?: CreateBlogRoutesOptions): {
|
|
52
|
+
list: (request: NextRequest) => Promise<Response>;
|
|
53
|
+
slug: (request: NextRequest, ctx: {
|
|
54
|
+
params: Promise<{
|
|
55
|
+
slug: string;
|
|
56
|
+
}>;
|
|
57
|
+
}) => Promise<Response>;
|
|
58
|
+
jsonLd: (request: NextRequest, ctx: {
|
|
59
|
+
params: Promise<{
|
|
60
|
+
slug: string;
|
|
61
|
+
}>;
|
|
62
|
+
}) => Promise<Response>;
|
|
63
|
+
categories: (request: NextRequest) => Promise<Response>;
|
|
64
|
+
tags: (request: NextRequest) => Promise<Response>;
|
|
65
|
+
tagSlug: (request: NextRequest, ctx: {
|
|
66
|
+
params: Promise<{
|
|
67
|
+
slug: string;
|
|
68
|
+
}>;
|
|
69
|
+
}) => Promise<Response>;
|
|
70
|
+
categoryDescription: (request: NextRequest, ctx: {
|
|
71
|
+
params: Promise<{
|
|
72
|
+
slug: string;
|
|
73
|
+
}>;
|
|
74
|
+
}) => Promise<Response>;
|
|
75
|
+
reaction: (request: NextRequest, ctx: {
|
|
76
|
+
params: Promise<{
|
|
77
|
+
slug: string;
|
|
78
|
+
}>;
|
|
79
|
+
}) => Promise<Response>;
|
|
80
|
+
feedback: (request: NextRequest, ctx: {
|
|
81
|
+
params: Promise<{
|
|
82
|
+
slug: string;
|
|
83
|
+
}>;
|
|
84
|
+
}) => Promise<Response>;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export { type CreateBlogRoutesOptions, createBlogCategoriesHandler, createBlogCategoryDescriptionHandler, createBlogFeedbackHandler, createBlogJsonLdHandler, createBlogListHandler, createBlogReactionHandler, createBlogSlugHandler, createBlogTagSlugHandler, createBlogTagsHandler, createMailooBlogRoutes };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { NextRequest } from 'next/server';
|
|
2
|
+
import { MailooIntegrationConfig, MailooLogger } from '@mailoo/next-core';
|
|
3
|
+
|
|
4
|
+
type CreateBlogRoutesOptions = {
|
|
5
|
+
/** Explicit config; defaults to MAILOO_BLOG_* env */
|
|
6
|
+
getConfig?: () => MailooIntegrationConfig | null;
|
|
7
|
+
logger?: MailooLogger;
|
|
8
|
+
};
|
|
9
|
+
/** Factory: GET list posts — mount at `app/api/v1/blog/route.ts` */
|
|
10
|
+
declare function createBlogListHandler(options?: CreateBlogRoutesOptions): (request: NextRequest) => Promise<Response>;
|
|
11
|
+
/** Factory: GET post by slug — mount at `app/api/v1/blog/slug/[slug]/route.ts` */
|
|
12
|
+
declare function createBlogSlugHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
13
|
+
params: Promise<{
|
|
14
|
+
slug: string;
|
|
15
|
+
}>;
|
|
16
|
+
}) => Promise<Response>;
|
|
17
|
+
/** Factory: GET categories */
|
|
18
|
+
declare function createBlogCategoriesHandler(options?: CreateBlogRoutesOptions): (request: NextRequest) => Promise<Response>;
|
|
19
|
+
/** Factory: GET tags */
|
|
20
|
+
declare function createBlogTagsHandler(options?: CreateBlogRoutesOptions): (request: NextRequest) => Promise<Response>;
|
|
21
|
+
/** Factory: GET tag by slug */
|
|
22
|
+
declare function createBlogTagSlugHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
23
|
+
params: Promise<{
|
|
24
|
+
slug: string;
|
|
25
|
+
}>;
|
|
26
|
+
}) => Promise<Response>;
|
|
27
|
+
/** Factory: GET category description by slug */
|
|
28
|
+
declare function createBlogCategoryDescriptionHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
29
|
+
params: Promise<{
|
|
30
|
+
slug: string;
|
|
31
|
+
}>;
|
|
32
|
+
}) => Promise<Response>;
|
|
33
|
+
/** Factory: GET JSON-LD by slug — mount at `app/api/v1/blog/slug/[slug]/json-ld/route.ts` */
|
|
34
|
+
declare function createBlogJsonLdHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
35
|
+
params: Promise<{
|
|
36
|
+
slug: string;
|
|
37
|
+
}>;
|
|
38
|
+
}) => Promise<Response>;
|
|
39
|
+
/** Factory: POST reaction — mount at `app/api/v1/blog/slug/[slug]/reaction/route.ts` */
|
|
40
|
+
declare function createBlogReactionHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
41
|
+
params: Promise<{
|
|
42
|
+
slug: string;
|
|
43
|
+
}>;
|
|
44
|
+
}) => Promise<Response>;
|
|
45
|
+
/** Factory: POST feedback — mount at `app/api/v1/blog/slug/[slug]/feedback/route.ts` */
|
|
46
|
+
declare function createBlogFeedbackHandler(options?: CreateBlogRoutesOptions): (request: NextRequest, ctx: {
|
|
47
|
+
params: Promise<{
|
|
48
|
+
slug: string;
|
|
49
|
+
}>;
|
|
50
|
+
}) => Promise<Response>;
|
|
51
|
+
declare function createMailooBlogRoutes(options?: CreateBlogRoutesOptions): {
|
|
52
|
+
list: (request: NextRequest) => Promise<Response>;
|
|
53
|
+
slug: (request: NextRequest, ctx: {
|
|
54
|
+
params: Promise<{
|
|
55
|
+
slug: string;
|
|
56
|
+
}>;
|
|
57
|
+
}) => Promise<Response>;
|
|
58
|
+
jsonLd: (request: NextRequest, ctx: {
|
|
59
|
+
params: Promise<{
|
|
60
|
+
slug: string;
|
|
61
|
+
}>;
|
|
62
|
+
}) => Promise<Response>;
|
|
63
|
+
categories: (request: NextRequest) => Promise<Response>;
|
|
64
|
+
tags: (request: NextRequest) => Promise<Response>;
|
|
65
|
+
tagSlug: (request: NextRequest, ctx: {
|
|
66
|
+
params: Promise<{
|
|
67
|
+
slug: string;
|
|
68
|
+
}>;
|
|
69
|
+
}) => Promise<Response>;
|
|
70
|
+
categoryDescription: (request: NextRequest, ctx: {
|
|
71
|
+
params: Promise<{
|
|
72
|
+
slug: string;
|
|
73
|
+
}>;
|
|
74
|
+
}) => Promise<Response>;
|
|
75
|
+
reaction: (request: NextRequest, ctx: {
|
|
76
|
+
params: Promise<{
|
|
77
|
+
slug: string;
|
|
78
|
+
}>;
|
|
79
|
+
}) => Promise<Response>;
|
|
80
|
+
feedback: (request: NextRequest, ctx: {
|
|
81
|
+
params: Promise<{
|
|
82
|
+
slug: string;
|
|
83
|
+
}>;
|
|
84
|
+
}) => Promise<Response>;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export { type CreateBlogRoutesOptions, createBlogCategoriesHandler, createBlogCategoryDescriptionHandler, createBlogFeedbackHandler, createBlogJsonLdHandler, createBlogListHandler, createBlogReactionHandler, createBlogSlugHandler, createBlogTagSlugHandler, createBlogTagsHandler, createMailooBlogRoutes };
|