dn-react-router-toolkit 0.8.1 → 0.9.1

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 (130) hide show
  1. package/dist/api/create_api_handler.d.mts +2 -2
  2. package/dist/api/create_api_handler.d.ts +2 -2
  3. package/dist/api/create_api_handler.js +55 -52
  4. package/dist/api/create_api_handler.mjs +61 -59
  5. package/dist/api/create_handler.d.mts +5 -5
  6. package/dist/api/create_handler.d.ts +5 -5
  7. package/dist/api/create_handler.js +41 -44
  8. package/dist/api/create_handler.mjs +41 -44
  9. package/dist/api/index.d.mts +4 -3
  10. package/dist/api/index.d.ts +4 -3
  11. package/dist/api/index.js +118 -102
  12. package/dist/api/index.mjs +130 -109
  13. package/dist/api/item_api_handler.d.mts +4 -3
  14. package/dist/api/item_api_handler.d.ts +4 -3
  15. package/dist/api/item_api_handler.js +22 -6
  16. package/dist/api/item_api_handler.mjs +28 -6
  17. package/dist/auth/cookie_manager.d.mts +1 -1
  18. package/dist/auth/cookie_manager.d.ts +1 -1
  19. package/dist/auth/index.d.mts +2 -2
  20. package/dist/auth/index.d.ts +2 -2
  21. package/dist/auth/index.js +18 -18
  22. package/dist/auth/index.mjs +18 -18
  23. package/dist/auth/with_auth.d.mts +2 -2
  24. package/dist/auth/with_auth.d.ts +2 -2
  25. package/dist/auth/with_auth.js +18 -18
  26. package/dist/auth/with_auth.mjs +18 -18
  27. package/dist/client/editor.d.mts +2 -2
  28. package/dist/client/editor.d.ts +2 -2
  29. package/dist/client/editor.js +9 -3
  30. package/dist/client/editor.mjs +9 -3
  31. package/dist/client/index.d.mts +2 -2
  32. package/dist/client/index.d.ts +2 -2
  33. package/dist/client/index.js +9 -3
  34. package/dist/client/index.mjs +9 -3
  35. package/dist/crud/crud_form.js +22 -4
  36. package/dist/crud/crud_form.mjs +11 -3
  37. package/dist/crud/crud_form_provider.js +16 -3
  38. package/dist/crud/crud_form_provider.mjs +14 -1
  39. package/dist/crud/index.d.mts +0 -20
  40. package/dist/crud/index.d.ts +0 -20
  41. package/dist/crud/index.js +32 -8589
  42. package/dist/crud/index.mjs +11 -8599
  43. package/dist/db/backup/index.d.mts +1 -1
  44. package/dist/db/backup/index.d.ts +1 -1
  45. package/dist/form/create_form_component.js +21 -2
  46. package/dist/form/create_form_component.mjs +10 -1
  47. package/dist/form/form_components.js +21 -2
  48. package/dist/form/form_components.mjs +10 -1
  49. package/dist/form/index.js +21 -2
  50. package/dist/form/index.mjs +10 -1
  51. package/dist/post/editor_toolbar.js +20 -3
  52. package/dist/post/editor_toolbar.mjs +9 -2
  53. package/dist/post/index.js +93 -7711
  54. package/dist/post/index.mjs +69 -7723
  55. package/dist/post/post_form_page.js +91 -7711
  56. package/dist/post/post_form_page.mjs +69 -7725
  57. package/dist/post/thumbnail_picker.js +21 -2
  58. package/dist/post/thumbnail_picker.mjs +10 -1
  59. package/dist/table/buttons.js +11 -14
  60. package/dist/table/buttons.mjs +10 -13
  61. package/dist/table/index.d.mts +0 -2
  62. package/dist/table/index.d.ts +0 -2
  63. package/dist/table/index.js +24 -95
  64. package/dist/table/index.mjs +23 -92
  65. package/dist/table/load_table.d.mts +1 -1
  66. package/dist/table/load_table.d.ts +1 -1
  67. package/dist/table/load_table.js +2 -2
  68. package/dist/table/load_table.mjs +2 -2
  69. package/dist/table/loader.js +2 -2
  70. package/dist/table/loader.mjs +2 -2
  71. package/dist/table/table.d.mts +2 -2
  72. package/dist/table/table.d.ts +2 -2
  73. package/dist/table/table.js +14 -25
  74. package/dist/table/table.mjs +11 -24
  75. package/dist/table/table_form.js +16 -39
  76. package/dist/table/table_form.mjs +15 -38
  77. package/dist/utils/cn.d.mts +3 -0
  78. package/dist/utils/cn.d.ts +3 -0
  79. package/dist/utils/cn.js +32 -0
  80. package/dist/utils/cn.mjs +7 -0
  81. package/dist/utils/date.d.mts +5 -0
  82. package/dist/utils/date.d.ts +5 -0
  83. package/dist/utils/date.js +65 -0
  84. package/dist/utils/date.mjs +29 -0
  85. package/dist/utils/index.d.mts +7 -0
  86. package/dist/utils/index.d.ts +7 -0
  87. package/dist/utils/index.js +116 -0
  88. package/dist/utils/index.mjs +73 -0
  89. package/dist/utils/korean.d.mts +6 -0
  90. package/dist/utils/korean.d.ts +6 -0
  91. package/dist/{crud/generate_pages.js → utils/korean.js} +16 -30
  92. package/dist/utils/korean.mjs +16 -0
  93. package/dist/utils/singleton.d.mts +3 -0
  94. package/dist/utils/singleton.d.ts +3 -0
  95. package/dist/utils/singleton.js +37 -0
  96. package/dist/utils/singleton.mjs +12 -0
  97. package/dist/utils/sleep.d.mts +3 -0
  98. package/dist/utils/sleep.d.ts +3 -0
  99. package/dist/{table/item_loader.js → utils/sleep.js} +8 -19
  100. package/dist/utils/sleep.mjs +7 -0
  101. package/dist/utils/slug.d.mts +3 -0
  102. package/dist/utils/slug.d.ts +3 -0
  103. package/dist/{crud/generate_handlers.js → utils/slug.js} +8 -15
  104. package/dist/utils/slug.mjs +7 -0
  105. package/package.json +7 -3
  106. package/dist/crud/crud_loader.d.mts +0 -26
  107. package/dist/crud/crud_loader.d.ts +0 -26
  108. package/dist/crud/crud_loader.js +0 -351
  109. package/dist/crud/crud_loader.mjs +0 -337
  110. package/dist/crud/crud_page.d.mts +0 -32
  111. package/dist/crud/crud_page.d.ts +0 -32
  112. package/dist/crud/crud_page.js +0 -776
  113. package/dist/crud/crud_page.mjs +0 -758
  114. package/dist/crud/generate_handlers.d.mts +0 -16
  115. package/dist/crud/generate_handlers.d.ts +0 -16
  116. package/dist/crud/generate_handlers.mjs +0 -14
  117. package/dist/crud/generate_pages.d.mts +0 -19
  118. package/dist/crud/generate_pages.d.ts +0 -19
  119. package/dist/crud/generate_pages.mjs +0 -30
  120. package/dist/crud/generate_routes.d.mts +0 -5
  121. package/dist/crud/generate_routes.d.ts +0 -5
  122. package/dist/crud/generate_routes.js +0 -7639
  123. package/dist/crud/generate_routes.mjs +0 -7627
  124. package/dist/table/item_loader.d.mts +0 -14
  125. package/dist/table/item_loader.d.ts +0 -14
  126. package/dist/table/item_loader.mjs +0 -18
  127. package/dist/table/page.d.mts +0 -16
  128. package/dist/table/page.d.ts +0 -16
  129. package/dist/table/page.js +0 -375
  130. package/dist/table/page.mjs +0 -350
