@pangza/orm 0.0.0-stage → 1.0.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 (142) hide show
  1. package/README.md +2 -2
  2. package/dist/BaseMapper.d.ts +112 -0
  3. package/dist/BaseMapper.d.ts.map +1 -0
  4. package/dist/BaseMapper.js +653 -0
  5. package/dist/BaseMapper.js.map +1 -0
  6. package/dist/DataSource.d.ts +61 -0
  7. package/dist/DataSource.d.ts.map +1 -0
  8. package/dist/DataSource.js +350 -0
  9. package/dist/DataSource.js.map +1 -0
  10. package/dist/Db.d.ts +67 -0
  11. package/dist/Db.d.ts.map +1 -0
  12. package/dist/Db.js +222 -0
  13. package/dist/Db.js.map +1 -0
  14. package/dist/IdType.d.ts +22 -0
  15. package/dist/IdType.d.ts.map +1 -0
  16. package/dist/IdType.js +34 -0
  17. package/dist/IdType.js.map +1 -0
  18. package/dist/QueryWrapper.d.ts +110 -0
  19. package/dist/QueryWrapper.d.ts.map +1 -0
  20. package/dist/QueryWrapper.js +343 -0
  21. package/dist/QueryWrapper.js.map +1 -0
  22. package/dist/config.d.ts +12 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +80 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/dialect.d.ts +41 -0
  27. package/dist/dialect.d.ts.map +1 -0
  28. package/dist/dialect.js +171 -0
  29. package/dist/dialect.js.map +1 -0
  30. package/dist/enable.d.ts +12 -0
  31. package/dist/enable.d.ts.map +1 -0
  32. package/dist/enable.js +31 -0
  33. package/dist/enable.js.map +1 -0
  34. package/dist/entityDecorators.d.ts +77 -0
  35. package/dist/entityDecorators.d.ts.map +1 -0
  36. package/dist/entityDecorators.js +150 -0
  37. package/dist/entityDecorators.js.map +1 -0
  38. package/dist/errors.d.ts +11 -0
  39. package/dist/errors.d.ts.map +1 -0
  40. package/dist/errors.js +22 -0
  41. package/dist/errors.js.map +1 -0
  42. package/dist/fieldSelect.d.ts +49 -0
  43. package/dist/fieldSelect.d.ts.map +1 -0
  44. package/dist/fieldSelect.js +53 -0
  45. package/dist/fieldSelect.js.map +1 -0
  46. package/dist/fill.d.ts +8 -0
  47. package/dist/fill.d.ts.map +1 -0
  48. package/dist/fill.js +47 -0
  49. package/dist/fill.js.map +1 -0
  50. package/dist/flag.d.ts +2 -0
  51. package/dist/flag.d.ts.map +1 -0
  52. package/dist/flag.js +8 -0
  53. package/dist/flag.js.map +1 -0
  54. package/dist/hydrate.d.ts +38 -0
  55. package/dist/hydrate.d.ts.map +1 -0
  56. package/dist/hydrate.js +325 -0
  57. package/dist/hydrate.js.map +1 -0
  58. package/dist/identifier.d.ts +14 -0
  59. package/dist/identifier.d.ts.map +1 -0
  60. package/dist/identifier.js +51 -0
  61. package/dist/identifier.js.map +1 -0
  62. package/dist/index.d.ts +41 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +122 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/relation.d.ts +72 -0
  67. package/dist/relation.d.ts.map +1 -0
  68. package/dist/relation.js +150 -0
  69. package/dist/relation.js.map +1 -0
  70. package/dist/resultMap.d.ts +7 -0
  71. package/dist/resultMap.d.ts.map +1 -0
  72. package/dist/resultMap.js +25 -0
  73. package/dist/resultMap.js.map +1 -0
  74. package/dist/security.d.ts +16 -0
  75. package/dist/security.d.ts.map +1 -0
  76. package/dist/security.js +50 -0
  77. package/dist/security.js.map +1 -0
  78. package/dist/sqlDecorators.d.ts +60 -0
  79. package/dist/sqlDecorators.d.ts.map +1 -0
  80. package/dist/sqlDecorators.js +147 -0
  81. package/dist/sqlDecorators.js.map +1 -0
  82. package/dist/sqlLog.d.ts +30 -0
  83. package/dist/sqlLog.d.ts.map +1 -0
  84. package/dist/sqlLog.js +183 -0
  85. package/dist/sqlLog.js.map +1 -0
  86. package/dist/sqlTemplate.d.ts +38 -0
  87. package/dist/sqlTemplate.d.ts.map +1 -0
  88. package/dist/sqlTemplate.js +112 -0
  89. package/dist/sqlTemplate.js.map +1 -0
  90. package/dist/table.d.ts +17 -0
  91. package/dist/table.d.ts.map +1 -0
  92. package/dist/table.js +55 -0
  93. package/dist/table.js.map +1 -0
  94. package/dist/tableSearch.d.ts +72 -0
  95. package/dist/tableSearch.d.ts.map +1 -0
  96. package/dist/tableSearch.js +232 -0
  97. package/dist/tableSearch.js.map +1 -0
  98. package/dist/transactional.d.ts +27 -0
  99. package/dist/transactional.d.ts.map +1 -0
  100. package/dist/transactional.js +57 -0
  101. package/dist/transactional.js.map +1 -0
  102. package/dist/types.d.ts +155 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +3 -0
  105. package/dist/types.js.map +1 -0
  106. package/dist/xml/MapperXml.d.ts +24 -0
  107. package/dist/xml/MapperXml.d.ts.map +1 -0
  108. package/dist/xml/MapperXml.js +92 -0
  109. package/dist/xml/MapperXml.js.map +1 -0
  110. package/dist/xml/execute.d.ts +12 -0
  111. package/dist/xml/execute.d.ts.map +1 -0
  112. package/dist/xml/execute.js +54 -0
  113. package/dist/xml/execute.js.map +1 -0
  114. package/dist/xml/index.d.ts +11 -0
  115. package/dist/xml/index.d.ts.map +1 -0
  116. package/dist/xml/index.js +29 -0
  117. package/dist/xml/index.js.map +1 -0
  118. package/dist/xml/loadMappers.d.ts +14 -0
  119. package/dist/xml/loadMappers.d.ts.map +1 -0
  120. package/dist/xml/loadMappers.js +171 -0
  121. package/dist/xml/loadMappers.js.map +1 -0
  122. package/dist/xml/parseMapperXml.d.ts +6 -0
  123. package/dist/xml/parseMapperXml.d.ts.map +1 -0
  124. package/dist/xml/parseMapperXml.js +225 -0
  125. package/dist/xml/parseMapperXml.js.map +1 -0
  126. package/dist/xml/registry.d.ts +15 -0
  127. package/dist/xml/registry.d.ts.map +1 -0
  128. package/dist/xml/registry.js +57 -0
  129. package/dist/xml/registry.js.map +1 -0
  130. package/dist/xml/renderSql.d.ts +6 -0
  131. package/dist/xml/renderSql.d.ts.map +1 -0
  132. package/dist/xml/renderSql.js +187 -0
  133. package/dist/xml/renderSql.js.map +1 -0
  134. package/dist/xml/types.d.ts +52 -0
  135. package/dist/xml/types.d.ts.map +1 -0
  136. package/dist/xml/types.js +3 -0
  137. package/dist/xml/types.js.map +1 -0
  138. package/dist/xml/xmlMapper.d.ts +16 -0
  139. package/dist/xml/xmlMapper.d.ts.map +1 -0
  140. package/dist/xml/xmlMapper.js +49 -0
  141. package/dist/xml/xmlMapper.js.map +1 -0
  142. package/package.json +35 -4
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SqlServerDialect = exports.PostgresqlDialect = exports.MysqlDialect = void 0;
4
+ exports.getDialect = getDialect;
5
+ function replaceQuestionMarks(sql, to) {
6
+ let i = 0;
7
+ return sql.replace(/\?/g, () => to(++i));
8
+ }
9
+ exports.MysqlDialect = {
10
+ type: "mysql",
11
+ quoteIdent(name) {
12
+ return `\`${name}\``;
13
+ },
14
+ convertPlaceholders(sql) {
15
+ return sql;
16
+ },
17
+ likeEscapeClause() {
18
+ return " ESCAPE '\\\\'";
19
+ },
20
+ appendLimitOffset(sql, limit, offset = 0) {
21
+ if (offset > 0)
22
+ return `${sql} LIMIT ${limit} OFFSET ${offset}`;
23
+ return `${sql} LIMIT ${limit}`;
24
+ },
25
+ listColumnsSql(table) {
26
+ return {
27
+ sql: `SHOW COLUMNS FROM ${this.quoteIdent(table)}`,
28
+ params: [],
29
+ };
30
+ },
31
+ parseColumnNames(rows) {
32
+ return rows.map((r) => String(r.Field ?? r.field ?? ""));
33
+ },
34
+ prepareInsert(sql) {
35
+ return { sql, returning: false };
36
+ },
37
+ extractInsertId(result) {
38
+ const header = result;
39
+ return Number(header?.insertId ?? 0);
40
+ },
41
+ extractAffectedRows(result) {
42
+ const header = result;
43
+ return Number(header?.affectedRows ?? 0);
44
+ },
45
+ };
46
+ exports.PostgresqlDialect = {
47
+ type: "postgresql",
48
+ quoteIdent(name) {
49
+ return `"${name}"`;
50
+ },
51
+ convertPlaceholders(sql) {
52
+ return replaceQuestionMarks(sql, (i) => `$${i}`);
53
+ },
54
+ likeEscapeClause() {
55
+ return " ESCAPE '\\'";
56
+ },
57
+ appendLimitOffset(sql, limit, offset = 0) {
58
+ if (offset > 0)
59
+ return `${sql} LIMIT ${limit} OFFSET ${offset}`;
60
+ return `${sql} LIMIT ${limit}`;
61
+ },
62
+ listColumnsSql(table) {
63
+ return {
64
+ sql: `SELECT column_name AS "Field" FROM information_schema.columns WHERE table_schema = current_schema() AND table_name = ?`,
65
+ params: [table],
66
+ };
67
+ },
68
+ parseColumnNames(rows) {
69
+ return rows.map((r) => String(r.Field ?? r.field ?? r.column_name ?? ""));
70
+ },
71
+ prepareInsert(sql, idColumn) {
72
+ return {
73
+ sql: `${sql} RETURNING ${this.quoteIdent(idColumn)}`,
74
+ returning: true,
75
+ };
76
+ },
77
+ extractInsertId(result, idColumn, returning) {
78
+ if (returning && Array.isArray(result) && result[0]) {
79
+ const row = result[0];
80
+ return Number(row[idColumn] ?? 0);
81
+ }
82
+ return 0;
83
+ },
84
+ extractAffectedRows(result) {
85
+ if (Array.isArray(result))
86
+ return result.length;
87
+ const header = result;
88
+ return Number(header?.rowCount ?? header?.affectedRows ?? 0);
89
+ },
90
+ };
91
+ exports.SqlServerDialect = {
92
+ type: "sqlserver",
93
+ quoteIdent(name) {
94
+ return `[${name}]`;
95
+ },
96
+ convertPlaceholders(sql) {
97
+ // node-mssql 对 ? 支持不稳定,统一转 @p1,@p2
98
+ return replaceQuestionMarks(sql, (i) => `@p${i}`);
99
+ },
100
+ likeEscapeClause() {
101
+ return " ESCAPE '\\'";
102
+ },
103
+ appendLimitOffset(sql, limit, offset = 0, hasOrderBy = false) {
104
+ const order = hasOrderBy ? "" : " ORDER BY (SELECT NULL)";
105
+ return `${sql}${order} OFFSET ${offset} ROWS FETCH NEXT ${limit} ROWS ONLY`;
106
+ },
107
+ listColumnsSql(table) {
108
+ return {
109
+ sql: `SELECT COLUMN_NAME AS [Field] FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ?`,
110
+ params: [table],
111
+ };
112
+ },
113
+ parseColumnNames(rows) {
114
+ return rows.map((r) => String(r.Field ?? r.field ?? r.COLUMN_NAME ?? ""));
115
+ },
116
+ prepareInsert(sql, idColumn) {
117
+ // INSERT INTO t (a) VALUES (@p1) → INSERT INTO t (a) OUTPUT INSERTED.[id] VALUES (@p1)
118
+ const upper = sql.toUpperCase();
119
+ const valuesIdx = upper.lastIndexOf(" VALUES");
120
+ if (valuesIdx < 0) {
121
+ return { sql, returning: false };
122
+ }
123
+ const head = sql.slice(0, valuesIdx);
124
+ const tail = sql.slice(valuesIdx);
125
+ return {
126
+ sql: `${head} OUTPUT INSERTED.${this.quoteIdent(idColumn)}${tail}`,
127
+ returning: true,
128
+ };
129
+ },
130
+ extractInsertId(result, idColumn, returning) {
131
+ if (returning && Array.isArray(result) && result[0]) {
132
+ const row = result[0];
133
+ return Number(row[idColumn] ?? 0);
134
+ }
135
+ return 0;
136
+ },
137
+ extractAffectedRows(result) {
138
+ if (Array.isArray(result))
139
+ return result.length;
140
+ const header = result;
141
+ if (Array.isArray(header?.rowsAffected)) {
142
+ return Number(header.rowsAffected[0] ?? 0);
143
+ }
144
+ return Number(header?.affectedRows ?? 0);
145
+ },
146
+ };
147
+ const DIALECTS = {
148
+ mysql: exports.MysqlDialect,
149
+ postgresql: exports.PostgresqlDialect,
150
+ sqlserver: exports.SqlServerDialect,
151
+ };
152
+ function getDialect(type = "mysql") {
153
+ const key = String(type || "mysql").toLowerCase();
154
+ const map = {
155
+ mysql: "mysql",
156
+ mariadb: "mysql",
157
+ postgres: "postgresql",
158
+ postgresql: "postgresql",
159
+ pg: "postgresql",
160
+ mssql: "sqlserver",
161
+ sqlserver: "sqlserver",
162
+ "sql-server": "sqlserver",
163
+ };
164
+ const resolved = map[key] ?? key;
165
+ const dialect = DIALECTS[resolved];
166
+ if (!dialect) {
167
+ throw new Error(`不支持的数据库类型: ${type}`);
168
+ }
169
+ return dialect;
170
+ }
171
+ //# sourceMappingURL=dialect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.js","sourceRoot":"","sources":["../src/dialect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { NextFunction, Request, Response } from "express";
2
+ import type { DataSourceConfig } from "./DataSource";
3
+ /**
4
+ * 显式启用 ORM / 默认数据源:预热仅在 registry 后执行。
5
+ * 未 registry 时启动阶段不会连库;业务首次查询仍可懒连接。
6
+ *
7
+ * @example
8
+ * Application.registry(EnableOrm()).start();
9
+ * Application.registry(EnableOrm({ host: "127.0.0.1", database: "app" })).start();
10
+ */
11
+ export declare function EnableOrm(config?: DataSourceConfig): (_req: Request, _res: Response, next: NextFunction) => void;
12
+ //# sourceMappingURL=enable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.d.ts","sourceRoot":"","sources":["../src/enable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,gBAAgB,UAMvB,OAAO,QAAQ,QAAQ,QAAQ,YAAY,UAUtE"}
package/dist/enable.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EnableOrm = EnableOrm;
7
+ const Db_1 = __importDefault(require("./Db"));
8
+ const flag_1 = require("./flag");
9
+ /**
10
+ * 显式启用 ORM / 默认数据源:预热仅在 registry 后执行。
11
+ * 未 registry 时启动阶段不会连库;业务首次查询仍可懒连接。
12
+ *
13
+ * @example
14
+ * Application.registry(EnableOrm()).start();
15
+ * Application.registry(EnableOrm({ host: "127.0.0.1", database: "app" })).start();
16
+ */
17
+ function EnableOrm(config) {
18
+ (0, flag_1.markOrmEnabled)(true);
19
+ if (config) {
20
+ Db_1.default.register("default", config);
21
+ }
22
+ const middleware = (_req, _res, next) => {
23
+ next();
24
+ };
25
+ Object.defineProperty(middleware, flag_1.ORM_MODULE_FLAG, {
26
+ value: true,
27
+ enumerable: false,
28
+ });
29
+ return middleware;
30
+ }
31
+ //# sourceMappingURL=enable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.js","sourceRoot":"","sources":["../src/enable.ts"],"names":[],"mappings":";;;;;AAaA,8BAgBC;AA5BD,8CAAsB;AAEtB,iCAAyD;AAEzD;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAC,MAAyB;IACjD,IAAA,qBAAc,EAAC,IAAI,CAAC,CAAC;IACrB,IAAI,MAAM,EAAE,CAAC;QACX,YAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,IAAa,EAAE,IAAc,EAAE,IAAkB,EAAE,EAAE;QACvE,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;IAEF,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,sBAAe,EAAE;QACjD,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,77 @@
1
+ import "reflect-metadata";
2
+ import { IdType, type IdTypeValue } from "./IdType";
3
+ /** insertFill / updateFill:直接值,或同步/异步函数 */
4
+ export type FieldFillValue = unknown | (() => unknown) | (() => Promise<unknown>);
5
+ export interface TableIdOptions {
6
+ /** 数据库列名,默认用属性名 */
7
+ value?: string;
8
+ /**
9
+ * 主键策略,默认 IdType.NONE(跟随全局 ORM_ID_TYPE / configureOrm)。
10
+ * @see IdType
11
+ */
12
+ type?: IdTypeValue;
13
+ }
14
+ export interface TableFieldOptions {
15
+ /** 数据库列名,默认用属性名 */
16
+ value?: string;
17
+ /** false 表示非表字段,不参与默认 SQL 映射 */
18
+ exist?: boolean;
19
+ /**
20
+ * 插入时默认填充:常量或函数。
21
+ * 仅当实体上该列仍为 undefined 时写入。
22
+ */
23
+ insertFill?: FieldFillValue;
24
+ /**
25
+ * 更新时默认填充:常量或函数。
26
+ * 仅当实体上该列仍为 undefined 时写入。
27
+ */
28
+ updateFill?: FieldFillValue;
29
+ }
30
+ export interface EntityFieldMeta {
31
+ /** 实体属性名 */
32
+ property: string;
33
+ /** 数据库列名 */
34
+ column: string;
35
+ /** 是否主键 */
36
+ id?: boolean;
37
+ /** 主键策略(仅 id 字段有意义) */
38
+ idType?: IdType;
39
+ exist: boolean;
40
+ insertFill?: FieldFillValue;
41
+ updateFill?: FieldFillValue;
42
+ }
43
+ export interface EntityTableMeta {
44
+ tableName: string;
45
+ idColumn: string;
46
+ fields: EntityFieldMeta[];
47
+ }
48
+ type Ctor = Function;
49
+ /**
50
+ * @TableName("user")
51
+ * 标记实体对应表名。
52
+ */
53
+ export declare function TableName(tableName: string): ClassDecorator;
54
+ /**
55
+ * @TableId() / @TableId("user_id") / @TableId({ value: "user_id", type: IdType.ASSIGN_ID })
56
+ * 标记主键字段及生成策略。
57
+ */
58
+ export declare function TableId(valueOrOptions?: string | TableIdOptions): PropertyDecorator;
59
+ /** 读取实体主键字段元数据(含 IdType) */
60
+ export declare function getEntityIdField(entity: Ctor): EntityFieldMeta | undefined;
61
+ /**
62
+ * @TableField("nick_name")
63
+ * @TableField({ value: "create_time", insertFill: () => new Date() })
64
+ */
65
+ export declare function TableField(valueOrOptions?: string | TableFieldOptions): PropertyDecorator;
66
+ export declare function getTableName(entity: Ctor): string | undefined;
67
+ export declare function getEntityFields(entity: Ctor): EntityFieldMeta[];
68
+ export declare function getEntityTableMeta(entity: Ctor): EntityTableMeta | undefined;
69
+ export declare function resolveFieldFill(fill: FieldFillValue | undefined): Promise<unknown>;
70
+ /**
71
+ * 按实体 @TableField 的 insertFill / updateFill 填充。
72
+ * 写入列名(column);属性名与列名不同时同步写属性名,便于对象读写。
73
+ * 仅当目标键仍为 undefined 时填充。
74
+ */
75
+ export declare function applyEntityFieldFills(entityClass: Ctor | undefined, row: Record<string, any>, mode: "insert" | "update"): Promise<void>;
76
+ export {};
77
+ //# sourceMappingURL=entityDecorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityDecorators.d.ts","sourceRoot":"","sources":["../src/entityDecorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,MAAM,EAAiB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEnE,2CAA2C;AAC3C,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,CAAC,MAAM,OAAO,CAAC,GACf,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAKD,KAAK,IAAI,GAAG,QAAQ,CAAC;AAgBrB;;;GAGG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAM3D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,cAAc,CAAC,EAAE,MAAM,GAAG,cAAc,GACvC,iBAAiB,CAsBnB;AAED,4BAA4B;AAC5B,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,GAAG,eAAe,GAAG,SAAS,CAE1E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,cAAc,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAC1C,iBAAiB,CAqBnB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAE7D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,IAAI,GAAG,eAAe,EAAE,CAE/D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,IAAI,GAAG,eAAe,GAAG,SAAS,CAU5E;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,GAAG,SAAS,GAC/B,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,IAAI,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GACxB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TableName = TableName;
4
+ exports.TableId = TableId;
5
+ exports.getEntityIdField = getEntityIdField;
6
+ exports.TableField = TableField;
7
+ exports.getTableName = getTableName;
8
+ exports.getEntityFields = getEntityFields;
9
+ exports.getEntityTableMeta = getEntityTableMeta;
10
+ exports.resolveFieldFill = resolveFieldFill;
11
+ exports.applyEntityFieldFills = applyEntityFieldFills;
12
+ require("reflect-metadata");
13
+ const beanKeys_1 = require("@pangza/core/Json/beanKeys");
14
+ const IdType_1 = require("./IdType");
15
+ const TABLE_NAME_KEY = Symbol.for("pangza.orm.tableName");
16
+ const FIELDS_KEY = Symbol.for("pangza.orm.entityFields");
17
+ function fieldMap(ctor) {
18
+ return (Reflect.getOwnMetadata(FIELDS_KEY, ctor) ?? {});
19
+ }
20
+ function saveField(ctor, meta) {
21
+ const map = { ...fieldMap(ctor), [meta.property]: meta };
22
+ Reflect.defineMetadata(FIELDS_KEY, map, ctor);
23
+ (0, beanKeys_1.addBeanKey)(ctor, meta.property);
24
+ }
25
+ /**
26
+ * @TableName("user")
27
+ * 标记实体对应表名。
28
+ */
29
+ function TableName(tableName) {
30
+ return (ctor) => {
31
+ const name = String(tableName).trim();
32
+ if (!name)
33
+ throw new Error("@TableName 不能为空");
34
+ Reflect.defineMetadata(TABLE_NAME_KEY, name, ctor);
35
+ };
36
+ }
37
+ /**
38
+ * @TableId() / @TableId("user_id") / @TableId({ value: "user_id", type: IdType.ASSIGN_ID })
39
+ * 标记主键字段及生成策略。
40
+ */
41
+ function TableId(valueOrOptions) {
42
+ return (target, propertyKey) => {
43
+ const property = String(propertyKey);
44
+ let column = property;
45
+ let idType = IdType_1.IdType.NONE;
46
+ if (typeof valueOrOptions === "string") {
47
+ column = valueOrOptions || property;
48
+ }
49
+ else if (valueOrOptions) {
50
+ if (valueOrOptions.value)
51
+ column = valueOrOptions.value;
52
+ if (valueOrOptions.type != null) {
53
+ idType = (0, IdType_1.resolveIdType)(valueOrOptions.type);
54
+ }
55
+ }
56
+ const ctor = target.constructor;
57
+ saveField(ctor, {
58
+ property,
59
+ column,
60
+ id: true,
61
+ idType,
62
+ exist: true,
63
+ });
64
+ };
65
+ }
66
+ /** 读取实体主键字段元数据(含 IdType) */
67
+ function getEntityIdField(entity) {
68
+ return getEntityFields(entity).find((f) => f.id);
69
+ }
70
+ /**
71
+ * @TableField("nick_name")
72
+ * @TableField({ value: "create_time", insertFill: () => new Date() })
73
+ */
74
+ function TableField(valueOrOptions) {
75
+ return (target, propertyKey) => {
76
+ const property = String(propertyKey);
77
+ let options = {};
78
+ if (typeof valueOrOptions === "string") {
79
+ options = { value: valueOrOptions };
80
+ }
81
+ else if (valueOrOptions) {
82
+ options = valueOrOptions;
83
+ }
84
+ const ctor = target.constructor;
85
+ const prev = fieldMap(ctor)[property];
86
+ saveField(ctor, {
87
+ property,
88
+ column: options.value || property,
89
+ id: prev?.id,
90
+ idType: prev?.idType,
91
+ exist: options.exist !== false,
92
+ insertFill: options.insertFill,
93
+ updateFill: options.updateFill,
94
+ });
95
+ };
96
+ }
97
+ function getTableName(entity) {
98
+ return Reflect.getOwnMetadata(TABLE_NAME_KEY, entity);
99
+ }
100
+ function getEntityFields(entity) {
101
+ return Object.values(fieldMap(entity));
102
+ }
103
+ function getEntityTableMeta(entity) {
104
+ const tableName = getTableName(entity);
105
+ if (!tableName)
106
+ return undefined;
107
+ const fields = getEntityFields(entity);
108
+ const idField = fields.find((f) => f.id);
109
+ return {
110
+ tableName,
111
+ idColumn: idField?.column ?? "id",
112
+ fields,
113
+ };
114
+ }
115
+ async function resolveFieldFill(fill) {
116
+ if (fill === undefined)
117
+ return undefined;
118
+ if (typeof fill === "function") {
119
+ return await fill();
120
+ }
121
+ return fill;
122
+ }
123
+ /**
124
+ * 按实体 @TableField 的 insertFill / updateFill 填充。
125
+ * 写入列名(column);属性名与列名不同时同步写属性名,便于对象读写。
126
+ * 仅当目标键仍为 undefined 时填充。
127
+ */
128
+ async function applyEntityFieldFills(entityClass, row, mode) {
129
+ if (!entityClass)
130
+ return;
131
+ const fields = getEntityFields(entityClass);
132
+ for (const field of fields) {
133
+ if (!field.exist)
134
+ continue;
135
+ const fill = mode === "insert" ? field.insertFill : field.updateFill;
136
+ if (fill === undefined)
137
+ continue;
138
+ const colKey = field.column;
139
+ const propKey = field.property;
140
+ const current = row[colKey] !== undefined ? row[colKey] : row[propKey];
141
+ if (current !== undefined)
142
+ continue;
143
+ const value = await resolveFieldFill(fill);
144
+ if (value === undefined || value === null)
145
+ continue;
146
+ // 只写列名,避免 camelCase 属性名被当成 SQL 列
147
+ row[colKey] = value;
148
+ }
149
+ }
150
+ //# sourceMappingURL=entityDecorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityDecorators.js","sourceRoot":"","sources":["../src/entityDecorators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ResponseCode } from "@pangza/core/types/enums";
2
+ /** ORM 业务错误,携带响应码 */
3
+ export declare class OrmError extends Error {
4
+ readonly code: ResponseCode;
5
+ constructor(message: string, code?: ResponseCode);
6
+ }
7
+ /** 乐观锁版本不匹配 */
8
+ export declare class OptimisticLockError extends OrmError {
9
+ constructor(message?: string);
10
+ }
11
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,qBAAqB;AACrB,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiC;CAKrE;AAED,eAAe;AACf,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,OAAO,SAAkB;CAItC"}
package/dist/errors.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OptimisticLockError = exports.OrmError = void 0;
4
+ const enums_1 = require("@pangza/core/types/enums");
5
+ /** ORM 业务错误,携带响应码 */
6
+ class OrmError extends Error {
7
+ constructor(message, code = enums_1.ResponseCode.ERROR) {
8
+ super(message);
9
+ this.name = "OrmError";
10
+ this.code = code;
11
+ }
12
+ }
13
+ exports.OrmError = OrmError;
14
+ /** 乐观锁版本不匹配 */
15
+ class OptimisticLockError extends OrmError {
16
+ constructor(message = "数据已被修改,请刷新后重试") {
17
+ super(message, enums_1.ResponseCode.CONFLICT);
18
+ this.name = "OptimisticLockError";
19
+ }
20
+ }
21
+ exports.OptimisticLockError = OptimisticLockError;
22
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,oDAAwD;AAExD,qBAAqB;AACrB,MAAa,QAAS,SAAQ,KAAK;IAGjC,YAAY,OAAe,EAAE,OAAqB,oBAAY,CAAC,KAAK;QAClE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AARD,4BAQC;AAED,eAAe;AACf,MAAa,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,OAAO,GAAG,eAAe;QACnC,KAAK,CAAC,OAAO,EAAE,oBAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC"}
@@ -0,0 +1,49 @@
1
+ import "reflect-metadata";
2
+ /** 字段级 @Select 选项(对齐 MyBatis association / collection) */
3
+ export interface FieldSelectOptions {
4
+ /**
5
+ * true → 结果为数组(collection,如 children)
6
+ * false → 单条/单值(association,如 roleName)
7
+ * 默认 false
8
+ */
9
+ many?: boolean;
10
+ /**
11
+ * 取结果中某一列作为值;
12
+ * many=true 时得到标量数组;many=false 时得到单个标量。
13
+ * 不传则 many 时为行对象数组,否则为第一行对象。
14
+ */
15
+ column?: string;
16
+ /**
17
+ * 对嵌套查出的行是否继续填充其 @Select(同实体递归)。
18
+ * 默认 0:不再递归;设为 1+ 可做有限层树。
19
+ */
20
+ depth?: number;
21
+ /**
22
+ * 是否在 selectList / selectPage 上自动填充。
23
+ * 默认 true。形如 `列 = #{字段}` 的 SQL 会合并成一条 IN;
24
+ * 含子查询或 LIMIT 的仍逐行查。树形全表加载建议 eager:false,再手动 hydrate。
25
+ */
26
+ eager?: boolean;
27
+ /** 数据源名称;不传则跟随 hydrate / Mapper 的 datasource */
28
+ datasource?: string;
29
+ /** 按数据库类型查找数据源(同类型多源时须用 datasource) */
30
+ db?: string;
31
+ }
32
+ export interface FieldSelectMeta {
33
+ property: string;
34
+ sql: string;
35
+ many: boolean;
36
+ column?: string;
37
+ depth: number;
38
+ eager: boolean;
39
+ datasource?: string;
40
+ db?: string;
41
+ }
42
+ type Ctor = Function;
43
+ /** 注册属性级 @Select */
44
+ export declare function registerFieldSelect(ctor: Ctor, property: string, sql: string, options?: FieldSelectOptions): void;
45
+ /** 读取实体上全部字段级 @Select */
46
+ export declare function getFieldSelects(ctor: Ctor): FieldSelectMeta[];
47
+ export declare function getFieldSelect(ctor: Ctor, property: string): FieldSelectMeta | undefined;
48
+ export {};
49
+ //# sourceMappingURL=fieldSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldSelect.d.ts","sourceRoot":"","sources":["../src/fieldSelect.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAID,KAAK,IAAI,GAAG,QAAQ,CAAC;AAUrB,oBAAoB;AACpB,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,kBAAuB,GAC/B,IAAI,CAkCN;AAED,yBAAyB;AACzB,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,EAAE,CAE7D;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,GACf,eAAe,GAAG,SAAS,CAE7B"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerFieldSelect = registerFieldSelect;
4
+ exports.getFieldSelects = getFieldSelects;
5
+ exports.getFieldSelect = getFieldSelect;
6
+ require("reflect-metadata");
7
+ const beanKeys_1 = require("@pangza/core/Json/beanKeys");
8
+ const FIELD_SELECT_KEY = Symbol.for("pangza.orm.fieldSelect");
9
+ function fieldSelectMap(ctor) {
10
+ return (Reflect.getOwnMetadata(FIELD_SELECT_KEY, ctor) ?? {});
11
+ }
12
+ /** 注册属性级 @Select */
13
+ function registerFieldSelect(ctor, property, sql, options = {}) {
14
+ const template = String(sql).trim();
15
+ if (!template) {
16
+ throw new Error("@Select 字段 SQL 不能为空");
17
+ }
18
+ // 延迟检查关联,避免 relation ↔ fieldSelect 循环依赖在加载期炸
19
+ try {
20
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
21
+ const { getRelation } = require("./relation");
22
+ if (getRelation(ctor, property)) {
23
+ throw new Error(`字段 @Select(${property}) 与关联装饰器不能同时用于同一属性`);
24
+ }
25
+ }
26
+ catch (err) {
27
+ if (err instanceof Error && /不能同时/.test(err.message))
28
+ throw err;
29
+ }
30
+ (0, beanKeys_1.addBeanKey)(ctor, property);
31
+ const map = {
32
+ ...fieldSelectMap(ctor),
33
+ [property]: {
34
+ property,
35
+ sql: template,
36
+ many: options.many === true,
37
+ column: options.column?.trim() || undefined,
38
+ depth: Math.max(0, options.depth ?? 0),
39
+ eager: options.eager !== false,
40
+ datasource: options.datasource?.trim() || undefined,
41
+ db: options.db?.trim() || undefined,
42
+ },
43
+ };
44
+ Reflect.defineMetadata(FIELD_SELECT_KEY, map, ctor);
45
+ }
46
+ /** 读取实体上全部字段级 @Select */
47
+ function getFieldSelects(ctor) {
48
+ return Object.values(fieldSelectMap(ctor));
49
+ }
50
+ function getFieldSelect(ctor, property) {
51
+ return fieldSelectMap(ctor)[property];
52
+ }
53
+ //# sourceMappingURL=fieldSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldSelect.js","sourceRoot":"","sources":["../src/fieldSelect.ts"],"names":[],"mappings":";;AA0DA,kDAuCC;AAGD,0CAEC;AAED,wCAKC;AA7GD,4BAA0B;AAC1B,yDAAwD;AA4CxD,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAI9D,SAAS,cAAc,CAAC,IAAU;IAChC,OAAO,CACJ,OAAO,CAAC,cAAc,CAAC,gBAAgB,EAAE,IAAI,CAEhC,IAAI,EAAE,CACrB,CAAC;AACJ,CAAC;AAED,oBAAoB;AACpB,SAAgB,mBAAmB,CACjC,IAAU,EACV,QAAgB,EAChB,GAAW,EACX,UAA8B,EAAE;IAEhC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,6CAA6C;IAC7C,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,YAAY,CAE3C,CAAC;QACF,IAAI,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,cAAc,QAAQ,oBAAoB,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,MAAM,GAAG,CAAC;IAClE,CAAC;IACD,IAAA,qBAAU,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG;QACV,GAAG,cAAc,CAAC,IAAI,CAAC;QACvB,CAAC,QAAQ,CAAC,EAAE;YACV,QAAQ;YACR,GAAG,EAAE,QAAQ;YACb,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS;YAC3C,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;YACtC,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,KAAK;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,SAAS;YACnD,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,SAAS;SACpC;KACF,CAAC;IACF,OAAO,CAAC,cAAc,CAAC,gBAAgB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,yBAAyB;AACzB,SAAgB,eAAe,CAAC,IAAU;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,cAAc,CAC5B,IAAU,EACV,QAAgB;IAEhB,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC"}
package/dist/fill.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { getOrmConfig } from "./config";
2
+ import type { ResolvedOrmConfig } from "./types";
3
+ /** 插入前默认填充 + 用户拦截 */
4
+ export declare function applyInsertFill(entity: Record<string, any>, cfg: ResolvedOrmConfig, fillEnabled: boolean): Promise<void>;
5
+ /** 更新 / 逻辑删除前默认填充 + 用户拦截 */
6
+ export declare function applyUpdateFill(entity: Record<string, any>, cfg: ResolvedOrmConfig, fillEnabled: boolean): Promise<void>;
7
+ export { getOrmConfig };
8
+ //# sourceMappingURL=fill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../src/fill.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,YAAY,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAyBjD,qBAAqB;AACrB,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,4BAA4B;AAC5B,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}