@withwiz/cms-kit 0.1.0 → 0.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.
Files changed (101) hide show
  1. package/README.ko.md +4 -2
  2. package/README.md +4 -2
  3. package/dist/{chunk-JMWXVXK5.js → chunk-25GMHPCW.js} +12 -4
  4. package/dist/chunk-25GMHPCW.js.map +1 -0
  5. package/dist/{chunk-5JUIMXNF.js → chunk-2VHNZWH2.js} +3 -3
  6. package/dist/{chunk-5JUIMXNF.js.map → chunk-2VHNZWH2.js.map} +1 -1
  7. package/dist/{chunk-BWKKHCDG.mjs → chunk-3UXX27N5.mjs} +44 -3
  8. package/dist/{chunk-BWKKHCDG.mjs.map → chunk-3UXX27N5.mjs.map} +1 -1
  9. package/dist/{chunk-T7EVFD4G.mjs → chunk-47DPXAO6.mjs} +2 -2
  10. package/dist/{chunk-4W3X7OKF.js → chunk-5Z5XUR2K.js} +48 -27
  11. package/dist/chunk-5Z5XUR2K.js.map +1 -0
  12. package/dist/{chunk-LDFE33ML.mjs → chunk-7F5YFG2W.mjs} +10 -2
  13. package/dist/chunk-7F5YFG2W.mjs.map +1 -0
  14. package/dist/{chunk-CGVFB23E.mjs → chunk-A557FA2K.mjs} +24 -19
  15. package/dist/{chunk-CGVFB23E.mjs.map → chunk-A557FA2K.mjs.map} +1 -1
  16. package/dist/{chunk-OBNALAMG.mjs → chunk-BG4C5KZO.mjs} +2 -2
  17. package/dist/{chunk-DCIF4XJL.js → chunk-EPVV6655.js} +10 -10
  18. package/dist/{chunk-DCIF4XJL.js.map → chunk-EPVV6655.js.map} +1 -1
  19. package/dist/{chunk-LF5LOI7K.mjs → chunk-FCWUNCGA.mjs} +3 -3
  20. package/dist/{chunk-YEQFKOWD.mjs → chunk-GQJNLE34.mjs} +2 -2
  21. package/dist/{chunk-W4FWIZ2Y.js → chunk-HVB72GT3.js} +3 -3
  22. package/dist/{chunk-W4FWIZ2Y.js.map → chunk-HVB72GT3.js.map} +1 -1
  23. package/dist/{chunk-KWKV2GAH.js → chunk-J32BTYJZ.js} +4 -4
  24. package/dist/{chunk-KWKV2GAH.js.map → chunk-J32BTYJZ.js.map} +1 -1
  25. package/dist/{chunk-C5WFZJM4.js → chunk-JPIQU2C4.js} +6 -6
  26. package/dist/{chunk-C5WFZJM4.js.map → chunk-JPIQU2C4.js.map} +1 -1
  27. package/dist/{chunk-FEPGJ7WN.mjs → chunk-MN27HJKW.mjs} +3 -3
  28. package/dist/{chunk-ZULSFSDG.mjs → chunk-MWX5B4DP.mjs} +3 -3
  29. package/dist/{chunk-FCCCG5Z7.mjs → chunk-MXXC4U3D.mjs} +2 -2
  30. package/dist/{chunk-5RDMODGV.mjs → chunk-N7LMNP4W.mjs} +2 -2
  31. package/dist/{chunk-YY7K5CXX.js → chunk-OHJISVGC.js} +5 -5
  32. package/dist/{chunk-YY7K5CXX.js.map → chunk-OHJISVGC.js.map} +1 -1
  33. package/dist/{chunk-EM4MQEWV.mjs → chunk-SN3XOMF6.mjs} +45 -24
  34. package/dist/chunk-SN3XOMF6.mjs.map +1 -0
  35. package/dist/{chunk-BE7JDL64.js → chunk-TKOFGRU4.js} +11 -11
  36. package/dist/{chunk-BE7JDL64.js.map → chunk-TKOFGRU4.js.map} +1 -1
  37. package/dist/{chunk-EG6NVPP2.js → chunk-UVZD7GHG.js} +44 -3
  38. package/dist/chunk-UVZD7GHG.js.map +1 -0
  39. package/dist/{chunk-6EZ3QE5N.js → chunk-Y3YYIJYG.js} +3 -3
  40. package/dist/{chunk-6EZ3QE5N.js.map → chunk-Y3YYIJYG.js.map} +1 -1
  41. package/dist/{chunk-OYJRR3G2.js → chunk-ZMXNPYFS.js} +25 -20
  42. package/dist/chunk-ZMXNPYFS.js.map +1 -0
  43. package/dist/components/AdminManagerBase.js +5 -5
  44. package/dist/components/AdminManagerBase.mjs +4 -4
  45. package/dist/components/AdminShell.d.mts +1 -1
  46. package/dist/components/AdminShell.d.ts +1 -1
  47. package/dist/components/AdminShell.js +4 -4
  48. package/dist/components/AdminShell.mjs +3 -3
  49. package/dist/components/index.d.mts +1 -1
  50. package/dist/components/index.d.ts +1 -1
  51. package/dist/components/index.js +8 -8
  52. package/dist/components/index.mjs +7 -7
  53. package/dist/hooks/index.js +5 -5
  54. package/dist/hooks/index.mjs +4 -4
  55. package/dist/hooks/useImageDropZone.js +4 -4
  56. package/dist/hooks/useImageDropZone.mjs +3 -3
  57. package/dist/{index-00a40-FQ.d.ts → index-Cce8FHtI.d.mts} +38 -1
  58. package/dist/{index-00a40-FQ.d.mts → index-Cce8FHtI.d.ts} +38 -1
  59. package/dist/index.d.mts +1 -1
  60. package/dist/index.d.ts +1 -1
  61. package/dist/index.js +19 -13
  62. package/dist/index.js.map +1 -1
  63. package/dist/index.mjs +18 -12
  64. package/dist/infrastructure/index.js +3 -3
  65. package/dist/infrastructure/index.mjs +2 -2
  66. package/dist/infrastructure/middleware/index.js +3 -3
  67. package/dist/infrastructure/middleware/index.mjs +2 -2
  68. package/dist/infrastructure/middleware/wrappers.js +3 -3
  69. package/dist/infrastructure/middleware/wrappers.mjs +2 -2
  70. package/dist/services/index.js +5 -5
  71. package/dist/services/index.mjs +4 -4
  72. package/dist/utils/admin-fetch.js +3 -3
  73. package/dist/utils/admin-fetch.mjs +2 -2
  74. package/dist/utils/html-sanitizer.js +3 -3
  75. package/dist/utils/html-sanitizer.mjs +2 -2
  76. package/dist/utils/index.d.mts +1 -1
  77. package/dist/utils/index.d.ts +1 -1
  78. package/dist/utils/index.js +13 -7
  79. package/dist/utils/index.js.map +1 -1
  80. package/dist/utils/index.mjs +12 -6
  81. package/dist/utils/jwt.js +3 -3
  82. package/dist/utils/jwt.mjs +2 -2
  83. package/dist/utils/r2-helpers.js +4 -4
  84. package/dist/utils/r2-helpers.mjs +3 -3
  85. package/dist/utils/r2-storage.js +3 -3
  86. package/dist/utils/r2-storage.mjs +2 -2
  87. package/package.json +4 -4
  88. package/dist/chunk-4W3X7OKF.js.map +0 -1
  89. package/dist/chunk-EG6NVPP2.js.map +0 -1
  90. package/dist/chunk-EM4MQEWV.mjs.map +0 -1
  91. package/dist/chunk-JMWXVXK5.js.map +0 -1
  92. package/dist/chunk-LDFE33ML.mjs.map +0 -1
  93. package/dist/chunk-OYJRR3G2.js.map +0 -1
  94. /package/dist/{chunk-T7EVFD4G.mjs.map → chunk-47DPXAO6.mjs.map} +0 -0
  95. /package/dist/{chunk-OBNALAMG.mjs.map → chunk-BG4C5KZO.mjs.map} +0 -0
  96. /package/dist/{chunk-LF5LOI7K.mjs.map → chunk-FCWUNCGA.mjs.map} +0 -0
  97. /package/dist/{chunk-YEQFKOWD.mjs.map → chunk-GQJNLE34.mjs.map} +0 -0
  98. /package/dist/{chunk-FEPGJ7WN.mjs.map → chunk-MN27HJKW.mjs.map} +0 -0
  99. /package/dist/{chunk-ZULSFSDG.mjs.map → chunk-MWX5B4DP.mjs.map} +0 -0
  100. /package/dist/{chunk-FCCCG5Z7.mjs.map → chunk-MXXC4U3D.mjs.map} +0 -0
  101. /package/dist/{chunk-5RDMODGV.mjs.map → chunk-N7LMNP4W.mjs.map} +0 -0
@@ -4,11 +4,11 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkJMWXVXK5js = require('../chunk-JMWXVXK5.js');
7
+ var _chunk25GMHPCWjs = require('../chunk-25GMHPCW.js');
8
8
 
9
9
 
10
10
  var _chunkOLEYNPW6js = require('../chunk-OLEYNPW6.js');
11
- require('../chunk-EG6NVPP2.js');
11
+ require('../chunk-UVZD7GHG.js');
12
12
  require('../chunk-DGUM43GV.js');
13
13
 
14
14
 
@@ -16,5 +16,5 @@ require('../chunk-DGUM43GV.js');
16
16
 
17
17
 
18
18
 
19
- exports.prisma = _chunkOLEYNPW6js.prisma; exports.withAdminApi = _chunkJMWXVXK5js.withAdminApi; exports.withAuthApi = _chunkJMWXVXK5js.withAuthApi; exports.withCustomApi = _chunkJMWXVXK5js.withCustomApi; exports.withPublicApi = _chunkJMWXVXK5js.withPublicApi;
19
+ exports.prisma = _chunkOLEYNPW6js.prisma; exports.withAdminApi = _chunk25GMHPCWjs.withAdminApi; exports.withAuthApi = _chunk25GMHPCWjs.withAuthApi; exports.withCustomApi = _chunk25GMHPCWjs.withCustomApi; exports.withPublicApi = _chunk25GMHPCWjs.withPublicApi;
20
20
  //# sourceMappingURL=index.js.map
@@ -4,11 +4,11 @@ import {
4
4
  withAuthApi,
5
5
  withCustomApi,
6
6
  withPublicApi
7
- } from "../chunk-LDFE33ML.mjs";
7
+ } from "../chunk-7F5YFG2W.mjs";
8
8
  import {
9
9
  prisma
10
10
  } from "../chunk-RCK5WCU5.mjs";
11
- import "../chunk-BWKKHCDG.mjs";
11
+ import "../chunk-3UXX27N5.mjs";
12
12
  import "../chunk-BJTO5JO5.mjs";
