@planet-matrix/mobius-mono 0.4.2 → 0.5.0

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # @planet-matrix/mobius-mono
2
2
 
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 1297345: Update Mobius Mono.
8
+
9
+ 使用 `.npmignore` 代替 `files` 字段,重新撰写 Mobius Mono 文档等。
10
+
3
11
  ## 0.4.2
4
12
 
5
13
  ### Patch Changes
package/README.md CHANGED
@@ -1,153 +1,41 @@
1
1
  # Mobius Mono
2
2
 
3
- Mobius Mono 是一个用于规范项目的项目,由规范文本(Specification)、配套工具(Tool)组成。
3
+ Mobius Mono 是一个用于对项目开发进行规范的项目,目标是将项目开发中与核心业务逻辑无关的部分全部标准化,一方面开发者可以专注于业务逻辑的开发,另一方面不同项目可以共享相同的基础设施,从而提升整体的开发体验、协同效率和交付质量。同时,清晰明确的规范也能够提高人与 AI 协同开发或全 AI 驱动开发的效率和质量。
4
4
 
5
- 该规范的正式名称为 Mobius Mono。在指称该规范时,可称为“Mobius Mono 规范”或“Mobius Mono Spec”。
5
+ 项目开发中,所有的规范都可以具体为对某个或某些文件的要求,基于这样的理解,Mobius Mono 的规范等价于一个规则集,其中每条规则都对应于对某个或某些文件的某种要求,这个规则集会随着时间的推移不断演进和完善,以适应不断变化的开发需求和技术环境。
6
6
 
7
- ## Principles
7
+ 每条规则都有对应的代码实现,可以通过调用代码来执行目标规则的查看、检查、修正、迁移等操作,调用代码的操作可以手动完成,也可以配合 CI/CD 等工具自动完成,而无需全凭人工注意来保障规则的遵守。
8
8
 
9
- - 不考虑保障不符合 Mobius Mono 规范的项目的开发体验。
10
- - 优先使用 TypeScript,并且只在必要的时候转译为 JavaScript。
11
- - 业务代码中优先使用跨运行时、跨平台兼容的特性。
12
- - 优先使用 Bun 提供的基础设施(infra)。
13
- - 优先使用 Oxc 生态系统中的工具。
14
- - 所有敏感信息都只通过环境变量提供。
9
+ ## Documentation
15
10
 
16
- ## Specification
11
+ - Mobius Mono 规范的文本版本请查阅 [Mobius Mono Specification](./docs/mobius-mono-specification.md)。
12
+ - 如何在项目中使用 Mobius Mono 规范请查阅 [Getting Started](./docs/getting-started.md)。
17
13
 
18
- ### Monorepo
14
+ ## Todos & Drafts
19
15
 
