@ai0x0/utils 0.0.10 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/backend/route-operation/delete-operation.d.ts +3 -1
- package/es/backend/route-operation/delete-operation.js +31 -15
- package/es/backend/route-operation/get-list-operation.d.ts +4 -2
- package/es/backend/route-operation/get-list-operation.js +35 -19
- package/es/backend/route-operation/get-operation.d.ts +4 -2
- package/es/backend/route-operation/get-operation.js +37 -21
- package/es/backend/route-operation/post-operation.d.ts +2 -2
- package/es/backend/route-operation/post-operation.js +2 -2
- package/es/backend/route-operation/put-operation.d.ts +4 -2
- package/es/backend/route-operation/put-operation.js +41 -25
- package/es/backend/schemas/index.d.ts +899 -3635
- package/es/backend/schemas/index.js +7 -2
- package/lib/backend/route-operation/delete-operation.d.ts +3 -1
- package/lib/backend/route-operation/delete-operation.js +19 -9
- package/lib/backend/route-operation/get-list-operation.d.ts +4 -2
- package/lib/backend/route-operation/get-list-operation.js +30 -20
- package/lib/backend/route-operation/get-operation.d.ts +4 -2
- package/lib/backend/route-operation/get-operation.js +30 -20
- package/lib/backend/route-operation/post-operation.d.ts +2 -2
- package/lib/backend/route-operation/post-operation.js +2 -2
- package/lib/backend/route-operation/put-operation.d.ts +4 -2
- package/lib/backend/route-operation/put-operation.js +30 -20
- package/lib/backend/schemas/index.d.ts +899 -3635
- package/lib/backend/schemas/index.js +7 -2
- package/package.json +1 -1
|
@@ -66,15 +66,20 @@ export var createTableSchema = function createTableSchema(_ref) {
|
|
|
66
66
|
var table = pgTable(name, _objectSpread(_objectSpread({}, basicFields), columns), extraConfig);
|
|
67
67
|
// 创建基础的schema
|
|
68
68
|
var selectSchema = createSelectSchema(table, refineSchema);
|
|
69
|
+
// 去掉基础的字段的table
|
|
70
|
+
var insertTable = pgTable(name, columns);
|
|
71
|
+
var updateTable = pgTable(name, _objectSpread({
|
|
72
|
+
id: uuid()
|
|
73
|
+
}, columns));
|
|
69
74
|
return {
|
|
70
75
|
table: table,
|
|
71
76
|
selectSchema: selectSchema,
|
|
72
77
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
73
78
|
// @ts-ignore
|
|
74
|
-
insertSchema: createInsertSchema(
|
|
79
|
+
insertSchema: createInsertSchema(insertTable, refineSchema),
|
|
75
80
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
76
81
|
// @ts-ignore
|
|
77
|
-
updateSchema: createUpdateSchema(
|
|
82
|
+
updateSchema: createUpdateSchema(updateTable, _objectSpread({
|
|
78
83
|
id: z.string()
|
|
79
84
|
}, refineSchema)),
|
|
80
85
|
querySchema: selectSchema.pick({
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TypedNextResponse } from "next-rest-framework";
|
|
1
2
|
import { BaseTable } from "../types";
|
|
2
3
|
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
3
4
|
import { NextRequest } from "next/server";
|
|
@@ -5,6 +6,7 @@ export interface DeleteOperationOptions<TTable extends BaseTable> {
|
|
|
5
6
|
table: TTable;
|
|
6
7
|
summary?: string;
|
|
7
8
|
onSuccess?: () => Promise<void>;
|
|
9
|
+
onError?: (error: Error) => Promise<ReturnType<(typeof TypedNextResponse)["json"]> | undefined>;
|
|
8
10
|
byCreator?: boolean;
|
|
9
11
|
}
|
|
10
12
|
export declare const createDeleteOperation: ({ db, getSession, }: {
|
|
@@ -12,4 +14,4 @@ export declare const createDeleteOperation: ({ db, getSession, }: {
|
|
|
12
14
|
getSession: (req: NextRequest) => Promise<{
|
|
13
15
|
userId?: string;
|
|
14
16
|
} | undefined>;
|
|
15
|
-
}) => <TTable extends BaseTable>({ table, summary, onSuccess, byCreator, }: DeleteOperationOptions<TTable>) => any;
|
|
17
|
+
}) => <TTable extends BaseTable>({ table, summary, onSuccess, onError, byCreator, }: DeleteOperationOptions<TTable>) => any;
|
|
@@ -43,6 +43,7 @@ var createDeleteOperation = ({
|
|
|
43
43
|
table,
|
|
44
44
|
summary,
|
|
45
45
|
onSuccess,
|
|
46
|
+
onError,
|
|
46
47
|
byCreator = true
|
|
47
48
|
}) => (0, import_next_rest_framework.routeOperation)({
|
|
48
49
|
method: "DELETE",
|
|
@@ -56,16 +57,25 @@ var createDeleteOperation = ({
|
|
|
56
57
|
}),
|
|
57
58
|
contentType: "application/json"
|
|
58
59
|
}).handler(async (req) => {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
try {
|
|
61
|
+
const body = await req.json();
|
|
62
|
+
if (byCreator) {
|
|
63
|
+
const { userId } = await getSession(req) || {};
|
|
64
|
+
body.creatorId = userId;
|
|
65
|
+
}
|
|
66
|
+
const data = await (0, import_actions.createDeleteAction)({ table, db })(body);
|
|
67
|
+
await (onSuccess == null ? void 0 : onSuccess());
|
|
68
|
+
return import_next_rest_framework.TypedNextResponse.json(data, {
|
|
69
|
+
status: 200
|
|
70
|
+
});
|
|
71
|
+
} catch (e) {
|
|
72
|
+
const response = await (onError == null ? void 0 : onError(e));
|
|
73
|
+
if (response) {
|
|
74
|
+
return response;
|
|
75
|
+
} else {
|
|
76
|
+
throw e;
|
|
77
|
+
}
|
|
63
78
|
}
|
|
64
|
-
const data = await (0, import_actions.createDeleteAction)({ table, db })(body);
|
|
65
|
-
await (onSuccess == null ? void 0 : onSuccess());
|
|
66
|
-
return import_next_rest_framework.TypedNextResponse.json(data, {
|
|
67
|
-
status: 200
|
|
68
|
-
});
|
|
69
79
|
});
|
|
70
80
|
// Annotate the CommonJS export names for ESM import in node:
|
|
71
81
|
0 && (module.exports = {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z, ZodSchema } from "zod";
|
|
2
2
|
import { NextRequest } from "next/server";
|
|
3
|
+
import { TypedNextRequest, TypedNextResponse } from "next-rest-framework";
|
|
3
4
|
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
4
5
|
import { BaseTable, GetListRelations } from "../types";
|
|
5
6
|
export interface GetListOperationOptions<T extends ZodSchema, Q extends ZodSchema, TTable extends BaseTable> {
|
|
@@ -7,7 +8,7 @@ export interface GetListOperationOptions<T extends ZodSchema, Q extends ZodSchem
|
|
|
7
8
|
jsonArrayFields?: string[];
|
|
8
9
|
querySchema: Q;
|
|
9
10
|
relations?: GetListRelations;
|
|
10
|
-
setParams?: (req:
|
|
11
|
+
setParams?: (req: TypedNextRequest<"GET", "application/json", unknown, z.infer<Q>>) => Promise<Record<string, unknown>>;
|
|
11
12
|
byCreator?: boolean;
|
|
12
13
|
summary?: string;
|
|
13
14
|
table: TTable;
|
|
@@ -18,10 +19,11 @@ export interface GetListOperationOptions<T extends ZodSchema, Q extends ZodSchem
|
|
|
18
19
|
data: z.infer<T>[];
|
|
19
20
|
total: number;
|
|
20
21
|
}>;
|
|
22
|
+
onError?: (error: Error) => Promise<ReturnType<(typeof TypedNextResponse)["json"]> | undefined>;
|
|
21
23
|
}
|
|
22
24
|
export declare const createGetListOperation: ({ db, getSession, }: {
|
|
23
25
|
db: NodePgDatabase<any>;
|
|
24
26
|
getSession: (req: NextRequest) => Promise<{
|
|
25
27
|
userId?: string;
|
|
26
28
|
} | undefined>;
|
|
27
|
-
}) => <T extends z.ZodType<any, z.ZodTypeDef, any>, Q extends z.ZodType<any, z.ZodTypeDef, any>, TTable extends BaseTable>({ querySchema, bodySchema, table, summary, relations, jsonArrayFields, setParams, onSuccess, byCreator, }: GetListOperationOptions<T, Q, TTable>) => any;
|
|
29
|
+
}) => <T extends z.ZodType<any, z.ZodTypeDef, any>, Q extends z.ZodType<any, z.ZodTypeDef, any>, TTable extends BaseTable>({ querySchema, bodySchema, table, summary, relations, jsonArrayFields, setParams, onSuccess, onError, byCreator, }: GetListOperationOptions<T, Q, TTable>) => any;
|
|
@@ -48,6 +48,7 @@ var createGetListOperation = ({
|
|
|
48
48
|
jsonArrayFields,
|
|
49
49
|
setParams,
|
|
50
50
|
onSuccess,
|
|
51
|
+
onError,
|
|
51
52
|
byCreator = true
|
|
52
53
|
}) => (0, import_next_rest_framework.routeOperation)({
|
|
53
54
|
method: "GET",
|
|
@@ -64,27 +65,36 @@ var createGetListOperation = ({
|
|
|
64
65
|
status: 200
|
|
65
66
|
}
|
|
66
67
|
]).handler(async (req) => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
try {
|
|
69
|
+
const params = await (setParams == null ? void 0 : setParams(req)) || {};
|
|
70
|
+
if (byCreator) {
|
|
71
|
+
const { userId } = await getSession(req) || {};
|
|
72
|
+
params.creatorId = userId;
|
|
73
|
+
}
|
|
74
|
+
let result = await (0, import_actions.createGetListAction)({
|
|
75
|
+
bodySchema,
|
|
76
|
+
db,
|
|
77
|
+
jsonArrayFields,
|
|
78
|
+
relations,
|
|
79
|
+
table
|
|
80
|
+
})(
|
|
81
|
+
Object.assign(
|
|
82
|
+
Object.fromEntries(new URL(req.url).searchParams),
|
|
83
|
+
params
|
|
84
|
+
)
|
|
85
|
+
);
|
|
86
|
+
if (onSuccess) {
|
|
87
|
+
result = await onSuccess(result);
|
|
88
|
+
}
|
|
89
|
+
return import_next_rest_framework.TypedNextResponse.json(result, { status: 200 });
|
|
90
|
+
} catch (e) {
|
|
91
|
+
const response = await (onError == null ? void 0 : onError(e));
|
|
92
|
+
if (response) {
|
|
93
|
+
return response;
|
|
94
|
+
} else {
|
|
95
|
+
throw e;
|
|
96
|
+
}
|
|
71
97
|
}
|
|
72
|
-
let result = await (0, import_actions.createGetListAction)({
|
|
73
|
-
bodySchema,
|
|
74
|
-
db,
|
|
75
|
-
jsonArrayFields,
|
|
76
|
-
relations,
|
|
77
|
-
table
|
|
78
|
-
})(
|
|
79
|
-
Object.assign(
|
|
80
|
-
Object.fromEntries(new URL(req.url).searchParams),
|
|
81
|
-
params
|
|
82
|
-
)
|
|
83
|
-
);
|
|
84
|
-
if (onSuccess) {
|
|
85
|
-
result = await onSuccess(result);
|
|
86
|
-
}
|
|
87
|
-
return import_next_rest_framework.TypedNextResponse.json(result, { status: 200 });
|
|
88
98
|
});
|
|
89
99
|
// Annotate the CommonJS export names for ESM import in node:
|
|
90
100
|
0 && (module.exports = {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z, ZodSchema } from "zod";
|
|
2
2
|
import { NextRequest } from "next/server";
|
|
3
|
+
import { TypedNextRequest, TypedNextResponse } from "next-rest-framework";
|
|
3
4
|
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
4
5
|
import { BaseTable, GetListRelations } from "../types";
|
|
5
6
|
export interface GetOperationOptions<T extends ZodSchema, Q extends ZodSchema, TTable extends BaseTable> {
|
|
@@ -7,8 +8,9 @@ export interface GetOperationOptions<T extends ZodSchema, Q extends ZodSchema, T
|
|
|
7
8
|
jsonArrayFields?: string[];
|
|
8
9
|
querySchema: Q;
|
|
9
10
|
relations?: GetListRelations;
|
|
10
|
-
setParams?: (req:
|
|
11
|
+
setParams?: (req: TypedNextRequest<"GET", "application/json", unknown, z.infer<Q>>) => Promise<Record<string, any>>;
|
|
11
12
|
onSuccess?: (data: z.infer<T>) => Promise<z.infer<T>>;
|
|
13
|
+
onError?: (error: Error) => Promise<ReturnType<(typeof TypedNextResponse)["json"]> | undefined>;
|
|
12
14
|
summary?: string;
|
|
13
15
|
table: TTable;
|
|
14
16
|
byCreator?: boolean;
|
|
@@ -18,4 +20,4 @@ export declare const createGetOperation: ({ getSession, db, }: {
|
|
|
18
20
|
getSession: (req: NextRequest) => Promise<{
|
|
19
21
|
userId?: string;
|
|
20
22
|
} | undefined>;
|
|
21
|
-
}) => <T extends z.ZodType<any, z.ZodTypeDef, any>, Q extends z.ZodType<any, z.ZodTypeDef, any>, TTable extends BaseTable>({ querySchema, bodySchema, table, summary, relations, setParams, jsonArrayFields, onSuccess, byCreator, }: GetOperationOptions<T, Q, TTable>) => any;
|
|
23
|
+
}) => <T extends z.ZodType<any, z.ZodTypeDef, any>, Q extends z.ZodType<any, z.ZodTypeDef, any>, TTable extends BaseTable>({ querySchema, bodySchema, table, summary, relations, setParams, jsonArrayFields, onSuccess, onError, byCreator, }: GetOperationOptions<T, Q, TTable>) => any;
|
|
@@ -47,6 +47,7 @@ var createGetOperation = ({
|
|
|
47
47
|
setParams,
|
|
48
48
|
jsonArrayFields,
|
|
49
49
|
onSuccess,
|
|
50
|
+
onError,
|
|
50
51
|
byCreator = true
|
|
51
52
|
}) => (0, import_next_rest_framework.routeOperation)({
|
|
52
53
|
method: "GET",
|
|
@@ -63,27 +64,36 @@ var createGetOperation = ({
|
|
|
63
64
|
status: 200
|
|
64
65
|
}
|
|
65
66
|
]).handler(async (req) => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
try {
|
|
68
|
+
const params = await (setParams == null ? void 0 : setParams(req)) || {};
|
|
69
|
+
if (byCreator) {
|
|
70
|
+
const { userId } = await getSession(req) || {};
|
|
71
|
+
params.creatorId = userId;
|
|
72
|
+
}
|
|
73
|
+
let result = await (0, import_actions.createGetAction)({
|
|
74
|
+
bodySchema,
|
|
75
|
+
db,
|
|
76
|
+
jsonArrayFields,
|
|
77
|
+
relations,
|
|
78
|
+
table
|
|
79
|
+
})(
|
|
80
|
+
Object.assign(
|
|
81
|
+
Object.fromEntries(new URL(req.url).searchParams),
|
|
82
|
+
params
|
|
83
|
+
)
|
|
84
|
+
) || {};
|
|
85
|
+
if (onSuccess) {
|
|
86
|
+
result = await onSuccess(result);
|
|
87
|
+
}
|
|
88
|
+
return import_next_rest_framework.TypedNextResponse.json(result, { status: 200 });
|
|
89
|
+
} catch (e) {
|
|
90
|
+
const response = await (onError == null ? void 0 : onError(e));
|
|
91
|
+
if (response) {
|
|
92
|
+
return response;
|
|
93
|
+
} else {
|
|
94
|
+
throw e;
|
|
95
|
+
}
|
|
70
96
|
}
|
|
71
|
-
let result = await (0, import_actions.createGetAction)({
|
|
72
|
-
bodySchema,
|
|
73
|
-
db,
|
|
74
|
-
jsonArrayFields,
|
|
75
|
-
relations,
|
|
76
|
-
table
|
|
77
|
-
})(
|
|
78
|
-
Object.assign(
|
|
79
|
-
Object.fromEntries(new URL(req.url).searchParams),
|
|
80
|
-
params
|
|
81
|
-
)
|
|
82
|
-
) || {};
|
|
83
|
-
if (onSuccess) {
|
|
84
|
-
result = await onSuccess(result);
|
|
85
|
-
}
|
|
86
|
-
return import_next_rest_framework.TypedNextResponse.json(result, { status: 200 });
|
|
87
97
|
});
|
|
88
98
|
// Annotate the CommonJS export names for ESM import in node:
|
|
89
99
|
0 && (module.exports = {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { z, ZodSchema } from "zod";
|
|
2
2
|
import { PgTable } from "drizzle-orm/pg-core";
|
|
3
3
|
import { NextRequest } from "next/server";
|
|
4
|
-
import { TypedNextResponse } from "next-rest-framework";
|
|
4
|
+
import { TypedNextRequest, TypedNextResponse } from "next-rest-framework";
|
|
5
5
|
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
6
6
|
export interface PostOperationOptions<IB extends ZodSchema, OB extends ZodSchema, TTable extends PgTable> {
|
|
7
7
|
bodySchema: IB;
|
|
8
8
|
outputBodySchema?: IB;
|
|
9
|
-
setBody?: (req:
|
|
9
|
+
setBody?: (req: TypedNextRequest<"POST", "application/json", z.infer<IB>>) => Promise<Partial<z.infer<IB>>>;
|
|
10
10
|
summary?: string;
|
|
11
11
|
onSuccess?: (data: z.infer<OB>) => Promise<z.infer<OB>>;
|
|
12
12
|
onError?: (error: Error) => Promise<ReturnType<(typeof TypedNextResponse)["json"]> | undefined>;
|
|
@@ -70,8 +70,8 @@ var createPostOperation = ({
|
|
|
70
70
|
await (setBody == null ? void 0 : setBody(req)) || {}
|
|
71
71
|
);
|
|
72
72
|
let [data] = await (0, import_actions.createPostAction)({ bodySchema, db, table })({
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
creatorId: userId,
|
|
74
|
+
...body
|
|
75
75
|
});
|
|
76
76
|
if (onSuccess) {
|
|
77
77
|
data = await onSuccess(data);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z, ZodSchema } from "zod";
|
|
2
2
|
import { PgTable } from "drizzle-orm/pg-core";
|
|
3
|
+
import { TypedNextRequest, TypedNextResponse } from "next-rest-framework";
|
|
3
4
|
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
4
5
|
import { NextRequest } from "next/server";
|
|
5
6
|
import { BaseTable } from "../types";
|
|
@@ -8,8 +9,9 @@ export interface PutOperationOptions<IB extends ZodSchema, OB extends ZodSchema,
|
|
|
8
9
|
outputBodySchema?: OB;
|
|
9
10
|
table: TTable;
|
|
10
11
|
summary?: string;
|
|
11
|
-
setBody?: (req:
|
|
12
|
+
setBody?: (req: TypedNextRequest<"PUT", "application/json", z.infer<IB>>) => Promise<Partial<z.infer<IB>>>;
|
|
12
13
|
onSuccess?: (data: z.infer<OB>) => Promise<z.infer<OB>>;
|
|
14
|
+
onError?: (error: Error) => Promise<ReturnType<(typeof TypedNextResponse)["json"]> | undefined>;
|
|
13
15
|
byCreator?: boolean;
|
|
14
16
|
}
|
|
15
17
|
export declare const createPutOperation: ({ getSession, db, }: {
|
|
@@ -17,4 +19,4 @@ export declare const createPutOperation: ({ getSession, db, }: {
|
|
|
17
19
|
userId?: string;
|
|
18
20
|
} | undefined>;
|
|
19
21
|
db: NodePgDatabase<any>;
|
|
20
|
-
}) => <IB extends z.ZodType<any, z.ZodTypeDef, any>, OB extends z.ZodType<any, z.ZodTypeDef, any>, TTable extends BaseTable>({ bodySchema, outputBodySchema, table, summary, setBody, onSuccess, byCreator, }: PutOperationOptions<IB, OB, TTable>) => any;
|
|
22
|
+
}) => <IB extends z.ZodType<any, z.ZodTypeDef, any>, OB extends z.ZodType<any, z.ZodTypeDef, any>, TTable extends BaseTable>({ bodySchema, outputBodySchema, table, summary, setBody, onSuccess, byCreator, onError, }: PutOperationOptions<IB, OB, TTable>) => any;
|
|
@@ -46,7 +46,8 @@ var createPutOperation = ({
|
|
|
46
46
|
summary,
|
|
47
47
|
setBody,
|
|
48
48
|
onSuccess,
|
|
49
|
-
byCreator = true
|
|
49
|
+
byCreator = true,
|
|
50
|
+
onError
|
|
50
51
|
}) => (0, import_next_rest_framework.routeOperation)({
|
|
51
52
|
method: "PUT",
|
|
52
53
|
openApiOperation: {
|
|
@@ -63,26 +64,35 @@ var createPutOperation = ({
|
|
|
63
64
|
contentType: "application/json"
|
|
64
65
|
}
|
|
65
66
|
]).handler(async (req) => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
67
|
+
try {
|
|
68
|
+
const { userId } = await getSession(req) || {};
|
|
69
|
+
const body = Object.assign(
|
|
70
|
+
await req.json(),
|
|
71
|
+
await (setBody == null ? void 0 : setBody(req)) || {}
|
|
72
|
+
);
|
|
73
|
+
let data = await (0, import_actions.createPutAction)({
|
|
74
|
+
bodySchema,
|
|
75
|
+
table,
|
|
76
|
+
db
|
|
77
|
+
})(
|
|
78
|
+
{
|
|
79
|
+
editorId: userId,
|
|
80
|
+
...body
|
|
81
|
+
},
|
|
82
|
+
{ byCreator }
|
|
83
|
+
);
|
|
84
|
+
if (onSuccess) {
|
|
85
|
+
data = await onSuccess(data);
|
|
86
|
+
}
|
|
87
|
+
return import_next_rest_framework.TypedNextResponse.json(data, { status: 200 });
|
|
88
|
+
} catch (e) {
|
|
89
|
+
const response = await (onError == null ? void 0 : onError(e));
|
|
90
|
+
if (response) {
|
|
91
|
+
return response;
|
|
92
|
+
} else {
|
|
93
|
+
throw e;
|
|
94
|
+
}
|
|
84
95
|
}
|
|
85
|
-
return import_next_rest_framework.TypedNextResponse.json(data, { status: 200 });
|
|
86
96
|
});
|
|
87
97
|
// Annotate the CommonJS export names for ESM import in node:
|
|
88
98
|
0 && (module.exports = {
|