@ai0x0/utils 0.0.18 → 0.0.21

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.
@@ -7,7 +7,6 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
7
7
  import { z } from "zod";
8
8
  import { pgTable, timestamp, uuid } from "drizzle-orm/pg-core";
9
9
  import { createInsertSchema, createSelectSchema, createUpdateSchema } from "drizzle-zod";
10
-
11
10
  //============================基本字段============================//
12
11
  var timestamptz = function timestamptz(name) {
13
12
  return timestamp(name, {
@@ -32,6 +31,42 @@ export var basicFields = {
32
31
  updatedAt: updatedAt()
33
32
  };
34
33
 
34
+ // basicFields 中需要从业务 insert/update schema 中排除的字段。
35
+ // update 保留 id(必填),其他基础字段都由后端自动维护。
36
+ var basicInsertOmit = {
37
+ id: true,
38
+ creatorId: true,
39
+ editorId: true,
40
+ accessedAt: true,
41
+ createdAt: true,
42
+ updatedAt: true
43
+ };
44
+ var basicUpdateOmit = {
45
+ creatorId: true,
46
+ editorId: true,
47
+ accessedAt: true,
48
+ createdAt: true,
49
+ updatedAt: true
50
+ };
51
+
52
+ /**
53
+ * 基于 drizzle-zod 生成业务侧 insert schema,自动排除 basicFields
54
+ * (id / creatorId / editorId / accessedAt / createdAt / updatedAt)。
55
+ */
56
+ export var createInsertBodySchema = function createInsertBodySchema(table) {
57
+ return createInsertSchema(table).omit(basicInsertOmit);
58
+ };
59
+
60
+ /**
61
+ * 基于 drizzle-zod 生成业务侧 update schema,保留 id 为必填,
62
+ * 其余 basicFields 全部排除。
63
+ */
64
+ export var createUpdateBodySchema = function createUpdateBodySchema(table) {
65
+ return createUpdateSchema(table).omit(basicUpdateOmit).required({
66
+ id: true
67
+ });
68
+ };
69
+
35
70
  //============================列表查询字段============================//
36
71
  export var queryListSchema = function queryListSchema(schema) {
37
72
  return z.object({
@@ -58,31 +93,43 @@ export var listBodySchema = function listBodySchema(schema) {
58
93
  };
59
94
 
60
95
  //============================创建一个pg表============================//
96
+ /**
97
+ * 基于 drizzle + drizzle-zod 快速生成带基础字段(id / 创建时间等)的
98
+ * 表定义以及 select / insert / update / query / list zod schema。
99
+ *
100
+ * 关键点:把合并后的 `basicFields & TColumnsMap` 交给 pgTable 时同时
101
+ * 提供显式泛型参数,返回的 table 会携带完整列类型;drizzle-zod 由此
102
+ * 推导出的 selectSchema 才是强类型的,而不是退化成
103
+ * `z.ZodObject<Record<string, any[] | null>>`。
104
+ */
61
105
  export var createTableSchema = function createTableSchema(_ref) {
62
106
  var name = _ref.name,
63
107
  columns = _ref.columns,
64
- refineSchema = _ref.refineSchema,
65
108
  extraConfig = _ref.extraConfig;
66
- // 创建表
67
- var table = pgTable(name, _objectSpread(_objectSpread({}, basicFields), columns), extraConfig);
68
- // 创建基础的schema
69
- var selectSchema = createSelectSchema(table, refineSchema);
70
- // 去掉基础的字段的table
71
- var insertTable = pgTable(name, columns);
72
- var updateTable = pgTable(name, _objectSpread({
73
- id: uuid()
74
- }, columns));
109
+ var mergedColumns = _objectSpread(_objectSpread({}, basicFields), columns);
110
+ var table = pgTable(name, mergedColumns, extraConfig);
111
+ var selectSchema = createSelectSchema(table);
112
+ var insertSchema = createInsertSchema(pgTable(name, columns));
113
+ // id 用 defaultRandom() 避免进入 insert 必填;随后在 zod 层把 id 标为必填
114
+ var updateSchema = createUpdateSchema(pgTable(name, _objectSpread({
115
+ id: uuid("id")
116
+ }, columns))).extend({
117
+ id: z.string()
118
+ });
119
+
120
+ // querySchema / queryListSchema 使用手写 zod,避免 selectSchema 泛型通过 .pick / .partial
121
+ // 扩散,导致外部类型声明过长(TS7056)。运行时行为不变。
122
+ var querySchema = z.object({
123
+ id: z.string()
124
+ });
125
+ var queryListWithSchema = queryListSchema(z.object({}).catchall(z.unknown()));
75
126
  return {
76
127
  table: table,
77
128
  selectSchema: selectSchema,
78
- insertSchema: createInsertSchema(insertTable, refineSchema),
79
- updateSchema: createUpdateSchema(updateTable, _objectSpread({
80
- id: z.string()
81
- }, refineSchema)),
82
- querySchema: selectSchema.pick({
83
- id: true
84
- }),
85
- queryListSchema: queryListSchema(selectSchema.partial()),
129
+ insertSchema: insertSchema,
130
+ updateSchema: updateSchema,
131
+ querySchema: querySchema,
132
+ queryListSchema: queryListWithSchema,
86
133
  queryListSelectSchema: selectSchema
87
134
  };
88
135
  };
@@ -25,6 +25,7 @@ module.exports = __toCommonJS(create_delete_action_exports);
25
25
  var import_drizzle_orm = require("drizzle-orm");
26
26
  var import_backend = require("..");
27
27
  var import_zod = require("zod");
28
+ var import_errors = require("../errors");
28
29
  function createDeleteAction({
29
30
  table,
30
31
  db
@@ -40,7 +41,7 @@ function createDeleteAction({
40
41
  })
41
42
  })({ creatorId, id });
42
43
  if (!data) {
43
- throw Error("未找到删除对象,或没有权限");
44
+ throw new import_errors.HttpError(404, "未找到删除对象,或没有权限");
44
45
  }
45
46
  }
46
47
  return db.delete(table).where((0, import_drizzle_orm.eq)(table.id, id)).returning();
@@ -26,6 +26,7 @@ var import_zod = require("zod");
26
26
  var import_transform_body = require("./transform-body");
27
27
  var import_drizzle_orm = require("drizzle-orm");
28
28
  var import_backend = require("..");
29
+ var import_errors = require("../errors");
29
30
  function createPutAction({
30
31
  db,
31
32
  table
@@ -46,7 +47,7 @@ function createPutAction({
46
47
  id: body.id
47
48
  });
48
49
  if (!data2) {
49
- throw Error("未找到编辑对象,或没有权限");
50
+ throw new import_errors.HttpError(404, "未找到编辑对象,或没有权限");
50
51
  }
51
52
  }
52
53
  const [data] = await db.update(table).set((0, import_transform_body.transformBody)(body)).where((0, import_drizzle_orm.eq)(table.id, body.id)).returning();
@@ -0,0 +1,4 @@
1
+ export declare class HttpError extends Error {
2
+ status: number;
3
+ constructor(status: number, message: string);
4
+ }
@@ -0,0 +1,35 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/backend/errors.ts
20
+ var errors_exports = {};
21
+ __export(errors_exports, {
22
+ HttpError: () => HttpError
23
+ });
24
+ module.exports = __toCommonJS(errors_exports);
25
+ var HttpError = class extends Error {
26
+ constructor(status, message) {
27
+ super(message);
28
+ this.name = "HttpError";
29
+ this.status = status;
30
+ }
31
+ };
32
+ // Annotate the CommonJS export names for ESM import in node:
33
+ 0 && (module.exports = {
34
+ HttpError
35
+ });
@@ -1,3 +1,4 @@
1
1
  export * from "./actions";
2
2
  export * from "./route-operation";
3
3
  export * from "./schemas";
4
+ export * from "./errors";
@@ -19,9 +19,11 @@ module.exports = __toCommonJS(backend_exports);
19
19
  __reExport(backend_exports, require("./actions"), module.exports);
20
20
  __reExport(backend_exports, require("./route-operation"), module.exports);
21
21
  __reExport(backend_exports, require("./schemas"), module.exports);
22
+ __reExport(backend_exports, require("./errors"), module.exports);
22
23
  // Annotate the CommonJS export names for ESM import in node:
23
24
  0 && (module.exports = {
24
25
  ...require("./actions"),
25
26
  ...require("./route-operation"),
26
- ...require("./schemas")
27
+ ...require("./schemas"),
28
+ ...require("./errors")
27
29
  });
@@ -36,6 +36,7 @@ var import_next_rest_framework = require("next-rest-framework");
36
36
  var import_zod = require("zod");
37
37
  var import_get_table_name = __toESM(require("./get-table-name"));
38
38
  var import_actions = require("../actions");
39
+ var import_errors = require("../errors");
39
40
  var createDeleteOperation = ({
40
41
  db,
41
42
  getSession
@@ -72,9 +73,13 @@ var createDeleteOperation = ({
72
73
  const response = await (onError == null ? void 0 : onError(e));
73
74
  if (response) {
74
75
  return response;
75
- } else {
76
- throw e;
77
76
  }
77
+ if (e instanceof import_errors.HttpError) {
78
+ return import_next_rest_framework.TypedNextResponse.json({ message: e.message }, {
79
+ status: e.status
80
+ });
81
+ }
82
+ throw e;
78
83
  }
79
84
  });
80
85
  // Annotate the CommonJS export names for ESM import in node:
@@ -36,6 +36,7 @@ var import_zod = require("zod");
36
36
  var import_next_rest_framework = require("next-rest-framework");
37
37
  var import_get_table_name = __toESM(require("./get-table-name"));
38
38
  var import_actions = require("../actions");
39
+ var import_errors = require("../errors");
39
40
  var createPutOperation = ({
40
41
  getSession,
41
42
  db
@@ -89,9 +90,13 @@ var createPutOperation = ({
89
90
  const response = await (onError == null ? void 0 : onError(e));
90
91
  if (response) {
91
92
  return response;
92
- } else {
93
- throw e;
94
93
  }
94
+ if (e instanceof import_errors.HttpError) {
95
+ return import_next_rest_framework.TypedNextResponse.json({ message: e.message }, {
96
+ status: e.status
97
+ });
98
+ }
99
+ throw e;
95
100
  }
96
101
  });
97
102
  // Annotate the CommonJS export names for ESM import in node: