dn-react-router-toolkit 0.4.4 → 0.5.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 (95) hide show
  1. package/dist/api/create_api_handler.d.mts +28 -0
  2. package/dist/api/create_api_handler.d.ts +28 -0
  3. package/dist/api/create_api_handler.js +148 -0
  4. package/dist/api/create_api_handler.mjs +132 -0
  5. package/dist/api/create_handler.js +27 -25
  6. package/dist/api/create_handler.mjs +27 -25
  7. package/dist/api/index.js +27 -25
  8. package/dist/api/index.mjs +27 -25
  9. package/dist/api/item_api_handler.d.mts +18 -0
  10. package/dist/api/item_api_handler.d.ts +18 -0
  11. package/dist/api/item_api_handler.js +55 -0
  12. package/dist/api/item_api_handler.mjs +30 -0
  13. package/dist/auth/index.d.mts +1 -2
  14. package/dist/auth/index.d.ts +1 -2
  15. package/dist/auth/index.js +13 -21
  16. package/dist/auth/index.mjs +12 -20
  17. package/dist/auth/with_auth.d.mts +3 -3
  18. package/dist/auth/with_auth.d.ts +3 -3
  19. package/dist/auth/with_auth.js +13 -21
  20. package/dist/auth/with_auth.mjs +12 -20
  21. package/dist/crud/crud_form.d.mts +13 -0
  22. package/dist/crud/crud_form.d.ts +13 -0
  23. package/dist/crud/crud_form.js +88 -0
  24. package/dist/crud/crud_form.mjs +55 -0
  25. package/dist/crud/crud_form_provider.d.mts +34 -0
  26. package/dist/crud/crud_form_provider.d.ts +34 -0
  27. package/dist/crud/crud_form_provider.js +160 -0
  28. package/dist/crud/crud_form_provider.mjs +124 -0
  29. package/dist/crud/crud_loader.d.mts +21 -0
  30. package/dist/crud/crud_loader.d.ts +21 -0
  31. package/dist/crud/crud_loader.js +288 -0
  32. package/dist/crud/crud_loader.mjs +273 -0
  33. package/dist/crud/crud_page.d.mts +25 -0
  34. package/dist/crud/crud_page.d.ts +25 -0
  35. package/dist/crud/crud_page.js +645 -0
  36. package/dist/crud/crud_page.mjs +616 -0
  37. package/dist/crud/generate_handlers.d.mts +15 -0
  38. package/dist/crud/generate_handlers.d.ts +15 -0
  39. package/dist/crud/generate_handlers.js +39 -0
  40. package/dist/crud/generate_handlers.mjs +14 -0
  41. package/dist/crud/generate_pages.d.mts +11 -0
  42. package/dist/crud/generate_pages.d.ts +11 -0
  43. package/dist/crud/generate_pages.js +52 -0
  44. package/dist/crud/generate_pages.mjs +17 -0
  45. package/dist/crud/generate_routes.d.mts +5 -0
  46. package/dist/crud/generate_routes.d.ts +5 -0
  47. package/dist/crud/generate_routes.js +62 -0
  48. package/dist/crud/generate_routes.mjs +27 -0
  49. package/dist/crud/index.d.mts +21 -0
  50. package/dist/crud/index.d.ts +21 -0
  51. package/dist/crud/index.js +970 -0
  52. package/dist/crud/index.mjs +945 -0
  53. package/dist/db/index.d.mts +4 -0
  54. package/dist/db/index.d.ts +4 -0
  55. package/dist/db/index.js +46 -0
  56. package/dist/db/index.mjs +8 -0
  57. package/dist/index.d.mts +3 -2
  58. package/dist/index.d.ts +3 -2
  59. package/dist/seo/index.js +26 -25
  60. package/dist/seo/index.mjs +27 -26
  61. package/dist/seo/seo.js +26 -25
  62. package/dist/seo/seo.mjs +27 -26
  63. package/dist/table/buttons.d.mts +10 -0
  64. package/dist/table/buttons.d.ts +10 -0
  65. package/dist/table/buttons.js +102 -0
  66. package/dist/table/buttons.mjs +71 -0
  67. package/dist/table/index.d.mts +9 -0
  68. package/dist/table/index.d.ts +9 -0
  69. package/dist/table/index.js +570 -0
  70. package/dist/table/index.mjs +543 -0
  71. package/dist/table/item_loader.d.mts +12 -0
  72. package/dist/table/item_loader.d.ts +12 -0
  73. package/dist/table/item_loader.js +51 -0
  74. package/dist/table/item_loader.mjs +26 -0
  75. package/dist/table/loader.d.mts +28 -0
  76. package/dist/table/loader.d.ts +28 -0
  77. package/dist/table/loader.js +70 -0
  78. package/dist/table/loader.mjs +48 -0
  79. package/dist/table/page.d.mts +27 -0
  80. package/dist/table/page.d.ts +27 -0
  81. package/dist/table/page.js +444 -0
  82. package/dist/table/page.mjs +415 -0
  83. package/dist/table/repository.d.mts +38 -0
  84. package/dist/table/repository.d.ts +38 -0
  85. package/dist/table/repository.js +76 -0
  86. package/dist/table/repository.mjs +56 -0
  87. package/dist/table/table.d.mts +27 -0
  88. package/dist/table/table.d.ts +27 -0
  89. package/dist/table/table.js +290 -0
  90. package/dist/table/table.mjs +255 -0
  91. package/package.json +21 -3
  92. package/dist/auth/temp_user.d.mts +0 -5
  93. package/dist/auth/temp_user.d.ts +0 -5
  94. package/dist/auth/temp_user.js +0 -18
  95. package/dist/auth/temp_user.mjs +0 -0
