@infuro/cms-core 1.0.52 → 1.0.54
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/dist/admin.cjs +86 -21
- package/dist/admin.js +86 -21
- package/dist/api.cjs +32 -32
- package/dist/api.js +1 -1
- package/dist/{chunk-3BPD5NGU.cjs → chunk-CJ2YAVCO.cjs} +127 -6
- package/dist/{chunk-UO5Q5RXB.js → chunk-PDA4L2LS.js} +127 -6
- package/dist/index.cjs +346 -223
- package/dist/index.js +135 -12
- package/dist/middleware.d.cts +50 -0
- package/dist/middleware.d.ts +50 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { emitOrderNotificationTrigger, fireOrderNotificationTrigger } from './chunk-MXIWUFBP.js';
|
|
2
|
-
import { checkMultiVendorEnabled, loadUserVendorContext, getPublicSettingsGroup, BlogGeneratorService } from './chunk-
|
|
3
|
-
export { Address, Attendee, Attribute, BLOG_GENERATOR_AGENT_NAME, BLOG_GENERATOR_DEFAULT_SYSTEM_INSTRUCTION, BLOG_GENERATOR_DEFAULT_VALIDATION_RULES, BLOG_GENERATOR_LLM_AGENT_SLUG, BLOG_GENERATOR_MARKDOWN_ARTICLE_SEPARATOR, BLOG_METADATA_ENRICHER_AGENT_NAME, BLOG_METADATA_ENRICHER_DEFAULT_SYSTEM_INSTRUCTION, BLOG_METADATA_ENRICHER_DEFAULT_VALIDATION_RULES, BLOG_METADATA_ENRICHER_LLM_AGENT_SLUG, Blog, BlogGeneratorService, Brand, CMS_ENTITY_MAP, Cart, CartItem, Category, ChatConversation, ChatMessage, Collection, Combo, ComboItem, Comment, Config, Contact, Currency, CurrencyExchange, Customer, Customer_Contacts, Discount, DiscountRules, Event, EventProduct, Form, FormField, FormSubmission, JobSchedule, JobScheduleRun, KnowledgeBaseChunk, KnowledgeBaseDocument, LlmAgent, LlmAgentKnowledgeDocument, Media, MessageTemplate, Order, OrderAddresses, OrderDiscounts, OrderItem, OrderNotificationBinding, OrderNotificationTrigger, OtpChallenge, Page, PasswordResetToken, Payment, Permission, Product, ProductAttribute, ProductCategory, ProductConfig, ProductVariant, RefundPolicy, RefundRequest, RssArticle, RssFeed, Seo, Tag, Tax, User, UserDeviceToken, UserGroup, Vendor, VendorCustomer, VendorRole, VendorRolePermission, VendorUser, VendorUserProfile, Wishlist, WishlistItem, ZIP_MIME_TYPES, applyApprovalStatusSideEffects, applyEventApprovalStatusSideEffects, applyRotatingVendorInvite, applyVendorCustomersContactFilter, applyVendorEventCreateApproval, applyVendorProductCreateApproval, assertCaptchaOk, assertContactAllowedForVendorOrder, assertEventApprovalUpdate, assertProductApprovalUpdate, buildBlogMetadataUserPrompt, buildCronFromSchedule, buildRssUserPromptFromFeeds, buildUserInviteLink, buildVendorInviteLink, calculateOrderRefundPreview, calculateRefundFromPolicy, checkAndIncrementDiscountUsage, checkEventsEnabled, checkMultiVendorEnabled, completeUserInviteAccept, consumeAppliedDiscountUsages, contactIsVendorCustomer, countDiscountOrdersForContact, countRecentOtpSends, createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCmsApp, createCmsAppWithMessaging, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createEventOrderMessageTemplateHandlers, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createMessageTemplateRowLoader, createOtpChallenge, createSetPasswordHandler, createSettingsApiHandlers, createSocialMediaHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, daysBeforeEventStart, decrementDiscountUsage, describeEventTierPolicy, ensureMessagingPluginsOnCms, ensureScheduleQueueWorker, ensureVendorCustomerForOrderContact, ensureVendorCustomersForOrder, findActiveRefundPolicyForVendor, findUserByInviteToken, findVendorByInviteToken, formatTierRange, generateNumericOtp, getPublicSettingsGroup, getRequireEventApproval, getRequireProductApproval, getRssArticleSummaryFromItem, getVendorCatalogCreateFlags, hashOtpCode, hydrateVendorSessionUser, invalidateEventsCache, invalidateMultiVendorCache, invalidateRequireEventApprovalCache, invalidateRequireProductApprovalCache, invalidateVendorCatalogCreateFlagsCache, isCustomerTypeContact, isMaxPerUserUsageReached, isMaxTotalUsageReached, isZipMedia, llmAgentToChatAgentOptions, loadSettingsGroupFromDb, loadUserVendorContext, mergeGuardrailsIntoSystemPrompt, messagingPlugins, metaFetchUserManagedPages, metaPostPageFeed, metaPostPagePhoto, metaResolvePageAccessToken, newUserInviteToken, normalizePhoneE164, normalizeRefundTiers, overlayCmsPlugins, parseBlogGeneratorAgentContent, parseBlogGeneratorModelOutput, parseBlogMetadataEnrichmentJson, parseLlmAgentValidationRules, pgBossScheduleNameForId, queueErpCreateContactIfEnabled, queueJobScheduleNow, queuePlugin, queueSms, recordDiscountUsage, registerJobRunnerWorker, registerMessagingQueueProcessors, registerSmsQueueProcessor, relativePathFromMediaParentId, resolveBlogCategoryIdByName, resolveSettingsEncryptionKey, resolveVendorIdForContactCheck, sanitizeMediaFolderPath, sanitizeStorageSegment, sendVendorOnboardEmails, simpleDecrypt, simpleEncrypt, syncJobScheduleToPgBoss, validateRefundTiers, validateScheduleInput, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules, verifyAndConsumeOtpChallenge, verifyOtpCodeHash, whatsappPlugin, wrapGetCmsWithMessaging } from './chunk-
|
|
2
|
+
import { checkMultiVendorEnabled, loadUserVendorContext, getPublicSettingsGroup, BlogGeneratorService } from './chunk-PDA4L2LS.js';
|
|
3
|
+
export { Address, Attendee, Attribute, BLOG_GENERATOR_AGENT_NAME, BLOG_GENERATOR_DEFAULT_SYSTEM_INSTRUCTION, BLOG_GENERATOR_DEFAULT_VALIDATION_RULES, BLOG_GENERATOR_LLM_AGENT_SLUG, BLOG_GENERATOR_MARKDOWN_ARTICLE_SEPARATOR, BLOG_METADATA_ENRICHER_AGENT_NAME, BLOG_METADATA_ENRICHER_DEFAULT_SYSTEM_INSTRUCTION, BLOG_METADATA_ENRICHER_DEFAULT_VALIDATION_RULES, BLOG_METADATA_ENRICHER_LLM_AGENT_SLUG, Blog, BlogGeneratorService, Brand, CMS_ENTITY_MAP, Cart, CartItem, Category, ChatConversation, ChatMessage, Collection, Combo, ComboItem, Comment, Config, Contact, Currency, CurrencyExchange, Customer, Customer_Contacts, Discount, DiscountRules, Event, EventProduct, Form, FormField, FormSubmission, JobSchedule, JobScheduleRun, KnowledgeBaseChunk, KnowledgeBaseDocument, LlmAgent, LlmAgentKnowledgeDocument, Media, MessageTemplate, Order, OrderAddresses, OrderDiscounts, OrderItem, OrderNotificationBinding, OrderNotificationTrigger, OtpChallenge, Page, PasswordResetToken, Payment, Permission, Product, ProductAttribute, ProductCategory, ProductConfig, ProductVariant, RefundPolicy, RefundRequest, RssArticle, RssFeed, Seo, Tag, Tax, User, UserDeviceToken, UserGroup, Vendor, VendorCustomer, VendorRole, VendorRolePermission, VendorUser, VendorUserProfile, Wishlist, WishlistItem, ZIP_MIME_TYPES, applyApprovalStatusSideEffects, applyEventApprovalStatusSideEffects, applyRotatingVendorInvite, applyVendorCustomersContactFilter, applyVendorEventCreateApproval, applyVendorProductCreateApproval, assertCaptchaOk, assertContactAllowedForVendorOrder, assertEventApprovalUpdate, assertProductApprovalUpdate, buildBlogMetadataUserPrompt, buildCronFromSchedule, buildRssUserPromptFromFeeds, buildUserInviteLink, buildVendorInviteLink, calculateOrderRefundPreview, calculateRefundFromPolicy, checkAndIncrementDiscountUsage, checkEventsEnabled, checkMultiVendorEnabled, completeUserInviteAccept, consumeAppliedDiscountUsages, contactIsVendorCustomer, countDiscountOrdersForContact, countRecentOtpSends, createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCmsApp, createCmsAppWithMessaging, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createEventOrderMessageTemplateHandlers, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createMessageTemplateRowLoader, createOtpChallenge, createSetPasswordHandler, createSettingsApiHandlers, createSocialMediaHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, daysBeforeEventStart, decrementDiscountUsage, describeEventTierPolicy, ensureMessagingPluginsOnCms, ensureScheduleQueueWorker, ensureVendorCustomerForOrderContact, ensureVendorCustomersForOrder, findActiveRefundPolicyForVendor, findUserByInviteToken, findVendorByInviteToken, formatTierRange, generateNumericOtp, getPublicSettingsGroup, getRequireEventApproval, getRequireProductApproval, getRssArticleSummaryFromItem, getVendorCatalogCreateFlags, hashOtpCode, hydrateVendorSessionUser, invalidateEventsCache, invalidateMultiVendorCache, invalidateRequireEventApprovalCache, invalidateRequireProductApprovalCache, invalidateVendorCatalogCreateFlagsCache, isCustomerTypeContact, isMaxPerUserUsageReached, isMaxTotalUsageReached, isZipMedia, llmAgentToChatAgentOptions, loadSettingsGroupFromDb, loadUserVendorContext, mergeGuardrailsIntoSystemPrompt, messagingPlugins, metaFetchUserManagedPages, metaPostPageFeed, metaPostPagePhoto, metaResolvePageAccessToken, newUserInviteToken, normalizePhoneE164, normalizeRefundTiers, overlayCmsPlugins, parseBlogGeneratorAgentContent, parseBlogGeneratorModelOutput, parseBlogMetadataEnrichmentJson, parseLlmAgentValidationRules, pgBossScheduleNameForId, queueErpCreateContactIfEnabled, queueJobScheduleNow, queuePlugin, queueSms, recordDiscountUsage, registerJobRunnerWorker, registerMessagingQueueProcessors, registerSmsQueueProcessor, relativePathFromMediaParentId, resolveBlogCategoryIdByName, resolveSettingsEncryptionKey, resolveVendorIdForContactCheck, sanitizeMediaFolderPath, sanitizeStorageSegment, sendVendorOnboardEmails, simpleDecrypt, simpleEncrypt, syncJobScheduleToPgBoss, validateRefundTiers, validateScheduleInput, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules, verifyAndConsumeOtpChallenge, verifyOtpCodeHash, whatsappPlugin, wrapGetCmsWithMessaging } from './chunk-PDA4L2LS.js';
|
|
4
4
|
import { PgBossService } from './chunk-GO7PPYNU.js';
|
|
5
5
|
export { JOB_RUNNER_QUEUE, PgBossService } from './chunk-GO7PPYNU.js';
|
|
6
6
|
export { deductInventoryForConfirmedOrder, mergeInventoryLines, orderInventorySnapshotFromRow, orderStatusHoldsStock, reconcileOrderInventoryBetweenSnapshots, restoreInventoryForCancelledOrder, validateInventoryForConfirmedOrderLines, validateInventoryForOrderBecomingConfirmed } from './chunk-3K5AIEIZ.js';
|
|
@@ -1046,6 +1046,76 @@ function paymentPlugin(config) {
|
|
|
1046
1046
|
__name(paymentPlugin, "paymentPlugin");
|
|
1047
1047
|
|
|
1048
1048
|
// src/plugins/storage/s3.ts
|
|
1049
|
+
var LOG = "[s3]";
|
|
1050
|
+
function serializeS3Error(err) {
|
|
1051
|
+
if (!err || typeof err !== "object") {
|
|
1052
|
+
return {
|
|
1053
|
+
error: String(err)
|
|
1054
|
+
};
|
|
1055
|
+
}
|
|
1056
|
+
const e = err;
|
|
1057
|
+
return {
|
|
1058
|
+
name: e.name,
|
|
1059
|
+
message: e.message,
|
|
1060
|
+
code: e.Code ?? e.code,
|
|
1061
|
+
httpStatus: e.$metadata?.httpStatusCode,
|
|
1062
|
+
requestId: e.$metadata?.requestId,
|
|
1063
|
+
extendedRequestId: e.$metadata?.extendedRequestId,
|
|
1064
|
+
cfId: e.$metadata?.cfId
|
|
1065
|
+
};
|
|
1066
|
+
}
|
|
1067
|
+
__name(serializeS3Error, "serializeS3Error");
|
|
1068
|
+
function publicObjectUrl(config, fullKey) {
|
|
1069
|
+
if (config.baseUrl) {
|
|
1070
|
+
return `${config.baseUrl.replace(/\/$/, "")}/${fullKey}`;
|
|
1071
|
+
}
|
|
1072
|
+
return `https://s3.${config.region}.amazonaws.com/${config.bucket}/${fullKey}`;
|
|
1073
|
+
}
|
|
1074
|
+
__name(publicObjectUrl, "publicObjectUrl");
|
|
1075
|
+
async function probePublicUrl(url) {
|
|
1076
|
+
try {
|
|
1077
|
+
const head = await fetch(url, {
|
|
1078
|
+
method: "HEAD",
|
|
1079
|
+
redirect: "manual"
|
|
1080
|
+
});
|
|
1081
|
+
const headInfo = {
|
|
1082
|
+
url,
|
|
1083
|
+
status: head.status,
|
|
1084
|
+
ok: head.ok,
|
|
1085
|
+
contentType: head.headers.get("content-type"),
|
|
1086
|
+
location: head.headers.get("location")
|
|
1087
|
+
};
|
|
1088
|
+
if (head.ok) {
|
|
1089
|
+
console.info(LOG, "public URL reachable (HEAD)", headInfo);
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
const getRes = await fetch(url, {
|
|
1093
|
+
method: "GET",
|
|
1094
|
+
headers: {
|
|
1095
|
+
Range: "bytes=0-0"
|
|
1096
|
+
},
|
|
1097
|
+
redirect: "manual"
|
|
1098
|
+
});
|
|
1099
|
+
let bodySnippet = "";
|
|
1100
|
+
try {
|
|
1101
|
+
bodySnippet = (await getRes.text()).slice(0, 400);
|
|
1102
|
+
} catch {
|
|
1103
|
+
}
|
|
1104
|
+
console.error(LOG, "public URL not readable \u2014 admin images will not display", {
|
|
1105
|
+
...headInfo,
|
|
1106
|
+
getStatus: getRes.status,
|
|
1107
|
+
getOk: getRes.ok,
|
|
1108
|
+
getContentType: getRes.headers.get("content-type"),
|
|
1109
|
+
bodySnippet
|
|
1110
|
+
});
|
|
1111
|
+
} catch (err) {
|
|
1112
|
+
console.error(LOG, "public URL probe failed", {
|
|
1113
|
+
url,
|
|
1114
|
+
error: err instanceof Error ? err.message : String(err)
|
|
1115
|
+
});
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
__name(probePublicUrl, "probePublicUrl");
|
|
1049
1119
|
function getS3Storage(config) {
|
|
1050
1120
|
const prefix = (config.prefix ?? "uploads").replace(/\/$/, "");
|
|
1051
1121
|
const keyPrefix = prefix ? `${prefix}/` : "";
|
|
@@ -1060,16 +1130,38 @@ function getS3Storage(config) {
|
|
|
1060
1130
|
}
|
|
1061
1131
|
});
|
|
1062
1132
|
const fullKey = keyPrefix + key.replace(/^\/+/, "");
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1133
|
+
const started = Date.now();
|
|
1134
|
+
try {
|
|
1135
|
+
await client.send(new PutObjectCommand({
|
|
1136
|
+
Bucket: config.bucket,
|
|
1137
|
+
Key: fullKey,
|
|
1138
|
+
Body: buffer,
|
|
1139
|
+
ContentType: contentType
|
|
1140
|
+
}));
|
|
1141
|
+
} catch (err) {
|
|
1142
|
+
console.error(LOG, "PutObject failed", {
|
|
1143
|
+
bucket: config.bucket,
|
|
1144
|
+
region: config.region,
|
|
1145
|
+
key: fullKey,
|
|
1146
|
+
contentType,
|
|
1147
|
+
bytes: buffer.length,
|
|
1148
|
+
...serializeS3Error(err)
|
|
1149
|
+
});
|
|
1150
|
+
throw err;
|
|
1071
1151
|
}
|
|
1072
|
-
|
|
1152
|
+
const url = publicObjectUrl(config, fullKey);
|
|
1153
|
+
console.info(LOG, "PutObject ok", {
|
|
1154
|
+
bucket: config.bucket,
|
|
1155
|
+
region: config.region,
|
|
1156
|
+
key: fullKey,
|
|
1157
|
+
contentType,
|
|
1158
|
+
bytes: buffer.length,
|
|
1159
|
+
ms: Date.now() - started,
|
|
1160
|
+
url,
|
|
1161
|
+
hasCustomBaseUrl: Boolean(config.baseUrl)
|
|
1162
|
+
});
|
|
1163
|
+
void probePublicUrl(url);
|
|
1164
|
+
return url;
|
|
1073
1165
|
}
|
|
1074
1166
|
};
|
|
1075
1167
|
}
|
|
@@ -1086,8 +1178,29 @@ function s3StoragePlugin(config) {
|
|
|
1086
1178
|
const baseUrl = config.baseUrl ?? context.config.S3_MEDIA_URL ?? context.config.S3_CUSTOM_DOMAIN;
|
|
1087
1179
|
const resolvedBaseUrl = typeof baseUrl === "string" && baseUrl ? baseUrl.startsWith("http") ? baseUrl : `https://${baseUrl}` : void 0;
|
|
1088
1180
|
if (!region || !accessKeyId || !secretAccessKey || !bucket) {
|
|
1181
|
+
console.error(LOG, "plugin init missing config", {
|
|
1182
|
+
hasRegion: Boolean(region),
|
|
1183
|
+
hasAccessKeyId: Boolean(accessKeyId),
|
|
1184
|
+
hasSecretAccessKey: Boolean(secretAccessKey),
|
|
1185
|
+
hasBucket: Boolean(bucket),
|
|
1186
|
+
hasBaseUrl: Boolean(resolvedBaseUrl)
|
|
1187
|
+
});
|
|
1089
1188
|
throw new Error("S3 storage plugin: missing region, accessKeyId, secretAccessKey or bucket");
|
|
1090
1189
|
}
|
|
1190
|
+
let baseUrlHost = null;
|
|
1191
|
+
try {
|
|
1192
|
+
baseUrlHost = resolvedBaseUrl ? new URL(resolvedBaseUrl).host : null;
|
|
1193
|
+
} catch {
|
|
1194
|
+
baseUrlHost = resolvedBaseUrl ?? null;
|
|
1195
|
+
}
|
|
1196
|
+
console.info(LOG, "plugin ready", {
|
|
1197
|
+
region,
|
|
1198
|
+
bucket,
|
|
1199
|
+
prefix: config.prefix ?? "uploads",
|
|
1200
|
+
hasBaseUrl: Boolean(resolvedBaseUrl),
|
|
1201
|
+
baseUrlHost,
|
|
1202
|
+
accessKeyIdLast4: accessKeyId.slice(-4)
|
|
1203
|
+
});
|
|
1091
1204
|
return getS3Storage({
|
|
1092
1205
|
region,
|
|
1093
1206
|
accessKeyId,
|
|
@@ -1121,7 +1234,14 @@ function getLocalStorage(config) {
|
|
|
1121
1234
|
recursive: true
|
|
1122
1235
|
});
|
|
1123
1236
|
await fs.writeFile(filePath, buffer);
|
|
1124
|
-
|
|
1237
|
+
const url = `${publicPath.replace(/\/$/, "")}/${fileName}`;
|
|
1238
|
+
console.info("[storage:local] wrote file", {
|
|
1239
|
+
dir: fullDir,
|
|
1240
|
+
key: fileName,
|
|
1241
|
+
bytes: buffer.length,
|
|
1242
|
+
url
|
|
1243
|
+
});
|
|
1244
|
+
return url;
|
|
1125
1245
|
}
|
|
1126
1246
|
};
|
|
1127
1247
|
}
|
|
@@ -1132,6 +1252,9 @@ function localStoragePlugin(config = {}) {
|
|
|
1132
1252
|
version: "1.0.0",
|
|
1133
1253
|
async init(context) {
|
|
1134
1254
|
const dir = config.dir ?? context.config.UPLOAD_DIR ?? "public/uploads";
|
|
1255
|
+
console.info("[storage:local] plugin ready", {
|
|
1256
|
+
dir
|
|
1257
|
+
});
|
|
1135
1258
|
return getLocalStorage({
|
|
1136
1259
|
...config,
|
|
1137
1260
|
dir
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
interface CmsMiddlewareRequest {
|
|
2
|
+
nextUrl: {
|
|
3
|
+
pathname: string;
|
|
4
|
+
};
|
|
5
|
+
url: string;
|
|
6
|
+
method: string;
|
|
7
|
+
cookies: {
|
|
8
|
+
get: (name: string) => {
|
|
9
|
+
value?: string;
|
|
10
|
+
} | undefined;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Full Next.js request (e.g. `NextRequest`). When provided, session is resolved via
|
|
14
|
+
* cookie presence or `getToken()`.
|
|
15
|
+
*/
|
|
16
|
+
req?: unknown;
|
|
17
|
+
}
|
|
18
|
+
interface CmsMiddlewareConfig {
|
|
19
|
+
publicAdminPaths?: string[];
|
|
20
|
+
publicApiPaths?: string[];
|
|
21
|
+
/** path -> allowed methods */
|
|
22
|
+
publicApiMethods?: Record<string, string[]>;
|
|
23
|
+
signInPath?: string;
|
|
24
|
+
/** @deprecated Prefer passing `req` on the request; used only when `req` is omitted. */
|
|
25
|
+
getSessionToken?: (request: CmsMiddlewareRequest) => string | undefined;
|
|
26
|
+
secret?: string;
|
|
27
|
+
}
|
|
28
|
+
/** Default public API paths (no auth). Sites should extend this with their own routes. */
|
|
29
|
+
declare const defaultPublicApiMethods: Record<string, string[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Returns middleware logic. Use from Next.js middleware:
|
|
32
|
+
* import { createCmsMiddleware } from '@infuro/cms-core';
|
|
33
|
+
* export async function middleware(request: NextRequest) {
|
|
34
|
+
* const result = await cmsMiddleware({ ...request fields, req: request });
|
|
35
|
+
* ...
|
|
36
|
+
* }
|
|
37
|
+
* export const config = { matcher: ['/admin/:path*', '/api/:path*'] };
|
|
38
|
+
*/
|
|
39
|
+
declare function createCmsMiddleware(config?: CmsMiddlewareConfig): (request: CmsMiddlewareRequest) => Promise<{
|
|
40
|
+
type: "next";
|
|
41
|
+
} | {
|
|
42
|
+
type: "redirect";
|
|
43
|
+
url: string;
|
|
44
|
+
} | {
|
|
45
|
+
type: "json";
|
|
46
|
+
status: number;
|
|
47
|
+
body: unknown;
|
|
48
|
+
}>;
|
|
49
|
+
|
|
50
|
+
export { type CmsMiddlewareConfig, type CmsMiddlewareRequest, createCmsMiddleware, defaultPublicApiMethods };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
interface CmsMiddlewareRequest {
|
|
2
|
+
nextUrl: {
|
|
3
|
+
pathname: string;
|
|
4
|
+
};
|
|
5
|
+
url: string;
|
|
6
|
+
method: string;
|
|
7
|
+
cookies: {
|
|
8
|
+
get: (name: string) => {
|
|
9
|
+
value?: string;
|
|
10
|
+
} | undefined;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Full Next.js request (e.g. `NextRequest`). When provided, session is resolved via
|
|
14
|
+
* cookie presence or `getToken()`.
|
|
15
|
+
*/
|
|
16
|
+
req?: unknown;
|
|
17
|
+
}
|
|
18
|
+
interface CmsMiddlewareConfig {
|
|
19
|
+
publicAdminPaths?: string[];
|
|
20
|
+
publicApiPaths?: string[];
|
|
21
|
+
/** path -> allowed methods */
|
|
22
|
+
publicApiMethods?: Record<string, string[]>;
|
|
23
|
+
signInPath?: string;
|
|
24
|
+
/** @deprecated Prefer passing `req` on the request; used only when `req` is omitted. */
|
|
25
|
+
getSessionToken?: (request: CmsMiddlewareRequest) => string | undefined;
|
|
26
|
+
secret?: string;
|
|
27
|
+
}
|
|
28
|
+
/** Default public API paths (no auth). Sites should extend this with their own routes. */
|
|
29
|
+
declare const defaultPublicApiMethods: Record<string, string[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Returns middleware logic. Use from Next.js middleware:
|
|
32
|
+
* import { createCmsMiddleware } from '@infuro/cms-core';
|
|
33
|
+
* export async function middleware(request: NextRequest) {
|
|
34
|
+
* const result = await cmsMiddleware({ ...request fields, req: request });
|
|
35
|
+
* ...
|
|
36
|
+
* }
|
|
37
|
+
* export const config = { matcher: ['/admin/:path*', '/api/:path*'] };
|
|
38
|
+
*/
|
|
39
|
+
declare function createCmsMiddleware(config?: CmsMiddlewareConfig): (request: CmsMiddlewareRequest) => Promise<{
|
|
40
|
+
type: "next";
|
|
41
|
+
} | {
|
|
42
|
+
type: "redirect";
|
|
43
|
+
url: string;
|
|
44
|
+
} | {
|
|
45
|
+
type: "json";
|
|
46
|
+
status: number;
|
|
47
|
+
body: unknown;
|
|
48
|
+
}>;
|
|
49
|
+
|
|
50
|
+
export { type CmsMiddlewareConfig, type CmsMiddlewareRequest, createCmsMiddleware, defaultPublicApiMethods };
|