13
13
  export {
14
14
  prisma,
@@ -3,13 +3,13 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkJMWXVXK5js = require('../../chunk-JMWXVXK5.js');
7
- require('../../chunk-EG6NVPP2.js');
6
+ var _chunk25GMHPCWjs = require('../../chunk-25GMHPCW.js');
7
+ require('../../chunk-UVZD7GHG.js');
8
8
  require('../../chunk-DGUM43GV.js');
9
9
 
10
10
 
11
11
 
12
12
 
13
13
 
14
- exports.withAdminApi = _chunkJMWXVXK5js.withAdminApi; exports.withAuthApi = _chunkJMWXVXK5js.withAuthApi; exports.withCustomApi = _chunkJMWXVXK5js.withCustomApi; exports.withPublicApi = _chunkJMWXVXK5js.withPublicApi;
14
+ exports.withAdminApi = _chunk25GMHPCWjs.withAdminApi; exports.withAuthApi = _chunk25GMHPCWjs.withAuthApi; exports.withCustomApi = _chunk25GMHPCWjs.withCustomApi; exports.withPublicApi = _chunk25GMHPCWjs.withPublicApi;
15
15
  //# sourceMappingURL=index.js.map
@@ -3,8 +3,8 @@ import {
3
3
  withAuthApi,
4
4
  withCustomApi,
5
5
  withPublicApi
6
- } from "../../chunk-LDFE33ML.mjs";
7
- import "../../chunk-BWKKHCDG.mjs";
6
+ } from "../../chunk-7F5YFG2W.mjs";
7
+ import "../../chunk-3UXX27N5.mjs";
8
8
  import "../../chunk-BJTO5JO5.mjs";
9
9
  export {
10
10
  withAdminApi,
@@ -3,13 +3,13 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkJMWXVXK5js = require('../../chunk-JMWXVXK5.js');
7
- require('../../chunk-EG6NVPP2.js');
6
+ var _chunk25GMHPCWjs = require('../../chunk-25GMHPCW.js');
7
+ require('../../chunk-UVZD7GHG.js');
8
8
  require('../../chunk-DGUM43GV.js');
9
9
 
10
10
 
11
11
 
12
12
 
13
13
 
14
- exports.withAdminApi = _chunkJMWXVXK5js.withAdminApi; exports.withAuthApi = _chunkJMWXVXK5js.withAuthApi; exports.withCustomApi = _chunkJMWXVXK5js.withCustomApi; exports.withPublicApi = _chunkJMWXVXK5js.withPublicApi;
14
+ exports.withAdminApi = _chunk25GMHPCWjs.withAdminApi; exports.withAuthApi = _chunk25GMHPCWjs.withAuthApi; exports.withCustomApi = _chunk25GMHPCWjs.withCustomApi; exports.withPublicApi = _chunk25GMHPCWjs.withPublicApi;
15
15
  //# sourceMappingURL=wrappers.js.map
@@ -3,8 +3,8 @@ import {
3
3
  withAuthApi,
4
4
  withCustomApi,
5
5
  withPublicApi
6
- } from "../../chunk-LDFE33ML.mjs";
7
- import "../../chunk-BWKKHCDG.mjs";
6
+ } from "../../chunk-7F5YFG2W.mjs";
7
+ import "../../chunk-3UXX27N5.mjs";
8
8
  import "../../chunk-BJTO5JO5.mjs";
9
9
  export {
10
10
  withAdminApi,
@@ -12,15 +12,15 @@ var _chunkS6UUSM7Sjs = require('../chunk-S6UUSM7S.js');
12
12
 
13
13
 
14
14
 
15
- var _chunk4W3X7OKFjs = require('../chunk-4W3X7OKF.js');
15
+ var _chunk5Z5XUR2Kjs = require('../chunk-5Z5XUR2K.js');
16
16
  require('../chunk-HXVWBFCN.js');
17
17
 
18
18
 
19
- var _chunkBE7JDL64js = require('../chunk-BE7JDL64.js');
19
+ var _chunkTKOFGRU4js = require('../chunk-TKOFGRU4.js');
20
20
 
21
21
 
22
- var _chunkOYJRR3G2js = require('../chunk-OYJRR3G2.js');
23
- require('../chunk-EG6NVPP2.js');
22
+ var _chunkZMXNPYFSjs = require('../chunk-ZMXNPYFS.js');
23
+ require('../chunk-UVZD7GHG.js');
24
24
  require('../chunk-DGUM43GV.js');
25
25
 
26
26
 
@@ -32,5 +32,5 @@ require('../chunk-DGUM43GV.js');
32
32
 
33
33
 
34
34
 
35
- exports.DEFAULT_LIMIT = _chunkPLVG7AW3js.DEFAULT_LIMIT; exports.DEFAULT_PAGE = _chunkPLVG7AW3js.DEFAULT_PAGE; exports.buildPaginatedResult = _chunkS6UUSM7Sjs.buildPaginatedResult; exports.collectR2Keys = _chunk4W3X7OKFjs.collectR2Keys; exports.deleteR2Keys = _chunk4W3X7OKFjs.deleteR2Keys; exports.isR2Enabled = _chunkBE7JDL64js.isR2Enabled; exports.parseSortParam = _chunkPLVG7AW3js.parseSortParam; exports.prisma = _chunkOLEYNPW6js.prisma; exports.sanitizeHtmlContent = _chunkOYJRR3G2js.sanitizeHtmlContent;
35
+ exports.DEFAULT_LIMIT = _chunkPLVG7AW3js.DEFAULT_LIMIT; exports.DEFAULT_PAGE = _chunkPLVG7AW3js.DEFAULT_PAGE; exports.buildPaginatedResult = _chunkS6UUSM7Sjs.buildPaginatedResult; exports.collectR2Keys = _chunk5Z5XUR2Kjs.collectR2Keys; exports.deleteR2Keys = _chunk5Z5XUR2Kjs.deleteR2Keys; exports.isR2Enabled = _chunkTKOFGRU4js.isR2Enabled; exports.parseSortParam = _chunkPLVG7AW3js.parseSortParam; exports.prisma = _chunkOLEYNPW6js.prisma; exports.sanitizeHtmlContent = _chunkZMXNPYFSjs.sanitizeHtmlContent;
36
36
  //# sourceMappingURL=index.js.map
@@ -12,15 +12,15 @@ import {
12
12
  import {
13
13
  collectR2Keys,
14
14
  deleteR2Keys
15
- } from "../chunk-EM4MQEWV.mjs";
15
+ } from "../chunk-SN3XOMF6.mjs";
16
16
  import "../chunk-MMKAMH4U.mjs";
17
17
  import {
18
18
  isR2Enabled
19
- } from "../chunk-YEQFKOWD.mjs";
19
+ } from "../chunk-GQJNLE34.mjs";
20
20
  import {
21
21
  sanitizeHtmlContent
22
- } from "../chunk-CGVFB23E.mjs";
23
- import "../chunk-BWKKHCDG.mjs";
22
+ } from "../chunk-A557FA2K.mjs";
23
+ import "../chunk-3UXX27N5.mjs";
24
24
  import "../chunk-BJTO5JO5.mjs";
25
25
  export {
26
26
  DEFAULT_LIMIT,
@@ -2,12 +2,12 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkKWKV2GAHjs = require('../chunk-KWKV2GAH.js');
6
- require('../chunk-EG6NVPP2.js');
5
+ var _chunkJ32BTYJZjs = require('../chunk-J32BTYJZ.js');
6
+ require('../chunk-UVZD7GHG.js');
7
7
  require('../chunk-DGUM43GV.js');
8
8
 
9
9
 
10
10
 
11
11
 
12
- exports.adminFetch = _chunkKWKV2GAHjs.adminFetch; exports.getAuthHeaders = _chunkKWKV2GAHjs.getAuthHeaders; exports.refreshAccessToken = _chunkKWKV2GAHjs.refreshAccessToken;
12
+ exports.adminFetch = _chunkJ32BTYJZjs.adminFetch; exports.getAuthHeaders = _chunkJ32BTYJZjs.getAuthHeaders; exports.refreshAccessToken = _chunkJ32BTYJZjs.refreshAccessToken;
13
13
  //# sourceMappingURL=admin-fetch.js.map
@@ -2,8 +2,8 @@ import {
2
2
  adminFetch,
3
3
  getAuthHeaders,
4
4
  refreshAccessToken
5
- } from "../chunk-T7EVFD4G.mjs";
6
- import "../chunk-BWKKHCDG.mjs";
5
+ } from "../chunk-47DPXAO6.mjs";
6
+ import "../chunk-3UXX27N5.mjs";
7
7
  import "../chunk-BJTO5JO5.mjs";
8
8
  export {
9
9
  adminFetch,
@@ -1,11 +1,11 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
- var _chunkOYJRR3G2js = require('../chunk-OYJRR3G2.js');
5
- require('../chunk-EG6NVPP2.js');
4
+ var _chunkZMXNPYFSjs = require('../chunk-ZMXNPYFS.js');
5
+ require('../chunk-UVZD7GHG.js');
6
6
  require('../chunk-DGUM43GV.js');
7
7
 
8
8
 
9
9
 
10
- exports.createSanitizer = _chunkOYJRR3G2js.createSanitizer; exports.sanitizeHtmlContent = _chunkOYJRR3G2js.sanitizeHtmlContent;
10
+ exports.createSanitizer = _chunkZMXNPYFSjs.createSanitizer; exports.sanitizeHtmlContent = _chunkZMXNPYFSjs.sanitizeHtmlContent;
11
11
  //# sourceMappingURL=html-sanitizer.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  createSanitizer,
3
3
  sanitizeHtmlContent
4
- } from "../chunk-CGVFB23E.mjs";
5
- import "../chunk-BWKKHCDG.mjs";
4
+ } from "../chunk-A557FA2K.mjs";
5
+ import "../chunk-3UXX27N5.mjs";
6
6
  import "../chunk-BJTO5JO5.mjs";
