@lsby/net-core 0.4.7 → 0.5.0-beta.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 (53) hide show
  1. package/dist/cjs/action/{action.cjs → action.bak.cjs} +4 -4
  2. package/dist/cjs/index.cjs +2 -92
  3. package/dist/cjs/index.d.cts +1 -2
  4. package/dist/cjs/server/server.cjs +1 -88
  5. package/dist/cjs/server/server.d.cts +1 -8
  6. package/dist/esm/action/{action.js → action.bak.js} +1 -1
  7. package/dist/esm/{chunk-UQ3SZP4A.js → chunk-AXMWOH7L.js} +1 -72
  8. package/dist/esm/{chunk-47ICFQXW.js → chunk-CE4M2QA4.js} +1 -1
  9. package/dist/esm/index.d.ts +1 -2
  10. package/dist/esm/index.js +3 -7
  11. package/dist/esm/server/server.d.ts +1 -8
  12. package/dist/esm/server/server.js +1 -2
  13. package/package.json +1 -1
  14. package/dist/bin/gen-table-list/bin.cjs +0 -157
  15. package/dist/bin/gen-table-list/bin.d.cts +0 -1
  16. package/dist/bin/gen-table-list/index.cjs +0 -156
  17. package/dist/bin/gen-table-list/index.d.cts +0 -3
  18. package/dist/bin/gen-table-type/addition.cjs +0 -123
  19. package/dist/bin/gen-table-type/addition.d.cts +0 -3
  20. package/dist/bin/gen-table-type/bin.cjs +0 -277
  21. package/dist/bin/gen-table-type/bin.d.cts +0 -1
  22. package/dist/bin/gen-table-type/index.cjs +0 -276
  23. package/dist/bin/gen-table-type/index.d.cts +0 -3
  24. package/dist/cjs/bin/gen-table-list/bin.cjs +0 -157
  25. package/dist/cjs/bin/gen-table-list/bin.d.cts +0 -1
  26. package/dist/cjs/bin/gen-table-list/index.cjs +0 -156
  27. package/dist/cjs/bin/gen-table-list/index.d.cts +0 -3
  28. package/dist/cjs/bin/gen-table-type/addition.cjs +0 -123
  29. package/dist/cjs/bin/gen-table-type/addition.d.cts +0 -3
  30. package/dist/cjs/bin/gen-table-type/bin.cjs +0 -277
  31. package/dist/cjs/bin/gen-table-type/bin.d.cts +0 -1
  32. package/dist/cjs/bin/gen-table-type/index.cjs +0 -276
  33. package/dist/cjs/bin/gen-table-type/index.d.cts +0 -3
  34. package/dist/cjs/interface-table/interface-table.cjs +0 -47
  35. package/dist/cjs/interface-table/interface-table.d.cts +0 -142
  36. package/dist/esm/bin/gen-table-list/bin.d.ts +0 -1
  37. package/dist/esm/bin/gen-table-list/bin.js +0 -16
  38. package/dist/esm/bin/gen-table-list/index.d.ts +0 -3
  39. package/dist/esm/bin/gen-table-list/index.js +0 -6
  40. package/dist/esm/bin/gen-table-type/addition.d.ts +0 -3
  41. package/dist/esm/bin/gen-table-type/addition.js +0 -6
  42. package/dist/esm/bin/gen-table-type/bin.d.ts +0 -1
  43. package/dist/esm/bin/gen-table-type/bin.js +0 -17
  44. package/dist/esm/bin/gen-table-type/index.d.ts +0 -3
  45. package/dist/esm/bin/gen-table-type/index.js +0 -7
  46. package/dist/esm/chunk-4T2MZJJ5.js +0 -122
  47. package/dist/esm/chunk-GN24MVWF.js +0 -23
  48. package/dist/esm/chunk-HSGHMDHC.js +0 -148
  49. package/dist/esm/chunk-V3CNI7QV.js +0 -99
  50. package/dist/esm/interface-table/interface-table.d.ts +0 -142
  51. package/dist/esm/interface-table/interface-table.js +0 -6
  52. /package/dist/cjs/action/{action.d.cts → action.bak.d.cts} +0 -0
  53. /package/dist/esm/action/{action.d.ts → action.bak.d.ts} +0 -0