@@ -0,0 +1,288 @@
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/loader.tsx
28
+ var import_drizzle_orm = require("drizzle-orm");
29
+ function tableLoader({
30
+ repository,
31
+ tableOptions
32
+ }) {
33
+ return async ({ request }) => {
34
+ const searchParams = new URL(request.url).searchParams;
35
+ const { where, searchKey, defaultOrderBy, defaultDirection } = tableOptions;
36
+ const query = searchParams.get("query") ?? void 0;
37
+ const limit = Number(searchParams.get("limit") ?? "10");
38
+ const offset = Number(searchParams.get("offset") ?? "0");
39
+ const orderBy = searchParams.get("orderBy") ?? defaultOrderBy;
40
+ const direction = searchParams.get("direction") ?? defaultDirection;
41
+ const whereClauses = (0, import_drizzle_orm.and)(
42
+ searchKey && query ? (0, import_drizzle_orm.ilike)(
43
+ repository.schema[searchKey],
44
+ `%${query}%`
45
+ ) : void 0,
46
+ ...where ?? []
47
+ );
48
+ const total = await repository.countTotal({ where: whereClauses });
49
+ const items = await repository.findAll({
50
+ orderBy,
51
+ direction,
52
+ limit,
53
+ offset,
54
+ where: whereClauses
55
+ });
56
+ return {
57
+ table: {
58
+ items,
59
+ total,
60
+ limit,
61
+ offset,
62
+ orderBy,
63
+ direction,
64
+ searchKey
65
+ }
66
+ };
67
+ };
68
+ }
69
+
70
+ // src/table/item_loader.tsx
71
+ var tableItemloader = ({
72
+ loader,
73
+ repository
74
+ }) => {
75
+ return async ({ params }) => {
76
+ const body = loader ? await (async () => {
77
+ const result = await loader({ params });
78
+ if (result instanceof Response) {
79
+ return result.json();
80
+ }
81
+ return result;
82
+ })() : {};
83
+ if (params["itemId"] === "new") {
84
+ return { item: void 0, ...body };
85
+ }
86
+ const item = params["itemId"] ? await repository.find(params["itemId"]) : void 0;
87
+ return {
88
+ item,
89
+ ...body
90
+ };
91
+ };
92
+ };
93
+
94
+ // src/api/create_api_handler.ts
95
+ var import_http = require("dn-react-toolkit/http");
96
+ var import_drizzle_orm2 = require("drizzle-orm");
97
+ var import_react_router = require("react-router");
98
+ var import_uuid = require("uuid");
99
+ function apiHandler({
100
+ withAuthAction,
101
+ repository,
102
+ validators,
103
+ existingConditions,
104
+ injectUserId
105
+ }) {
106
+ const loader = async ({ request }) => {
107
+ return {};
108
+ };
109
+ const action = withAuthAction((auth) => async ({ request }) => {
110
+ if (!auth || auth.role !== "admin") {
111
+ return (0, import_react_router.redirect)("/login");
112
+ }
113
+ switch (request.method) {
114
+ case "POST":
115
+ case "PUT": {
116
+ const serilaizedParams = await request.json();
117
+ const params = Object.entries(serilaizedParams).reduce(
118
+ function reducer(acc, [key, value]) {
119
+ const converter = (value2) => {
120
+ if (value2.type === "null") {
121
+ return null;
122
+ }
123
+ if (value2.type === "string") {
124
+ return value2.value;
125
+ }
126
+ if (value2.type === "number") {
127
+ return value2.value;
128
+ }
129
+ if (value2.type === "boolean") {
130
+ return value2.value;
131
+ }
132
+ if (value2.type === "date") {
133
+ return new Date(value2.value);
134
+ }
135
+ if (Array.isArray(value2)) {
136
+ return value2.map((v) => converter(v));
137
+ }
138
+ if (typeof value2 === "object") {
139
+ return Object.entries(value2).reduce(
140
+ reducer,
141
+ {}
142
+ );
143
+ }
144
+ };
145
+ const result = converter(value);
146
+ if (result === void 0) {
147
+ return acc;
148
+ }
149
+ return {
150
+ ...acc,
151
+ [key]: result
152
+ };
153
+ },
154
+ {}
155
+ );
156
+ if (validators) {
157
+ const paramsForValidation = Object.keys(validators).filter(
158
+ (key) => Object.prototype.hasOwnProperty.call(
159
+ validators,
160
+ key
161
+ )
162
+ );
163
+ for (const paramKey of paramsForValidation) {
164
+ const value = params[paramKey];
165
+ const validator = validators[paramKey];
166
+ if (validator?.validate && !validator.validate(value)) {
167
+ throw (0, import_http.BAD_REQUEST)(
168
+ validator.message ? validator.message(value) : void 0
169
+ );
170
+ }
171
+ }
172
+ }
173
+ const itemId = params.id || (0, import_uuid.v4)();
174
+ if (!params.id && existingConditions) {
175
+ const paramsForExistenceCheck = Object.keys(
176
+ existingConditions
177
+ ).filter(
178
+ (key) => Object.prototype.hasOwnProperty.call(params, key)
179
+ );
180
+ const where = (0, import_drizzle_orm2.and)(
181
+ ...paramsForExistenceCheck.reduce((acc, key) => {
182
+ const condition = existingConditions[key];
183
+ if (condition) {
184
+ acc.push(condition(params[key]));
185
+ }
186
+ return acc;
187
+ }, [])
188
+ );
189
+ const existing = await repository.findAll({
190
+ limit: 1,
191
+ where
192
+ });
193
+ if (existing.length > 0) {
194
+ throw (0, import_http.CONFLICT)("\uC790\uB8CC\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.");
195
+ }
196
+ }
197
+ const values = {
198
+ id: itemId,
199
+ userId: injectUserId ? auth.userId : void 0,
200
+ ...params
201
+ };
202
+ const item = await repository.save(values);
203
+ return (0, import_http.CREATED)(item);
204
+ }
205
+ default:
206
+ throw (0, import_http.METHOD_NOT_ALLOWED)();
207
+ }
208
+ });
209
+ return {
210
+ loader,
211
+ action
212
+ };
213
+ }
214
+
215
+ // src/api/item_api_handler.ts
216
+ var import_http2 = require("dn-react-toolkit/http");
217
+ var import_react_router2 = require("react-router");
218
+ function itemApiHandler({
219
+ withAuthAction,
220
+ repository
221
+ }) {
222
+ const loader = async ({ request }) => {
223
+ return {};
224
+ };
225
+ const action = withAuthAction((auth) => async ({ params, request }) => {
226
+ if (!auth || auth.role !== "admin") {
227
+ return (0, import_http2.UNAUTHORIZED)();
228
+ }
229
+ switch (request.method) {
230
+ case "DELETE": {
231
+ const itemId = params.itemId;
232
+ await repository.delete(itemId);
233
+ return {};
234
+ }
235
+ }
236
+ });
237
+ return {
238
+ loader,
239
+ action
240
+ };
241
+ }
242
+
243
+ // src/crud/crud_loader.tsx
244
+ function crudHandler({
245
+ repository,
246
+ apiHandlerOptions,
247
+ loaderOptions,
248
+ itemLoaderOptions
249
+ }) {
250
+ return (prefix) => async (args) => {
251
+ const pattern = args.unstable_pattern;
252
+ if (pattern === `/api${prefix}`) {
253
+ const { loader, action } = apiHandler({
254
+ repository,
255
+ ...apiHandlerOptions
256
+ });
257
+ if (args.request.method === "GET") {
258
+ return loader(args);
259
+ } else {
260
+ return action(args);
261
+ }
262
+ }
263
+ if (pattern.startsWith(`/api${prefix}`)) {
264
+ const { loader, action } = itemApiHandler({
265
+ repository,
266
+ ...apiHandlerOptions
267
+ });
268
+ if (args.request.method === "GET") {
269
+ return loader(args);
270
+ } else {
271
+ return action(args);
272
+ }
273
+ }
274
+ if (pattern === prefix) {
275
+ return tableLoader({
276
+ ...loaderOptions,
277
+ repository
278
+ })(args);
279
+ }
280
+ if (pattern.startsWith(prefix)) {
281
+ return tableItemloader({ ...itemLoaderOptions, repository })(args);
282
+ }
283
+ };
284
+ }
285
+ // Annotate the CommonJS export names for ESM import in node:
286
+ 0 && (module.exports = {
287
+ crudHandler
288
+ });
@@ -0,0 +1,273 @@
1
+ // src/table/loader.tsx
2
+ import {
3
+ and,
4
+ ilike
5
+ } from "drizzle-orm";
6
+ function tableLoader({
7
+ repository,
8
+ tableOptions
9
+ }) {
10
+ return async ({ request }) => {
11
+ const searchParams = new URL(request.url).searchParams;
12
+ const { where, searchKey, defaultOrderBy, defaultDirection } = tableOptions;
13
+ const query = searchParams.get("query") ?? void 0;
14
+ const limit = Number(searchParams.get("limit") ?? "10");
15
+ const offset = Number(searchParams.get("offset") ?? "0");
16
+ const orderBy = searchParams.get("orderBy") ?? defaultOrderBy;
17
+ const direction = searchParams.get("direction") ?? defaultDirection;
18
+ const whereClauses = and(
19
+ searchKey && query ? ilike(
20
+ repository.schema[searchKey],
21
+ `%${query}%`
22
+ ) : void 0,
23
+ ...where ?? []
24
+ );
25
+ const total = await repository.countTotal({ where: whereClauses });
26
+ const items = await repository.findAll({
27
+ orderBy,
28
+ direction,
29
+ limit,
30
+ offset,
31
+ where: whereClauses
32
+ });
33
+ return {
34
+ table: {
35
+ items,
36
+ total,
37
+ limit,
38
+ offset,
39
+ orderBy,
40
+ direction,
41
+ searchKey
42
+ }
43
+ };
44
+ };
45
+ }
46
+
47
+ // src/table/item_loader.tsx
48
+ var tableItemloader = ({
49
+ loader,
50
+ repository
51
+ }) => {
52
+ return async ({ params }) => {
53
+ const body = loader ? await (async () => {
54
+ const result = await loader({ params });
55
+ if (result instanceof Response) {
56
+ return result.json();
57
+ }
58
+ return result;
59
+ })() : {};
60
+ if (params["itemId"] === "new") {
61
+ return { item: void 0, ...body };
62
+ }
63
+ const item = params["itemId"] ? await repository.find(params["itemId"]) : void 0;
64
+ return {
65
+ item,
66
+ ...body
67
+ };
68
+ };
69
+ };
70
+
71
+ // src/api/create_api_handler.ts
72
+ import {
73
+ BAD_REQUEST,
74
+ CONFLICT,
75
+ CREATED,
76
+ METHOD_NOT_ALLOWED
77
+ } from "dn-react-toolkit/http";
78
+ import {
79
+ and as and2
80
+ } from "drizzle-orm";
81
+ import {
82
+ redirect
83
+ } from "react-router";
84
+ import { v4 } from "uuid";
85
+ function apiHandler({
86
+ withAuthAction,
87
+ repository,
88
+ validators,
89
+ existingConditions,
90
+ injectUserId
91
+ }) {
92
+ const loader = async ({ request }) => {
93
+ return {};
94
+ };
95
+ const action = withAuthAction((auth) => async ({ request }) => {
96
+ if (!auth || auth.role !== "admin") {
97
+ return redirect("/login");
98
+ }
99
+ switch (request.method) {
100
+ case "POST":
101
+ case "PUT": {
102
+ const serilaizedParams = await request.json();
103
+ const params = Object.entries(serilaizedParams).reduce(
104
+ function reducer(acc, [key, value]) {
105
+ const converter = (value2) => {
106
+ if (value2.type === "null") {
107
+ return null;
108
+ }
109
+ if (value2.type === "string") {
110
+ return value2.value;
111
+ }
112
+ if (value2.type === "number") {
113
+ return value2.value;
114
+ }
115
+ if (value2.type === "boolean") {
116
+ return value2.value;
117
+ }
118
+ if (value2.type === "date") {
119
+ return new Date(value2.value);
120
+ }
121
+ if (Array.isArray(value2)) {
122
+ return value2.map((v) => converter(v));
123
+ }
124
+ if (typeof value2 === "object") {
125
+ return Object.entries(value2).reduce(
126
+ reducer,
127
+ {}
128
+ );
129
+ }
130
+ };
131
+ const result = converter(value);
132
+ if (result === void 0) {
133
+ return acc;
134
+ }
135
+ return {
136
+ ...acc,
137
+ [key]: result
138
+ };
139
+ },
140
+ {}
141
+ );
142
+ if (validators) {
143
+ const paramsForValidation = Object.keys(validators).filter(
144
+ (key) => Object.prototype.hasOwnProperty.call(
145
+ validators,
146
+ key
147
+ )
148
+ );
149
+ for (const paramKey of paramsForValidation) {
150
+ const value = params[paramKey];
151
+ const validator = validators[paramKey];
152
+ if (validator?.validate && !validator.validate(value)) {
153
+ throw BAD_REQUEST(
154
+ validator.message ? validator.message(value) : void 0
155
+ );
156
+ }
157
+ }
158
+ }
159
+ const itemId = params.id || v4();
160
+ if (!params.id && existingConditions) {
161
+ const paramsForExistenceCheck = Object.keys(
162
+ existingConditions
163
+ ).filter(
164
+ (key) => Object.prototype.hasOwnProperty.call(params, key)
165
+ );
166
+ const where = and2(
167
+ ...paramsForExistenceCheck.reduce((acc, key) => {
168
+ const condition = existingConditions[key];
169
+ if (condition) {
170
+ acc.push(condition(params[key]));
171
+ }
172
+ return acc;
173
+ }, [])
174
+ );
175
+ const existing = await repository.findAll({
176
+ limit: 1,
177
+ where
178
+ });
179
+ if (existing.length > 0) {
180
+ throw CONFLICT("\uC790\uB8CC\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.");
181
+ }
182
+ }
183
+ const values = {
184
+ id: itemId,
185
+ userId: injectUserId ? auth.userId : void 0,
186
+ ...params
187
+ };
188
+ const item = await repository.save(values);
189
+ return CREATED(item);
190
+ }
191
+ default:
192
+ throw METHOD_NOT_ALLOWED();
193
+ }
194
+ });
195
+ return {
196
+ loader,
197
+ action
198
+ };
199
+ }
200
+
201
+ // src/api/item_api_handler.ts
202
+ import { UNAUTHORIZED } from "dn-react-toolkit/http";
203
+ import "react-router";
204
+ function itemApiHandler({
205
+ withAuthAction,
206
+ repository
207
+ }) {
208
+ const loader = async ({ request }) => {
209
+ return {};
210
+ };
211
+ const action = withAuthAction((auth) => async ({ params, request }) => {
212
+ if (!auth || auth.role !== "admin") {
213
+ return UNAUTHORIZED();
214
+ }
215
+ switch (request.method) {
216
+ case "DELETE": {
217
+ const itemId = params.itemId;
218
+ await repository.delete(itemId);
219
+ return {};
220
+ }
221
+ }
222
+ });
223
+ return {
224
+ loader,
225
+ action
226
+ };
227
+ }
228
+
229
+ // src/crud/crud_loader.tsx
230
+ function crudHandler({
231
+ repository,
232
+ apiHandlerOptions,
233
+ loaderOptions,
234
+ itemLoaderOptions
235
+ }) {
236
+ return (prefix) => async (args) => {
237
+ const pattern = args.unstable_pattern;
238
+ if (pattern === `/api${prefix}`) {
239
+ const { loader, action } = apiHandler({
240
+ repository,
241
+ ...apiHandlerOptions
242
+ });
243
+ if (args.request.method === "GET") {
244
+ return loader(args);
245
+ } else {
246
+ return action(args);
247
+ }
248
+ }
249
+ if (pattern.startsWith(`/api${prefix}`)) {
250
+ const { loader, action } = itemApiHandler({
251
+ repository,
252
+ ...apiHandlerOptions
253
+ });
254
+ if (args.request.method === "GET") {
255
+ return loader(args);
256
+ } else {
257
+ return action(args);
258
+ }
259
+ }
260
+ if (pattern === prefix) {
261
+ return tableLoader({
262
+ ...loaderOptions,
263
+ repository
264
+ })(args);
265
+ }
266
+ if (pattern.startsWith(prefix)) {
267
+ return tableItemloader({ ...itemLoaderOptions, repository })(args);
268
+ }
269
+ };
270
+ }
271
+ export {
272
+ crudHandler
273
+ };
@@ -0,0 +1,25 @@
1
+ import { CrudFormProps } from './crud_form_provider.mjs';
2
+ import { TablePageOptions } from '../table/page.mjs';
3
+ import React from 'react';
4
+ import 'dn-react-toolkit/store';
5
+ import 'drizzle-orm/pg-core';
6
+ import '../table/table.mjs';
7
+
8
+ type CrudPageOptions<TModel, TPrimaryKey extends keyof TModel> = {
9
+ name: string;
10
+ tablePageOptions: Omit<TablePageOptions<TModel>, "name">;
11
+ formOptions: {
12
+ form?: React.FC;
13
+ columns: CrudFormProps<TModel, TPrimaryKey>["columns"];
14
+ };
15
+ AdminLayout: React.FC<{
16
+ title: string;
17
+ actions?: React.ReactNode;
18
+ className?: string;
19
+ children?: React.ReactNode;
20
+ }>;
21
+ };
22
+ type CrudPage = (prefix: string) => React.FC;
23
+ declare function crudPage<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>({ name, tablePageOptions, formOptions, AdminLayout, }: CrudPageOptions<TModel, TPrimaryKey>): CrudPage;
24
+
25
+ export { type CrudPage, type CrudPageOptions, crudPage };
@@ -0,0 +1,25 @@
1
+ import { CrudFormProps } from './crud_form_provider.js';
2
+ import { TablePageOptions } from '../table/page.js';
3
+ import React from 'react';
4
+ import 'dn-react-toolkit/store';
5
+ import 'drizzle-orm/pg-core';
6
+ import '../table/table.js';
7
+
8
+ type CrudPageOptions<TModel, TPrimaryKey extends keyof TModel> = {
9
+ name: string;
10
+ tablePageOptions: Omit<TablePageOptions<TModel>, "name">;
11
+ formOptions: {
12
+ form?: React.FC;
13
+ columns: CrudFormProps<TModel, TPrimaryKey>["columns"];
14
+ };
15
+ AdminLayout: React.FC<{
16
+ title: string;
17
+ actions?: React.ReactNode;
18
+ className?: string;
19
+ children?: React.ReactNode;
20
+ }>;
21
+ };
22
+ type CrudPage = (prefix: string) => React.FC;
23
+ declare function crudPage<TModel, TPrimaryKey extends keyof TModel = "id" extends keyof TModel ? "id" : never>({ name, tablePageOptions, formOptions, AdminLayout, }: CrudPageOptions<TModel, TPrimaryKey>): CrudPage;
24
+
25
+ export { type CrudPage, type CrudPageOptions, crudPage };