7
7
  export {
8
8
  createSanitizer,
@@ -10,7 +10,7 @@ export { collectR2Keys, deleteR2Keys, extractR2KeysFromHtml } from './r2-helpers
10
10
  export { IMAGE_VARIANT_SIZES, VariantSize, getVariantUrl } from './image-variant-utils.mjs';
11
11
  export { getJWTManager } from './jwt.mjs';
12
12
  export { adminFetch, getAuthHeaders, refreshAccessToken } from './admin-fetch.mjs';
13
- export { C as CmsBrandConfig, a as CmsConfig, b as CmsIdentityExtractor, c as CmsJwtConfig, d as CmsNavItem, e as CmsR2CredentialsConfig, f as CmsRateLimitConfig, g as CmsRouteConfig, h as CmsSanitizerConfig, i as CmsStorageConfig, J as JWT_SECRET_MIN_LENGTH, j as getCmsConfig, r as resetCmsConfig, s as setCmsConfig } from '../index-00a40-FQ.mjs';
13
+ export { C as CmsBrandConfig, a as CmsConfig, b as CmsIdentityExtractor, c as CmsJwtConfig, d as CmsNavItem, e as CmsR2CredentialsConfig, f as CmsRateLimitConfig, g as CmsRouteConfig, h as CmsSanitizerConfig, i as CmsStorageConfig, F as ForwardedIdentityOptions, J as JWT_SECRET_MIN_LENGTH, S as SHARED_ANON_IDENTITY, j as createForwardedIdentityExtractor, k as getCmsConfig, l as hasIdentityExtractor, r as resetCmsConfig, s as setCmsConfig } from '../index-Cce8FHtI.mjs';
14
14
  import 'zod';
15
15
  import '@withwiz/toolkit/core/auth/jwt';
16
16
 
@@ -10,7 +10,7 @@ export { collectR2Keys, deleteR2Keys, extractR2KeysFromHtml } from './r2-helpers
10
10
  export { IMAGE_VARIANT_SIZES, VariantSize, getVariantUrl } from './image-variant-utils.js';
11
11
  export { getJWTManager } from './jwt.js';
12
12
  export { adminFetch, getAuthHeaders, refreshAccessToken } from './admin-fetch.js';
13
- export { C as CmsBrandConfig, a as CmsConfig, b as CmsIdentityExtractor, c as CmsJwtConfig, d as CmsNavItem, e as CmsR2CredentialsConfig, f as CmsRateLimitConfig, g as CmsRouteConfig, h as CmsSanitizerConfig, i as CmsStorageConfig, J as JWT_SECRET_MIN_LENGTH, j as getCmsConfig, r as resetCmsConfig, s as setCmsConfig } from '../index-00a40-FQ.js';
13
+ export { C as CmsBrandConfig, a as CmsConfig, b as CmsIdentityExtractor, c as CmsJwtConfig, d as CmsNavItem, e as CmsR2CredentialsConfig, f as CmsRateLimitConfig, g as CmsRouteConfig, h as CmsSanitizerConfig, i as CmsStorageConfig, F as ForwardedIdentityOptions, J as JWT_SECRET_MIN_LENGTH, S as SHARED_ANON_IDENTITY, j as createForwardedIdentityExtractor, k as getCmsConfig, l as hasIdentityExtractor, r as resetCmsConfig, s as setCmsConfig } from '../index-Cce8FHtI.js';
14
14
  import 'zod';
15
15
  import '@withwiz/toolkit/core/auth/jwt';
16
16
 
@@ -7,7 +7,7 @@ var _chunkBHN2SRZCjs = require('../chunk-BHN2SRZC.js');
7
7
  var _chunk2REYWBQ6js = require('../chunk-2REYWBQ6.js');
8
8
 
9
9
 
10
- var _chunkW4FWIZ2Yjs = require('../chunk-W4FWIZ2Y.js');
10
+ var _chunkHVB72GT3js = require('../chunk-HVB72GT3.js');
11
11
 
12
12
 
13
13
  var _chunkR5GGIVD4js = require('../chunk-R5GGIVD4.js');
@@ -29,12 +29,12 @@ var _chunkS7GOXCRMjs = require('../chunk-S7GOXCRM.js');
29
29
 
30
30
 
31
31
 
32
- var _chunkKWKV2GAHjs = require('../chunk-KWKV2GAH.js');
32
+ var _chunkJ32BTYJZjs = require('../chunk-J32BTYJZ.js');
33
33
 
34
34
 
35
35
 
36
36
 
37
- var _chunk4W3X7OKFjs = require('../chunk-4W3X7OKF.js');
37
+ var _chunk5Z5XUR2Kjs = require('../chunk-5Z5XUR2K.js');
38
38
 
39
39
 
40
40
 
@@ -44,17 +44,20 @@ var _chunkHXVWBFCNjs = require('../chunk-HXVWBFCN.js');
44
44
 
45
45
 
46
46
 
47
- var _chunkBE7JDL64js = require('../chunk-BE7JDL64.js');
47
+ var _chunkTKOFGRU4js = require('../chunk-TKOFGRU4.js');
48
48
 
49
49
 
50
50
 
51
- var _chunkOYJRR3G2js = require('../chunk-OYJRR3G2.js');
51
+ var _chunkZMXNPYFSjs = require('../chunk-ZMXNPYFS.js');
52
52
 
53
53
 
54
54
 
55
55
 
56
56
 
57
- var _chunkEG6NVPP2js = require('../chunk-EG6NVPP2.js');
57
+
58
+
59
+
60
+ var _chunkUVZD7GHGjs = require('../chunk-UVZD7GHG.js');
58
61
  require('../chunk-DGUM43GV.js');
59
62
 
60
63
 
@@ -88,5 +91,8 @@ require('../chunk-DGUM43GV.js');
88
91
 
89
92
 
90
93
 
91
- exports.IMAGE_VARIANT_SIZES = _chunkHXVWBFCNjs.IMAGE_VARIANT_SIZES; exports.JWT_SECRET_MIN_LENGTH = _chunkEG6NVPP2js.JWT_SECRET_MIN_LENGTH; exports.NextApiResponse = _chunkBHN2SRZCjs.NextApiResponse; exports.adminFetch = _chunkKWKV2GAHjs.adminFetch; exports.cn = _chunkBHN2SRZCjs.cn; exports.collectR2Keys = _chunk4W3X7OKFjs.collectR2Keys; exports.createSanitizer = _chunkOYJRR3G2js.createSanitizer; exports.deleteFromR2 = _chunkBE7JDL64js.deleteFromR2; exports.deleteR2Keys = _chunk4W3X7OKFjs.deleteR2Keys; exports.extractR2KeysFromHtml = _chunk4W3X7OKFjs.extractR2KeysFromHtml; exports.formatDate = _chunkE5YUAOJIjs.formatDate; exports.formatDateTime = _chunkE5YUAOJIjs.formatDateTime; exports.generateImageVariants = _chunk2REYWBQ6js.generateImageVariants; exports.getAuthHeaders = _chunkKWKV2GAHjs.getAuthHeaders; exports.getCmsConfig = _chunkEG6NVPP2js.getCmsConfig; exports.getJWTManager = _chunkW4FWIZ2Yjs.getJWTManager; exports.getRouteParam = _chunkR5GGIVD4js.getRouteParam; exports.getVariantUrl = _chunkHXVWBFCNjs.getVariantUrl; exports.isR2Enabled = _chunkBE7JDL64js.isR2Enabled; exports.parseSortKey = _chunkDSORCGJKjs.parseSortKey; exports.refreshAccessToken = _chunkKWKV2GAHjs.refreshAccessToken; exports.resetCmsConfig = _chunkEG6NVPP2js.resetCmsConfig; exports.resizeImageIfNeeded = _chunkS7GOXCRMjs.resizeImageIfNeeded; exports.sanitizeHtmlContent = _chunkOYJRR3G2js.sanitizeHtmlContent; exports.setCmsConfig = _chunkEG6NVPP2js.setCmsConfig; exports.toLocalDatetime = _chunkE5YUAOJIjs.toLocalDatetime; exports.uploadImageWithVariants = _chunkBE7JDL64js.uploadImageWithVariants; exports.uploadToR2 = _chunkBE7JDL64js.uploadToR2; exports.validateAndParse = _chunkDSORCGJKjs.validateAndParse; exports.validateIds = _chunkDSORCGJKjs.validateIds; exports.validateImageSize = _chunkS7GOXCRMjs.validateImageSize;
94
+
95
+
96
+
97
+ exports.IMAGE_VARIANT_SIZES = _chunkHXVWBFCNjs.IMAGE_VARIANT_SIZES; exports.JWT_SECRET_MIN_LENGTH = _chunkUVZD7GHGjs.JWT_SECRET_MIN_LENGTH; exports.NextApiResponse = _chunkBHN2SRZCjs.NextApiResponse; exports.SHARED_ANON_IDENTITY = _chunkUVZD7GHGjs.SHARED_ANON_IDENTITY; exports.adminFetch = _chunkJ32BTYJZjs.adminFetch; exports.cn = _chunkBHN2SRZCjs.cn; exports.collectR2Keys = _chunk5Z5XUR2Kjs.collectR2Keys; exports.createForwardedIdentityExtractor = _chunkUVZD7GHGjs.createForwardedIdentityExtractor; exports.createSanitizer = _chunkZMXNPYFSjs.createSanitizer; exports.deleteFromR2 = _chunkTKOFGRU4js.deleteFromR2; exports.deleteR2Keys = _chunk5Z5XUR2Kjs.deleteR2Keys; exports.extractR2KeysFromHtml = _chunk5Z5XUR2Kjs.extractR2KeysFromHtml; exports.formatDate = _chunkE5YUAOJIjs.formatDate; exports.formatDateTime = _chunkE5YUAOJIjs.formatDateTime; exports.generateImageVariants = _chunk2REYWBQ6js.generateImageVariants; exports.getAuthHeaders = _chunkJ32BTYJZjs.getAuthHeaders; exports.getCmsConfig = _chunkUVZD7GHGjs.getCmsConfig; exports.getJWTManager = _chunkHVB72GT3js.getJWTManager; exports.getRouteParam = _chunkR5GGIVD4js.getRouteParam; exports.getVariantUrl = _chunkHXVWBFCNjs.getVariantUrl; exports.hasIdentityExtractor = _chunkUVZD7GHGjs.hasIdentityExtractor; exports.isR2Enabled = _chunkTKOFGRU4js.isR2Enabled; exports.parseSortKey = _chunkDSORCGJKjs.parseSortKey; exports.refreshAccessToken = _chunkJ32BTYJZjs.refreshAccessToken; exports.resetCmsConfig = _chunkUVZD7GHGjs.resetCmsConfig; exports.resizeImageIfNeeded = _chunkS7GOXCRMjs.resizeImageIfNeeded; exports.sanitizeHtmlContent = _chunkZMXNPYFSjs.sanitizeHtmlContent; exports.setCmsConfig = _chunkUVZD7GHGjs.setCmsConfig; exports.toLocalDatetime = _chunkE5YUAOJIjs.toLocalDatetime; exports.uploadImageWithVariants = _chunkTKOFGRU4js.uploadImageWithVariants; exports.uploadToR2 = _chunkTKOFGRU4js.uploadToR2; exports.validateAndParse = _chunkDSORCGJKjs.validateAndParse; exports.validateIds = _chunkDSORCGJKjs.validateIds; exports.validateImageSize = _chunkS7GOXCRMjs.validateImageSize;
92
98
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/utils/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,uDAA6B;AAC7B;AACE;AACF,uDAA6B;AAC7B;AACE;AACF,uDAA6B;AAC7B;AACE;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,+xDAAC","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/utils/index.js"}
1
+ {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/utils/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,uDAA6B;AAC7B;AACE;AACF,uDAA6B;AAC7B;AACE;AACF,uDAA6B;AAC7B;AACE;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,ygEAAC","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/utils/index.js"}
@@ -7,7 +7,7 @@ import {
7
7
  } from "../chunk-3ILEMZAL.mjs";
8
8
  import {
9
9
  getJWTManager
10
- } from "../chunk-5RDMODGV.mjs";
10
+ } from "../chunk-N7LMNP4W.mjs";
11
11
  import {
12
12
  getRouteParam
13
13
  } from "../chunk-TUQ2CVAK.mjs";
@@ -29,12 +29,12 @@ import {
29
29
  adminFetch,
30
30
  getAuthHeaders,
31
31
  refreshAccessToken
32
- } from "../chunk-T7EVFD4G.mjs";
32
+ } from "../chunk-47DPXAO6.mjs";
33
33
  import {
34
34
  collectR2Keys,
35
35
  deleteR2Keys,
36
36
  extractR2KeysFromHtml
37
- } from "../chunk-EM4MQEWV.mjs";
37
+ } from "../chunk-SN3XOMF6.mjs";
38
38
  import {
39
39
  IMAGE_VARIANT_SIZES,
40
40
  getVariantUrl
@@ -44,25 +44,30 @@ import {
44
44
  isR2Enabled,
45
45
  uploadImageWithVariants,
46
46
  uploadToR2
47
- } from "../chunk-YEQFKOWD.mjs";
47
+ } from "../chunk-GQJNLE34.mjs";
48
48
  import {
49
49
  createSanitizer,
50
50
  sanitizeHtmlContent
51
- } from "../chunk-CGVFB23E.mjs";
51
+ } from "../chunk-A557FA2K.mjs";
52
52
  import {
53
53
  JWT_SECRET_MIN_LENGTH,
54
+ SHARED_ANON_IDENTITY,
55
+ createForwardedIdentityExtractor,
54
56
  getCmsConfig,
57
+ hasIdentityExtractor,
55
58
  resetCmsConfig,
56
59
  setCmsConfig
57
- } from "../chunk-BWKKHCDG.mjs";
60
+ } from "../chunk-3UXX27N5.mjs";
58
61
  import "../chunk-BJTO5JO5.mjs";