@@ -1,142 +0,0 @@
1
- import { z } from 'zod';
2
- import { 接口逻辑 as ____ } from '../interface-api/interface-logic.cjs';
3
- import { 插件项类型 as _____ } from '../plugin/plug.cjs';
4
- import '@lsby/ts-fp-data';
5
- import 'express';
6
-
7
- type 是any<T> = 0 extends 1 & T ? true : false;
8
- type 条件<列定义> = 是any<列定义> extends true ? any : {
9
- [K in keyof 列定义]: {
10
- 列: K;
11
- 符号: '=' | '<>';
12
- 值: 列定义[K];
13
- };
14
- }[keyof 列定义] | {
15
- [K in keyof 列定义]: {
16
- 列: K;
17
- 符号: 'in' | 'not in';
18
- 值: 列定义[K][];
19
- };
20
- }[keyof 列定义] | {
21
- [K in keyof 列定义]: {
22
- 列: K;
23
- 符号: 'is' | 'is not';
24
- 值: null;
25
- };
26
- }[keyof 列定义] | {
27
- [K in keyof 列定义]: 列定义[K] extends string ? {
28
- 列: K;
29
- 符号: 'like' | 'not like';
30
- 值: string;
31
- } : never;
32
- }[keyof 列定义] | {
33
- [K in keyof 列定义]: 列定义[K] extends number ? {
34
- 列: K;
35
- 符号: '>' | '<' | '>=' | '<=';
36
- 值: number;
37
- } : never;
38
- }[keyof 列定义];
39
- type 条件组<列定义 extends object> = 条件<列定义>[];
40
- type 分页选项 = {
41
- 页数: number;
42
- 大小: number;
43
- };
44
- type 排序选项<列名称们> = {
45
- 排序列: 列名称们;
46
- 排序模式: '正序' | '倒序';
47
- };
48
- type 翻译自定义类型<A> = A extends '字符串' ? string : A extends '数字' ? number : A extends '布尔' ? boolean : never;
49
- type 翻译列描述<对象> = 是any<对象> extends true ? any : {
50
- [key in keyof 对象]: '类型' extends keyof 对象[key] ? 翻译自定义类型<对象[key]['类型']> : never;
51
- };
52
- type 翻译查询列描述<对象> = 是any<对象> extends true ? any : {
53
- [key in keyof 对象]: '类型' extends keyof 对象[key] ? '可空' extends keyof 对象[key] ? 对象[key]['可空'] extends 'false' ? 翻译自定义类型<对象[key]['类型']> : 翻译自定义类型<对象[key]['类型']> | null : never : never;
54
- };
55
- type 翻译插入列描述<对象> = 是any<对象> extends true ? any : 归约数组对象<联合转元组<未定义对象转可选对象<{
56
- [key in keyof 对象]: '类型' extends keyof 对象[key] ? '可选' extends keyof 对象[key] ? 对象[key]['可选'] extends 'false' ? 翻译自定义类型<对象[key]['类型']> : 翻译自定义类型<对象[key]['类型']> | undefined : never : never;
57
- }>>>;
58
- type 翻译修改值列描述<对象> = 是any<对象> extends true ? any : 归约数组对象<联合转元组<未定义对象转可选对象<{
59
- [key in keyof 对象]: '类型' extends keyof 对象[key] ? '可空' extends keyof 对象[key] ? 对象[key]['可空'] extends 'false' ? 翻译自定义类型<对象[key]['类型']> : 翻译自定义类型<对象[key]['类型']> | null : never : never;
60
- }>>>;
61
- type 未定义对象转可选对象<X> = {
62
- [key in keyof X]: undefined extends X[key] ? {
63
- [k in key]?: X[key];
64
- } : {
65
- [k in key]: X[key];
66
- };
67
- }[keyof X];
68
- type 归约数组对象<Arr> = Arr extends [] ? {} : Arr extends [infer x, ...infer xs] ? x & 归约数组对象<xs> : never;
69
- type 联合转换成函数<X> = X extends any ? (a: (x: any) => X) => any : never;
70
- type 函数转换成与<X> = (X extends any ? X : never) extends (a: infer A) => any ? A : never;
71
- type 取最后一个<X> = 函数转换成与<联合转换成函数<X>> extends (x: any) => infer A ? A : never;
72
- type 联合转元组<X> = [X] extends [never] ? [] : 取最后一个<X> extends infer Last ? [...联合转元组<Exclude<X, Last>>, Last] : never;
73
- /**
74
- * # 虚拟表
75
- *
76
- * 注意到后端大部分时候只做两件事:
77
- * - 查询数据库的数据给前端
78
- * - 接收前端数据, 以此更新或修改数据库的数据
79
- * 甚至可以说, 后端就是提供了带鉴权的有限数据库操作机制.
80
- *
81
- * 同时, 注意到前端请求和修改数据是基于结构的.
82
- * 例如: 前端不会要求"修改学生表的第十行的第三列的值", 而是"修改学生id为x的姓名"
83
- * 注意: 前端理解的这种结构, 并不是数据库本身的结构, 而是将数据库的数据进行重组后得到的, 这个转换的过程通常由后端完成.
84
- *
85
- * 这样, 我们就得到了一个统一的心智模型: 后端就是对数据库结构进行重组映射, 得到前端期望的虚拟表, 同时提供模型的增删改查操作, 的逻辑集合.
86
- *
87
- * 我们可以抽象这个过程.
88
- * 写一个"虚拟表"的抽象类.
89
- * 构造这个类时需要提供构造参数, 构造参数将模型映射为一个确定的sql语句或一个构造式.
90
- * 这个语句的结果必然是一个表, 这个表的行不确定, 但列是固定的.
91
- * 这个表并不一定对应数据库里的某张表, 而是依据前端视角, 构造出来的逻辑表.
92
- * 这个表的实际数据可能映射到数据库的一张或多张表上, 也可能映射到内存或其他位置上.
93
- *
94
- * 既然列已固定, 增删改查的参数和返回值就都可以确定.
95
- * 当然, 并不是任何模型都可以同时提供增删改查, 如果不能提供或者不想提供, 直接报错即可.
96
- *
97
- * 接下来只需要继承这个类, 实现各种虚拟表即可, 注意到这些虚拟表是横向的, 可以很容易的扩展.
98
- * 这样, 编写后端的过程就是编写这些虚拟表的过程, 这些模型不但简单, 也很容易扩展和管理.
99
- * 我们可以很容易的编写大量的虚拟表来适配各种需求, 也很容易通过继承或组合产生新的虚拟表.
100
- *
101
- * 这样, 我们就将原来一个一个离散的过程式接口, 改成了对象式的虚拟表.
102
- */
103
- declare abstract class 虚拟表<构造参数类型 extends z.AnyZodObject, 列形状 extends z.ZodObject<Record<string, z.ZodObject<{
104
- 类型: z.ZodLiteral<'字符串'> | z.ZodLiteral<'数字'> | z.ZodLiteral<'布尔'>;
105
- 可选: z.ZodLiteral<'true'> | z.ZodLiteral<'false'>;
106
- 可空: z.ZodLiteral<'true'> | z.ZodLiteral<'false'>;
107
- }>>>, 增错误 extends z.ZodEnum<[string, ...string[]]> | z.ZodNever, 删错误 extends z.ZodEnum<[string, ...string[]]> | z.ZodNever, 改错误 extends z.ZodEnum<[string, ...string[]]> | z.ZodNever, 查错误 extends z.ZodEnum<[string, ...string[]]> | z.ZodNever> {
108
- protected 构造参数: z.infer<构造参数类型>;
109
- static 资源路径: string;
110
- protected readonly __类型保持符号?: [构造参数类型, 列形状, 增错误, 删错误, 改错误, 查错误];
111
- constructor(构造参数: z.infer<构造参数类型>);
112
- abstract 增(数据们: 翻译插入列描述<z.infer<列形状>>[]): Promise<____<_____[], {}, z.infer<增错误>, {
113
- data: {
114
- insertId: string;
115
- }[];
116
- }>>;
117
- abstract 删(筛选条件: 条件组<翻译列描述<z.infer<列形状>>>): Promise<____<_____[], {}, z.infer<删错误>, {}>>;
118
- abstract 改(新值: Partial<翻译修改值列描述<z.infer<列形状>>>, 筛选条件: 条件组<翻译列描述<z.infer<列形状>>>): Promise<____<_____[], {}, z.infer<改错误>, {}>>;
119
- abstract 查(筛选条件?: 条件组<翻译列描述<z.infer<列形状>>>, 分页条件?: 分页选项, 排序条件?: 排序选项<keyof z.infer<列形状>>): Promise<____<_____[], {}, z.infer<查错误>, 翻译查询列描述<z.infer<列形状>>[]>>;
120
- 调用增(body: {
121
- value: 翻译插入列描述<z.infer<列形状>>[];
122
- }): Promise<____<_____[], {}, z.infer<增错误>, {
123
- data: {
124
- insertId: string;
125
- }[];
126
- }>>;
127
- 调用删(body: {
128
- where: 条件组<翻译列描述<z.infer<列形状>>>;
129
- }): Promise<____<_____[], {}, z.infer<删错误>, {}>>;
130
- 调用改(body: {
131
- value: Partial<翻译修改值列描述<z.infer<列形状>>>;
132
- where: 条件组<翻译列描述<z.infer<列形状>>>;
133
- }): Promise<____<_____[], {}, z.infer<改错误>, {}>>;
134
- 调用查(body: {
135
- where?: 条件组<翻译列描述<z.infer<列形状>>>;
136
- page?: 分页选项;
137
- sort?: 排序选项<keyof z.infer<列形状>>;
138
- }): Promise<____<_____[], {}, z.infer<查错误>, 翻译查询列描述<z.infer<列形状>>[]>>;
139
- }
140
- type 任意虚拟表 = 虚拟表<any, any, any, any, any, any>;
141
-
142
- export { type 任意虚拟表, type 分页选项, type 排序选项, type 是any, type 未定义对象转可选对象, type 条件, type 条件组, type 翻译修改值列描述, type 翻译列描述, type 翻译插入列描述, type 翻译查询列描述, type 翻译自定义类型, 虚拟表 };
@@ -1 +0,0 @@
1
- #!/usr/bin/env node
@@ -1,16 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- main
4
- } from "../../chunk-4T2MZJJ5.js";
5
-
6
- // src/bin/gen-table-list/bin.ts
7
- import { Command } from "commander";
8
- import path from "node:path";
9
- var program = new Command();
10
- program.name("\u751F\u6210\u8868\u63A5\u53E3\u6587\u4EF6\u5217\u8868").argument("<tsconfigPath>", "tsconfig\u6587\u4EF6\u8DEF\u5F84").argument("<interfaceFolderPath>", "\u63A5\u53E3\u6587\u4EF6\u5939\u8DEF\u5F84").argument("<outFilePath>", "\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84").action(async (tsconfigPath, interfaceFolderPath, outFilePath) => {
11
- let absoluteTsconfigPath = path.resolve(tsconfigPath);
12
- let absoluteApiFolderPath = path.resolve(interfaceFolderPath);
13
- let absoluteOutputPath = path.resolve(outFilePath);
14
- await main(absoluteTsconfigPath, absoluteApiFolderPath, absoluteOutputPath);
15
- });
16
- program.parse(process.argv);
@@ -1,3 +0,0 @@
1
- declare function main(tsconfig路径: string, 目标路径: string, 输出文件路径: string): Promise<void>;
2
-
3
- export { main };
@@ -1,6 +0,0 @@
1
- import {
2
- main
3
- } from "../../chunk-4T2MZJJ5.js";
4
- export {
5
- main
6
- };
@@ -1,3 +0,0 @@
1
- declare let 附加代码: string;
2
-
3
- export { 附加代码 };
@@ -1,6 +0,0 @@
1
- import {
2
- 附加代码
3
- } from "../../chunk-V3CNI7QV.js";
4
- export {
5
- \u9644\u52A0\u4EE3\u7801
6
- };
@@ -1 +0,0 @@
1
- #!/usr/bin/env node
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- main
4
- } from "../../chunk-HSGHMDHC.js";
5
- import "../../chunk-V3CNI7QV.js";
6
-
7
- // src/bin/gen-table-type/bin.ts
8
- import { Command } from "commander";
9
- import path from "node:path";
10
- var program = new Command();
11
- program.name("\u751F\u6210\u8868\u7C7B\u578B\u6587\u4EF6").argument("<tsconfigPath>", "tsconfig\u6587\u4EF6\u8DEF\u5F84").argument("<interfaceFolderPath>", "\u63A5\u53E3\u6587\u4EF6\u5939\u8DEF\u5F84").argument("<outFilePath>", "\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84").action(async (tsconfigPath, interfaceFolderPath, outputPath) => {
12
- let absoluteTsconfigPath = path.resolve(tsconfigPath);
13
- let absoluteApiFolderPath = path.resolve(interfaceFolderPath);
14
- let absoluteOutputPath = path.resolve(outputPath);
15
- await main(absoluteTsconfigPath, absoluteApiFolderPath, absoluteOutputPath);
16
- });
17
- program.parse(process.argv);
@@ -1,3 +0,0 @@
1
- declare function main(tsconfig路径: string, 目标路径: string, 输出文件路径: string): Promise<void>;
2
-
3
- export { main };
@@ -1,7 +0,0 @@
1
- import {
2
- main
3
- } from "../../chunk-HSGHMDHC.js";
4
- import "../../chunk-V3CNI7QV.js";
5
- export {
6
- main
7
- };
@@ -1,122 +0,0 @@
1
- // src/bin/gen-table-list/index.ts
2
- import { Log } from "@lsby/ts-log";
3
- import L from "lodash";
4
- import { randomUUID } from "node:crypto";
5
- import fs from "node:fs";
6
- import path from "node:path";
7
- import ts from "typescript";
8
- function \u68C0\u67E5\u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA(\u6E90\u6587\u4EF6) {
9
- let \u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA = false;
10
- ts.forEachChild(\u6E90\u6587\u4EF6, (\u8282\u70B9) => {
11
- if (ts.isExportDeclaration(\u8282\u70B9)) {
12
- let \u8282\u70B9\u5BFC\u51FA = \u8282\u70B9.exportClause ?? null;
13
- if (\u8282\u70B9\u5BFC\u51FA !== null && ts.isDefaultClause(\u8282\u70B9\u5BFC\u51FA) || ts.isExportAssignment(\u8282\u70B9)) {
14
- \u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA = true;
15
- }
16
- } else if (ts.isClassDeclaration(\u8282\u70B9) && (\u8282\u70B9.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.DefaultKeyword) ?? false)) {
17
- \u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA = true;
18
- }
19
- });
20
- return \u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA;
21
- }
22
- function \u66FF\u6362\u975E\u6CD5\u5B57\u7B26(\u5B57\u7B26\u4E32) {
23
- return "_" + \u5B57\u7B26\u4E32.replace(/[ !\-!@#$%^&*()\[\]{}\\|;:'",.\/?]/g, "_");
24
- }
25
- function \u8BA1\u7B97\u5B8C\u6574\u540D\u79F0(tsconfig\u8DEF\u5F84, a) {
26
- return \u66FF\u6362\u975E\u6CD5\u5B57\u7B26(path.relative(path.dirname(tsconfig\u8DEF\u5F84), a.fileName));
27
- }
28
- function \u8BA1\u7B97\u5F15\u5165\u8DEF\u5F84(\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84, a) {
29
- return path.relative(path.dirname(\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84), a.fileName).replaceAll("\\", "/").replaceAll(".ts", "");
30
- }
31
- async function main(tsconfig\u8DEF\u5F84, \u76EE\u6807\u8DEF\u5F84, \u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84) {
32
- let log = new Log("@lsby:net-core").extend("gen-table-list");
33
- await log.debug("\u5F00\u59CB\u751F\u6210\u63A5\u53E3\u5217\u8868...");
34
- await log.debug(`tsconfig\u8DEF\u5F84: ${tsconfig\u8DEF\u5F84}`);
35
- await log.debug(`\u76EE\u6807\u8DEF\u5F84: ${\u76EE\u6807\u8DEF\u5F84}`);
36
- await log.debug(`\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84: ${\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84}`);
37
- let tsconfig\u5185\u5BB9 = ts.parseConfigFileTextToJson(tsconfig\u8DEF\u5F84, fs.readFileSync(tsconfig\u8DEF\u5F84, "utf8"));
38
- let tsconfig\u5185\u5BB9\u9519\u8BEF = tsconfig\u5185\u5BB9.error ?? null;
39
- if (tsconfig\u5185\u5BB9\u9519\u8BEF !== null) {
40
- await log.error("\u65E0\u6CD5\u89E3\u6790 tsconfig.json: " + tsconfig\u5185\u5BB9\u9519\u8BEF.messageText);
41
- throw new Error("\u65E0\u6CD5\u89E3\u6790 tsconfig.json");
42
- }
43
- let \u89E3\u6790\u540E\u7684tsconfig = ts.parseJsonConfigFileContent(tsconfig\u5185\u5BB9.config, ts.sys, path.resolve(tsconfig\u8DEF\u5F84, ".."));
44
- await log.debug("\u6210\u529F\u89E3\u6790 tsconfig \u6587\u4EF6...");
45
- let \u9879\u76EE\u4E3B\u673A = ts.createCompilerHost(\u89E3\u6790\u540E\u7684tsconfig.options);
46
- let \u9879\u76EE = ts.createProgram(\u89E3\u6790\u540E\u7684tsconfig.fileNames, \u89E3\u6790\u540E\u7684tsconfig.options, \u9879\u76EE\u4E3B\u673A);
47
- await log.debug("\u6210\u529F\u8BFB\u53D6\u9879\u76EE...");
48
- let \u6240\u6709\u6E90\u6587\u4EF6 = \u9879\u76EE.getSourceFiles();
49
- let \u76F8\u5173\u6E90\u6587\u4EF6\u4EEC = \u6240\u6709\u6E90\u6587\u4EF6.filter((\u6E90\u6587\u4EF6) => {
50
- let \u6E90\u6587\u4EF6\u8DEF\u5F84 = path.normalize(\u6E90\u6587\u4EF6.fileName);
51
- if (\u6E90\u6587\u4EF6\u8DEF\u5F84.includes(\u76EE\u6807\u8DEF\u5F84) === false)
52
- return false;
53
- let \u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA = \u68C0\u67E5\u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA(\u6E90\u6587\u4EF6);
54
- if (\u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA === false)
55
- return false;
56
- return true;
57
- });
58
- await log.debug(`\u7B5B\u9009\u51FA ${\u76F8\u5173\u6E90\u6587\u4EF6\u4EEC.length} \u4E2A\u76F8\u5173\u6E90\u6587\u4EF6`);
59
- let \u4F34\u968F\u7684\u865A\u62DF\u6587\u4EF6\u4EEC = \u76F8\u5173\u6E90\u6587\u4EF6\u4EEC.map((a) => {
60
- let \u4EE3\u7801 = [
61
- `import { \u4EFB\u610F\u865A\u62DF\u8868 } from '@lsby/net-core'`,
62
- `import \u5BFC\u5165 from "./${a.fileName.split("/").at(-1)?.replaceAll(".ts", "")}"`,
63
- ``,
64
- `type \u8BA1\u7B97\u7ED3\u679C = \u5BFC\u5165 extends \u4EFB\u610F\u865A\u62DF\u8868 ? true : false`
65
- ];
66
- return ts.createSourceFile(
67
- a.fileName.replaceAll(".ts", "-" + randomUUID() + ".ts"),
68
- \u4EE3\u7801.join("\n"),
69
- ts.ScriptTarget.Latest
70
- );
71
- });
72
- let \u65B0\u9879\u76EE = ts.createProgram({
73
- rootNames: [...\u9879\u76EE.getSourceFiles().map((a) => a.fileName), ...\u4F34\u968F\u7684\u865A\u62DF\u6587\u4EF6\u4EEC.map((a) => a.fileName)],
74
- options: \u89E3\u6790\u540E\u7684tsconfig.options,
75
- host: {
76
- ...\u9879\u76EE\u4E3B\u673A,
77
- getSourceFile: (filename) => {
78
- let \u627E\u5230\u7684\u865A\u62DF\u6587\u4EF6 = \u4F34\u968F\u7684\u865A\u62DF\u6587\u4EF6\u4EEC.find((a) => a.fileName === filename) ?? null;
79
- if (\u627E\u5230\u7684\u865A\u62DF\u6587\u4EF6 !== null)
80
- return \u627E\u5230\u7684\u865A\u62DF\u6587\u4EF6;
81
- return \u9879\u76EE.getSourceFile(filename);
82
- }
83
- },
84
- oldProgram: \u9879\u76EE
85
- });
86
- let \u7C7B\u578B\u68C0\u67E5\u5668 = \u65B0\u9879\u76EE.getTypeChecker();
87
- let \u68C0\u67E5\u7ED3\u679C = [];
88
- for (let \u6E90\u6587\u4EF6 of \u4F34\u968F\u7684\u865A\u62DF\u6587\u4EF6\u4EEC) {
89
- let \u7ED3\u679C = false;
90
- ts.forEachChild(\u6E90\u6587\u4EF6, (node) => {
91
- if (ts.isTypeAliasDeclaration(node) && node.name.text === "\u8BA1\u7B97\u7ED3\u679C") {
92
- let type = \u7C7B\u578B\u68C0\u67E5\u5668.getTypeAtLocation(node);
93
- let \u6587\u672C\u7ED3\u679C = \u7C7B\u578B\u68C0\u67E5\u5668.typeToString(type);
94
- if (\u6587\u672C\u7ED3\u679C === "true")
95
- \u7ED3\u679C = true;
96
- }
97
- });
98
- \u68C0\u67E5\u7ED3\u679C.push(\u7ED3\u679C);
99
- }
100
- let \u6700\u7EC8\u7ED3\u679C = L.zip(\u76F8\u5173\u6E90\u6587\u4EF6\u4EEC, \u68C0\u67E5\u7ED3\u679C).filter((a) => a[1] === true).map((a) => a[0] ?? null).filter((a) => a !== null);
101
- await log.debug(`\u6700\u7EC8\u7B5B\u9009\u51FA ${\u6700\u7EC8\u7ED3\u679C.length} \u4E2A\u63A5\u53E3\u5B9E\u73B0`);
102
- let \u6700\u7EC8\u4EE3\u7801 = [
103
- `import { \u4EFB\u610F\u865A\u62DF\u8868 } from '@lsby/net-core'`,
104
- "",
105
- ...\u6700\u7EC8\u7ED3\u679C.map((a) => `import ${\u8BA1\u7B97\u5B8C\u6574\u540D\u79F0(tsconfig\u8DEF\u5F84, a)} from './${\u8BA1\u7B97\u5F15\u5165\u8DEF\u5F84(\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84, a)}'`),
106
- "",
107
- `export let interfaceTableList: { new (\u6784\u9020\u53C2\u6570: any): \u4EFB\u610F\u865A\u62DF\u8868; \u8D44\u6E90\u8DEF\u5F84: string }[] = [`,
108
- ...\u6700\u7EC8\u7ED3\u679C.map((a) => \u8BA1\u7B97\u5B8C\u6574\u540D\u79F0(tsconfig\u8DEF\u5F84, a)).map((a) => ` ${a},`),
109
- `]`,
110
- ""
111
- ];
112
- await log.debug("\u6700\u7EC8\u4EE3\u7801\u751F\u6210\u5B8C\u6210");
113
- let \u8F93\u51FA\u6587\u4EF6\u5939 = path.dirname(\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84);
114
- if (fs.existsSync(\u8F93\u51FA\u6587\u4EF6\u5939) === false)
115
- fs.mkdirSync(\u8F93\u51FA\u6587\u4EF6\u5939, { recursive: true });
116
- fs.writeFileSync(\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84, \u6700\u7EC8\u4EE3\u7801.join("\n"));
117
- await log.debug(`\u8F93\u51FA\u6587\u4EF6\u5199\u5165\u5B8C\u6210: ${\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84}`);
118
- }
119
-
120
- export {
121
- main
122
- };
@@ -1,23 +0,0 @@
1
- // src/interface-table/interface-table.ts
2
- var \u865A\u62DF\u8868 = class {
3
- constructor(\u6784\u9020\u53C2\u6570) {
4
- this.\u6784\u9020\u53C2\u6570 = \u6784\u9020\u53C2\u6570;
5
- }
6
- static \u8D44\u6E90\u8DEF\u5F84;
7
- \u8C03\u7528\u589E(body) {
8
- return this.\u589E(body.value);
9
- }
10
- \u8C03\u7528\u5220(body) {
11
- return this.\u5220(body.where);
12
- }
13
- \u8C03\u7528\u6539(body) {
14
- return this.\u6539(body.value, body.where);
15
- }
16
- \u8C03\u7528\u67E5(body) {
17
- return this.\u67E5(body.where, body.page, body.sort);
18
- }
19
- };
20
-
21
- export {
22
- 虚拟表
23
- };
@@ -1,148 +0,0 @@
1
- import {
2
- 附加代码
3
- } from "./chunk-V3CNI7QV.js";
4
-
5
- // src/bin/gen-table-type/index.ts
6
- import { Log } from "@lsby/ts-log";
7
- import { randomUUID } from "node:crypto";
8
- import fs from "node:fs";
9
- import path from "node:path";
10
- import ts from "typescript";
11
- function \u68C0\u67E5\u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA(\u6E90\u6587\u4EF6) {
12
- let \u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA = false;
13
- ts.forEachChild(\u6E90\u6587\u4EF6, (\u8282\u70B9) => {
14
- if (ts.isExportDeclaration(\u8282\u70B9)) {
15
- let \u8282\u70B9\u5BFC\u51FA = \u8282\u70B9.exportClause ?? null;
16
- if (\u8282\u70B9\u5BFC\u51FA !== null && ts.isDefaultClause(\u8282\u70B9\u5BFC\u51FA) || ts.isExportAssignment(\u8282\u70B9)) {
17
- \u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA = true;
18
- }
19
- } else if (ts.isClassDeclaration(\u8282\u70B9) && (\u8282\u70B9.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.DefaultKeyword) ?? false)) {
20
- \u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA = true;
21
- }
22
- });
23
- return \u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA;
24
- }
25
- async function main(tsconfig\u8DEF\u5F84, \u76EE\u6807\u8DEF\u5F84, \u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84) {
26
- let log = new Log("@lsby:net-core").extend("gen-table-type");
27
- await log.debug("\u5F00\u59CB\u751F\u6210\u7C7B\u578B...");
28
- await log.debug(`tsconfig\u8DEF\u5F84: ${tsconfig\u8DEF\u5F84}`);
29
- await log.debug(`\u76EE\u6807\u8DEF\u5F84: ${\u76EE\u6807\u8DEF\u5F84}`);
30
- await log.debug(`\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84: ${\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84}`);
31
- let tsconfig\u5185\u5BB9 = ts.parseConfigFileTextToJson(tsconfig\u8DEF\u5F84, fs.readFileSync(tsconfig\u8DEF\u5F84, "utf8"));
32
- let tsconfig\u5185\u5BB9\u9519\u8BEF = tsconfig\u5185\u5BB9.error ?? null;
33
- if (tsconfig\u5185\u5BB9\u9519\u8BEF !== null) {
34
- await log.error("\u65E0\u6CD5\u89E3\u6790 tsconfig.json: " + tsconfig\u5185\u5BB9\u9519\u8BEF.messageText);
35
- throw new Error("\u65E0\u6CD5\u89E3\u6790 tsconfig.json");
36
- }
37
- let \u89E3\u6790\u540E\u7684tsconfig = ts.parseJsonConfigFileContent(tsconfig\u5185\u5BB9.config, ts.sys, path.resolve(tsconfig\u8DEF\u5F84, ".."));
38
- await log.debug("\u6210\u529F\u89E3\u6790 tsconfig \u6587\u4EF6...");
39
- let \u9879\u76EE\u4E3B\u673A = ts.createCompilerHost(\u89E3\u6790\u540E\u7684tsconfig.options);
40
- let \u9879\u76EE = ts.createProgram(\u89E3\u6790\u540E\u7684tsconfig.fileNames, \u89E3\u6790\u540E\u7684tsconfig.options, \u9879\u76EE\u4E3B\u673A);
41
- await log.debug("\u6210\u529F\u8BFB\u53D6\u9879\u76EE...");
42
- let \u6240\u6709\u6E90\u6587\u4EF6 = \u9879\u76EE.getSourceFiles();
43
- let \u76F8\u5173\u6E90\u6587\u4EF6\u4EEC = \u6240\u6709\u6E90\u6587\u4EF6.filter((\u6E90\u6587\u4EF6) => {
44
- let \u6E90\u6587\u4EF6\u8DEF\u5F84 = path.normalize(\u6E90\u6587\u4EF6.fileName);
45
- if (\u6E90\u6587\u4EF6\u8DEF\u5F84.includes(\u76EE\u6807\u8DEF\u5F84) === false)
46
- return false;
47
- let \u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA = \u68C0\u67E5\u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA(\u6E90\u6587\u4EF6);
48
- if (\u5B58\u5728\u9ED8\u8BA4\u5BFC\u51FA === false)
49
- return false;
50
- return true;
51
- });
52
- await log.debug(`\u7B5B\u9009\u51FA ${\u76F8\u5173\u6E90\u6587\u4EF6\u4EEC.length} \u4E2A\u76F8\u5173\u6E90\u6587\u4EF6`);
53
- let \u4F34\u968F\u7684\u865A\u62DF\u6587\u4EF6\u4EEC = \u76F8\u5173\u6E90\u6587\u4EF6\u4EEC.map((a) => {
54
- let \u4EE3\u7801 = `
55
- import { \u5206\u9875\u9009\u9879, \u6392\u5E8F\u9009\u9879, \u6761\u4EF6\u7EC4, \u7FFB\u8BD1\u5217\u63CF\u8FF0, \u7FFB\u8BD1\u67E5\u8BE2\u5217\u63CF\u8FF0, \u7FFB\u8BD1\u63D2\u5165\u5217\u63CF\u8FF0, \u865A\u62DF\u8868, \u7FFB\u8BD1\u4FEE\u6539\u503C\u5217\u63CF\u8FF0 } from '@lsby/net-core'
56
- import { z } from 'zod'
57
- import \u5BFC\u5165 from "./${a.fileName.split("/").at(-1)?.replaceAll(".ts", "")}",
58
-
59
- // \u8DEF\u5F84
60
- type \u8DEF\u5F84 = (typeof \u5BFC\u5165)['\u8D44\u6E90\u8DEF\u5F84']
61
-
62
- // \u5217
63
- type \u5217\u63CF\u8FF0Zod = \u5BFC\u5165 extends \u865A\u62DF\u8868<any, infer X, any, any, any, any> ? X : never
64
-
65
- // \u9519\u8BEF
66
- type \u589E\u9519\u8BEF = \u5BFC\u5165 extends \u865A\u62DF\u8868<any, any, infer X, any, any, any> ? z.infer<X> : never
67
- type \u5220\u9519\u8BEF = \u5BFC\u5165 extends \u865A\u62DF\u8868<any, any, any, infer X, any, any> ? z.infer<X> : never
68
- type \u6539\u9519\u8BEF = \u5BFC\u5165 extends \u865A\u62DF\u8868<any, any, any, any, infer X, any> ? z.infer<X> : never
69
- type \u67E5\u9519\u8BEF = \u5BFC\u5165 extends \u865A\u62DF\u8868<any, any, any, any, any, infer X> ? z.infer<X> : never
70
-
71
- // \u6700\u7EC8\u8F93\u51FA
72
- type \u6700\u7EC8\u8F93\u51FA = \u8DEF\u5F84 extends infer _
73
- ? {
74
- \u8DEF\u5F84: \u8DEF\u5F84
75
-
76
- \u6784\u9020\u53C2\u6570: \u5BFC\u5165 extends \u865A\u62DF\u8868<infer X, any, any, any, any, any> ? z.infer<X> : never
77
-
78
- \u589E\u53C2\u6570_\u6570\u636E\u4EEC: \u7FFB\u8BD1\u63D2\u5165\u5217\u63CF\u8FF0<z.infer<\u5217\u63CF\u8FF0Zod>>[]
79
- \u5220\u53C2\u6570_\u7B5B\u9009\u6761\u4EF6: \u6761\u4EF6\u7EC4<\u7FFB\u8BD1\u5217\u63CF\u8FF0<z.infer<\u5217\u63CF\u8FF0Zod>>>
80
- \u6539\u53C2\u6570_\u65B0\u503C: Partial<\u7FFB\u8BD1\u4FEE\u6539\u503C\u5217\u63CF\u8FF0<z.infer<\u5217\u63CF\u8FF0Zod>>>
81
- \u6539\u53C2\u6570_\u7B5B\u9009\u6761\u4EF6: \u6761\u4EF6\u7EC4<\u7FFB\u8BD1\u5217\u63CF\u8FF0<z.infer<\u5217\u63CF\u8FF0Zod>>>
82
- \u67E5\u53C2\u6570_\u7B5B\u9009\u6761\u4EF6: \u6761\u4EF6\u7EC4<\u7FFB\u8BD1\u5217\u63CF\u8FF0<z.infer<\u5217\u63CF\u8FF0Zod>>>
83
- \u67E5\u53C2\u6570_\u5206\u9875\u6761\u4EF6: \u5206\u9875\u9009\u9879
84
- \u67E5\u53C2\u6570_\u6392\u5E8F\u6761\u4EF6: \u6392\u5E8F\u9009\u9879<z.infer<ReturnType<\u5217\u63CF\u8FF0Zod['keyof']>>>
85
-
86
- \u589E\u539F\u59CB\u9519\u8BEF\u503C: \u589E\u9519\u8BEF
87
- \u5220\u539F\u59CB\u9519\u8BEF\u503C: \u5220\u9519\u8BEF
88
- \u6539\u539F\u59CB\u9519\u8BEF\u503C: \u6539\u9519\u8BEF
89
- \u67E5\u539F\u59CB\u9519\u8BEF\u503C: \u67E5\u9519\u8BEF
90
-
91
- \u589E\u539F\u59CB\u6B63\u786E\u503C: {}
92
- \u5220\u539F\u59CB\u6B63\u786E\u503C: {}
93
- \u6539\u539F\u59CB\u6B63\u786E\u503C: {}
94
- \u67E5\u539F\u59CB\u6B63\u786E\u503C: \u7FFB\u8BD1\u67E5\u8BE2\u5217\u63CF\u8FF0<z.infer<\u5217\u63CF\u8FF0Zod>>[]
95
-
96
- \u589E\u5305\u88C5\u7ED3\u679C: { status: 'fail'; data: \u589E\u9519\u8BEF } | { status: 'success'; data:{} }
97
- \u5220\u5305\u88C5\u7ED3\u679C: { status: 'fail'; data: \u5220\u9519\u8BEF } | { status: 'success'; data:{} }
98
- \u6539\u5305\u88C5\u7ED3\u679C: { status: 'fail'; data: \u6539\u9519\u8BEF } | { status: 'success'; data:{} }
99
- \u67E5\u5305\u88C5\u7ED3\u679C: { status: 'fail'; data: \u67E5\u9519\u8BEF } | { status: 'success'; data: \u7FFB\u8BD1\u67E5\u8BE2\u5217\u63CF\u8FF0<z.infer<\u5217\u63CF\u8FF0Zod>>[] }
100
- }
101
- : never
102
- `;
103
- return ts.createSourceFile(a.fileName.replaceAll(".ts", "-" + randomUUID() + ".ts"), \u4EE3\u7801, ts.ScriptTarget.Latest);
104
- });
105
- let \u65B0\u9879\u76EE = ts.createProgram({
106
- rootNames: [...\u9879\u76EE.getSourceFiles().map((a) => a.fileName), ...\u4F34\u968F\u7684\u865A\u62DF\u6587\u4EF6\u4EEC.map((a) => a.fileName)],
107
- options: \u89E3\u6790\u540E\u7684tsconfig.options,
108
- host: {
109
- ...\u9879\u76EE\u4E3B\u673A,
110
- getSourceFile: (filename) => {
111
- let \u627E\u5230\u7684\u865A\u62DF\u6587\u4EF6 = \u4F34\u968F\u7684\u865A\u62DF\u6587\u4EF6\u4EEC.find((a) => a.fileName === filename) ?? null;
112
- if (\u627E\u5230\u7684\u865A\u62DF\u6587\u4EF6 !== null)
113
- return \u627E\u5230\u7684\u865A\u62DF\u6587\u4EF6;
114
- return \u9879\u76EE.getSourceFile(filename);
115
- }
116
- },
117
- oldProgram: \u9879\u76EE
118
- });
119
- let \u7C7B\u578B\u68C0\u67E5\u5668 = \u65B0\u9879\u76EE.getTypeChecker();
120
- let \u7ED3\u679C = [];
121
- for (let \u6E90\u6587\u4EF6 of \u4F34\u968F\u7684\u865A\u62DF\u6587\u4EF6\u4EEC) {
122
- ts.forEachChild(\u6E90\u6587\u4EF6, (node) => {
123
- if (ts.isTypeAliasDeclaration(node) && node.name.text === "\u6700\u7EC8\u8F93\u51FA") {
124
- let type = \u7C7B\u578B\u68C0\u67E5\u5668.getTypeAtLocation(node);
125
- \u7ED3\u679C.push(
126
- \u7C7B\u578B\u68C0\u67E5\u5668.typeToString(
127
- type,
128
- void 0,
129
- ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.NoTypeReduction | ts.TypeFormatFlags.AllowUniqueESSymbolType | ts.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope
130
- )
131
- );
132
- }
133
- });
134
- }
135
- let \u6700\u7EC8\u7ED3\u679C = Array.from(new Set(\u7ED3\u679C.filter((a) => a !== "any" && a !== "never" && a !== "unknown")));
136
- await log.debug(`\u6700\u7EC8\u7B5B\u9009\u51FA ${\u6700\u7EC8\u7ED3\u679C.length} \u4E2A\u63A5\u53E3\u8868\u7C7B\u578B`);
137
- let \u6700\u7EC8\u4EE3\u7801 = [`export type InterfaceTableType = [${\u6700\u7EC8\u7ED3\u679C.join(",")}]`, \u9644\u52A0\u4EE3\u7801];
138
- await log.debug("\u6700\u7EC8\u4EE3\u7801\u751F\u6210\u5B8C\u6210");
139
- let \u8F93\u51FA\u6587\u4EF6\u5939 = path.dirname(\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84);
140
- if (fs.existsSync(\u8F93\u51FA\u6587\u4EF6\u5939) === false)
141
- fs.mkdirSync(\u8F93\u51FA\u6587\u4EF6\u5939, { recursive: true });
142
- fs.writeFileSync(\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84, \u6700\u7EC8\u4EE3\u7801.join("\n"));
143
- await log.debug(`\u8F93\u51FA\u6587\u4EF6\u5199\u5165\u5B8C\u6210: ${\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84}`);
144
- }
145
-
146
- export {
147
- main
148
- };
@@ -1,99 +0,0 @@
1
- // src/bin/gen-table-type/addition.ts
2
- var \u9644\u52A0\u4EE3\u7801 = `
3
- export type \u662Fany<T> = 0 extends 1 & T ? true : false
4
- export type \u6761\u4EF6<\u5217\u5B9A\u4E49> =
5
- \u662Fany<\u5217\u5B9A\u4E49> extends true
6
- ? any
7
- :
8
- | { [K in keyof \u5217\u5B9A\u4E49]: { \u5217: K; \u7B26\u53F7: '=' | '<>'; \u503C: \u5217\u5B9A\u4E49[K] } }[keyof \u5217\u5B9A\u4E49]
9
- | { [K in keyof \u5217\u5B9A\u4E49]: { \u5217: K; \u7B26\u53F7: 'in' | 'not in'; \u503C: \u5217\u5B9A\u4E49[K][] } }[keyof \u5217\u5B9A\u4E49]
10
- | { [K in keyof \u5217\u5B9A\u4E49]: { \u5217: K; \u7B26\u53F7: 'is' | 'is not'; \u503C: null } }[keyof \u5217\u5B9A\u4E49]
11
- | {
12
- [K in keyof \u5217\u5B9A\u4E49]: \u5217\u5B9A\u4E49[K] extends string ? { \u5217: K; \u7B26\u53F7: 'like' | 'not like'; \u503C: string } : never
13
- }[keyof \u5217\u5B9A\u4E49]
14
- | {
15
- [K in keyof \u5217\u5B9A\u4E49]: \u5217\u5B9A\u4E49[K] extends number ? { \u5217: K; \u7B26\u53F7: '>' | '<' | '>=' | '<='; \u503C: number } : never
16
- }[keyof \u5217\u5B9A\u4E49]
17
- export type \u6761\u4EF6\u7EC4<\u5217\u5B9A\u4E49 extends object> = \u6761\u4EF6<\u5217\u5B9A\u4E49>[]
18
- export type \u5206\u9875\u9009\u9879 = {
19
- \u9875\u6570: number
20
- \u5927\u5C0F: number
21
- }
22
- export type \u6392\u5E8F\u9009\u9879<\u5217\u540D\u79F0\u4EEC> = {
23
- \u6392\u5E8F\u5217: \u5217\u540D\u79F0\u4EEC
24
- \u6392\u5E8F\u6A21\u5F0F: '\u6B63\u5E8F' | '\u5012\u5E8F'
25
- }
26
- export type \u7FFB\u8BD1\u81EA\u5B9A\u4E49\u7C7B\u578B<A> = A extends '\u5B57\u7B26\u4E32'
27
- ? string
28
- : A extends '\u6570\u5B57'
29
- ? number
30
- : A extends '\u5E03\u5C14'
31
- ? boolean
32
- : never
33
- export type \u7FFB\u8BD1\u5217\u63CF\u8FF0<\u5BF9\u8C61> =
34
- \u662Fany<\u5BF9\u8C61> extends true
35
- ? any
36
- : { [key in keyof \u5BF9\u8C61]: '\u7C7B\u578B' extends keyof \u5BF9\u8C61[key] ? \u7FFB\u8BD1\u81EA\u5B9A\u4E49\u7C7B\u578B<\u5BF9\u8C61[key]['\u7C7B\u578B']> : never }
37
- export type \u7FFB\u8BD1\u67E5\u8BE2\u5217\u63CF\u8FF0<\u5BF9\u8C61> =
38
- \u662Fany<\u5BF9\u8C61> extends true
39
- ? any
40
- : {
41
- [key in keyof \u5BF9\u8C61]: '\u7C7B\u578B' extends keyof \u5BF9\u8C61[key]
42
- ? '\u53EF\u7A7A' extends keyof \u5BF9\u8C61[key]
43
- ? \u5BF9\u8C61[key]['\u53EF\u7A7A'] extends 'false'
44
- ? \u7FFB\u8BD1\u81EA\u5B9A\u4E49\u7C7B\u578B<\u5BF9\u8C61[key]['\u7C7B\u578B']>
45
- : \u7FFB\u8BD1\u81EA\u5B9A\u4E49\u7C7B\u578B<\u5BF9\u8C61[key]['\u7C7B\u578B']> | null
46
- : never
47
- : never
48
- }
49
- export type \u7FFB\u8BD1\u63D2\u5165\u5217\u63CF\u8FF0<\u5BF9\u8C61> =
50
- \u662Fany<\u5BF9\u8C61> extends true
51
- ? any
52
- : \u5F52\u7EA6\u6570\u7EC4\u5BF9\u8C61<
53
- \u8054\u5408\u8F6C\u5143\u7EC4<
54
- \u672A\u5B9A\u4E49\u5BF9\u8C61\u8F6C\u53EF\u9009\u5BF9\u8C61<{
55
- [key in keyof \u5BF9\u8C61]: '\u7C7B\u578B' extends keyof \u5BF9\u8C61[key]
56
- ? '\u53EF\u9009' extends keyof \u5BF9\u8C61[key]
57
- ? \u5BF9\u8C61[key]['\u53EF\u9009'] extends 'false'
58
- ? \u7FFB\u8BD1\u81EA\u5B9A\u4E49\u7C7B\u578B<\u5BF9\u8C61[key]['\u7C7B\u578B']>
59
- : \u7FFB\u8BD1\u81EA\u5B9A\u4E49\u7C7B\u578B<\u5BF9\u8C61[key]['\u7C7B\u578B']> | undefined
60
- : never
61
- : never
62
- }>
63
- >
64
- >
65
- export type \u7FFB\u8BD1\u4FEE\u6539\u503C\u5217\u63CF\u8FF0<\u5BF9\u8C61> =
66
- \u662Fany<\u5BF9\u8C61> extends true
67
- ? any
68
- : \u5F52\u7EA6\u6570\u7EC4\u5BF9\u8C61<
69
- \u8054\u5408\u8F6C\u5143\u7EC4<
70
- \u672A\u5B9A\u4E49\u5BF9\u8C61\u8F6C\u53EF\u9009\u5BF9\u8C61<{
71
- [key in keyof \u5BF9\u8C61]: '\u7C7B\u578B' extends keyof \u5BF9\u8C61[key]
72
- ? '\u53EF\u7A7A' extends keyof \u5BF9\u8C61[key]
73
- ? \u5BF9\u8C61[key]['\u53EF\u7A7A'] extends 'false'
74
- ? \u7FFB\u8BD1\u81EA\u5B9A\u4E49\u7C7B\u578B<\u5BF9\u8C61[key]['\u7C7B\u578B']>
75
- : \u7FFB\u8BD1\u81EA\u5B9A\u4E49\u7C7B\u578B<\u5BF9\u8C61[key]['\u7C7B\u578B']> | null
76
- : never
77
- : never
78
- }>
79
- >
80
- >
81
- export type \u672A\u5B9A\u4E49\u5BF9\u8C61\u8F6C\u53EF\u9009\u5BF9\u8C61<X> = {
82
- [key in keyof X]: undefined extends X[key] ? { [k in key]?: X[key] } : { [k in key]: X[key] }
83
- }[keyof X]
84
-
85
- type \u5F52\u7EA6\u6570\u7EC4\u5BF9\u8C61<Arr> = Arr extends [] ? {} : Arr extends [infer x, ...infer xs] ? x & \u5F52\u7EA6\u6570\u7EC4\u5BF9\u8C61<xs> : never
86
-
87
- type \u8054\u5408\u8F6C\u6362\u6210\u51FD\u6570<X> = X extends any ? (a: (x: any) => X) => any : never
88
- type \u51FD\u6570\u8F6C\u6362\u6210\u4E0E<X> = (X extends any ? X : never) extends (a: infer A) => any ? A : never
89
- type \u53D6\u6700\u540E\u4E00\u4E2A<X> = \u51FD\u6570\u8F6C\u6362\u6210\u4E0E<\u8054\u5408\u8F6C\u6362\u6210\u51FD\u6570<X>> extends (x: any) => infer A ? A : never
90
- type \u8054\u5408\u8F6C\u5143\u7EC4<X> = [X] extends [never]
91
- ? []
92
- : \u53D6\u6700\u540E\u4E00\u4E2A<X> extends infer Last
93
- ? [...\u8054\u5408\u8F6C\u5143\u7EC4<Exclude<X, Last>>, Last]
94
- : never
95
- `;
96
-
97
- export {
98
- 附加代码
99
- };