@yimingliao/cms 0.0.23 → 0.0.25

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.
@@ -5,7 +5,8 @@ import Keyv from 'keyv';
5
5
  import { Logger } from 'logry';
6
6
  import { e as AdminRole, v as SingleItem, B as BaseTranslation, a as Admin, c as AdminFull, f as AdminSafe, D as DeviceInfo, d as AdminRefreshToken, k as File, m as FileFull, o as FileType, p as Folder, F as FolderFull, u as PostType, M as MultiItems, E as ExternalLink, j as Faq, T as TocItem, q as Post, s as PostListCard, t as PostTranslation, r as PostFull, S as SeoMetadata, g as AdminTranslation, n as FileTranslation, h as Alternate } from '../base-DbGnfZr6.js';
7
7
  import { BaseTranslator, LocaleMessages } from 'intor';
8
- import { S as SuccessResult, R as Result, E as ErrorDetail } from '../types-DHlRoJwv.js';
8
+ import { S as SuccessResult, R as Result } from '../types-DHlRoJwv.js';
9
+ import { NextResponse } from 'next/server';
9
10
 
10
11
  interface CreateJwtServiceOptions {
11
12
  defaultSecret: string;
@@ -601,7 +602,7 @@ declare const POST_ORDER_BY: ({
601
602
  type Action<D> = (translator: BaseTranslator<LocaleMessages>) => Promise<Omit<SuccessResult<D>, "success"> & {
602
603
  i18nKey?: string;
603
604
  }>;
604
- interface CreateServerActionOptions {
605
+ interface CreateExecuteActionOptions {
605
606
  initI18n: () => Promise<BaseTranslator<LocaleMessages>>;
606
607
  cacheResult: <T>({ key, ttl, load }: CacheResultOptions<T>) => Promise<T>;
607
608
  cache: Keyv<unknown>;
@@ -612,14 +613,14 @@ interface ServerActionOptions {
612
613
  key?: RawCacheKey;
613
614
  ttl?: number;
614
615
  }
615
- declare function createExecuteAction({ initI18n, cacheResult, cache, logger, }: CreateServerActionOptions): <D = void>(fn: Action<D>, options?: ServerActionOptions) => Promise<Result<D>>;
616
+ declare function createExecuteAction({ initI18n, cacheResult, cache, logger, }: CreateExecuteActionOptions): <D = void>(fn: Action<D>, options?: ServerActionOptions) => Promise<Result<D>>;
616
617
 
617
- declare const normalizeError: (error: unknown, translator: BaseTranslator<LocaleMessages>) => {
618
- message: string;
619
- errors?: ErrorDetail[];
620
- statusCode: number;
621
- isInternal?: boolean;
622
- };
618
+ type Api = (translator: BaseTranslator<LocaleMessages>) => Promise<NextResponse<unknown>>;
619
+ interface CreateExecuteApiOptions {
620
+ initI18n: () => Promise<BaseTranslator<LocaleMessages>>;
621
+ logger: Logger;
622
+ }
623
+ declare function createExecuteApi({ initI18n, logger, }: CreateExecuteApiOptions): (fn: Api) => Promise<NextResponse<unknown>>;
623
624
 
624
625
  declare class ServerError extends Error {
625
626
  readonly i18nKey?: string;
@@ -629,6 +630,14 @@ declare class ServerError extends Error {
629
630
  i18nKey?: string;
630
631
  statusCode?: number;
631
632
  });
633
+ /** 401 Unauthorized */
634
+ static unauthorized(): ServerError;
635
+ /** 403 Forbidden */
636
+ static forbidden(): ServerError;
637
+ /** 404 Not found */
638
+ static notFound(): ServerError;
639
+ /** 500 Internal Server Error */
640
+ static internalServerError(): ServerError;
632
641
  }
633
642
 
634
- export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, type RawCacheKey, ServerError, createAdminCommandRepository, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenQueryRepository, createArgon2Service, createCache, createCacheResult, createCookieService, createCryptoService, createExecuteAction, createFileCommandRepository, createFileQueryRepository, createFolderCommandRepository, createFolderQueryRepository, createIpRateLimiter, createJwtService, createPostCommandRepository, createPostQueryRepository, createSeoMetadataCommandRepository, normalizeCacheKey, normalizeError };
643
+ export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, type RawCacheKey, ServerError, createAdminCommandRepository, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenQueryRepository, createArgon2Service, createCache, createCacheResult, createCookieService, createCryptoService, createExecuteAction, createExecuteApi, createFileCommandRepository, createFileQueryRepository, createFolderCommandRepository, createFolderQueryRepository, createIpRateLimiter, createJwtService, createPostCommandRepository, createPostQueryRepository, createSeoMetadataCommandRepository, normalizeCacheKey };
@@ -8,6 +8,7 @@ import KeyvRedis from '@keyv/redis';
8
8
  import Keyv from 'keyv';
9
9
  import { ulid } from 'ulid';
10
10
  import { ZodError } from 'zod';
11
+ import { NextResponse } from 'next/server';
11
12
 
12
13
  function createJwtService({
13
14
  defaultSecret,
@@ -1423,7 +1424,7 @@ function createSeoMetadataCommandRepository(prisma) {
1423
1424
  }
1424
1425
 
1425
1426
  // src/server/server-error.ts
1426
- var ServerError = class extends Error {
1427
+ var ServerError = class _ServerError extends Error {
1427
1428
  i18nKey;
1428
1429
  statusCode;
1429
1430
  constructor({
@@ -1436,9 +1437,28 @@ var ServerError = class extends Error {
1436
1437
  if (i18nKey) this.i18nKey = i18nKey;
1437
1438
  if (statusCode) this.statusCode = statusCode;
1438
1439
  }
1440
+ /** 401 Unauthorized */
1441
+ static unauthorized() {
1442
+ return new _ServerError({ i18nKey: "error.unauthorized", statusCode: 401 });
1443
+ }
1444
+ /** 403 Forbidden */
1445
+ static forbidden() {
1446
+ return new _ServerError({ i18nKey: "error.forbidden", statusCode: 403 });
1447
+ }
1448
+ /** 404 Not found */
1449
+ static notFound() {
1450
+ return new _ServerError({ i18nKey: "error.not-found", statusCode: 404 });
1451
+ }
1452
+ /** 500 Internal Server Error */
1453
+ static internalServerError() {
1454
+ return new _ServerError({
1455
+ i18nKey: "error.internal-server-error",
1456
+ statusCode: 500
1457
+ });
1458
+ }
1439
1459
  };
1440
1460
 
1441
- // src/server/interfaces/execute-action/normalize-error.ts
1461
+ // src/server/interfaces/normalize-error.ts
1442
1462
  var normalizeError = (error, translator) => {
1443
1463
  if (error instanceof ZodError) {
1444
1464
  const errors = error.issues.map((issue) => {
@@ -1501,5 +1521,29 @@ function createExecuteAction({
1501
1521
  }
1502
1522
  };
1503
1523
  }
1524
+ function createExecuteApi({
1525
+ initI18n,
1526
+ logger
1527
+ }) {
1528
+ return async function serverApi(fn) {
1529
+ const translator = await initI18n();
1530
+ try {
1531
+ return await fn(translator);
1532
+ } catch (error) {
1533
+ const { message, errors, statusCode, isInternal } = normalizeError(
1534
+ error,
1535
+ translator
1536
+ );
1537
+ logger.error({ message, errors });
1538
+ return NextResponse.json(
1539
+ result.error({
1540
+ message: isInternal ? "Internal server error" : message,
1541
+ ...errors ? { errors } : {}
1542
+ }),
1543
+ { status: statusCode }
1544
+ );
1545
+ }
1546
+ };
1547
+ }
1504
1548
 
1505
- export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, ServerError, createAdminCommandRepository, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenQueryRepository, createArgon2Service, createCache, createCacheResult, createCookieService, createCryptoService, createExecuteAction, createFileCommandRepository, createFileQueryRepository, createFolderCommandRepository, createFolderQueryRepository, createIpRateLimiter, createJwtService, createPostCommandRepository, createPostQueryRepository, createSeoMetadataCommandRepository, normalizeCacheKey, normalizeError };
1549
+ export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, ServerError, createAdminCommandRepository, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenQueryRepository, createArgon2Service, createCache, createCacheResult, createCookieService, createCryptoService, createExecuteAction, createExecuteApi, createFileCommandRepository, createFileQueryRepository, createFolderCommandRepository, createFolderQueryRepository, createIpRateLimiter, createJwtService, createPostCommandRepository, createPostQueryRepository, createSeoMetadataCommandRepository, normalizeCacheKey };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yimingliao/cms",
3
- "version": "0.0.23",
3
+ "version": "0.0.25",
4
4
  "author": "Yiming Liao",
5
5
  "license": "MIT",
6
6
  "type": "module",