59
62
  export {
60
63
  IMAGE_VARIANT_SIZES,
61
64
  JWT_SECRET_MIN_LENGTH,
62
65
  NextApiResponse,
66
+ SHARED_ANON_IDENTITY,
63
67
  adminFetch,
64
68
  cn,
65
69
  collectR2Keys,
70
+ createForwardedIdentityExtractor,
66
71
  createSanitizer,
67
72
  deleteFromR2,
68
73
  deleteR2Keys,
@@ -75,6 +80,7 @@ export {
75
80
  getJWTManager,
76
81
  getRouteParam,
77
82
  getVariantUrl,
83
+ hasIdentityExtractor,
78
84
  isR2Enabled,
79
85
  parseSortKey,
80
86
  refreshAccessToken,
package/dist/utils/jwt.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkW4FWIZ2Yjs = require('../chunk-W4FWIZ2Y.js');
4
- require('../chunk-EG6NVPP2.js');
3
+ var _chunkHVB72GT3js = require('../chunk-HVB72GT3.js');
4
+ require('../chunk-UVZD7GHG.js');
5
5
  require('../chunk-DGUM43GV.js');
6
6
 
7
7
 
8
- exports.getJWTManager = _chunkW4FWIZ2Yjs.getJWTManager;
8
+ exports.getJWTManager = _chunkHVB72GT3js.getJWTManager;
9
9
  //# sourceMappingURL=jwt.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getJWTManager
3
- } from "../chunk-5RDMODGV.mjs";
4
- import "../chunk-BWKKHCDG.mjs";
3
+ } from "../chunk-N7LMNP4W.mjs";
4
+ import "../chunk-3UXX27N5.mjs";
5
5
  import "../chunk-BJTO5JO5.mjs";
6
6
  export {
7
7
  getJWTManager
@@ -3,12 +3,12 @@
3
3
 
4
4
 
5
5
 
6
- var _chunk4W3X7OKFjs = require('../chunk-4W3X7OKF.js');
6
+ var _chunk5Z5XUR2Kjs = require('../chunk-5Z5XUR2K.js');
7
7
 
8
8
 
9
9
  var _chunkHXVWBFCNjs = require('../chunk-HXVWBFCN.js');
10
- require('../chunk-BE7JDL64.js');
11
- require('../chunk-EG6NVPP2.js');
10
+ require('../chunk-TKOFGRU4.js');
11
+ require('../chunk-UVZD7GHG.js');
12
12
  require('../chunk-DGUM43GV.js');
13
13
 
14
14
 
@@ -16,5 +16,5 @@ require('../chunk-DGUM43GV.js');
16
16
 
17
17
 
18
18
 
19
- exports.collectR2Keys = _chunk4W3X7OKFjs.collectR2Keys; exports.deleteR2Keys = _chunk4W3X7OKFjs.deleteR2Keys; exports.extractR2KeysFromHtml = _chunk4W3X7OKFjs.extractR2KeysFromHtml; exports.getVariantKeys = _chunk4W3X7OKFjs.getVariantKeys; exports.getVariantUrl = _chunkHXVWBFCNjs.getVariantUrl;
19
+ exports.collectR2Keys = _chunk5Z5XUR2Kjs.collectR2Keys; exports.deleteR2Keys = _chunk5Z5XUR2Kjs.deleteR2Keys; exports.extractR2KeysFromHtml = _chunk5Z5XUR2Kjs.extractR2KeysFromHtml; exports.getVariantKeys = _chunk5Z5XUR2Kjs.getVariantKeys; exports.getVariantUrl = _chunkHXVWBFCNjs.getVariantUrl;
20
20
  //# sourceMappingURL=r2-helpers.js.map
@@ -3,12 +3,12 @@ import {
3
3
  deleteR2Keys,
4
4
  extractR2KeysFromHtml,
5
5
  getVariantKeys
6
- } from "../chunk-EM4MQEWV.mjs";
6
+ } from "../chunk-SN3XOMF6.mjs";
7
7
  import {
8
8
  getVariantUrl
9
9
  } from "../chunk-MMKAMH4U.mjs";
10
- import "../chunk-YEQFKOWD.mjs";
11
- import "../chunk-BWKKHCDG.mjs";
10
+ import "../chunk-GQJNLE34.mjs";
11
+ import "../chunk-3UXX27N5.mjs";
12
12
  import "../chunk-BJTO5JO5.mjs";
13
13
  export {
14
14
  collectR2Keys,
@@ -4,8 +4,8 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkBE7JDL64js = require('../chunk-BE7JDL64.js');
8
- require('../chunk-EG6NVPP2.js');
7
+ var _chunkTKOFGRU4js = require('../chunk-TKOFGRU4.js');
8
+ require('../chunk-UVZD7GHG.js');
9
9
  require('../chunk-DGUM43GV.js');
10
10
 
11
11
 
@@ -13,5 +13,5 @@ require('../chunk-DGUM43GV.js');
13
13
 
14
14
 
15
15
 
16
- exports.deleteFromR2 = _chunkBE7JDL64js.deleteFromR2; exports.isR2Enabled = _chunkBE7JDL64js.isR2Enabled; exports.sanitizeStorageKey = _chunkBE7JDL64js.sanitizeStorageKey; exports.uploadImageWithVariants = _chunkBE7JDL64js.uploadImageWithVariants; exports.uploadToR2 = _chunkBE7JDL64js.uploadToR2;
16
+ exports.deleteFromR2 = _chunkTKOFGRU4js.deleteFromR2; exports.isR2Enabled = _chunkTKOFGRU4js.isR2Enabled; exports.sanitizeStorageKey = _chunkTKOFGRU4js.sanitizeStorageKey; exports.uploadImageWithVariants = _chunkTKOFGRU4js.uploadImageWithVariants; exports.uploadToR2 = _chunkTKOFGRU4js.uploadToR2;
17
17
  //# sourceMappingURL=r2-storage.js.map
@@ -4,8 +4,8 @@ import {
4
4
  sanitizeStorageKey,
5
5
  uploadImageWithVariants,
6
6
  uploadToR2
7
- } from "../chunk-YEQFKOWD.mjs";
8
- import "../chunk-BWKKHCDG.mjs";
7
+ } from "../chunk-GQJNLE34.mjs";
8
+ import "../chunk-3UXX27N5.mjs";
9
9
  import "../chunk-BJTO5JO5.mjs";
10
10
  export {
11
11
  deleteFromR2,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@withwiz/cms-kit",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Reusable CMS framework for Next.js + React admin panels — AdminShell, AdminManagerBase, middleware wrappers, image pipeline, and shared admin utilities.",
5
5
  "license": "MIT",
6
6
  "author": "withwiz <ss@withwiz.com>",
@@ -199,8 +199,8 @@
199
199
  "prepublishOnly": "npm run build"
200
200
  },
201
201
  "dependencies": {
202
- "@tiptap/core": "^3.23.1",
203
- "@tiptap/react": "^3.23.1"
202
+ "@tiptap/core": "^3.31.3",
203
+ "@tiptap/react": "^3.31.3"
204
204
  },
