@eggjs/tegg-dal-plugin 3.35.1 → 3.36.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/README.md +41 -5
- package/app.js +4 -4
- package/lib/DalModuleLoadUnitHook.d.ts +2 -1
- package/lib/DalModuleLoadUnitHook.js +17 -6
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
## egg 模式
|
|
6
6
|
|
|
7
7
|
### Install
|
|
8
|
+
|
|
8
9
|
```shell
|
|
9
10
|
# tegg 注解
|
|
10
11
|
npm i --save @eggjs/tegg
|
|
@@ -15,6 +16,7 @@ npm i --save @eggjs/tegg-dal-plugin
|
|
|
15
16
|
```
|
|
16
17
|
|
|
17
18
|
### Prepare
|
|
19
|
+
|
|
18
20
|
```json
|
|
19
21
|
// tsconfig.json
|
|
20
22
|
{
|
|
@@ -40,6 +42,7 @@ exports.teggDal = {
|
|
|
40
42
|
## standalone 模式
|
|
41
43
|
|
|
42
44
|
### Install
|
|
45
|
+
|
|
43
46
|
```shell
|
|
44
47
|
# tegg 注解
|
|
45
48
|
npm i --save @eggjs/tegg
|
|
@@ -48,6 +51,7 @@ npm i --save @eggjs/tegg-dal-plugin
|
|
|
48
51
|
```
|
|
49
52
|
|
|
50
53
|
### Prepare
|
|
54
|
+
|
|
51
55
|
```json
|
|
52
56
|
// tsconfig.json
|
|
53
57
|
{
|
|
@@ -58,6 +62,7 @@ npm i --save @eggjs/tegg-dal-plugin
|
|
|
58
62
|
## Usage
|
|
59
63
|
|
|
60
64
|
### module.yml
|
|
65
|
+
|
|
61
66
|
通过 module.yml 来配置 module 中的 mysql 数据源。
|
|
62
67
|
|
|
63
68
|
```yaml
|
|
@@ -73,6 +78,7 @@ dataSource:
|
|
|
73
78
|
```
|
|
74
79
|
|
|
75
80
|
### Table
|
|
81
|
+
|
|
76
82
|
`TableModel` 定义一个表结构,包括表配置、列、索引。
|
|
77
83
|
|
|
78
84
|
```ts
|
|
@@ -108,6 +114,7 @@ export class Foo {
|
|
|
108
114
|
详细参数定义如下,具体参数值可以参考 https://dev.mysql.com/doc/refman/8.0/en/create-table.html
|
|
109
115
|
|
|
110
116
|
建表参数,使用方式为 `@Table(parmas?: TableParams)`
|
|
117
|
+
|
|
111
118
|
```ts
|
|
112
119
|
export interface TableParams {
|
|
113
120
|
// 数据库表名
|
|
@@ -134,6 +141,7 @@ export interface TableParams {
|
|
|
134
141
|
```
|
|
135
142
|
|
|
136
143
|
建索引参数,使用方式为 `@Index(parmas?: IndexParams)`
|
|
144
|
+
|
|
137
145
|
```ts
|
|
138
146
|
export interface IndexParams {
|
|
139
147
|
// 索引的列
|
|
@@ -153,6 +161,7 @@ export interface IndexParams {
|
|
|
153
161
|
```
|
|
154
162
|
|
|
155
163
|
建列参数,使用方式为 `@Column(type: ColumnTypeParams, parmas?: ColumnParams)`
|
|
164
|
+
|
|
156
165
|
```ts
|
|
157
166
|
export interface ColumnParams {
|
|
158
167
|
// 列名,默认转换规则 userName 至 user_name
|
|
@@ -174,6 +183,7 @@ export interface ColumnParams {
|
|
|
174
183
|
```
|
|
175
184
|
|
|
176
185
|
支持的类型
|
|
186
|
+
|
|
177
187
|
```ts
|
|
178
188
|
export enum ColumnType {
|
|
179
189
|
// Numeric
|
|
@@ -225,6 +235,7 @@ export enum ColumnType {
|
|
|
225
235
|
支持的类型参数,详细可参考 https://dev.mysql.com/doc/refman/8.0/en/data-types.html
|
|
226
236
|
|
|
227
237
|
如果 mysql 类型和 ts 类型对应关系不确定可直接使用 `ColumnTsType` 类型,如
|
|
238
|
+
|
|
228
239
|
```ts
|
|
229
240
|
import { Table, Index, Column, ColumnType, IndexType, ColumnTsType } from '@eggjs/tegg/dal';
|
|
230
241
|
|
|
@@ -344,12 +355,18 @@ export interface DateParams {
|
|
|
344
355
|
export interface DateTimeParams {
|
|
345
356
|
type: ColumnType.DATETIME;
|
|
346
357
|
precision?: number;
|
|
358
|
+
// 自动添加 ON UPDATE CURRENT_TIMESTAMP
|
|
359
|
+
// 如果有精度则为 ON UPDATE CURRENT_TIMESTAMP(precision)
|
|
360
|
+
autoUpdate?: boolean;
|
|
347
361
|
}
|
|
348
362
|
|
|
349
363
|
// Timestamp 类型,对应 js 中的 Date
|
|
350
364
|
export interface TimestampParams {
|
|
351
365
|
type: ColumnType.TIMESTAMP;
|
|
352
366
|
precision?: number;
|
|
367
|
+
// 自动添加 ON UPDATE CURRENT_TIMESTAMP
|
|
368
|
+
// 如果有精度则为 ON UPDATE CURRENT_TIMESTAMP(precision)
|
|
369
|
+
autoUpdate?: boolean;
|
|
353
370
|
}
|
|
354
371
|
|
|
355
372
|
// Times 类型,对应 js 中的 string
|
|
@@ -506,7 +523,8 @@ export interface GeometryCollectionParams {
|
|
|
506
523
|
```
|
|
507
524
|
|
|
508
525
|
### 目录结构
|
|
509
|
-
|
|
526
|
+
|
|
527
|
+
运行 `egg-bin dal gen` 即可生成 `dal` 相关目录,包括 dao、extension、structure
|
|
510
528
|
|
|
511
529
|
```plain
|
|
512
530
|
dal
|
|
@@ -519,7 +537,7 @@ dal
|
|
|
519
537
|
└── structure
|
|
520
538
|
├── Foo.json
|
|
521
539
|
└── Foo.sql
|
|
522
|
-
```
|
|
540
|
+
```
|
|
523
541
|
|
|
524
542
|
- dao: 表访问类,生成的 BaseDAO 请勿修改,其中包含了根据表结构生成的基础访问方法,如 insert/update/delete 以及根据索引信息生成的 find 方法
|
|
525
543
|
- extension: 扩展文件,如果需要自定义 sql,需要在 extension 文件中定义
|
|
@@ -543,8 +561,9 @@ export class FooRepository {
|
|
|
543
561
|
}
|
|
544
562
|
```
|
|
545
563
|
|
|
546
|
-
#### 自定义
|
|
547
|
-
|
|
564
|
+
#### 自定义 SQL
|
|
565
|
+
|
|
566
|
+
1. 在 extension 中定义自定义 SQL
|
|
548
567
|
|
|
549
568
|
```ts
|
|
550
569
|
// dal/extension/FooExtension.ts
|
|
@@ -559,6 +578,7 @@ export default {
|
|
|
559
578
|
```
|
|
560
579
|
|
|
561
580
|
2. 在 dao 中定义自定义方法
|
|
581
|
+
|
|
562
582
|
```ts
|
|
563
583
|
import { SingletonProto, AccessLevel } from '@eggjs/tegg';
|
|
564
584
|
import { BaseFooDAO } from './base/BaseFooDAO';
|
|
@@ -577,6 +597,7 @@ export default class FooDAO extends BaseFooDAO {
|
|
|
577
597
|
```
|
|
578
598
|
|
|
579
599
|
支持的自定义 filter
|
|
600
|
+
|
|
580
601
|
```
|
|
581
602
|
- toPoint
|
|
582
603
|
- toLine
|
|
@@ -589,6 +610,7 @@ export default class FooDAO extends BaseFooDAO {
|
|
|
589
610
|
```
|
|
590
611
|
|
|
591
612
|
支持自定义 block 来简化 sql, 如内置的 allColumns
|
|
613
|
+
|
|
592
614
|
```ts
|
|
593
615
|
export default {
|
|
594
616
|
findByName: {
|
|
@@ -599,7 +621,8 @@ export default {
|
|
|
599
621
|
```
|
|
600
622
|
|
|
601
623
|
### DataSource
|
|
602
|
-
|
|
624
|
+
|
|
625
|
+
DataSource 仅能在 DAO 中使用,可以将 MySQL 返回的数据反序列化为类。支持的方法有
|
|
603
626
|
|
|
604
627
|
```ts
|
|
605
628
|
export interface DataSource<T> {
|
|
@@ -634,6 +657,19 @@ dataSource:
|
|
|
634
657
|
```
|
|
635
658
|
|
|
636
659
|
可以通过以下 SQL 来查看数据库时区
|
|
660
|
+
|
|
637
661
|
```sql
|
|
638
662
|
SELECT @@GLOBAL.time_zone;
|
|
639
663
|
```
|
|
664
|
+
|
|
665
|
+
## Unittest
|
|
666
|
+
可以在 `module.yml` 中开启 forkDb 配置,即可实现 unittest 环境自动创建数据库
|
|
667
|
+
|
|
668
|
+
```yaml
|
|
669
|
+
# module.yml
|
|
670
|
+
dataSource:
|
|
671
|
+
foo:
|
|
672
|
+
# 开启 ci 环境自动创建数据库
|
|
673
|
+
forkDb: true
|
|
674
|
+
|
|
675
|
+
```
|
package/app.js
CHANGED
|
@@ -11,17 +11,17 @@ class ControllerAppBootHook {
|
|
|
11
11
|
this.app = app;
|
|
12
12
|
}
|
|
13
13
|
configWillLoad() {
|
|
14
|
-
this.dalModuleLoadUnitHook = new DalModuleLoadUnitHook_1.DalModuleLoadUnitHook(this.app.moduleConfigs);
|
|
14
|
+
this.dalModuleLoadUnitHook = new DalModuleLoadUnitHook_1.DalModuleLoadUnitHook(this.app.config.env, this.app.moduleConfigs);
|
|
15
15
|
this.dalTableEggPrototypeHook = new DalTableEggPrototypeHook_1.DalTableEggPrototypeHook(this.app.logger);
|
|
16
16
|
this.app.eggPrototypeLifecycleUtil.registerLifecycle(this.dalTableEggPrototypeHook);
|
|
17
17
|
this.app.loadUnitLifecycleUtil.registerLifecycle(this.dalModuleLoadUnitHook);
|
|
18
18
|
}
|
|
19
19
|
async beforeClose() {
|
|
20
20
|
if (this.dalTableEggPrototypeHook) {
|
|
21
|
-
|
|
21
|
+
this.app.eggPrototypeLifecycleUtil.deleteLifecycle(this.dalTableEggPrototypeHook);
|
|
22
22
|
}
|
|
23
23
|
if (this.dalModuleLoadUnitHook) {
|
|
24
|
-
|
|
24
|
+
this.app.loadUnitLifecycleUtil.deleteLifecycle(this.dalModuleLoadUnitHook);
|
|
25
25
|
}
|
|
26
26
|
MysqlDataSourceManager_1.MysqlDataSourceManager.instance.clear();
|
|
27
27
|
SqlMapManager_1.SqlMapManager.instance.clear();
|
|
@@ -29,4 +29,4 @@ class ControllerAppBootHook {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
exports.default = ControllerAppBootHook;
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw0Q0FBNEM7O0FBRzVDLDZFQUEwRTtBQUMxRSx5RUFBc0U7QUFDdEUsdURBQW9EO0FBQ3BELCtEQUE0RDtBQUM1RCx1RUFBb0U7QUFFcEUsTUFBcUIscUJBQXFCO0lBS3hDLFlBQVksR0FBZ0I7UUFDMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSw2Q0FBcUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwRyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxtREFBd0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDZixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCwrQ0FBc0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEMsNkJBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IscUNBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQTNCRCx3Q0EyQkMifQ==
|
|
@@ -3,6 +3,7 @@ import { ModuleConfigHolder } from '@eggjs/tegg-common-util';
|
|
|
3
3
|
import { LoadUnit, LoadUnitLifecycleContext } from '@eggjs/tegg/helper';
|
|
4
4
|
export declare class DalModuleLoadUnitHook implements LifecycleHook<LoadUnitLifecycleContext, LoadUnit> {
|
|
5
5
|
private readonly moduleConfigs;
|
|
6
|
-
|
|
6
|
+
private readonly env;
|
|
7
|
+
constructor(env: string, moduleConfigs: Record<string, ModuleConfigHolder>);
|
|
7
8
|
preCreate(_: LoadUnitLifecycleContext, loadUnit: LoadUnit): Promise<void>;
|
|
8
9
|
}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.DalModuleLoadUnitHook = void 0;
|
|
4
7
|
const MysqlDataSourceManager_1 = require("./MysqlDataSourceManager");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const dal_runtime_1 = require("@eggjs/dal-runtime");
|
|
5
10
|
class DalModuleLoadUnitHook {
|
|
6
|
-
constructor(moduleConfigs) {
|
|
11
|
+
constructor(env, moduleConfigs) {
|
|
12
|
+
this.env = env;
|
|
7
13
|
this.moduleConfigs = moduleConfigs;
|
|
8
14
|
}
|
|
9
15
|
async preCreate(_, loadUnit) {
|
|
@@ -14,11 +20,16 @@ class DalModuleLoadUnitHook {
|
|
|
14
20
|
if (!dataSourceConfig)
|
|
15
21
|
return;
|
|
16
22
|
await Promise.all(Object.entries(dataSourceConfig).map(async ([name, config]) => {
|
|
23
|
+
const dataSourceOptions = {
|
|
24
|
+
...config,
|
|
25
|
+
name,
|
|
26
|
+
};
|
|
27
|
+
const forker = new dal_runtime_1.DatabaseForker(this.env, dataSourceOptions);
|
|
28
|
+
if (forker.shouldFork()) {
|
|
29
|
+
await forker.forkDb(node_path_1.default.join(loadUnit.unitPath, 'dal'));
|
|
30
|
+
}
|
|
17
31
|
try {
|
|
18
|
-
await MysqlDataSourceManager_1.MysqlDataSourceManager.instance.createDataSource(loadUnit.name, name,
|
|
19
|
-
...config,
|
|
20
|
-
name,
|
|
21
|
-
});
|
|
32
|
+
await MysqlDataSourceManager_1.MysqlDataSourceManager.instance.createDataSource(loadUnit.name, name, dataSourceOptions);
|
|
22
33
|
}
|
|
23
34
|
catch (e) {
|
|
24
35
|
e.message = `create module ${loadUnit.name} datasource ${name} failed: ` + e.message;
|
|
@@ -28,4 +39,4 @@ class DalModuleLoadUnitHook {
|
|
|
28
39
|
}
|
|
29
40
|
}
|
|
30
41
|
exports.DalModuleLoadUnitHook = DalModuleLoadUnitHook;
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFsTW9kdWxlTG9hZFVuaXRIb29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiRGFsTW9kdWxlTG9hZFVuaXRIb29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFFQUFrRTtBQUNsRSwwREFBNkI7QUFHN0Isb0RBQXVFO0FBR3ZFLE1BQWEscUJBQXFCO0lBSWhDLFlBQVksR0FBVyxFQUFFLGFBQWlEO1FBQ3hFLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDckMsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBMkIsRUFBRSxRQUFrQjtRQUM3RCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxrQkFBa0I7WUFBRSxPQUFPO1FBQ2hDLE1BQU0sZ0JBQWdCLEdBQW1ELGtCQUFrQixDQUFDLE1BQWMsQ0FBQyxVQUFVLENBQUM7UUFDdEgsSUFBSSxDQUFDLGdCQUFnQjtZQUFFLE9BQU87UUFDOUIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBRSxFQUFFLEVBQUU7WUFDaEYsTUFBTSxpQkFBaUIsR0FBRztnQkFDeEIsR0FBRyxNQUFNO2dCQUNULElBQUk7YUFDTCxDQUFDO1lBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSw0QkFBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUMvRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUN4QixNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFFRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSwrQ0FBc0IsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNqRyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxDQUFDLENBQUMsT0FBTyxHQUFHLGlCQUFpQixRQUFRLENBQUMsSUFBSSxlQUFlLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3JGLE1BQU0sQ0FBQyxDQUFDO1lBQ1YsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0NBQ0Y7QUFoQ0Qsc0RBZ0NDIn0=
|
package/package.json
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"eggModule": {
|
|
11
11
|
"name": "teggDal"
|
|
12
12
|
},
|
|
13
|
-
"version": "3.
|
|
13
|
+
"version": "3.36.0",
|
|
14
14
|
"description": "dal plugin for egg",
|
|
15
15
|
"keywords": [
|
|
16
16
|
"egg",
|
|
@@ -44,18 +44,18 @@
|
|
|
44
44
|
"repository": {
|
|
45
45
|
"type": "git",
|
|
46
46
|
"url": "git@github.com:eggjs/tegg.git",
|
|
47
|
-
"directory": "plugin/
|
|
47
|
+
"directory": "plugin/dal"
|
|
48
48
|
},
|
|
49
49
|
"engines": {
|
|
50
50
|
"node": ">=14.0.0"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@eggjs/dal-runtime": "^3.
|
|
54
|
-
"@eggjs/tegg": "^3.
|
|
53
|
+
"@eggjs/dal-runtime": "^3.36.0",
|
|
54
|
+
"@eggjs/tegg": "^3.36.0"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@eggjs/tegg-config": "^3.
|
|
58
|
-
"@eggjs/tegg-plugin": "^3.
|
|
57
|
+
"@eggjs/tegg-config": "^3.36.0",
|
|
58
|
+
"@eggjs/tegg-plugin": "^3.36.0",
|
|
59
59
|
"@types/mocha": "^10.0.1",
|
|
60
60
|
"@types/node": "^20.2.4",
|
|
61
61
|
"cross-env": "^7.0.3",
|
|
@@ -70,5 +70,5 @@
|
|
|
70
70
|
"publishConfig": {
|
|
71
71
|
"access": "public"
|
|
72
72
|
},
|
|
73
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "b550d59a21f7c9991310ca6b6fd16ee581a5e17d"
|
|
74
74
|
}
|