20
- - 所有子包均放置在 `packages/` 目录下,仅支持一级子包,不支持多级嵌套。
21
- - Monorepo 只是为了方便管理多个包,并不影响每个包的独立性,每个子包都拥有独立的 `package.json`、`tsconfig.json`、`README.md`、`LICENSE` 等文件,可以独立发布。
22
-
23
- ### File
24
-
25
- - 文件、目录命名格式应使用 kebab-case,约定俗成的文件或目录可以例外,如 `node_modules` 等。
26
- - 文件、目录命名区分大小写且应该尽可能只使用小写字母,约定俗成的文件或目录可以例外,如 `README.md`、`CHANGELOG.md`、`LICENSE` 等。
27
- - 文件、目录命名时,表示集合用复数,如 `scripts`、`tests`、`docs` 等,表示概念用单数,如 `dist`、`signal`、`build` 等,约定俗成的文件或目录可以例外,如 `src`、`bin` 等。
28
-
29
- ### Package
30
-
31
- - 使用 Bun 作为包管理工具。
32
- - 无论是源代码还是打包产物,都只支持 ES Modules。
33
- - 本地发包时,npm token 写在操作者的全局 `.npmrc` 中,CI/CD 发包时,使用 [Trusted publishing](https://docs.npmjs.com/trusted-publishers)。
34
- - 除敏感文件、临时文件、`node_modules` 外,其它所有文件均作为包的一部分进行发布。
35
-
36
- - `package.json` 一定要设置 `name` 字段。
37
- - `package.json` 一定要设置 `version` 字段。
38
- - `package.json` 一定要设置 `description` 字段。
39
- - `package.json` 一定要设置 `keywords` 字段。
40
- - `package.json` 一定要设置 `homepage` 字段,若没有 Homepage,该字段的值可设置为项目的仓库地址。
41
- - `package.json` 一定要设置 `bugs` 字段,`bugs` 字段的值一定要是对象,该对象一定要包含 `url` 字段,且 `url` 字段的值一定要是项目的 issue 地址,该对象一定要包含 `email` 字段,且 `email` 字段的值一定要是项目所有者的邮箱地址。
42
- - `package.json` 一定要设置 `license` 字段。
43
- - `package.json` 一定要设置 `author` 字段,且 `author` 字段的值一定要是对象,该对象一定要包含 `name` 字段,且 `name` 字段的值一定要是项目所有者的名称,该对象一定要包含 `email` 字段,且 `email` 字段的值一定要是项目所有者的邮箱地址,该对象一定要包含 `url` 字段,且 `url` 字段的值一定要是项目所有者的主页地址。
44
- - `package.json` 一定要设置 `contributors` 字段。
45
- - `package.json` 一定要设置 `files` 字段,`files` 字段的值一定要是 `["*"]`。
46
- - `package.json` 一定要设置 `bin` 字段,`bin` 字段的值一定要是对象。
47
- - `package.json` 一定要设置 `man` 字段,`man` 字段的值一定要是数组。
48
- - `package.json` 一定要设置 `type` 字段,该字段的值一定要是 `module`。
49
- - `package.json` 一定要设置 `exports` 字段,`exports` 字段的值一定要是对象,该对象至少要包含 `.` 字段用于指定包的主要入口文件,且 `.` 字段的值一定要是包含且只包含 `import` 字段的对象(只支持 ES Modules),且 `import` 字段的值一定要是对象,该对象的字段包含且只包含 `@planet-matrix/mobius-mono`、`bun`、`types` 和 `default` 四个字段(顺序一定要与描述一致,虽然 Node.js [推荐](https://nodejs.org/api/packages.html#community-conditions-definitions)总是将 `types` 作为第一个 condition,但 Live TypeScript 追求直接指向 `.ts` 文件,因此将 `types` condition 后移)。示例如下:
50
- ```jsonc
51
- {
52
- // other fields of package.json omitted
53
- "exports": {
54
- ".": {
55
- "import": {
56
- "@planet-matrix/mobius-mono": "./src/index.ts",
57
- "bun": "./src/index.ts",
58
- "types": "./dist/index.d.ts",
59
- "default": "./dist/index.js"
60
- }
61
- },
62
- // other subpath omitted
63
- },
64
- // other fields of package.json omitted
65
- }
66
- ```
67
- - `package.json` 一定要设置 `imports` 字段。示例如下:
68
- ```jsonc
69
- {
70
- // other fields of package.json omitted
71
- "imports": {
72
- "#Project/*": {
73
- "import": {
74
- "@planet-matrix/mobius-mono": "./*",
75
- "bun": "./*",
76
- "default": "./*"
77
- }
78
- },
79
- "#Source/*": {
80
- "import": {
81
- "@planet-matrix/mobius-mono": "./src/*",
82
- "bun": "./src/*",
83
- "default": "./src/*"
84
- }
85
- },
86
- // other subpath omitted
87
- },
88
- // other fields of package.json omitted
89
- }
90
- ```
91
- - `package.json` 一定不要设置 `main` 字段。
92
- - `package.json` 一定要设置 `repository` 字段,且 `repository` 字段的值一定要是对象,该对象一定要包含 `type` 字段,且 `type` 字段的值一定要是 `git`,该对象一定要包含 `url` 字段,且 `url` 字段的值一定要是项目的仓库地址,如果该包位于 monorepo 中且该 `package.json` 不位于仓库根目录,该对象一定要包含 `directory` 字段,且 `directory` 字段的值一定要是该包相对于仓库根目录的路径。
93
- - `package.json` 一定要设置 `scripts` 字段。
94
- - `package.json` 一定要设置 `dependencies` 字段。
95
- - `package.json` 一定要设置 `devDependencies` 字段。
96
- - `package.json` 一定要设置 `peerDependencies` 字段。
97
- - `package.json` 一定要设置 `peerDependenciesMeta` 字段。
98
- - `package.json` 一定要设置 `bundleDependencies` 字段。
99
- - `package.json` 一定要设置 `optionalDependencies` 字段。
100
- - `package.json` 一定要设置 `overrides` 字段。
101
-
102
- ### TypeScript
103
-
104
- - 仅将 TypeScript(此处不是指作为语言的 TypeScript,而是指配套的库或工具)作为提升开发体验的工具使用,将类型文件输出、代码转译等工作交给其它工具来完成。
105
- - TypeScript 配置尽量与 Bun 的推荐配置保持一致,见:https://bun.com/docs/typescript。
106
-
107
- - 将 `compilerOptions.allowImportingTsExtensions` 设置为 `true`,导入任意文件都一定要包含文件扩展名。
108
- - 将 `@planet-matrix/mobius-mono` 设置为 `compilerOptions.customConditions` 的第一项,遵循 Mobius Mono 规范的项目会将 `@planet-matrix/mobius-mono` 作为 conditional exports 的第一个 condition,从而实现 Live TypeScript(aka. Live Types)。
109
- - 将 `compilerOptions.module` 设置为 `preserve`,虽然我们不使用 TypeScript 来转译代码,但设置这个字段有助于 TypeScript 正确处理类型,从而提升开发体验。
110
- - 将 `compilerOptions.moduleResolution` 设置为 `bundler`,从而让 TypeScript 可以正确消费 `package.json` 中的 `imports` 和 `exports` 字段。
111
- - 将 `compilerOptions.noUncheckedSideEffectImports` 设置为 `true`,从而让 TypeScript 严格检查所有的副作用导入语句,避免导入不存在的模块。
112
- - 将 `compilerOptions.paths` 设置为 `{}`(即不使用该功能),使用 [subpath imports](https://nodejs.org/api/packages.html#subpath-imports) 作为替代方案,后者被 Node.js、Bun 等运行时原生支持,且在 `package.json` 中进行定义可以更加显式地体现包的情况。
113
- - 将 `compilerOptions.resolveJsonModule` 设置为 `true`,从而允许导入 JSON 文件。
114
- - 将 `compilerOptions.resolvePackageJsonExports` 设置为 `true`,从而让 TypeScript 可以正确消费 `package.json` 中的 `exports` 字段。
115
- - 将 `compilerOptions.resolvePackageJsonImports` 设置为 `true`,从而让 TypeScript 可以正确消费 `package.json` 中的 `imports` 字段。
116
- - 将 `compilerOptions.rewriteRelativeImportExtensions` 设置为 `false`,我们不使用 TypeScript 来转译代码,开启该选项会产生额外的报错,如 `This import uses a '.ts' extension to resolve to an input TypeScript file, but will not be rewritten during emit because it is not a relative path.`。
117
- - 将 `compilerOptions.typeRoots` 设置为 `["${configDir}/node_modules/@types"]`,从而让 TypeScript 只消费项目直接依赖的类型定义文件。
118
- - 将 `compilerOptions.types` 字段注释,否则 `compilerOptions.typeRoots` 不会生效。
119
- - 将 `compilerOptions.noEmit` 设置为 `true`,原因之一是我们不使用 TypeScript 来转译代码,原因之二是我们开启了 `compilerOptions.allowImportingTsExtensions`,开启该选项要求 `either --noEmit or --emitDeclarationOnly to be set`。
120
- - 将 `compilerOptions.forceConsistentCasingInFileNames` 设置为 `true`。
121
- - 将 `compilerOptions.isolatedDeclarations` 设置为 `true`。
122
- - 将 `compilerOptions.isolateModules` 设置为 `true`。
123
- - 将 `compilerOptions.verbatimModuleSyntax` 设置为 `true`。
124
- - 将 `compilerOptions.lib` 设置为 `["ESNext", "DOM", "WebWorker", "ScriptHost"]`,即默认启用所有不同运行环境的 API,以保持开发体验的一致性,正确性和跨平台兼容性由代码来保障。
125
- - 将 `compilerOptions.moduleDetection` 设置为 `force`,即要求尽可能将所有代码编写成模块。
126
- - 将 `compilerOptions.noLib` 设置为 `false`。
127
- - 将 `compilerOptions.target` 设置为 `esnext`,即拥抱最新的 JavaScript 特性。
128
-
129
- ### Lint
130
-
131
- - 将 Formatting 视为 Linting 的一部分。
132
- - import 任意文件都一定要包含文件扩展名。
133
-
134
- ### Build
135
-
136
- - `bin` 目录下的文件不需要打包,优先使用 Bun 直接运行。
137
-
138
- ### Change
16
+ - [ ] 当 oxfmt 支持在 monorepo 中为不同的包添加不同的配置之后将其引入。
17
+ - [ ] 当 oxlint `extends` 字段支持指定包产物时,更新所有相关配置。
18
+ - [ ] `change publish` 支持 dry-run 参数。
19
+ - [ ] 规则稳定之后,将其实现为代码。
139
20
 
140
- - 基于 [changesets](https://github.com/changesets/changesets) 做变更管理。
21
+ 几乎所有操作都可以理解为对文件的操作,包括但不限于:
141
22
 
142
- ## Tool
23
+ - 新增不存在的文件。
24
+ - 检查已存在的文件。
25
+ - 修改已存在的文件。
26
+ - 删除已存在的文件。
143
27
 
144
28
  ```
145
-
29
+ bun mono repository init
30
+ bun mono repository check
31
+ bun mono repository correct
32
+ bun mono file check
33
+ bun mono package add --template <template-name>
34
+ bun mono package remove
35
+ bun mono package check
36
+ bun mono package correct
37
+ bun mono typescript check
38
+ bun mono change add
39
+ bun mono change version
40
+ bun mono change publish
146
41
  ```
147
-
148
- ## Todos
149
-
150
- - [ ] 当 oxfmt 支持在 monorepo 中为不同的包添加不同的配置之后将其引入。
151
- - [ ] 当 oxlint `extends` 字段支持指定包产物时,更新所有相关配置。
152
- - [ ] `change publish` 支持 dry-run 参数。
153
- - [ ] 规范稳定之后,将其固化为工具。
@@ -0,0 +1,27 @@
1
+ # Getting Started
2
+
3
+ Mobius Mono 提供包含完整功能的 SDK、包含常用功能的 CLI、包含完整功能的 REPL、包含完整功能的 TUI,下载一个包即可获得前述所有。
4
+
5
+ ```bash
6
+ bun add @planet-matrix/mobius-mono -D
7
+ ```
8
+
9
+ ## SDK
10
+
11
+ ```typescript
12
+ import { /* ... */ } from "@planet-matrix/mobius-mono";
13
+ ```
14
+
15
+ ## CLI
16
+
17
+ ```bash
18
+ bun mono --help
19
+ ```
20
+
21
+ ## REPL
22
+
23
+ Planning...
24
+
25
+ ## TUI
26
+
27
+ Planning...
@@ -0,0 +1,207 @@
1
+ # Mobius Mono Specification
2
+
3
+ 此文档是 Mobius Mono 规范的文本版本。
4
+
5
+ 此规范的正式名称为 Mobius Mono 规范(zh_CN)、Mobius Mono Specification(en_US)。
6
+
7
+ ## Principles
8
+
9
+ - 不考虑保障不符合 Mobius Mono 规范的项目的开发体验。
10
+ - 优先使用 TypeScript,并且只在必要的时候转译为 JavaScript。
11
+ - 业务代码中优先使用跨运行时、跨平台兼容的特性。
12
+ - 优先使用 Bun 提供的基础设施(infra)。
13
+ - 优先使用 Oxc 生态系统中的工具。
14
+ - 放弃向后兼容性(backward compatibility),追求工程一致性(engineering consistency)。
15
+ - 追求显式性(explicitness),放弃隐式性(implicitness)。
16
+
17
+ ## Rules
18
+
19
+ ### Repository
20
+
21
+ - 仓库应该使用 Monorepo,无论有多少个包。
22
+ - 所有包都应该使用 Bun 作为包管理工具(包括 Root Package 在内)。
23
+ - 所有包都应该放在 `packages/` 目录下,不使用二级目录,不对包进行分组管理,仅支持一级包,不支持多级嵌套。
24
+ - 每个包都应该拥有独立的 `package.json`、`README.md`、 `CHANGELOG.md`、`LICENSE` 等文件,Monorepo 只是为了方便管理多个包,并不影响每个包的独立性,每个包都可以独立发布。
25
+ - 所有包名称(`package.json` 中的 `name` 字段)都应该使用相同的前缀,对于组织的包,名称是 `@<organization-name>/<common-prefix>-<package-name>`,对于个人的包,名称是 `<common-prefix>-<package-name>`。
26
+
27
+ - 仓库根目录一定要有 `.gitignore` 文件。标准的 `.gitignore` 文件内容如下:
28
+ ```
29
+ ```
30
+ - 仓库根目录一定要有 `bunfig.toml` 文件。
31
+ - 仓库根目录一定要有 `README.md` 文件。
32
+ - 仓库根目录一定要有 `package.json` 文件。
33
+ - 仓库根目录一定要有 `.vscode/` 目录,且该目录下一定要有 `settings.json` 文件和 `extensions.json` 文件。
34
+
35
+ ### File
36
+
37
+ - 文件、目录命名格式应使用 kebab-case,约定俗成的文件或目录可以例外,如 `node_modules` 等。
38
+ - 文件、目录命名区分大小写且应该尽可能只使用小写字母,约定俗成的文件或目录可以例外,如 `README.md`、`CHANGELOG.md`、`LICENSE` 等。
39
+ - 文件、目录命名时,表示集合用复数,如 `scripts`、`tests`、`docs` 等,表示概念用单数,如 `dist`、`signal`、`build` 等,约定俗成的文件或目录可以例外,如 `src`、`bin` 等。
40
+ - 文件、目录命名时,尽量避免使用缩写,约定俗成的文件或目录可以例外,如 `src`、`doc` 等。
41
+
42
+ ### Package
43
+
44
+ - 一定要有 `package.json` 文件。
45
+ - 一定要有 `.npmignore` 文件。
46
+ - 一定要有 `README.md` 文件。
47
+ - 一定要有 `CHANGELOG.md` 文件。
48
+ - 一定要有 `LICENSE` 文件。
49
+ - 一定要有 `tsconfig.json` 文件。
50
+ - 一定要有 `.oxlintrc.json` 文件。
51
+ - ……
52
+
53
+ ### Package Setting
54
+
55
+ - `package.json` 一定要设置 `name` 字段。
56
+ - `package.json` 一定要设置 `version` 字段。
57
+ - `package.json` 一定要设置 `description` 字段。
58
+ - `package.json` 一定要设置 `keywords` 字段。
59
+ - `package.json` 一定要设置 `homepage` 字段,若没有 Homepage,该字段的值可设置为项目的仓库地址。
60
+ - `package.json` 一定要设置 `bugs` 字段,`bugs` 字段的值一定要是对象,该对象一定要包含 `url` 字段,且 `url` 字段的值一定要是项目的 issue 地址,该对象一定要包含 `email` 字段,且 `email` 字段的值一定要是项目所有者的邮箱地址。
61
+ - `package.json` 一定要设置 `license` 字段。
62
+ - `package.json` 一定要设置 `author` 字段,且 `author` 字段的值一定要是对象,该对象一定要包含 `name` 字段,且 `name` 字段的值一定要是项目所有者的名称,该对象一定要包含 `email` 字段,且 `email` 字段的值一定要是项目所有者的邮箱地址,该对象一定要包含 `url` 字段,且 `url` 字段的值一定要是项目所有者的主页地址。
63
+ - `package.json` 一定要设置 `contributors` 字段。
64
+ - `package.json` 一定不要设置 `files` 字段。
65
+ - `package.json` 一定要设置 `bin` 字段,`bin` 字段的值一定要是对象。
66
+ - `package.json` 一定要设置 `man` 字段,`man` 字段的值一定要是数组。
67
+ - `package.json` 一定要设置 `type` 字段,该字段的值一定要是 `module`,源代码只支持 ES Modules。
68
+ - `package.json` 一定要设置 `exports` 字段,`exports` 字段的值一定要是对象,该对象至少要包含 `.` 字段用于指定包的主要入口文件,且 `.` 字段的值一定要是包含且只包含 `import` 字段的对象(只支持 ES Modules),且 `import` 字段的值一定要是对象,该对象的字段包含且只包含 `@planet-matrix/mobius-mono`、`bun`、`types` 和 `default` 四个字段(顺序一定要与描述一致,虽然 Node.js [推荐](https://nodejs.org/api/packages.html#community-conditions-definitions)总是将 `types` 作为第一个 condition,但 Live TypeScript 追求直接指向 `.ts` 文件,因此将 `types` condition 后移)。示例如下:
69
+ ```jsonc
70
+ {
71
+ // other fields of package.json omitted
72
+ "exports": {
73
+ ".": {
74
+ "import": {
75
+ "@planet-matrix/mobius-mono": "./src/index.ts",
76
+ "bun": "./src/index.ts",
77
+ "types": "./dist/index.d.ts",
78
+ "default": "./dist/index.js"
79
+ }
80
+ },
81
+ // other subpath omitted
82
+ },
83
+ // other fields of package.json omitted
84
+ }
85
+ ```
86
+ - `package.json` 一定要设置 `imports` 字段。示例如下:
87
+ ```jsonc
88
+ {
89
+ // other fields of package.json omitted
90
+ "imports": {
91
+ "#Project/*": {
92
+ "import": {
93
+ "@planet-matrix/mobius-mono": "./*",
94
+ "bun": "./*",
95
+ "default": "./*"
96
+ }
97
+ },
98
+ "#Source/*": {
99
+ "import": {
100
+ "@planet-matrix/mobius-mono": "./src/*",
101
+ "bun": "./src/*",
102
+ "default": "./src/*"
103
+ }
104
+ },
105
+ // other subpath omitted
106
+ },
107
+ // other fields of package.json omitted
108
+ }
109
+ ```
110
+ - `package.json` 一定不要设置 `main` 字段。
111
+ - `package.json` 一定要设置 `repository` 字段,且 `repository` 字段的值一定要是对象,该对象一定要包含 `type` 字段,且 `type` 字段的值一定要是 `git`,该对象一定要包含 `url` 字段,且 `url` 字段的值一定要是项目的仓库地址,如果该包位于 monorepo 中且该 `package.json` 不位于仓库根目录,该对象一定要包含 `directory` 字段,且 `directory` 字段的值一定要是该包相对于仓库根目录的路径。
112
+ - `package.json` 一定要设置 `scripts` 字段。
113
+ - `package.json` 一定要设置 `dependencies` 字段。
114
+ - `package.json` 一定要设置 `devDependencies` 字段。
115
+ - `package.json` 一定要设置 `peerDependencies` 字段。
116
+ - `package.json` 一定要设置 `peerDependenciesMeta` 字段。
117
+ - `package.json` 一定要设置 `bundleDependencies` 字段。
118
+ - `package.json` 一定要设置 `optionalDependencies` 字段。
119
+ - `package.json` 一定要设置 `overrides` 字段。
120
+
121
+ ### Package Publishing
122
+
123
+ - 本地发包时,npm token 写在操作者的全局 `.npmrc` 中,CI/CD 发包时,使用 [Trusted publishing](https://docs.npmjs.com/trusted-publishers)。
124
+ - 除敏感文件(含 token 等敏感信息的文件)、临时文件(代码构建时或运行时产生的缓存文件等)、`node_modules` 外,其它所有文件均作为包文件进行发布,所有包都应该使用 `.npmignore` 文件来排除不需要发布的文件。标准的 `.npmignore` 文件内容如下:
125
+ ```
126
+ # Mobius Mono ignores
127
+ .env/*
128
+ .env
129
+ .env.*
130
+
131
+ # npm default ignores
132
+
133
+ ## OS / Editor
134
+ *.orig
135
+ .*.swp
136
+ .DS_Store
137
+ ._*
138
+
139
+ ## VCS
140
+ .git
141
+ .hg
142
+ .svn
143
+ CVS
144
+
145
+ ## Node
146
+ node_modules
147
+ npm-debug.log
148
+
149
+ ## Lock files (for libraries)
150
+ package-lock.json
151
+ pnpm-lock.yaml
152
+ yarn.lock
153
+ bun.lockb
154
+
155
+ ## npm
156
+ .npmrc
157
+
158
+ ## Build
159
+ .lock-wscript
160
+ .wafpickle-N
161
+ config.gypi
162
+ ```
163
+
164
+ ### TypeScript
165
+
166
+ - 仅将 TypeScript(此处不是指作为语言的 TypeScript,而是指配套的库或工具)作为提升开发体验的工具使用,将类型文件输出、代码转译等工作交给其它工具来完成。
167
+ - TypeScript 配置尽量与 Bun 的推荐配置保持一致,见:https://bun.com/docs/typescript。
168
+
169
+ - 将 `compilerOptions.allowImportingTsExtensions` 设置为 `true`,导入任意文件都一定要包含文件扩展名。
170
+ - 将 `@planet-matrix/mobius-mono` 设置为 `compilerOptions.customConditions` 的第一项,遵循 Mobius Mono 规范的项目会将 `@planet-matrix/mobius-mono` 作为 conditional exports 的第一个 condition,从而实现 Live TypeScript(aka. Live Types)。
171
+ - 将 `compilerOptions.module` 设置为 `preserve`,虽然我们不使用 TypeScript 来转译代码,但设置这个字段有助于 TypeScript 正确处理类型,从而提升开发体验。
172
+ - 将 `compilerOptions.moduleResolution` 设置为 `bundler`,从而让 TypeScript 可以正确消费 `package.json` 中的 `imports` 和 `exports` 字段。
173
+ - 将 `compilerOptions.noUncheckedSideEffectImports` 设置为 `true`,从而让 TypeScript 严格检查所有的副作用导入语句,避免导入不存在的模块。
174
+ - 将 `compilerOptions.paths` 设置为 `{}`(即不使用该功能),使用 [subpath imports](https://nodejs.org/api/packages.html#subpath-imports) 作为替代方案,后者被 Node.js、Bun 等运行时原生支持,且在 `package.json` 中进行定义可以更加显式地体现包的情况。
175
+ - 将 `compilerOptions.resolveJsonModule` 设置为 `true`,从而允许导入 JSON 文件。
176
+ - 将 `compilerOptions.resolvePackageJsonExports` 设置为 `true`,从而让 TypeScript 可以正确消费 `package.json` 中的 `exports` 字段。
177
+ - 将 `compilerOptions.resolvePackageJsonImports` 设置为 `true`,从而让 TypeScript 可以正确消费 `package.json` 中的 `imports` 字段。
178
+ - 将 `compilerOptions.rewriteRelativeImportExtensions` 设置为 `false`,我们不使用 TypeScript 来转译代码,开启该选项会产生额外的报错,如 `This import uses a '.ts' extension to resolve to an input TypeScript file, but will not be rewritten during emit because it is not a relative path.`。
179
+ - 将 `compilerOptions.typeRoots` 设置为 `["${configDir}/node_modules/@types"]`,从而让 TypeScript 只消费项目直接依赖的类型定义文件。
180
+ - 将 `compilerOptions.types` 字段注释,否则 `compilerOptions.typeRoots` 不会生效。
181
+ - 将 `compilerOptions.noEmit` 设置为 `true`,原因之一是我们不使用 TypeScript 来转译代码,原因之二是我们开启了 `compilerOptions.allowImportingTsExtensions`,开启该选项要求 `either --noEmit or --emitDeclarationOnly to be set`。
182
+ - 将 `compilerOptions.forceConsistentCasingInFileNames` 设置为 `true`。
183
+ - 将 `compilerOptions.isolatedDeclarations` 设置为 `true`。
184
+ - 将 `compilerOptions.isolateModules` 设置为 `true`。
185
+ - 将 `compilerOptions.verbatimModuleSyntax` 设置为 `true`。
186
+ - 将 `compilerOptions.lib` 设置为 `["ESNext", "DOM", "WebWorker", "ScriptHost"]`,即默认启用所有不同运行环境的 API,以保持开发体验的一致性,正确性和跨平台兼容性由代码来保障。
187
+ - 将 `compilerOptions.moduleDetection` 设置为 `force`,即要求尽可能将所有代码编写成模块。
188
+ - 将 `compilerOptions.noLib` 设置为 `false`。
189
+ - 将 `compilerOptions.target` 设置为 `esnext`,即拥抱最新的 JavaScript 特性。
190
+
191
+ ### Lint
192
+
193
+ - 将 Formatting 视为 Linting 的一部分。
194
+ - 使用 Oxlint 作为 Lint 工具。
195
+ - 使用 Oxfmt 作为 Format 工具。
196
+
197
+ - import 任意文件都一定要包含文件扩展名。
198
+
199
+ ### Build
200
+
201
+ - `bin` 目录下的文件不需要打包,优先使用 Bun 直接运行。
202
+ - 打包产物只支持 ES Modules。
203
+
204
+ ### Change
205
+
206
+ - 基于 [changesets](https://github.com/changesets/changesets) 做变更管理。
207
+ - 仓库根目录一定要有 `.changeset/` 目录,且该目录下一定要有 `README.md` 文件和 `config.json` 文件。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@planet-matrix/mobius-mono",
3
- "version": "0.4.2",
4
- "description": "Mobius Mono 是一个用于规范项目的项目,由规范文本(Specification)、配套工具(Tool)组成。",
3
+ "version": "0.5.0",
4
+ "description": "Mobius Mono 是一个用于对项目开发进行规范的项目,目标是将项目开发中与核心业务逻辑无关的部分全部标准化,一方面开发者可以专注于业务逻辑的开发,另一方面不同项目可以共享相同的基础设施,从而提升整体的开发体验、协同效率和交付质量。同时,清晰明确的规范也能够提高人与 AI 协同开发或全 AI 驱动开发的效率和质量。",
5
5
  "keywords": [
6
6
  "mobius",
7
7
  "monorepo"
@@ -18,9 +18,6 @@
18
18
  "url": "https://github.com/kongxiangyan"
19
19
  },
20
20
  "contributors": [],
21
- "files": [
22
- "*"
23
- ],
24
21
  "bin": {
25
22
  "mono": "./src/app/index.ts"
26
23
  },
@@ -72,9 +69,9 @@
72
69
  "devDependencies": {
73
70
  "@types/bun": "^1.3.5",
74
71
  "@types/node": "^25.0.3",
75
- "oxlint": "^1.36.0",
72
+ "oxlint": "^1.37.0",
76
73
  "oxlint-tsgolint": "^0.10.1",
77
- "oxfmt": "^0.21.0",
74
+ "oxfmt": "^0.22.0",
78
75
  "typescript": "^5.9.0",
79
76
  "@typescript/native-preview": "^7.0.0-dev.20260101.1"
80
77
  },