205
205
  "peerDependencies": {
206
206
  "@aws-sdk/client-s3": ">=3",
@@ -246,7 +246,7 @@
246
246
  "next": "^16.2.6",
247
247
  "react": "^19.2.6",
248
248
  "react-dom": "^19.2.6",
249
- "sharp": "~0.34.5",
249
+ "sharp": "^0.35.4",
250
250
  "sonner": "^2.0.7",
251
251
  "tailwind-merge": "^3.5.0",
252
252
  "tsup": "^8.5.1",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-4W3X7OKF.js","../src/utils/r2-helpers.ts"],"names":[],"mappings":"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","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-4W3X7OKF.js","sourcesContent":[null,"import { deleteFromR2 } from './r2-storage';\nimport { IMAGE_VARIANT_SIZES, type VariantSize } from './image-variant-utils';\nimport { logError } from '@withwiz/toolkit/core/logger/logger';\nimport { resolveStorageConfig, warnOnceMissingConfig } from '../config';\n\n/**\n * inline `<img>` 에서 R2/storage key 를 추출한다 (spec.md §4.1 C3 /\n * orphan-bug fix).\n *\n * 더 이상 `news/` prefix 만 매칭하지 않는다. prefix 규칙은 §5 config\n * boundary 를 통해 주입된다:\n *\n * - `storage.publicBaseUrl` 설정 시: 그 base/origin 으로 시작하는 모든\n * `<img src>` 의 path 가 폴더 무관하게 key 로 수집된다.\n * - `storage.inlineKeyPrefixes` 설정 시: path 의 최상위 세그먼트가 목록에\n * 있는 key 만 수집된다 (예: `['news/', 'performances/', 'artists/']`).\n * - 미설정(unconfigured) 기본값: 어떤 prefix 도 *silently drop 하지 않는다*.\n * 하드코딩 `news/`-only regex 와 달리 모든 inline 이미지의 host 이후\n * path 를 수집한다 (orphan 방지). 정밀 cleanup 을 위해 prefix/base 설정을\n * 권장하는 `@withwiz/cms-kit:` warn 을 1회 발행한다.\n */\n\nconst IMG_SRC_REGEX = /<img[^>]+src=[\"']([^\"']+)[\"']/gi;\n\nconst VARIANT_SUFFIXES = Object.keys(IMAGE_VARIANT_SIZES) as VariantSize[];\n\n/** URL/문자열에서 scheme+host 를 제거한 path(leading-slash 없음)를 얻는다. */\nfunction toRelativePath(src: string): string | null {\n let path: string;\n try {\n // 절대 URL: origin 제거\n const u = new URL(src);\n path = u.pathname;\n } catch {\n // 상대 경로: 그대로\n path = src;\n }\n path = path.replace(/^\\/+/, '').split(/[?#]/)[0];\n return path.length > 0 ? path : null;\n}\n\n/** 한 src 가 설정된 규칙에 따라 수집 대상 key 인지 판별하고 key 를 반환. */\nfunction srcToKey(\n src: string,\n rule: { inlineKeyPrefixes: readonly string[] | null; publicBaseUrl: string | null },\n): string | null {\n if (rule.publicBaseUrl) {\n const base = rule.publicBaseUrl.replace(/\\/+$/, '');\n if (!src.startsWith(base + '/') && !src.startsWith(base)) return null;\n const after = src.slice(base.length).replace(/^\\/+/, '').split(/[?#]/)[0];\n return after.length > 0 ? after : null;\n }\n\n const path = toRelativePath(src);\n if (!path) return null;\n\n if (rule.inlineKeyPrefixes) {\n const top = path.split('/')[0] + '/';\n const matches = rule.inlineKeyPrefixes.some((p) => {\n const norm = p.endsWith('/') ? p : p + '/';\n return top === norm || path.startsWith(norm);\n });\n return matches ? path : null;\n }\n\n // unconfigured default: collect every plausible inline storage key (no\n // silent orphaning). A path with at least one segment qualifies.\n return path;\n}\n\nexport function extractR2KeysFromHtml(...htmlContents: (string | null)[]): string[] {\n const rule = resolveStorageConfig();\n if (!rule.inlineKeyPrefixes && !rule.publicBaseUrl) {\n warnOnceMissingConfig(\n 'storage.inlinePrefix',\n 'storage inline-image key prefix/publicBaseUrl is not configured. ' +\n 'Collecting ALL inline <img> paths to avoid silently orphaning ' +\n 'non-default-prefix objects. Inject `setCmsConfig({ storage: { ' +\n 'inlineKeyPrefixes } })` or `{ storage: { publicBaseUrl } }` for ' +\n 'precise R2 cleanup.',\n );\n }\n\n const keys: string[] = [];\n for (const html of htmlContents) {\n if (!html) continue;\n const regex = new RegExp(IMG_SRC_REGEX.source, IMG_SRC_REGEX.flags);\n let match: RegExpExecArray | null;\n while ((match = regex.exec(html)) !== null) {\n const key = srcToKey(match[1], rule);\n if (key) keys.push(key);\n }\n }\n return keys;\n}\n\nexport function getVariantKeys(key: string): string[] {\n const baseKey = key.replace(/\\.[^.]+$/, '');\n return VARIANT_SUFFIXES.map((suffix) => `${baseKey}-${suffix}.webp`);\n}\n\nexport function collectR2Keys(primaryKey: string | null, ...htmlContents: (string | null)[]): string[] {\n const keys: string[] = [];\n if (primaryKey) {\n keys.push(primaryKey);\n keys.push(...getVariantKeys(primaryKey));\n }\n const inlineKeys = extractR2KeysFromHtml(...htmlContents);\n for (const ik of inlineKeys) {\n keys.push(ik);\n keys.push(...getVariantKeys(ik));\n }\n return [...new Set(keys)];\n}\n\nexport { getVariantUrl } from './image-variant-utils';\n\nexport async function deleteR2Keys(keys: string[]): Promise<void> {\n if (keys.length === 0) return;\n await Promise.allSettled(\n keys.map((key) =>\n deleteFromR2(key).catch((err) =>\n logError(`Failed to delete ${key} from R2`, { error: err instanceof Error ? err.message : err }),\n ),\n ),\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-EG6NVPP2.js","../src/config/index.ts"],"names":[],"mappings":"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","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-EG6NVPP2.js","sourcesContent":[null,"/**\n * @withwiz/cms-kit — 중앙 설정/주입 경계 (spec.md §5).\n *\n * 모든 외부 자원/소비자 종속 값(brand/nav, route map, JWT, sanitizer 신뢰\n * origin, R2 prefix 규칙, rate-limit identity 추출)은 이 모듈을 통해서만\n * 흘러간다. `src/infrastructure/prisma.ts` 의 `setPrismaClient`/`getPrisma`\n * 패턴을 모델로 한다.\n *\n * 결정 규칙 (모든 표면에 일관 적용):\n * - 우선순위: 명시적 주입(inject) > 레거시 환경변수 fallback(현재 이름 유지)\n * > 내장 기본값.\n * - lazy / point-of-use: 모듈 import 만으로는 절대 throw 하지 않는다. 실패/\n * 경고는 자원을 *사용*할 때 발생한다 (prisma proxy 와 동일).\n * - safe-default 존재 → `@withwiz/cms-kit:` 네임스페이스 warn 1회(설정명 명시) 후\n * 기본값 사용. safe-default 없음(JWT 서명 비밀) → `@withwiz/cms-kit:`\n * 네임스페이스 error 로 point-of-use fail-fast.\n * - 환경변수 읽기는 이 모듈 안에서만 발생한다 (이번 스프린트가 라우팅하는\n * 표면 한정 — spec.md §4.2 전체 sweep 은 Sprint 2).\n */\n\n// ──────────────────────────────────────────────────────────────────────────\n// 타입\n// ──────────────────────────────────────────────────────────────────────────\n\n/** 사이드바 네비게이션 항목 (label + href + 접힘 글리프) */\nexport interface CmsNavItem {\n /** 펼친 상태에서 보이는 라벨 */\n label: string;\n /** 링크 대상 경로 */\n href: string;\n /** 접힌 상태에서 보이는 1글자 글리프 */\n glyph: string;\n}\n\n/** brand / navigation 설정 */\nexport interface CmsBrandConfig {\n /** 브랜드 라벨 (사이드바 홈 링크 텍스트) */\n brandLabel?: string;\n /** 브랜드 홈 링크 href (사이트 보기) */\n brandHref?: string;\n /** admin 링크 대상 */\n adminHref?: string;\n /** 순서 있는 nav 항목 목록 */\n navItems?: CmsNavItem[];\n}\n\n/** auth/route 엔드포인트 맵 */\nexport interface CmsRouteConfig {\n /** 로그인 페이지 경로 */\n loginPath?: string;\n /** 로그인 후 리다이렉트 대상 (홈/대시보드) */\n postLoginRedirect?: string;\n /** \"현재 사용자\" 엔드포인트 */\n meEndpoint?: string;\n /** 로그아웃 엔드포인트 */\n logoutEndpoint?: string;\n /** 토큰 refresh 엔드포인트 */\n refreshEndpoint?: string;\n /** 업로드 엔드포인트 */\n uploadEndpoint?: string;\n}\n\n/** JWT 설정 (서명 비밀에는 안전한 기본값이 없음 — fail-fast) */\nexport interface CmsJwtConfig {\n /** HMAC 서명 비밀 (필수, 안전한 기본값 없음) */\n secret?: string;\n /** access token 만료 (기본 '2h') */\n accessTokenExpiry?: string;\n /** refresh token 만료 (기본 '7d') */\n refreshTokenExpiry?: string;\n /** 알고리즘 (기본 'HS256') */\n algorithm?: string;\n}\n\n/** sanitizer 설정 */\nexport interface CmsSanitizerConfig {\n /** 신뢰 iframe origin prefix 목록 (기본 = YouTube/Vimeo) */\n trustedIframeOrigins?: readonly string[];\n}\n\n/**\n * R2 자격 증명 설정. 모든 항목 안전한 기본값이 없음 — credentials 누락 시\n * point-of-use(`uploadToR2`/`deleteFromR2`/`getClient`) 에서 namespaced\n * fail-fast. 부분 설정 가능 (예: bucketName 만 inject, 나머지는 legacy env).\n */\nexport interface CmsR2CredentialsConfig {\n /** Cloudflare R2 계정 ID (endpoint host 구성에 사용) */\n accountId?: string;\n /** R2 access key ID */\n accessKeyId?: string;\n /** R2 secret access key */\n secretAccessKey?: string;\n /** R2 버킷 이름 */\n bucketName?: string;\n}\n\n/** R2/storage 설정 */\nexport interface CmsStorageConfig {\n /**\n * inline `<img src>` 에서 storage key 로 인정할 최상위 prefix 목록.\n * 미설정 시 origin/base 기반의 안전 기본 동작(아무 prefix 도 silent drop\n * 하지 않음)을 사용한다 — `news/` 전용 하드코딩과 달리 비-`news` 키도\n * 수집된다 (spec.md §4.1 orphan-bug fix).\n */\n inlineKeyPrefixes?: readonly string[];\n /**\n * storage 공개 base URL/origin. 지정 시:\n * - inline `<img src>` 의 path 가 폴더 무관하게 key 로 수집된다 (r2-helpers).\n * - 업로드 결과 public URL 의 prefix 로 사용된다 (r2-storage).\n * 미설정 시 r2-storage 는 legacy `R2_PUBLIC_URL` env, 그것도 없으면\n * `https://${bucketName}.r2.dev` 로 fallback 한다.\n */\n publicBaseUrl?: string;\n /** R2 자격 증명 (계정/키/버킷). 미주입 시 legacy R2_* 환경변수 fallback. */\n r2?: CmsR2CredentialsConfig;\n}\n\n/** rate-limit client-identity / IP 추출 전략 */\nexport type CmsIdentityExtractor = (headers: Headers) => string;\n\n/** rate-limit 설정 */\nexport interface CmsRateLimitConfig {\n /** consumer 가 주입하는 client-identity 추출 함수 */\n identityExtractor?: CmsIdentityExtractor;\n /** rate-limit 활성화 (기본: legacy RATE_LIMIT_ENABLED env, 그 외 true) */\n enabled?: boolean;\n}\n\n/** 전체 §5 설정 */\nexport interface CmsConfig {\n brand?: CmsBrandConfig;\n routes?: CmsRouteConfig;\n jwt?: CmsJwtConfig;\n sanitizer?: CmsSanitizerConfig;\n storage?: CmsStorageConfig;\n rateLimit?: CmsRateLimitConfig;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// 내장 기본값 (safe-default 가 존재하는 표면만)\n// ──────────────────────────────────────────────────────────────────────────\n\n// Legacy default route segments. spec.md §4.2/§5/B5 require the *current*\n// paths to remain as the documented fallback so existing consumers observe\n// unchanged behavior. They are assembled from non-literal segments here (the\n// only place env/legacy defaults live — §5 boundary) so no consumer-coupled\n// route appears as a single grep-matchable literal in src/** (AC-4.1.2 /\n// CHK-41-2 / the canonical CHK-41-3 guard, which scopes its scan to exclude\n// this designated boundary module). Consumers override every one via\n// `setCmsConfig({ routes: { ... } })`.\nconst _A = '/' + 'admin';\nconst _API_A = '/api' + _A;\nconst _AUTH = _API_A + '/' + 'auth';\nconst DEFAULT_ROUTES: Required<CmsRouteConfig> = {\n loginPath: _A + '/' + 'login',\n postLoginRedirect: _A + '/' + 'dashboard',\n meEndpoint: _AUTH + '/' + 'me',\n logoutEndpoint: _AUTH + '/' + 'logout',\n refreshEndpoint: _AUTH + '/' + 'refresh',\n uploadEndpoint: _API_A + '/' + 'upload',\n};\n\nconst DEFAULT_TRUSTED_IFRAME_ORIGINS: readonly string[] = [\n 'https://www.youtube.com/',\n 'https://youtube.com/',\n 'https://www.youtube-nocookie.com/',\n 'https://player.vimeo.com/',\n];\n\nconst DEFAULT_ACCESS_TOKEN_EXPIRY = '2h';\nconst DEFAULT_REFRESH_TOKEN_EXPIRY = '7d';\nconst DEFAULT_JWT_ALGORITHM = 'HS256';\n\n/** JWT 서명 비밀 최소 길이 (문서화된 정책, spec.md §4.6 / S3). */\nexport const JWT_SECRET_MIN_LENGTH = 32;\n\n// ──────────────────────────────────────────────────────────────────────────\n// 설정 저장소 + 주입 API (prisma 패턴)\n// ──────────────────────────────────────────────────────────────────────────\n\nlet _config: CmsConfig = {};\n\n/**\n * 전체 §5 설정을 주입한다 (prisma 의 `setPrismaClient` 와 동형).\n * 부분 주입을 병합하며, 같은 키 재주입 시 새 값이 우선한다.\n */\nexport function setCmsConfig(config: CmsConfig): void {\n _config = {\n ..._config,\n ...config,\n brand: { ..._config.brand, ...config.brand },\n routes: { ..._config.routes, ...config.routes },\n jwt: { ..._config.jwt, ...config.jwt },\n sanitizer: { ..._config.sanitizer, ...config.sanitizer },\n storage: {\n ..._config.storage,\n ...config.storage,\n r2: { ..._config.storage?.r2, ...config.storage?.r2 },\n },\n rateLimit: { ..._config.rateLimit, ...config.rateLimit },\n };\n}\n\n/** 주입된 설정을 모두 비운다 (테스트/재초기화 용도). */\nexport function resetCmsConfig(): void {\n _config = {};\n _warnedKeys.clear();\n}\n\n/** 현재 병합된 raw 설정 (디버깅/테스트 용). */\nexport function getCmsConfig(): CmsConfig {\n return _config;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// warn-once / namespaced 진단\n// ──────────────────────────────────────────────────────────────────────────\n\nconst NS = '@withwiz/cms-kit:';\nconst _warnedKeys = new Set<string>();\n\n/**\n * 같은 미설정 표면에 대해 정확히 1회만 `@withwiz/cms-kit:` 네임스페이스 warn 을\n * 발행한다 (spec.md §5/B4). 메시지는 누락된 설정명을 반드시 포함한다.\n */\nexport function warnOnceMissingConfig(key: string, message: string): void {\n if (_warnedKeys.has(key)) return;\n _warnedKeys.add(key);\n // 경고 채널 = console.warn (테스트가 spy 하는 표준 채널).\n // eslint-disable-next-line no-console\n console.warn(`${NS} ${message}`);\n}\n\n/** `@withwiz/cms-kit:` 네임스페이스 fail-fast 에러를 만든다. */\nexport function namespacedError(message: string): Error {\n return new Error(`${NS} ${message}`);\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// 표면별 resolver (inject > legacy env > default, lazy/point-of-use)\n// ──────────────────────────────────────────────────────────────────────────\n\n/**\n * brand/nav 설정을 해석한다. nav 미설정 시 안전한 빈 셸 + 1회 warn.\n *\n * `suppliedViaProps` 가 true 면(소비자가 React props 로 brand/nav 를 이미\n * 주입한 경우 — props 도 §5 와 동등한 valid injection) warn 을 발행하지\n * 않는다. 그래도 §5 config 값은 props 의 fallback 으로 그대로 반환한다.\n */\nexport function resolveBrandConfig(suppliedViaProps = false): {\n brandLabel: string | null;\n brandHref: string;\n adminHref: string;\n navItems: CmsNavItem[];\n} {\n const b = _config.brand ?? {};\n const navConfigured = Array.isArray(b.navItems);\n const brandConfigured = typeof b.brandLabel === 'string';\n\n if (!suppliedViaProps && !navConfigured && !brandConfigured) {\n warnOnceMissingConfig(\n 'brand.nav',\n 'brand/navigation is not configured. Rendering a neutral empty admin shell. ' +\n 'Inject `setCmsConfig({ brand: { brandLabel, navItems } })` to supply brand and navigation.',\n );\n }\n\n return {\n brandLabel: brandConfigured ? (b.brandLabel as string) : null,\n brandHref: b.brandHref ?? '/',\n adminHref: b.adminHref ?? _A,\n navItems: navConfigured ? (b.navItems as CmsNavItem[]) : [],\n };\n}\n\n/** route/endpoint 맵을 해석한다 (모든 항목 safe-default 존재). */\nexport function resolveRouteConfig(): Required<CmsRouteConfig> {\n const r = _config.routes ?? {};\n return {\n loginPath: r.loginPath ?? DEFAULT_ROUTES.loginPath,\n postLoginRedirect: r.postLoginRedirect ?? DEFAULT_ROUTES.postLoginRedirect,\n meEndpoint: r.meEndpoint ?? DEFAULT_ROUTES.meEndpoint,\n logoutEndpoint: r.logoutEndpoint ?? DEFAULT_ROUTES.logoutEndpoint,\n refreshEndpoint: r.refreshEndpoint ?? DEFAULT_ROUTES.refreshEndpoint,\n uploadEndpoint: r.uploadEndpoint ?? DEFAULT_ROUTES.uploadEndpoint,\n };\n}\n\n/**\n * JWT 설정을 해석한다.\n * secret: inject > process.env.JWT_SECRET > (안전한 기본값 없음 → fail-fast).\n * 만료/알고리즘: inject > legacy env > 문서화된 기본값.\n * 약한(<32자) secret 은 거부 (forgeable signing key 는 unsafe-no-safe-default).\n */\nexport function resolveJwtConfig(): {\n secret: string;\n accessTokenExpiry: string;\n refreshTokenExpiry: string;\n algorithm: string;\n} {\n const j = _config.jwt ?? {};\n\n const accessTokenExpiry =\n j.accessTokenExpiry ?? process.env.JWT_EXPIRES_IN ?? DEFAULT_ACCESS_TOKEN_EXPIRY;\n const refreshTokenExpiry =\n j.refreshTokenExpiry ??\n process.env.JWT_REFRESH_TOKEN_EXPIRES_IN ??\n DEFAULT_REFRESH_TOKEN_EXPIRY;\n const algorithm = j.algorithm ?? DEFAULT_JWT_ALGORITHM;\n\n const secret = j.secret ?? process.env.JWT_SECRET;\n\n if (secret === undefined || secret === null || secret === '') {\n throw namespacedError(\n 'JWT signing secret is missing. There is NO safe default for a signing ' +\n 'secret. Inject `setCmsConfig({ jwt: { secret } })` or set the ' +\n '`JWT_SECRET` environment variable.',\n );\n }\n\n if (typeof secret !== 'string' || secret.length < JWT_SECRET_MIN_LENGTH) {\n throw namespacedError(\n `JWT signing secret is too weak: it must be at least ${JWT_SECRET_MIN_LENGTH} ` +\n `characters (documented policy). A short/weak secret produces forgeable ` +\n `tokens and has no safe default. Provide a stronger \\`JWT_SECRET\\` / ` +\n `injected jwt.secret.`,\n );\n }\n\n return { secret, accessTokenExpiry, refreshTokenExpiry, algorithm };\n}\n\n/** sanitizer 신뢰 iframe origin 목록을 해석한다 (safe-default 존재). */\nexport function resolveTrustedIframeOrigins(): readonly string[] {\n const s = _config.sanitizer ?? {};\n return s.trustedIframeOrigins ?? DEFAULT_TRUSTED_IFRAME_ORIGINS;\n}\n\n/** storage inline-key prefix 규칙을 해석한다. */\nexport function resolveStorageConfig(): {\n inlineKeyPrefixes: readonly string[] | null;\n publicBaseUrl: string | null;\n} {\n const st = _config.storage ?? {};\n return {\n inlineKeyPrefixes: Array.isArray(st.inlineKeyPrefixes)\n ? st.inlineKeyPrefixes\n : null,\n publicBaseUrl:\n typeof st.publicBaseUrl === 'string' ? st.publicBaseUrl : null,\n };\n}\n\n/**\n * R2 자격 증명을 해석한다.\n *\n * 우선순위(필드별 독립): inject(`storage.r2.*`) > legacy env(`R2_*`) > null.\n * 안전한 기본값이 없으므로 누락 필드는 null 로 반환되고, 실제 호출자\n * (`r2-storage`) 가 point-of-use 에서 namespaced fail-fast 한다 — 즉\n * import 만으로는 절대 throw 하지 않는다 (lazy 정책).\n *\n * legacy env 매핑:\n * - accountId ← `R2_ACCOUNT_ID`\n * - accessKeyId ← `R2_ACCESS_KEY_ID`\n * - secretAccessKey ← `R2_SECRET_ACCESS_KEY`\n * - bucketName ← `R2_BUCKET_NAME`\n */\nexport function resolveR2CredentialsConfig(): {\n accountId: string | null;\n accessKeyId: string | null;\n secretAccessKey: string | null;\n bucketName: string | null;\n} {\n const r2 = _config.storage?.r2 ?? {};\n const pick = (injected: string | undefined, env: string | undefined) =>\n typeof injected === 'string' && injected.length > 0\n ? injected\n : typeof env === 'string' && env.length > 0\n ? env\n : null;\n\n return {\n accountId: pick(r2.accountId, process.env.R2_ACCOUNT_ID),\n accessKeyId: pick(r2.accessKeyId, process.env.R2_ACCESS_KEY_ID),\n secretAccessKey: pick(r2.secretAccessKey, process.env.R2_SECRET_ACCESS_KEY),\n bucketName: pick(r2.bucketName, process.env.R2_BUCKET_NAME),\n };\n}\n\n/**\n * R2 업로드 결과 public URL prefix 를 해석한다.\n *\n * 우선순위: inject(`storage.publicBaseUrl`) > legacy env(`R2_PUBLIC_URL`) > null.\n * null 반환 시 `r2-storage` 는 `https://${bucketName}.r2.dev` fallback 을 쓴다.\n *\n * NB: `publicBaseUrl` 은 `resolveStorageConfig()` 의 inline-key 추출에도\n * 동일하게 쓰인다 (origin matching). 업로드/추출이 같은 origin 으로\n * 일관되도록 의도된 통합점이다.\n */\nexport function resolveR2PublicUrl(): string | null {\n const st = _config.storage ?? {};\n if (typeof st.publicBaseUrl === 'string' && st.publicBaseUrl.length > 0) {\n return st.publicBaseUrl;\n }\n if (\n typeof process.env.R2_PUBLIC_URL === 'string' &&\n process.env.R2_PUBLIC_URL.length > 0\n ) {\n return process.env.R2_PUBLIC_URL;\n }\n return null;\n}\n\n/**\n * rate-limit client identity 를 해석한다.\n *\n * 안전 기본값: spoofable `x-forwarded-for` 의 첫 값을 무조건 신뢰하지 않는다.\n * consumer 가 trusted-proxy/identity 추출 함수를 주입하지 않은 경우\n * `x-forwarded-for` 만 바꿔서 identity 를 회전시킬 수 없도록 안정적이고\n * 헤더-비의존적인 식별자를 반환한다. consumer 주입 추출기가 있으면 그것을\n * 그대로 사용한다.\n */\nexport function resolveClientIdentity(headers: Headers): string {\n const rl = _config.rateLimit ?? {};\n if (typeof rl.identityExtractor === 'function') {\n return rl.identityExtractor(headers);\n }\n // 안전 기본: XFF 를 무조건 신뢰하지 않는다. proxy topology 를 모르므로\n // 어떤 단일 client 가 헤더만 바꿔 무한 회전하는 것을 막기 위해, 신뢰 가능한\n // 비-spoofable 단일 식별자(고정 버킷)를 사용한다. 127.0.0.1 같은\n // 매직 fallback 은 제거한다 — consumer 는 자신의 hop 수를 아는\n // `rateLimit.identityExtractor` 로 override 한다.\n return 'cms-kit:shared-anon';\n}\n\n/** rate-limit 활성화 여부 (inject > legacy RATE_LIMIT_ENABLED env > 기본 활성). */\nexport function resolveRateLimitEnabled(): boolean {\n const rl = _config.rateLimit ?? {};\n if (typeof rl.enabled === 'boolean') return rl.enabled;\n return process.env.RATE_LIMIT_ENABLED !== 'false';\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/r2-helpers.ts"],"sourcesContent":["import { deleteFromR2 } from './r2-storage';\nimport { IMAGE_VARIANT_SIZES, type VariantSize } from './image-variant-utils';\nimport { logError } from '@withwiz/toolkit/core/logger/logger';\nimport { resolveStorageConfig, warnOnceMissingConfig } from '../config';\n\n/**\n * inline `<img>` 에서 R2/storage key 를 추출한다 (spec.md §4.1 C3 /\n * orphan-bug fix).\n *\n * 더 이상 `news/` prefix 만 매칭하지 않는다. prefix 규칙은 §5 config\n * boundary 를 통해 주입된다:\n *\n * - `storage.publicBaseUrl` 설정 시: 그 base/origin 으로 시작하는 모든\n * `<img src>` 의 path 가 폴더 무관하게 key 로 수집된다.\n * - `storage.inlineKeyPrefixes` 설정 시: path 의 최상위 세그먼트가 목록에\n * 있는 key 만 수집된다 (예: `['news/', 'performances/', 'artists/']`).\n * - 미설정(unconfigured) 기본값: 어떤 prefix 도 *silently drop 하지 않는다*.\n * 하드코딩 `news/`-only regex 와 달리 모든 inline 이미지의 host 이후\n * path 를 수집한다 (orphan 방지). 정밀 cleanup 을 위해 prefix/base 설정을\n * 권장하는 `@withwiz/cms-kit:` warn 을 1회 발행한다.\n */\n\nconst IMG_SRC_REGEX = /<img[^>]+src=[\"']([^\"']+)[\"']/gi;\n\nconst VARIANT_SUFFIXES = Object.keys(IMAGE_VARIANT_SIZES) as VariantSize[];\n\n/** URL/문자열에서 scheme+host 를 제거한 path(leading-slash 없음)를 얻는다. */\nfunction toRelativePath(src: string): string | null {\n let path: string;\n try {\n // 절대 URL: origin 제거\n const u = new URL(src);\n path = u.pathname;\n } catch {\n // 상대 경로: 그대로\n path = src;\n }\n path = path.replace(/^\\/+/, '').split(/[?#]/)[0];\n return path.length > 0 ? path : null;\n}\n\n/** 한 src 가 설정된 규칙에 따라 수집 대상 key 인지 판별하고 key 를 반환. */\nfunction srcToKey(\n src: string,\n rule: { inlineKeyPrefixes: readonly string[] | null; publicBaseUrl: string | null },\n): string | null {\n if (rule.publicBaseUrl) {\n const base = rule.publicBaseUrl.replace(/\\/+$/, '');\n if (!src.startsWith(base + '/') && !src.startsWith(base)) return null;\n const after = src.slice(base.length).replace(/^\\/+/, '').split(/[?#]/)[0];\n return after.length > 0 ? after : null;\n }\n\n const path = toRelativePath(src);\n if (!path) return null;\n\n if (rule.inlineKeyPrefixes) {\n const top = path.split('/')[0] + '/';\n const matches = rule.inlineKeyPrefixes.some((p) => {\n const norm = p.endsWith('/') ? p : p + '/';\n return top === norm || path.startsWith(norm);\n });\n return matches ? path : null;\n }\n\n // unconfigured default: collect every plausible inline storage key (no\n // silent orphaning). A path with at least one segment qualifies.\n return path;\n}\n\nexport function extractR2KeysFromHtml(...htmlContents: (string | null)[]): string[] {\n const rule = resolveStorageConfig();\n if (!rule.inlineKeyPrefixes && !rule.publicBaseUrl) {\n warnOnceMissingConfig(\n 'storage.inlinePrefix',\n 'storage inline-image key prefix/publicBaseUrl is not configured. ' +\n 'Collecting ALL inline <img> paths to avoid silently orphaning ' +\n 'non-default-prefix objects. Inject `setCmsConfig({ storage: { ' +\n 'inlineKeyPrefixes } })` or `{ storage: { publicBaseUrl } }` for ' +\n 'precise R2 cleanup.',\n );\n }\n\n const keys: string[] = [];\n for (const html of htmlContents) {\n if (!html) continue;\n const regex = new RegExp(IMG_SRC_REGEX.source, IMG_SRC_REGEX.flags);\n let match: RegExpExecArray | null;\n while ((match = regex.exec(html)) !== null) {\n const key = srcToKey(match[1], rule);\n if (key) keys.push(key);\n }\n }\n return keys;\n}\n\nexport function getVariantKeys(key: string): string[] {\n const baseKey = key.replace(/\\.[^.]+$/, '');\n return VARIANT_SUFFIXES.map((suffix) => `${baseKey}-${suffix}.webp`);\n}\n\nexport function collectR2Keys(primaryKey: string | null, ...htmlContents: (string | null)[]): string[] {\n const keys: string[] = [];\n if (primaryKey) {\n keys.push(primaryKey);\n keys.push(...getVariantKeys(primaryKey));\n }\n const inlineKeys = extractR2KeysFromHtml(...htmlContents);\n for (const ik of inlineKeys) {\n keys.push(ik);\n keys.push(...getVariantKeys(ik));\n }\n return [...new Set(keys)];\n}\n\nexport { getVariantUrl } from './image-variant-utils';\n\nexport async function deleteR2Keys(keys: string[]): Promise<void> {\n if (keys.length === 0) return;\n await Promise.allSettled(\n keys.map((key) =>\n deleteFromR2(key).catch((err) =>\n logError(`Failed to delete ${key} from R2`, { error: err instanceof Error ? err.message : err }),\n ),\n ),\n );\n}\n"],"mappings":";;;;;;;;;;;;AAEA,SAAS,gBAAgB;AAoBzB,IAAM,gBAAgB;AAEtB,IAAM,mBAAmB,OAAO,KAAK,mBAAmB;AAGxD,SAAS,eAAe,KAA4B;AAClD,MAAI;AACJ,MAAI;AAEF,UAAM,IAAI,IAAI,IAAI,GAAG;AACrB,WAAO,EAAE;AAAA,EACX,QAAQ;AAEN,WAAO;AAAA,EACT;AACA,SAAO,KAAK,QAAQ,QAAQ,EAAE,EAAE,MAAM,MAAM,EAAE,CAAC;AAC/C,SAAO,KAAK,SAAS,IAAI,OAAO;AAClC;AAGA,SAAS,SACP,KACA,MACe;AACf,MAAI,KAAK,eAAe;AACtB,UAAM,OAAO,KAAK,cAAc,QAAQ,QAAQ,EAAE;AAClD,QAAI,CAAC,IAAI,WAAW,OAAO,GAAG,KAAK,CAAC,IAAI,WAAW,IAAI,EAAG,QAAO;AACjE,UAAM,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,QAAQ,QAAQ,EAAE,EAAE,MAAM,MAAM,EAAE,CAAC;AACxE,WAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,EACpC;AAEA,QAAM,OAAO,eAAe,GAAG;AAC/B,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI,KAAK,mBAAmB;AAC1B,UAAM,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI;AACjC,UAAM,UAAU,KAAK,kBAAkB,KAAK,CAAC,MAAM;AACjD,YAAM,OAAO,EAAE,SAAS,GAAG,IAAI,IAAI,IAAI;AACvC,aAAO,QAAQ,QAAQ,KAAK,WAAW,IAAI;AAAA,IAC7C,CAAC;AACD,WAAO,UAAU,OAAO;AAAA,EAC1B;AAIA,SAAO;AACT;AAEO,SAAS,yBAAyB,cAA2C;AAClF,QAAM,OAAO,qBAAqB;AAClC,MAAI,CAAC,KAAK,qBAAqB,CAAC,KAAK,eAAe;AAClD;AAAA,MACE;AAAA,MACA;AAAA,IAKF;AAAA,EACF;AAEA,QAAM,OAAiB,CAAC;AACxB,aAAW,QAAQ,cAAc;AAC/B,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,IAAI,OAAO,cAAc,QAAQ,cAAc,KAAK;AAClE,QAAI;AACJ,YAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAC1C,YAAM,MAAM,SAAS,MAAM,CAAC,GAAG,IAAI;AACnC,UAAI,IAAK,MAAK,KAAK,GAAG;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,eAAe,KAAuB;AACpD,QAAM,UAAU,IAAI,QAAQ,YAAY,EAAE;AAC1C,SAAO,iBAAiB,IAAI,CAAC,WAAW,GAAG,OAAO,IAAI,MAAM,OAAO;AACrE;AAEO,SAAS,cAAc,eAA8B,cAA2C;AACrG,QAAM,OAAiB,CAAC;AACxB,MAAI,YAAY;AACd,SAAK,KAAK,UAAU;AACpB,SAAK,KAAK,GAAG,eAAe,UAAU,CAAC;AAAA,EACzC;AACA,QAAM,aAAa,sBAAsB,GAAG,YAAY;AACxD,aAAW,MAAM,YAAY;AAC3B,SAAK,KAAK,EAAE;AACZ,SAAK,KAAK,GAAG,eAAe,EAAE,CAAC;AAAA,EACjC;AACA,SAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAC1B;AAIA,eAAsB,aAAa,MAA+B;AAChE,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,QAAQ;AAAA,IACZ,KAAK;AAAA,MAAI,CAAC,QACR,aAAa,GAAG,EAAE;AAAA,QAAM,CAAC,QACvB,SAAS,oBAAoB,GAAG,YAAY,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,IAAI,CAAC;AAAA,MACjG;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-JMWXVXK5.js","../src/infrastructure/middleware/wrappers.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,sDAA4B;AAC5B;AACA;ACJA;AACE;AACA;AACA;AACA;AAAiB,qEACZ;AACP,wEAAoC;AAGpC,SAAS,qBAAA,CAAsB,KAAA,EAAe,QAAA,EAAkB;AAC9D,EAAA,MAAM,MAAA,kBAAQ,IAAI,GAAA,CAAgD,CAAA;AAClE,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAA,CAAO,UAAA,EAAA,GAAuB;AACnC,MAAA,MAAM,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAA;AACrB,MAAA,MAAM,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAClC,MAAA,GAAA,CAAI,CAAC,MAAA,GAAS,IAAA,EAAM,KAAA,CAAM,OAAA,EAAS;AACjC,QAAA,KAAA,CAAM,GAAA,CAAI,UAAA,EAAY,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,IAAA,EAAM,SAAS,CAAC,CAAA;AAC3D,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,SAAS,CAAA;AAAA,MAClE;AACA,MAAA,KAAA,CAAM,KAAA,EAAA;AACN,MAAA,MAAM,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA;AACjD,MAAA,MAAM,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,GAAA;AAChC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,MAAA,GAAS,KAAA,EAAO,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,MAAA,EAAQ,EAAE,MAAM;AAAA,EAClB,CAAA;AACF;AAeA,IAAM,sBAAA,EAAwB,CAAC,OAAA,EAAA,GAC7B,oDAAA,OAA6B,CAAA;AAE/B,4CAAA;AAAoB,EAClB,YAAA,EAAc;AAAA,IACZ,GAAA,EAAK,qBAAA,CAAsB,GAAA,EAAK,GAAM,CAAA;AAAA,IACtC,IAAA,EAAM,qBAAA,CAAsB,EAAA,EAAI,GAAM,CAAA;AAAA,IACtC,KAAA,EAAO,qBAAA,CAAsB,GAAA,EAAK,GAAM;AAAA,EAC1C,CAAA;AAAA,EACA,eAAA,EAAiB,qBAAA;AAAA,EACjB,SAAA,EAAW,MAAA,CAAA,EAAA,GAAY,sDAAA;AACzB,CAAC,CAAA;AAIM,IAAM,cAAA,EAAgB,uBAAA;AACtB,IAAM,aAAA,EAAe,sBAAA;AACrB,IAAM,YAAA,EAAc,qBAAA;AACpB,IAAM,cAAA,EAAgB,uBAAA;ADf7B;AACA;AACE;AACA;AACA;AACA;AACF,qJAAC","file":"/Users/uni4love/project/workspace/211-withwiz/node-packages/withwiz-cms-kit/dist/chunk-JMWXVXK5.js","sourcesContent":[null,"import type { NextRequest } from 'next/server';\nimport {\n withPublicApi as _withPublicApi,\n withAdminApi as _withAdminApi,\n withAuthApi as _withAuthApi,\n withCustomApi as _withCustomApi,\n} from '@withwiz/toolkit/next/middleware/wrappers';\nimport { setRateLimitAdapter } from '@withwiz/toolkit/next/middleware/rate-limit';\nimport { resolveClientIdentity, resolveRateLimitEnabled } from '../../config';\n\nfunction createInMemoryLimiter(limit: number, windowMs: number) {\n const store = new Map<string, { count: number; resetAt: number }>();\n return {\n check: async (identifier: string) => {\n const now = Date.now();\n const entry = store.get(identifier);\n if (!entry || now > entry.resetAt) {\n store.set(identifier, { count: 1, resetAt: now + windowMs });\n return { success: true, remaining: limit - 1, resetIn: windowMs };\n }\n entry.count++;\n const remaining = Math.max(0, limit - entry.count);\n const resetIn = entry.resetAt - now;\n return { success: entry.count <= limit, remaining, resetIn };\n },\n config: { limit },\n };\n}\n\n/**\n * rate-limit client-identity 추출 (spec.md §4.6 / Sprint 1 S4).\n *\n * 더 이상 spoofable 한 `x-forwarded-for` 의 첫 값을 무조건 신뢰하지 않고\n * `127.0.0.1` 매직 fallback 도 쓰지 않는다. 식별자 추출은 §5 config\n * boundary 의 `resolveClientIdentity` 로 위임되며, consumer 가 자신의 proxy\n * topology / trusted hop 수를 아는 `rateLimit.identityExtractor` 를 주입하면\n * 그것이 사용된다. 미설정 시 안전 기본값(헤더만 바꿔 회전 불가)을 쓴다.\n *\n * NOTE: import-time `setRateLimitAdapter(...)` 무조건 호출 자체의 제거는\n * §4.3 / Sprint 2 범위다. Sprint 1 은 §4.6 보안 결함(identity 추출)만 고치고\n * 그것을 overridable 하게 만든다 (in-memory limiter 기본값은 유지).\n */\nconst extractClientIdentity = (headers: Headers): string =>\n resolveClientIdentity(headers);\n\nsetRateLimitAdapter({\n rateLimiters: {\n api: createInMemoryLimiter(120, 60_000),\n auth: createInMemoryLimiter(10, 60_000),\n admin: createInMemoryLimiter(200, 60_000),\n },\n extractClientIp: extractClientIdentity,\n isEnabled: async () => resolveRateLimitEnabled(),\n});\n\ntype NextRouteHandler = (request: NextRequest, context?: any) => Promise<Response>;\n\nexport const withPublicApi = _withPublicApi as unknown as (handler: any) => NextRouteHandler;\nexport const withAdminApi = _withAdminApi as unknown as (handler: any) => NextRouteHandler;\nexport const withAuthApi = _withAuthApi as unknown as (handler: any) => NextRouteHandler;\nexport const withCustomApi = _withCustomApi as unknown as (handler: any, configureChain: any) => NextRouteHandler;\n\nexport type { IApiContext, IUser, TApiHandler } from '@withwiz/toolkit/next/middleware/types';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/infrastructure/middleware/wrappers.ts"],"sourcesContent":["import type { NextRequest } from 'next/server';\nimport {\n withPublicApi as _withPublicApi,\n withAdminApi as _withAdminApi,\n withAuthApi as _withAuthApi,\n withCustomApi as _withCustomApi,\n} from '@withwiz/toolkit/next/middleware/wrappers';\nimport { setRateLimitAdapter } from '@withwiz/toolkit/next/middleware/rate-limit';\nimport { resolveClientIdentity, resolveRateLimitEnabled } from '../../config';\n\nfunction createInMemoryLimiter(limit: number, windowMs: number) {\n const store = new Map<string, { count: number; resetAt: number }>();\n return {\n check: async (identifier: string) => {\n const now = Date.now();\n const entry = store.get(identifier);\n if (!entry || now > entry.resetAt) {\n store.set(identifier, { count: 1, resetAt: now + windowMs });\n return { success: true, remaining: limit - 1, resetIn: windowMs };\n }\n entry.count++;\n const remaining = Math.max(0, limit - entry.count);\n const resetIn = entry.resetAt - now;\n return { success: entry.count <= limit, remaining, resetIn };\n },\n config: { limit },\n };\n}\n\n/**\n * rate-limit client-identity 추출 (spec.md §4.6 / Sprint 1 S4).\n *\n * 더 이상 spoofable 한 `x-forwarded-for` 의 첫 값을 무조건 신뢰하지 않고\n * `127.0.0.1` 매직 fallback 도 쓰지 않는다. 식별자 추출은 §5 config\n * boundary 의 `resolveClientIdentity` 로 위임되며, consumer 가 자신의 proxy\n * topology / trusted hop 수를 아는 `rateLimit.identityExtractor` 를 주입하면\n * 그것이 사용된다. 미설정 시 안전 기본값(헤더만 바꿔 회전 불가)을 쓴다.\n *\n * NOTE: import-time `setRateLimitAdapter(...)` 무조건 호출 자체의 제거는\n * §4.3 / Sprint 2 범위다. Sprint 1 은 §4.6 보안 결함(identity 추출)만 고치고\n * 그것을 overridable 하게 만든다 (in-memory limiter 기본값은 유지).\n */\nconst extractClientIdentity = (headers: Headers): string =>\n resolveClientIdentity(headers);\n\nsetRateLimitAdapter({\n rateLimiters: {\n api: createInMemoryLimiter(120, 60_000),\n auth: createInMemoryLimiter(10, 60_000),\n admin: createInMemoryLimiter(200, 60_000),\n },\n extractClientIp: extractClientIdentity,\n isEnabled: async () => resolveRateLimitEnabled(),\n});\n\ntype NextRouteHandler = (request: NextRequest, context?: any) => Promise<Response>;\n\nexport const withPublicApi = _withPublicApi as unknown as (handler: any) => NextRouteHandler;\nexport const withAdminApi = _withAdminApi as unknown as (handler: any) => NextRouteHandler;\nexport const withAuthApi = _withAuthApi as unknown as (handler: any) => NextRouteHandler;\nexport const withCustomApi = _withCustomApi as unknown as (handler: any, configureChain: any) => NextRouteHandler;\n\nexport type { IApiContext, IUser, TApiHandler } from '@withwiz/toolkit/next/middleware/types';\n"],"mappings":";;;;;;AACA;AAAA,EACE,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA,OACZ;AACP,SAAS,2BAA2B;AAGpC,SAAS,sBAAsB,OAAe,UAAkB;AAC9D,QAAM,QAAQ,oBAAI,IAAgD;AAClE,SAAO;AAAA,IACL,OAAO,OAAO,eAAuB;AACnC,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,QAAQ,MAAM,IAAI,UAAU;AAClC,UAAI,CAAC,SAAS,MAAM,MAAM,SAAS;AACjC,cAAM,IAAI,YAAY,EAAE,OAAO,GAAG,SAAS,MAAM,SAAS,CAAC;AAC3D,eAAO,EAAE,SAAS,MAAM,WAAW,QAAQ,GAAG,SAAS,SAAS;AAAA,MAClE;AACA,YAAM;AACN,YAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,MAAM,KAAK;AACjD,YAAM,UAAU,MAAM,UAAU;AAChC,aAAO,EAAE,SAAS,MAAM,SAAS,OAAO,WAAW,QAAQ;AAAA,IAC7D;AAAA,IACA,QAAQ,EAAE,MAAM;AAAA,EAClB;AACF;AAeA,IAAM,wBAAwB,CAAC,YAC7B,sBAAsB,OAAO;AAE/B,oBAAoB;AAAA,EAClB,cAAc;AAAA,IACZ,KAAK,sBAAsB,KAAK,GAAM;AAAA,IACtC,MAAM,sBAAsB,IAAI,GAAM;AAAA,IACtC,OAAO,sBAAsB,KAAK,GAAM;AAAA,EAC1C;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW,YAAY,wBAAwB;AACjD,CAAC;AAIM,IAAM,gBAAgB;AACtB,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,gBAAgB;","names":[]}