@@ -1,351 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/crud/crud_loader.tsx
21
- var crud_loader_exports = {};
22
- __export(crud_loader_exports, {
23
- crudHandler: () => crudHandler
24
- });
25
- module.exports = __toCommonJS(crud_loader_exports);
26
-
27
- // src/table/load_table.tsx
28
- var import_drizzle_orm = require("drizzle-orm");
29
- async function loadTable({
30
- request,
31
- repository,
32
- options
33
- }) {
34
- const searchParams = new URL(request.url).searchParams;
35
- const { where, searchKey, defaultOrderBy, defaultDirection } = options;
36
- const query = searchParams.get("query") ?? void 0;
37
- const limit = Number(searchParams.get("limit") ?? "20");
38
- const offset = Number(searchParams.get("offset") ?? "0");
39
- const orderBy = searchParams.get("orderBy") ?? defaultOrderBy;
40
- const direction = searchParams.get("direction") ?? defaultDirection;
41
- const filterWhere = Object.entries(options.filters ?? {}).map(([key, value]) => {
42
- const param = searchParams.get(key);
43
- if (param) {
44
- return (0, import_drizzle_orm.eq)(
45
- repository.schema[key],
46
- decodeURIComponent(param)
47
- );
48
- }
49
- return void 0;
50
- }).filter(Boolean);
51
- const whereClauses = (0, import_drizzle_orm.and)(
52
- searchKey && query ? (0, import_drizzle_orm.ilike)(
53
- repository.schema[searchKey],
54
- `%${query}%`
55
- ) : void 0,
56
- ...filterWhere,
57
- ...where ?? []
58
- );
59
- const total = await repository.countTotal({ where: whereClauses });
60
- const items = await repository.findAll({
61
- orderBy,
62
- direction,
63
- limit,
64
- offset,
65
- where: whereClauses
66
- });
67
- const filters = Object.fromEntries(
68
- await Promise.all(
69
- Object.keys(options.filters ?? {}).map(async (key) => {
70
- const values = await repository.select(key);
71
- return [key, values.filter(Boolean)];
72
- })
73
- )
74
- );
75
- return {
76
- items,
77
- total,
78
- limit,
79
- offset,
80
- orderBy,
81
- direction,
82
- searchKey,
83
- filters
84
- };
85
- }
86
-
87
- // src/table/loader.tsx
88
- function tableLoader({
89
- repository,
90
- options
91
- }) {
92
- return async ({ request }) => {
93
- const table = await loadTable({
94
- request,
95
- repository,
96
- options
97
- });
98
- return {
99
- table
100
- };
101
- };
102
- }
103
-
104
- // src/table/item_loader.tsx
105
- var tableItemloader = ({
106
- repository
107
- }) => {
108
- return async (args) => {
109
- const { params } = args;
110
- if (params["itemId"] === "new") {
111
- return { item: void 0 };
112
- }
113
- const item = params["itemId"] ? await repository.find(params["itemId"]) : void 0;
114
- return {
115
- item
116
- };
117
- };
118
- };
119
-
120
- // src/api/create_api_handler.ts
121
- var import_http = require("dn-react-toolkit/http");
122
- var import_drizzle_orm2 = require("drizzle-orm");
123
- var import_uuid = require("uuid");
124
-
125
- // src/crud/serialize.ts
126
- function deserialize(data) {
127
- if (data === void 0) {
128
- return void 0;
129
- }
130
- if (typeof data === "object" && data !== null && "type" in data && "value" in data) {
131
- const { type, value } = data;
132
- switch (type) {
133
- case "null":
134
- return null;
135
- case "string":
136
- return value;
137
- case "number":
138
- return value;
139
- case "boolean":
140
- return value;
141
- case "date":
142
- return new Date(value);
143
- case "array":
144
- return value.map((item) => deserialize(item));
145
- case "object":
146
- return Object.entries(value).reduce(
147
- (acc, [key, value2]) => {
148
- return {
149
- ...acc,
150
- [key]: deserialize(value2)
151
- };
152
- },
153
- {}
154
- );
155
- default:
156
- return void 0;
157
- }
158
- }
159
- return void 0;
160
- }
161
-
162
- // src/api/create_api_handler.ts
163
- function apiHandler({
164
- withAuthAction,
165
- repository,
166
- validators,
167
- existingConditions,
168
- injectUserId,
169
- roles
170
- }) {
171
- const loader = async ({ request }) => {
172
- return {};
173
- };
174
- const action = withAuthAction((auth) => async ({ request }) => {
175
- if (roles && roles.length > 0 && (!auth || !roles.includes(auth.role))) {
176
- throw (0, import_http.UNAUTHORIZED)();
177
- }
178
- switch (request.method) {
179
- case "POST":
180
- case "PUT": {
181
- try {
182
- const serilaizedParams = await request.json();
183
- const params = deserialize(serilaizedParams);
184
- if (validators) {
185
- const paramsForValidation = Object.keys(validators).filter(
186
- (key) => Object.prototype.hasOwnProperty.call(validators, key)
187
- );
188
- for (const paramKey of paramsForValidation) {
189
- const value = params[paramKey];
190
- const validator = validators[paramKey];
191
- if (validator?.validate && !validator.validate(value)) {
192
- throw (0, import_http.BAD_REQUEST)(
193
- validator.message ? validator.message(value) : void 0
194
- );
195
- }
196
- }
197
- }
198
- const itemId = params.id || (0, import_uuid.v4)();
199
- if (!params.id && existingConditions) {
200
- const paramsForExistenceCheck = Object.keys(
201
- existingConditions
202
- ).filter(
203
- (key) => Object.prototype.hasOwnProperty.call(params, key)
204
- );
205
- if (paramsForExistenceCheck.length > 0) {
206
- const where = (0, import_drizzle_orm2.and)(
207
- ...paramsForExistenceCheck.reduce((acc, key) => {
208
- const condition = existingConditions[key];
209
- if (condition) {
210
- acc.push(condition(params[key]));
211
- }
212
- return acc;
213
- }, [])
214
- );
215
- const existing = await repository.findAll({
216
- limit: 1,
217
- where
218
- });
219
- if (existing.length > 0) {
220
- throw (0, import_http.CONFLICT)("\uC790\uB8CC\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.");
221
- }
222
- }
223
- }
224
- const values = {
225
- id: itemId,
226
- userId: injectUserId ? auth?.userId : void 0,
227
- ...params
228
- };
229
- const item = await repository.save(values);
230
- return (0, import_http.CREATED)(item);
231
- } catch (error) {
232
- if (error instanceof Error) {
233
- throw (0, import_http.INTERNAL_SERVER_ERROR)(error.message);
234
- }
235
- throw error;
236
- }
237
- }
238
- default:
239
- throw (0, import_http.METHOD_NOT_ALLOWED)();
240
- }
241
- });
242
- return {
243
- loader,
244
- action
245
- };
246
- }
247
-
248
- // src/api/item_api_handler.ts
249
- var import_http2 = require("dn-react-toolkit/http");
250
- function itemApiHandler({
251
- withAuthAction,
252
- repository,
253
- isOwnedBy,
254
- roles
255
- }) {
256
- const loader = async ({ request }) => {
257
- return {};
258
- };
259
- const action = withAuthAction((auth) => async ({ params, request }) => {
260
- if (roles && roles.length > 0 && (!auth || !roles.includes(auth.role))) {
261
- throw (0, import_http2.UNAUTHORIZED)();
262
- }
263
- const itemId = params.itemId;
264
- const existing = await repository.find(itemId);
265
- if (!existing) {
266
- throw (0, import_http2.NOT_FOUND)();
267
- }
268
- if (isOwnedBy && !isOwnedBy(existing, auth)) {
269
- throw (0, import_http2.FORBIDDEN)();
270
- }
271
- switch (request.method) {
272
- case "DELETE": {
273
- await repository.delete(itemId);
274
- return {};
275
- }
276
- }
277
- });
278
- return {
279
- loader,
280
- action
281
- };
282
- }
283
-
284
- // src/crud/crud_loader.tsx
285
- function crudHandler({
286
- repository,
287
- apiHandlerOptions,
288
- loaderOptions,
289
- itemLoaderOptions
290
- }) {
291
- return (prefix) => async (args) => {
292
- const pattern = args.unstable_pattern;
293
- if (pattern === `/api${prefix}`) {
294
- const { loader, action } = apiHandler({
295
- repository,
296
- ...apiHandlerOptions
297
- });
298
- if (args.request.method === "GET") {
299
- return loader(args);
300
- } else {
301
- return action(args);
302
- }
303
- }
304
- if (pattern.startsWith(`/api${prefix}`)) {
305
- const { loader, action } = itemApiHandler({
306
- repository,
307
- ...apiHandlerOptions
308
- });
309
- if (args.request.method === "GET") {
310
- return loader(args);
311
- } else {
312
- return action(args);
313
- }
314
- }
315
- if (pattern === prefix) {
316
- const body = await tableLoader({
317
- ...loaderOptions,
318
- repository
319
- })(args);
320
- if (loaderOptions.loader) {
321
- const result = await loaderOptions.loader(args);
322
- if (typeof result === "object") {
323
- return {
324
- ...result,
325
- ...body
326
- };
327
- }
328
- }
329
- return body;
330
- }
331
- if (pattern.startsWith(prefix)) {
332
- const body = await tableItemloader({ ...itemLoaderOptions, repository })(
333
- args
334
- );
335
- if (itemLoaderOptions.loader) {
336
- const result = await itemLoaderOptions.loader(args);
337
- if (typeof result === "object") {
338
- return {
339
- ...result,
340
- ...body
341
- };
342
- }
343
- }
344
- return body;
345
- }
346
- };
347
- }
348
- // Annotate the CommonJS export names for ESM import in node:
349
- 0 && (module.exports = {
350
- crudHandler
351
- });
@@ -1,337 +0,0 @@
1
- // src/table/load_table.tsx
2
- import {
3
- and,
4
- eq,
5
- ilike
6
- } from "drizzle-orm";
7
- async function loadTable({
8
- request,
9
- repository,
10
- options
11
- }) {
12
- const searchParams = new URL(request.url).searchParams;
13
- const { where, searchKey, defaultOrderBy, defaultDirection } = options;
14
- const query = searchParams.get("query") ?? void 0;
15
- const limit = Number(searchParams.get("limit") ?? "20");
16
- const offset = Number(searchParams.get("offset") ?? "0");
17
- const orderBy = searchParams.get("orderBy") ?? defaultOrderBy;
18
- const direction = searchParams.get("direction") ?? defaultDirection;
19
- const filterWhere = Object.entries(options.filters ?? {}).map(([key, value]) => {
20
- const param = searchParams.get(key);
21
- if (param) {
22
- return eq(
23
- repository.schema[key],
24
- decodeURIComponent(param)
25
- );
26
- }
27
- return void 0;
28
- }).filter(Boolean);
29
- const whereClauses = and(
30
- searchKey && query ? ilike(
31
- repository.schema[searchKey],
32
- `%${query}%`
33
- ) : void 0,
34
- ...filterWhere,
35
- ...where ?? []
36
- );
37
- const total = await repository.countTotal({ where: whereClauses });
38
- const items = await repository.findAll({
39
- orderBy,
40
- direction,
41
- limit,
42
- offset,
43
- where: whereClauses
44
- });
45
- const filters = Object.fromEntries(
46
- await Promise.all(
47
- Object.keys(options.filters ?? {}).map(async (key) => {
48
- const values = await repository.select(key);
49
- return [key, values.filter(Boolean)];
50
- })
51
- )
52
- );
53
- return {
54
- items,
55
- total,
56
- limit,
57
- offset,
58
- orderBy,
59
- direction,
60
- searchKey,
61
- filters
62
- };
63
- }
64
-
65
- // src/table/loader.tsx
66
- function tableLoader({
67
- repository,
68
- options
69
- }) {
70
- return async ({ request }) => {
71
- const table = await loadTable({
72
- request,
73
- repository,
74
- options
75
- });
76
- return {
77
- table
78
- };
79
- };
80
- }
81
-
82
- // src/table/item_loader.tsx
83
- var tableItemloader = ({
84
- repository
85
- }) => {
86
- return async (args) => {
87
- const { params } = args;
88
- if (params["itemId"] === "new") {
89
- return { item: void 0 };
90
- }
91
- const item = params["itemId"] ? await repository.find(params["itemId"]) : void 0;
92
- return {
93
- item
94
- };
95
- };
96
- };
97
-
98
- // src/api/create_api_handler.ts
99
- import {
100
- BAD_REQUEST,
101
- CONFLICT,
102
- CREATED,
103
- INTERNAL_SERVER_ERROR,
104
- METHOD_NOT_ALLOWED,
105
- UNAUTHORIZED
106
- } from "dn-react-toolkit/http";
107
- import {
108
- and as and2
109
- } from "drizzle-orm";
110
- import { v4 } from "uuid";
111
-
112
- // src/crud/serialize.ts
113
- function deserialize(data) {
114
- if (data === void 0) {
115
- return void 0;
116
- }
117
- if (typeof data === "object" && data !== null && "type" in data && "value" in data) {
118
- const { type, value } = data;
119
- switch (type) {
120
- case "null":
121
- return null;
122
- case "string":
123
- return value;
124
- case "number":
125
- return value;
126
- case "boolean":
127
- return value;
128
- case "date":
129
- return new Date(value);
130
- case "array":
131
- return value.map((item) => deserialize(item));
132
- case "object":
133
- return Object.entries(value).reduce(
134
- (acc, [key, value2]) => {
135
- return {
136
- ...acc,
137
- [key]: deserialize(value2)
138
- };
139
- },
140
- {}
141
- );
142
- default:
143
- return void 0;
144
- }
145
- }
146
- return void 0;
147
- }
148
-
149
- // src/api/create_api_handler.ts
150
- function apiHandler({
151
- withAuthAction,
152
- repository,
153
- validators,
154
- existingConditions,
155
- injectUserId,
156
- roles
157
- }) {
158
- const loader = async ({ request }) => {
159
- return {};
160
- };
161
- const action = withAuthAction((auth) => async ({ request }) => {
162
- if (roles && roles.length > 0 && (!auth || !roles.includes(auth.role))) {
163
- throw UNAUTHORIZED();
164
- }
165
- switch (request.method) {
166
- case "POST":
167
- case "PUT": {
168
- try {
169
- const serilaizedParams = await request.json();
170
- const params = deserialize(serilaizedParams);
171
- if (validators) {
172
- const paramsForValidation = Object.keys(validators).filter(
173
- (key) => Object.prototype.hasOwnProperty.call(validators, key)
174
- );
175
- for (const paramKey of paramsForValidation) {
176
- const value = params[paramKey];
177
- const validator = validators[paramKey];
178
- if (validator?.validate && !validator.validate(value)) {
179
- throw BAD_REQUEST(
180
- validator.message ? validator.message(value) : void 0
181
- );
182
- }
183
- }
184
- }
185
- const itemId = params.id || v4();
186
- if (!params.id && existingConditions) {
187
- const paramsForExistenceCheck = Object.keys(
188
- existingConditions
189
- ).filter(
190
- (key) => Object.prototype.hasOwnProperty.call(params, key)
191
- );
192
- if (paramsForExistenceCheck.length > 0) {
193
- const where = and2(
194
- ...paramsForExistenceCheck.reduce((acc, key) => {
195
- const condition = existingConditions[key];
196
- if (condition) {
197
- acc.push(condition(params[key]));
198
- }
199
- return acc;
200
- }, [])
201
- );
202
- const existing = await repository.findAll({
203
- limit: 1,
204
- where
205
- });
206
- if (existing.length > 0) {
207
- throw CONFLICT("\uC790\uB8CC\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.");
208
- }
209
- }
210
- }
211
- const values = {
212
- id: itemId,
213
- userId: injectUserId ? auth?.userId : void 0,
214
- ...params
215
- };
216
- const item = await repository.save(values);
217
- return CREATED(item);
218
- } catch (error) {
219
- if (error instanceof Error) {
220
- throw INTERNAL_SERVER_ERROR(error.message);
221
- }
222
- throw error;
223
- }
224
- }
225
- default:
226
- throw METHOD_NOT_ALLOWED();
227
- }
228
- });
229
- return {
230
- loader,
231
- action
232
- };
233
- }
234
-
235
- // src/api/item_api_handler.ts
236
- import { FORBIDDEN, NOT_FOUND, UNAUTHORIZED as UNAUTHORIZED2 } from "dn-react-toolkit/http";
237
- function itemApiHandler({
238
- withAuthAction,
239
- repository,
240
- isOwnedBy,
241
- roles
242
- }) {
243
- const loader = async ({ request }) => {
244
- return {};
245
- };
246
- const action = withAuthAction((auth) => async ({ params, request }) => {
247
- if (roles && roles.length > 0 && (!auth || !roles.includes(auth.role))) {
248
- throw UNAUTHORIZED2();
249
- }
250
- const itemId = params.itemId;
251
- const existing = await repository.find(itemId);
252
- if (!existing) {
253
- throw NOT_FOUND();
254
- }
255
- if (isOwnedBy && !isOwnedBy(existing, auth)) {
256
- throw FORBIDDEN();
257
- }
258
- switch (request.method) {
259
- case "DELETE": {
260
- await repository.delete(itemId);
261
- return {};
262
- }
263
- }
264
- });
265
- return {
266
- loader,
267
- action
268
- };
269
- }
270
-
271
- // src/crud/crud_loader.tsx
272
- function crudHandler({
273
- repository,
274
- apiHandlerOptions,
275
- loaderOptions,
276
- itemLoaderOptions
277
- }) {
278
- return (prefix) => async (args) => {
279
- const pattern = args.unstable_pattern;
280
- if (pattern === `/api${prefix}`) {
281
- const { loader, action } = apiHandler({
282
- repository,
283
- ...apiHandlerOptions
284
- });
285
- if (args.request.method === "GET") {
286
- return loader(args);
287
- } else {
288
- return action(args);
289
- }
290
- }
291
- if (pattern.startsWith(`/api${prefix}`)) {
292
- const { loader, action } = itemApiHandler({
293
- repository,
294
- ...apiHandlerOptions
295
- });
296
- if (args.request.method === "GET") {
297
- return loader(args);
298
- } else {
299
- return action(args);
300
- }
301
- }
302
- if (pattern === prefix) {
303
- const body = await tableLoader({
304
- ...loaderOptions,
305
- repository
306
- })(args);
307
- if (loaderOptions.loader) {
308
- const result = await loaderOptions.loader(args);
309
- if (typeof result === "object") {
310
- return {
311
- ...result,
312
- ...body
313
- };
314
- }
315
- }
316
- return body;
317
- }
318
- if (pattern.startsWith(prefix)) {
319
- const body = await tableItemloader({ ...itemLoaderOptions, repository })(
320
- args
321
- );
322
- if (itemLoaderOptions.loader) {
323
- const result = await itemLoaderOptions.loader(args);
324
- if (typeof result === "object") {
325
- return {
326
- ...result,
327
- ...body
328
- };
329
- }
330
- }
331
- return body;
332
- }
333
- };
334
- }
335
- export {
336
- crudHandler
337
- };
@@ -1,32 +0,0 @@
1
- import { FormContextProps, CrudFormProps } from './crud_form_provider.mjs';
2
- import { FC, ReactNode } from 'react';
3
- import { TablePageOptions } from '../table/table_form.mjs';
4
- import 'react/jsx-runtime';
5
- import 'react-store-input';
6
- import '../table/table.mjs';
7
- import '../table/use_table.mjs';
8
-
9
- type CrudPageOptions<TModel> = {
10
- name: string;
11
- primaryKey: keyof TModel;
12
- tablePageOptions: TablePageOptions<TModel>;
13
- formOptions: {
14
- form?: FC<{
15
- form: FormContextProps<TModel>;
16
- }>;
17
- columns?: CrudFormProps<TModel>["columns"];
18
- };
19
- header: FC<{
20
- title: string;
21
- actions?: ReactNode;
22
- className?: string;
23
- children?: ReactNode;
24
- }>;
25
- };
26
- type CrudPage = {
27
- name: string;
28
- create: (prefix: string) => FC;
29
- };
30
- declare function crudPage<TModel>({ name, primaryKey, tablePageOptions, formOptions, header: header, }: CrudPageOptions<TModel>): CrudPage;
31
-
32
- export { type CrudPage, type CrudPageOptions, crudPage };