@planet-matrix/mobius-model 0.6.0 → 0.10.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.
- package/CHANGELOG.md +50 -0
- package/oxlint.config.ts +1 -2
- package/package.json +29 -17
- package/scripts/build.ts +2 -52
- package/src/ai/README.md +1 -0
- package/src/ai/ai.ts +107 -0
- package/src/ai/chat-completion-ai/aihubmix-chat-completion.ts +78 -0
- package/src/ai/chat-completion-ai/chat-completion-ai.ts +270 -0
- package/src/ai/chat-completion-ai/chat-completion.ts +189 -0
- package/src/ai/chat-completion-ai/index.ts +7 -0
- package/src/ai/chat-completion-ai/lingyiwanwu-chat-completion.ts +78 -0
- package/src/ai/chat-completion-ai/ohmygpt-chat-completion.ts +78 -0
- package/src/ai/chat-completion-ai/openai-next-chat-completion.ts +78 -0
- package/src/ai/embedding-ai/embedding-ai.ts +63 -0
- package/src/ai/embedding-ai/embedding.ts +50 -0
- package/src/ai/embedding-ai/index.ts +4 -0
- package/src/ai/embedding-ai/openai-next-embedding.ts +23 -0
- package/src/ai/index.ts +4 -0
- package/src/aio/README.md +100 -0
- package/src/aio/content.ts +141 -0
- package/src/aio/index.ts +3 -0
- package/src/aio/json.ts +127 -0
- package/src/aio/prompt.ts +246 -0
- package/src/basic/README.md +20 -15
- package/src/basic/error.ts +19 -5
- package/src/basic/function.ts +2 -2
- package/src/basic/index.ts +1 -0
- package/src/basic/promise.ts +141 -71
- package/src/basic/schedule.ts +111 -0
- package/src/basic/stream.ts +135 -25
- package/src/credential/README.md +107 -0
- package/src/credential/api-key.ts +158 -0
- package/src/credential/bearer.ts +73 -0
- package/src/credential/index.ts +4 -0
- package/src/credential/json-web-token.ts +96 -0
- package/src/credential/password.ts +170 -0
- package/src/cron/README.md +86 -0
- package/src/cron/cron.ts +87 -0
- package/src/cron/index.ts +1 -0
- package/src/drizzle/README.md +1 -0
- package/src/drizzle/drizzle.ts +1 -0
- package/src/drizzle/helper.ts +47 -0
- package/src/drizzle/index.ts +5 -0
- package/src/drizzle/infer.ts +52 -0
- package/src/drizzle/kysely.ts +8 -0
- package/src/drizzle/pagination.ts +198 -0
- package/src/email/README.md +1 -0
- package/src/email/index.ts +1 -0
- package/src/email/resend.ts +25 -0
- package/src/event/class-event-proxy.ts +5 -6
- package/src/event/common.ts +13 -3
- package/src/event/event-manager.ts +3 -3
- package/src/event/instance-event-proxy.ts +5 -6
- package/src/event/internal.ts +4 -4
- package/src/exception/README.md +28 -19
- package/src/exception/error/error.ts +123 -0
- package/src/exception/error/index.ts +2 -0
- package/src/exception/error/match.ts +38 -0
- package/src/exception/error/must-fix.ts +17 -0
- package/src/exception/index.ts +2 -0
- package/src/file-system/find.ts +53 -0
- package/src/file-system/index.ts +2 -0
- package/src/file-system/path.ts +76 -0
- package/src/file-system/resolve.ts +22 -0
- package/src/form/README.md +25 -0
- package/src/form/index.ts +1 -0
- package/src/form/inputor-controller/base.ts +861 -0
- package/src/form/inputor-controller/boolean.ts +39 -0
- package/src/form/inputor-controller/file.ts +39 -0
- package/src/form/inputor-controller/form.ts +179 -0
- package/src/form/inputor-controller/helper.ts +117 -0
- package/src/form/inputor-controller/index.ts +17 -0
- package/src/form/inputor-controller/multi-select.ts +99 -0
- package/src/form/inputor-controller/number.ts +116 -0
- package/src/form/inputor-controller/select.ts +109 -0
- package/src/form/inputor-controller/text.ts +82 -0
- package/src/http/READMD.md +1 -0
- package/src/http/api/api-core.ts +84 -0
- package/src/http/api/api-handler.ts +79 -0
- package/src/http/api/api-host.ts +47 -0
- package/src/http/api/api-result.ts +56 -0
- package/src/http/api/api-schema.ts +154 -0
- package/src/http/api/api-server.ts +130 -0
- package/src/http/api/api-test.ts +142 -0
- package/src/http/api/api-type.ts +34 -0
- package/src/http/api/api.ts +81 -0
- package/src/http/api/index.ts +11 -0
- package/src/http/api-adapter/api-core-node-http.ts +260 -0
- package/src/http/api-adapter/api-host-node-http.ts +156 -0
- package/src/http/api-adapter/api-result-arktype.ts +294 -0
- package/src/http/api-adapter/api-result-zod.ts +286 -0
- package/src/http/api-adapter/index.ts +5 -0
- package/src/http/bin/gen-api-list/gen-api-list.ts +126 -0
- package/src/http/bin/gen-api-list/index.ts +1 -0
- package/src/http/bin/gen-api-test/gen-api-test.ts +136 -0
- package/src/http/bin/gen-api-test/index.ts +1 -0
- package/src/http/bin/gen-api-type/calc-code.ts +25 -0
- package/src/http/bin/gen-api-type/gen-api-type.ts +127 -0
- package/src/http/bin/gen-api-type/index.ts +2 -0
- package/src/http/bin/index.ts +2 -0
- package/src/http/index.ts +3 -0
- package/src/huawei/README.md +1 -0
- package/src/huawei/index.ts +2 -0
- package/src/huawei/moderation/index.ts +1 -0
- package/src/huawei/moderation/moderation.ts +355 -0
- package/src/huawei/obs/esdk-obs-nodejs.d.ts +87 -0
- package/src/huawei/obs/index.ts +1 -0
- package/src/huawei/obs/obs.ts +42 -0
- package/src/index.ts +21 -2
- package/src/json/README.md +92 -0
- package/src/json/index.ts +1 -0
- package/src/json/repair.ts +18 -0
- package/src/log/logger.ts +15 -4
- package/src/openai/README.md +1 -0
- package/src/openai/index.ts +1 -0
- package/src/openai/openai.ts +509 -0
- package/src/orchestration/README.md +9 -7
- package/src/orchestration/dispatching/dispatcher.ts +83 -0
- package/src/orchestration/dispatching/index.ts +2 -0
- package/src/orchestration/dispatching/selector/base-selector.ts +39 -0
- package/src/orchestration/dispatching/selector/down-count-selector.ts +119 -0
- package/src/orchestration/dispatching/selector/index.ts +2 -0
- package/src/orchestration/index.ts +2 -0
- package/src/orchestration/scheduling/index.ts +2 -0
- package/src/orchestration/scheduling/scheduler.ts +103 -0
- package/src/orchestration/scheduling/task.ts +32 -0
- package/src/random/README.md +8 -7
- package/src/random/base.ts +66 -0
- package/src/random/index.ts +5 -1
- package/src/random/random-boolean.ts +40 -0
- package/src/random/random-integer.ts +60 -0
- package/src/random/random-number.ts +72 -0
- package/src/random/random-string.ts +66 -0
- package/src/request/README.md +108 -0
- package/src/request/fetch/base.ts +108 -0
- package/src/request/fetch/browser.ts +280 -0
- package/src/request/fetch/general.ts +20 -0
- package/src/request/fetch/index.ts +4 -0
- package/src/request/fetch/nodejs.ts +280 -0
- package/src/request/index.ts +2 -0
- package/src/request/request/base.ts +246 -0
- package/src/request/request/general.ts +63 -0
- package/src/request/request/index.ts +3 -0
- package/src/request/request/resource.ts +68 -0
- package/src/result/README.md +4 -0
- package/src/result/controller.ts +58 -0
- package/src/result/either.ts +363 -0
- package/src/result/generator.ts +168 -0
- package/src/result/index.ts +3 -0
- package/src/route/README.md +105 -0
- package/src/route/adapter/browser.ts +122 -0
- package/src/route/adapter/driver.ts +56 -0
- package/src/route/adapter/index.ts +2 -0
- package/src/route/index.ts +3 -0
- package/src/route/router/index.ts +2 -0
- package/src/route/router/route.ts +630 -0
- package/src/route/router/router.ts +1641 -0
- package/src/route/uri/hash.ts +307 -0
- package/src/route/uri/index.ts +7 -0
- package/src/route/uri/pathname.ts +376 -0
- package/src/route/uri/search.ts +412 -0
- package/src/service/README.md +1 -0
- package/src/service/index.ts +1 -0
- package/src/service/service.ts +110 -0
- package/src/socket/README.md +105 -0
- package/src/socket/client/index.ts +2 -0
- package/src/socket/client/socket-unit.ts +658 -0
- package/src/socket/client/socket.ts +203 -0
- package/src/socket/common/index.ts +2 -0
- package/src/socket/common/socket-unit-common.ts +23 -0
- package/src/socket/common/socket-unit-heartbeat.ts +427 -0
- package/src/socket/index.ts +3 -0
- package/src/socket/server/index.ts +3 -0
- package/src/socket/server/server.ts +183 -0
- package/src/socket/server/socket-unit.ts +448 -0
- package/src/socket/server/socket.ts +264 -0
- package/src/storage/table.ts +3 -3
- package/src/timer/expiration/expiration-manager.ts +3 -3
- package/src/timer/expiration/remaining-manager.ts +3 -3
- package/src/tube/README.md +99 -0
- package/src/tube/helper.ts +137 -0
- package/src/tube/index.ts +2 -0
- package/src/tube/tube.ts +880 -0
- package/src/weixin/README.md +1 -0
- package/src/weixin/index.ts +2 -0
- package/src/weixin/official-account/authorization.ts +157 -0
- package/src/weixin/official-account/index.ts +2 -0
- package/src/weixin/official-account/js-api.ts +132 -0
- package/src/weixin/open/index.ts +1 -0
- package/src/weixin/open/oauth2.ts +131 -0
- package/tests/unit/ai/ai.spec.ts +85 -0
- package/tests/unit/aio/content.spec.ts +105 -0
- package/tests/unit/aio/json.spec.ts +146 -0
- package/tests/unit/aio/prompt.spec.ts +111 -0
- package/tests/unit/basic/error.spec.ts +16 -4
- package/tests/unit/basic/promise.spec.ts +158 -50
- package/tests/unit/basic/schedule.spec.ts +74 -0
- package/tests/unit/basic/stream.spec.ts +90 -37
- package/tests/unit/credential/api-key.spec.ts +36 -0
- package/tests/unit/credential/bearer.spec.ts +23 -0
- package/tests/unit/credential/json-web-token.spec.ts +23 -0
- package/tests/unit/credential/password.spec.ts +40 -0
- package/tests/unit/cron/cron.spec.ts +84 -0
- package/tests/unit/event/class-event-proxy.spec.ts +3 -3
- package/tests/unit/event/event-manager.spec.ts +3 -3
- package/tests/unit/event/instance-event-proxy.spec.ts +3 -3
- package/tests/unit/exception/error/error.spec.ts +83 -0
- package/tests/unit/exception/error/match.spec.ts +81 -0
- package/tests/unit/form/inputor-controller/base.spec.ts +458 -0
- package/tests/unit/form/inputor-controller/boolean.spec.ts +30 -0
- package/tests/unit/form/inputor-controller/file.spec.ts +27 -0
- package/tests/unit/form/inputor-controller/form.spec.ts +120 -0
- package/tests/unit/form/inputor-controller/helper.spec.ts +67 -0
- package/tests/unit/form/inputor-controller/multi-select.spec.ts +34 -0
- package/tests/unit/form/inputor-controller/number.spec.ts +36 -0
- package/tests/unit/form/inputor-controller/select.spec.ts +49 -0
- package/tests/unit/form/inputor-controller/text.spec.ts +34 -0
- package/tests/unit/http/api/api-core-host.spec.ts +207 -0
- package/tests/unit/http/api/api-schema.spec.ts +120 -0
- package/tests/unit/http/api/api-server.spec.ts +363 -0
- package/tests/unit/http/api/api-test.spec.ts +117 -0
- package/tests/unit/http/api/api.spec.ts +121 -0
- package/tests/unit/http/api-adapter/node-http.spec.ts +187 -0
- package/tests/unit/identifier/uuid.spec.ts +0 -1
- package/tests/unit/json/repair.spec.ts +11 -0
- package/tests/unit/log/logger.spec.ts +19 -4
- package/tests/unit/openai/openai.spec.ts +64 -0
- package/tests/unit/orchestration/dispatching/dispatcher.spec.ts +41 -0
- package/tests/unit/orchestration/dispatching/selector/down-count-selector.spec.ts +81 -0
- package/tests/unit/orchestration/scheduling/scheduler.spec.ts +103 -0
- package/tests/unit/random/base.spec.ts +58 -0
- package/tests/unit/random/random-boolean.spec.ts +25 -0
- package/tests/unit/random/random-integer.spec.ts +32 -0
- package/tests/unit/random/random-number.spec.ts +33 -0
- package/tests/unit/random/random-string.spec.ts +22 -0
- package/tests/unit/request/fetch/browser.spec.ts +222 -0
- package/tests/unit/request/fetch/general.spec.ts +43 -0
- package/tests/unit/request/fetch/nodejs.spec.ts +225 -0
- package/tests/unit/request/request/base.spec.ts +382 -0
- package/tests/unit/request/request/general.spec.ts +160 -0
- package/tests/unit/result/controller.spec.ts +82 -0
- package/tests/unit/result/either.spec.ts +377 -0
- package/tests/unit/result/generator.spec.ts +273 -0
- package/tests/unit/route/router/route.spec.ts +430 -0
- package/tests/unit/route/router/router.spec.ts +407 -0
- package/tests/unit/route/uri/hash.spec.ts +72 -0
- package/tests/unit/route/uri/pathname.spec.ts +146 -0
- package/tests/unit/route/uri/search.spec.ts +107 -0
- package/tests/unit/socket/client.spec.ts +208 -0
- package/tests/unit/socket/server.spec.ts +133 -0
- package/tests/unit/socket/socket-unit-heartbeat.spec.ts +214 -0
- package/tests/unit/tube/helper.spec.ts +139 -0
- package/tests/unit/tube/tube.spec.ts +501 -0
- package/vite.config.ts +2 -1
- package/dist/index.js +0 -50
- package/dist/index.js.map +0 -209
- package/src/random/string.ts +0 -35
- package/tests/unit/random/string.spec.ts +0 -11
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createTaggedError } from "./error.ts"
|
|
2
|
+
import type { TaggedErrorConstructor } from "./error.ts"
|
|
3
|
+
|
|
4
|
+
const MustFixErrorBase: TaggedErrorConstructor<"MustFix", {
|
|
5
|
+
message: string
|
|
6
|
+
cause?: unknown
|
|
7
|
+
}> = createTaggedError("MustFix")()
|
|
8
|
+
export class MustFixError extends MustFixErrorBase {
|
|
9
|
+
//
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const mustFixError = (message: string, options?: { cause?: unknown }): MustFixError => {
|
|
13
|
+
return new MustFixError({ message, cause: options?.cause })
|
|
14
|
+
}
|
|
15
|
+
export const isMustFixError = (error: unknown): error is MustFixError => {
|
|
16
|
+
return MustFixError.is(error)
|
|
17
|
+
}
|
package/src/exception/index.ts
CHANGED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { statSync } from "node:fs"
|
|
2
|
+
import { dirname, join, parse, resolve } from "node:path"
|
|
3
|
+
import type { ResolveFriendlyOptions } from "./resolve.ts"
|
|
4
|
+
import { resolveStartPath } from "./resolve.ts"
|
|
5
|
+
|
|
6
|
+
export interface GetClosestFilePathOptions extends ResolveFriendlyOptions {
|
|
7
|
+
targetBase: string
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 从 {@link ResolveFriendlyOptions.startPath} 开始,逐级向上查找,直到找到指定的文件为止,并返回该文件的路径。
|
|
11
|
+
* 若未找到指定的文件,则返回 undefined。
|
|
12
|
+
*/
|
|
13
|
+
export const getClosestFilePath = (
|
|
14
|
+
options: GetClosestFilePathOptions
|
|
15
|
+
): string | undefined => {
|
|
16
|
+
const { targetBase } = options
|
|
17
|
+
|
|
18
|
+
const startPath = resolveStartPath(options)
|
|
19
|
+
|
|
20
|
+
let currentDir = startPath
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
const stat = statSync(startPath)
|
|
24
|
+
if (stat.isFile()) {
|
|
25
|
+
currentDir = dirname(startPath)
|
|
26
|
+
}
|
|
27
|
+
} catch {
|
|
28
|
+
currentDir = dirname(startPath)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const { root } = parse(currentDir)
|
|
32
|
+
|
|
33
|
+
while (true) {
|
|
34
|
+
const filePath = resolve(join(currentDir, targetBase))
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
const stat = statSync(filePath)
|
|
38
|
+
if (stat.isFile()) {
|
|
39
|
+
return filePath
|
|
40
|
+
}
|
|
41
|
+
} catch {
|
|
42
|
+
//
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (currentDir === root) {
|
|
46
|
+
break
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
currentDir = dirname(currentDir)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return undefined
|
|
53
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { join, parse } from "node:path"
|
|
2
|
+
import { fileURLToPath } from "node:url"
|
|
3
|
+
|
|
4
|
+
export type PathString = string
|
|
5
|
+
export interface PathObject {
|
|
6
|
+
path: string
|
|
7
|
+
root: string
|
|
8
|
+
dir: string
|
|
9
|
+
base: string
|
|
10
|
+
ext: string
|
|
11
|
+
name: string
|
|
12
|
+
separator: string
|
|
13
|
+
}
|
|
14
|
+
export type PathUnion = PathString | PathObject
|
|
15
|
+
|
|
16
|
+
export const pathStringToObject = (pathString: string): PathObject => {
|
|
17
|
+
const pathObject = parse(pathString)
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
root: pathObject.root,
|
|
21
|
+
path: pathString,
|
|
22
|
+
dir: pathObject.dir,
|
|
23
|
+
base: pathObject.base,
|
|
24
|
+
ext: pathObject.ext,
|
|
25
|
+
name: pathObject.name,
|
|
26
|
+
separator: join("a", "b").replaceAll('a', "").replaceAll('b', "")
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const pathObjectToString = (pathObject: PathObject): string => {
|
|
31
|
+
return pathObject.path
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const toPathObject = (path: PathUnion): PathObject => {
|
|
35
|
+
if (typeof path === "string") {
|
|
36
|
+
if (isFileUrl(path)) {
|
|
37
|
+
return fileUrlToPathObject(path)
|
|
38
|
+
} else {
|
|
39
|
+
return pathStringToObject(path)
|
|
40
|
+
}
|
|
41
|
+
} else {
|
|
42
|
+
return path
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const toPathString = (path: PathUnion): string => {
|
|
47
|
+
if (typeof path === "string") {
|
|
48
|
+
if (isFileUrl(path)) {
|
|
49
|
+
return fileUrlToPathString(path)
|
|
50
|
+
} else {
|
|
51
|
+
return path
|
|
52
|
+
}
|
|
53
|
+
} else {
|
|
54
|
+
return pathObjectToString(path)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const isFileUrl = (url: string): boolean => {
|
|
59
|
+
try {
|
|
60
|
+
const parsedUrl = new URL(url)
|
|
61
|
+
return parsedUrl.protocol === "file:"
|
|
62
|
+
} catch {
|
|
63
|
+
return false
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export const fileUrlToPathString = (fileUrl: string): PathString => {
|
|
68
|
+
return fileURLToPath(fileUrl)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export const fileUrlToPathObject = (fileUrl: string): PathObject => {
|
|
72
|
+
const pathString = fileUrlToPathString(fileUrl)
|
|
73
|
+
const pathObject = pathStringToObject(pathString)
|
|
74
|
+
|
|
75
|
+
return pathObject
|
|
76
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { isAbsolute, join, resolve } from "node:path"
|
|
2
|
+
|
|
3
|
+
export interface ResolveFriendlyOptions {
|
|
4
|
+
startPath?: string | undefined
|
|
5
|
+
}
|
|
6
|
+
export const resolveStartPath = (options: ResolveFriendlyOptions): string => {
|
|
7
|
+
const { startPath } = options
|
|
8
|
+
|
|
9
|
+
if (startPath === undefined) {
|
|
10
|
+
return getCurrentWorkingDirectory()
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (isAbsolute(startPath)) {
|
|
14
|
+
return startPath
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return resolve(join(getCurrentWorkingDirectory(), startPath))
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const getCurrentWorkingDirectory = (): string => {
|
|
21
|
+
return process.cwd()
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Form
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
Form 模块提供围绕类表单输入项(form-like input)及其组合关系的通用建模能力,用于表达输入状态、值转换与聚合边界。
|
|
6
|
+
|
|
7
|
+
它关注的不是某个组件库的渲染细节,也不是某个框架各自的表单接入方式,而是“一个输入项应如何被视为可独立管理的输入原子、多个输入项如何组合成更高层的类表单数据管理器、以及输入值与聚合值如何保持清楚且可维护的对应关系”这一类基础问题。它之所以被命名为 Form,不是因为它只服务于页面表单,而是因为表单场景最自然、最直观地体现了这类模型的价值。
|
|
8
|
+
|
|
9
|
+
## For Understanding
|
|
10
|
+
|
|
11
|
+
理解 Form 模块时,首先应把它看成“类表单数据管理模型”,而不是“页面表单组件集合”或“校验规则工具箱”。它要解决的问题,不是把某个现成表单 API 重新包装一遍,而是为输入项本身建立稳定语义:一个输入项有哪些核心状态,输入过程与最终值如何区分,多个输入项如何组合,以及组合之后的整体值应如何被表达。
|
|
12
|
+
|
|
13
|
+
这个模块更适合放在以下边界中:
|
|
14
|
+
|
|
15
|
+
- 你希望把输入逻辑从具体接入层中抽离出来,让输入状态、值更新和聚合关系可以在不同 UI、服务端流程或其它非界面场景之间复用。
|
|
16
|
+
- 你需要先把输入项视为一组可独立管理的输入原子,再把它们组合成更高层的类表单数据管理器,而不是一开始就把所有逻辑揉成单个大对象。
|
|
17
|
+
- 你需要明确区分“输入过程中的值”和“对外稳定表达的值”,并希望这种区分能够成为长期可维护的公共语义。
|
|
18
|
+
|
|
19
|
+
理解这个模块时,还应守住几条边界原则:
|
|
20
|
+
|
|
21
|
+
- Form 模块表达的是输入项状态、输入项组合与值映射语义,不负责页面布局、样式、校验文案或具体提交流程。
|
|
22
|
+
- 它可以服务于具体输入组件,但不应因为适配某个框架或某种表单交互习惯,而把这些宿主细节直接上升为模块公共语义。
|
|
23
|
+
- 它关注的是“输入项如何被建模、如何更新、如何聚合”,而不是所有表单相关问题的总容器;像复杂校验编排、错误展示策略、网络提交流程或业务字段规范,通常应由更上层模块承担。
|
|
24
|
+
|
|
25
|
+
因此,更合适的理解方式是:Form 模块提供的是一套围绕输入原子与类表单聚合的数据管理基础模型能力。表单只是它最典型的落点之一,而不是它的唯一归宿。只有当某个能力确实在澄清这条边界时,它才适合作为该模块的组成部分;如果某个能力只是某类页面表单的临时便利封装,那么它通常不应直接进入这个模块。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./inputor-controller/index.ts"
|