@interactive-inc/docs-client 0.0.6 → 0.0.8
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 +0 -228
- package/build/index.d.ts +1921 -42
- package/build/index.js +4617 -39
- package/build/models.d.ts +34 -32
- package/build/models.js +219 -275
- package/package.json +4 -4
- package/tsup.config.ts +10 -0
- package/build/doc-client.d.ts +0 -59
- package/build/doc-client.d.ts.map +0 -1
- package/build/doc-client.js +0 -95
- package/build/doc-client.test.d.ts +0 -2
- package/build/doc-client.test.d.ts.map +0 -1
- package/build/doc-client.test.js +0 -38
- package/build/doc-directory-reference.d.ts +0 -65
- package/build/doc-directory-reference.d.ts.map +0 -1
- package/build/doc-directory-reference.js +0 -292
- package/build/doc-directory-reference.test.d.ts +0 -2
- package/build/doc-directory-reference.test.d.ts.map +0 -1
- package/build/doc-directory-reference.test.js +0 -100
- package/build/doc-file-index-reference.d.ts +0 -72
- package/build/doc-file-index-reference.d.ts.map +0 -1
- package/build/doc-file-index-reference.js +0 -191
- package/build/doc-file-index-reference.test.d.ts +0 -2
- package/build/doc-file-index-reference.test.d.ts.map +0 -1
- package/build/doc-file-index-reference.test.js +0 -77
- package/build/doc-file-md-reference.d.ts +0 -97
- package/build/doc-file-md-reference.d.ts.map +0 -1
- package/build/doc-file-md-reference.js +0 -297
- package/build/doc-file-md-reference.test.d.ts +0 -2
- package/build/doc-file-md-reference.test.d.ts.map +0 -1
- package/build/doc-file-md-reference.test.js +0 -465
- package/build/doc-file-relation-reference.d.ts +0 -54
- package/build/doc-file-relation-reference.d.ts.map +0 -1
- package/build/doc-file-relation-reference.js +0 -109
- package/build/doc-file-system-debug.d.ts +0 -81
- package/build/doc-file-system-debug.d.ts.map +0 -1
- package/build/doc-file-system-debug.js +0 -317
- package/build/doc-file-system.d.ts +0 -100
- package/build/doc-file-system.d.ts.map +0 -1
- package/build/doc-file-system.js +0 -210
- package/build/doc-file-tree-system.d.ts +0 -38
- package/build/doc-file-tree-system.d.ts.map +0 -1
- package/build/doc-file-tree-system.js +0 -153
- package/build/doc-file-tree-system.test.d.ts +0 -2
- package/build/doc-file-tree-system.test.d.ts.map +0 -1
- package/build/doc-file-tree-system.test.js +0 -105
- package/build/doc-file-unknown-reference.d.ts +0 -80
- package/build/doc-file-unknown-reference.d.ts.map +0 -1
- package/build/doc-file-unknown-reference.js +0 -181
- package/build/doc-file-unknown-reference.test.d.ts +0 -2
- package/build/doc-file-unknown-reference.test.d.ts.map +0 -1
- package/build/doc-file-unknown-reference.test.js +0 -73
- package/build/doc-markdown-system.d.ts +0 -44
- package/build/doc-markdown-system.d.ts.map +0 -1
- package/build/doc-markdown-system.js +0 -153
- package/build/doc-markdown-system.test.d.ts +0 -2
- package/build/doc-markdown-system.test.d.ts.map +0 -1
- package/build/doc-markdown-system.test.js +0 -124
- package/build/doc-path-system.d.ts +0 -43
- package/build/doc-path-system.d.ts.map +0 -1
- package/build/doc-path-system.js +0 -148
- package/build/doc-path-system.test.d.ts +0 -2
- package/build/doc-path-system.test.d.ts.map +0 -1
- package/build/doc-path-system.test.js +0 -67
- package/build/entities/doc-file-entity.d.ts +0 -5
- package/build/entities/doc-file-entity.d.ts.map +0 -1
- package/build/entities/doc-file-entity.js +0 -1
- package/build/entities/doc-file-index-entity.d.ts +0 -30
- package/build/entities/doc-file-index-entity.d.ts.map +0 -1
- package/build/entities/doc-file-index-entity.js +0 -49
- package/build/entities/doc-file-index-entity.test.d.ts +0 -2
- package/build/entities/doc-file-index-entity.test.d.ts.map +0 -1
- package/build/entities/doc-file-index-entity.test.js +0 -195
- package/build/entities/doc-file-md-entity.d.ts +0 -30
- package/build/entities/doc-file-md-entity.d.ts.map +0 -1
- package/build/entities/doc-file-md-entity.js +0 -49
- package/build/entities/doc-file-md-entity.test.d.ts +0 -2
- package/build/entities/doc-file-md-entity.test.d.ts.map +0 -1
- package/build/entities/doc-file-md-entity.test.js +0 -178
- package/build/entities/doc-file-unknown-entity.d.ts +0 -26
- package/build/entities/doc-file-unknown-entity.d.ts.map +0 -1
- package/build/entities/doc-file-unknown-entity.js +0 -45
- package/build/entities/doc-file-unknown-entity.test.d.ts +0 -2
- package/build/entities/doc-file-unknown-entity.test.d.ts.map +0 -1
- package/build/entities/doc-file-unknown-entity.test.js +0 -131
- package/build/index.d.ts.map +0 -1
- package/build/models.d.ts.map +0 -1
- package/build/types.d.ts +0 -154
- package/build/types.d.ts.map +0 -1
- package/build/types.js +0 -1
- package/build/values/doc-content-md-front-matter-value.d.ts +0 -49
- package/build/values/doc-content-md-front-matter-value.d.ts.map +0 -1
- package/build/values/doc-content-md-front-matter-value.js +0 -94
- package/build/values/doc-content-md-front-matter-value.test.d.ts +0 -2
- package/build/values/doc-content-md-front-matter-value.test.d.ts.map +0 -1
- package/build/values/doc-content-md-front-matter-value.test.js +0 -73
- package/build/values/doc-content-md-value.d.ts +0 -66
- package/build/values/doc-content-md-value.d.ts.map +0 -1
- package/build/values/doc-content-md-value.js +0 -218
- package/build/values/doc-content-md-value.test.d.ts +0 -2
- package/build/values/doc-content-md-value.test.d.ts.map +0 -1
- package/build/values/doc-content-md-value.test.js +0 -179
- package/build/values/doc-directory-path-value.d.ts +0 -89
- package/build/values/doc-directory-path-value.d.ts.map +0 -1
- package/build/values/doc-directory-path-value.js +0 -145
- package/build/values/doc-directory-path-value.test.d.ts +0 -2
- package/build/values/doc-directory-path-value.test.d.ts.map +0 -1
- package/build/values/doc-directory-path-value.test.js +0 -68
- package/build/values/doc-file-content-index-value.d.ts +0 -62
- package/build/values/doc-file-content-index-value.d.ts.map +0 -1
- package/build/values/doc-file-content-index-value.js +0 -134
- package/build/values/doc-file-content-index-value.test.d.ts +0 -2
- package/build/values/doc-file-content-index-value.test.d.ts.map +0 -1
- package/build/values/doc-file-content-index-value.test.js +0 -203
- package/build/values/doc-file-content-md-value.d.ts +0 -62
- package/build/values/doc-file-content-md-value.d.ts.map +0 -1
- package/build/values/doc-file-content-md-value.js +0 -139
- package/build/values/doc-file-content-md-value.test.d.ts +0 -2
- package/build/values/doc-file-content-md-value.test.d.ts.map +0 -1
- package/build/values/doc-file-content-md-value.test.js +0 -160
- package/build/values/doc-file-path-value.d.ts +0 -47
- package/build/values/doc-file-path-value.d.ts.map +0 -1
- package/build/values/doc-file-path-value.js +0 -83
- package/build/values/doc-file-path-value.test.d.ts +0 -2
- package/build/values/doc-file-path-value.test.d.ts.map +0 -1
- package/build/values/doc-file-path-value.test.js +0 -84
- package/build/values/doc-front-matter-index-value.d.ts +0 -66
- package/build/values/doc-front-matter-index-value.d.ts.map +0 -1
- package/build/values/doc-front-matter-index-value.js +0 -185
- package/build/values/doc-front-matter-index-value.test.d.ts +0 -2
- package/build/values/doc-front-matter-index-value.test.d.ts.map +0 -1
- package/build/values/doc-front-matter-index-value.test.js +0 -98
- package/build/values/doc-front-matter-md-value-accessor.test.d.ts +0 -2
- package/build/values/doc-front-matter-md-value-accessor.test.d.ts.map +0 -1
- package/build/values/doc-front-matter-md-value-accessor.test.js +0 -226
- package/build/values/doc-front-matter-md-value.d.ts +0 -80
- package/build/values/doc-front-matter-md-value.d.ts.map +0 -1
- package/build/values/doc-front-matter-md-value.js +0 -257
- package/build/values/doc-front-matter-md-value.test.d.ts +0 -2
- package/build/values/doc-front-matter-md-value.test.d.ts.map +0 -1
- package/build/values/doc-front-matter-md-value.test.js +0 -198
- package/build/values/doc-relation-field-value.d.ts +0 -57
- package/build/values/doc-relation-field-value.d.ts.map +0 -1
- package/build/values/doc-relation-field-value.js +0 -85
- package/build/values/doc-relation-field-value.test.d.ts +0 -2
- package/build/values/doc-relation-field-value.test.d.ts.map +0 -1
- package/build/values/doc-relation-field-value.test.js +0 -115
- package/build/values/doc-relation-file-value.d.ts +0 -33
- package/build/values/doc-relation-file-value.d.ts.map +0 -1
- package/build/values/doc-relation-file-value.js +0 -55
- package/build/values/doc-relation-file-value.test.d.ts +0 -2
- package/build/values/doc-relation-file-value.test.d.ts.map +0 -1
- package/build/values/doc-relation-file-value.test.js +0 -77
- package/build/values/doc-relation-value.d.ts +0 -34
- package/build/values/doc-relation-value.d.ts.map +0 -1
- package/build/values/doc-relation-value.js +0 -56
- package/build/values/doc-relation-value.test.d.ts +0 -2
- package/build/values/doc-relation-value.test.d.ts.map +0 -1
- package/build/values/doc-relation-value.test.js +0 -89
- package/build/values/doc-schema-field-boolean-multiple-value.d.ts +0 -23
- package/build/values/doc-schema-field-boolean-multiple-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-boolean-multiple-value.js +0 -43
- package/build/values/doc-schema-field-boolean-multiple-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-boolean-multiple-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-boolean-multiple-value.test.js +0 -76
- package/build/values/doc-schema-field-boolean-single-value.d.ts +0 -23
- package/build/values/doc-schema-field-boolean-single-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-boolean-single-value.js +0 -39
- package/build/values/doc-schema-field-boolean-single-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-boolean-single-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-boolean-single-value.test.js +0 -73
- package/build/values/doc-schema-field-factory.d.ts +0 -37
- package/build/values/doc-schema-field-factory.d.ts.map +0 -1
- package/build/values/doc-schema-field-factory.js +0 -151
- package/build/values/doc-schema-field-factory.test.d.ts +0 -2
- package/build/values/doc-schema-field-factory.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-factory.test.js +0 -215
- package/build/values/doc-schema-field-number-multiple-value.d.ts +0 -23
- package/build/values/doc-schema-field-number-multiple-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-number-multiple-value.js +0 -43
- package/build/values/doc-schema-field-number-multiple-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-number-multiple-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-number-multiple-value.test.js +0 -79
- package/build/values/doc-schema-field-number-single-value.d.ts +0 -23
- package/build/values/doc-schema-field-number-single-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-number-single-value.js +0 -39
- package/build/values/doc-schema-field-number-single-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-number-single-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-number-single-value.test.js +0 -77
- package/build/values/doc-schema-field-relation-multiple-value.d.ts +0 -24
- package/build/values/doc-schema-field-relation-multiple-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-relation-multiple-value.js +0 -46
- package/build/values/doc-schema-field-relation-multiple-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-relation-multiple-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-relation-multiple-value.test.js +0 -83
- package/build/values/doc-schema-field-relation-single-value.d.ts +0 -24
- package/build/values/doc-schema-field-relation-single-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-relation-single-value.js +0 -42
- package/build/values/doc-schema-field-relation-single-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-relation-single-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-relation-single-value.test.js +0 -83
- package/build/values/doc-schema-field-select-number-multiple-value.d.ts +0 -25
- package/build/values/doc-schema-field-select-number-multiple-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-select-number-multiple-value.js +0 -48
- package/build/values/doc-schema-field-select-number-multiple-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-select-number-multiple-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-select-number-multiple-value.test.js +0 -84
- package/build/values/doc-schema-field-select-number-single-value.d.ts +0 -25
- package/build/values/doc-schema-field-select-number-single-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-select-number-single-value.js +0 -45
- package/build/values/doc-schema-field-select-number-single-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-select-number-single-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-select-number-single-value.test.js +0 -96
- package/build/values/doc-schema-field-select-text-multiple-value.d.ts +0 -25
- package/build/values/doc-schema-field-select-text-multiple-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-select-text-multiple-value.js +0 -48
- package/build/values/doc-schema-field-select-text-multiple-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-select-text-multiple-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-select-text-multiple-value.test.js +0 -84
- package/build/values/doc-schema-field-select-text-single-value.d.ts +0 -25
- package/build/values/doc-schema-field-select-text-single-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-select-text-single-value.js +0 -47
- package/build/values/doc-schema-field-select-text-single-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-select-text-single-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-select-text-single-value.test.js +0 -96
- package/build/values/doc-schema-field-text-multiple-value.d.ts +0 -23
- package/build/values/doc-schema-field-text-multiple-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-text-multiple-value.js +0 -43
- package/build/values/doc-schema-field-text-multiple-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-text-multiple-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-text-multiple-value.test.js +0 -78
- package/build/values/doc-schema-field-text-single-value.d.ts +0 -23
- package/build/values/doc-schema-field-text-single-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-text-single-value.js +0 -39
- package/build/values/doc-schema-field-text-single-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-text-single-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-text-single-value.test.js +0 -76
- package/build/values/doc-schema-field-type-value.d.ts +0 -61
- package/build/values/doc-schema-field-type-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-type-value.js +0 -134
- package/build/values/doc-schema-field-type-value.test.d.ts +0 -2
- package/build/values/doc-schema-field-type-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-field-type-value.test.js +0 -101
- package/build/values/doc-schema-field-value.d.ts +0 -45
- package/build/values/doc-schema-field-value.d.ts.map +0 -1
- package/build/values/doc-schema-field-value.js +0 -1
- package/build/values/doc-schema-value.d.ts +0 -99
- package/build/values/doc-schema-value.d.ts.map +0 -1
- package/build/values/doc-schema-value.js +0 -269
- package/build/values/doc-schema-value.test.d.ts +0 -2
- package/build/values/doc-schema-value.test.d.ts.map +0 -1
- package/build/values/doc-schema-value.test.js +0 -301
- package/build/values/doc-tree-directory-node-value.d.ts +0 -36
- package/build/values/doc-tree-directory-node-value.d.ts.map +0 -1
- package/build/values/doc-tree-directory-node-value.js +0 -71
- package/build/values/doc-tree-directory-node-value.test.d.ts +0 -2
- package/build/values/doc-tree-directory-node-value.test.d.ts.map +0 -1
- package/build/values/doc-tree-directory-node-value.test.js +0 -162
- package/build/values/doc-tree-file-node-value.d.ts +0 -33
- package/build/values/doc-tree-file-node-value.d.ts.map +0 -1
- package/build/values/doc-tree-file-node-value.js +0 -56
- package/build/values/doc-tree-file-node-value.test.d.ts +0 -2
- package/build/values/doc-tree-file-node-value.test.d.ts.map +0 -1
- package/build/values/doc-tree-file-node-value.test.js +0 -113
- package/debug/debug.ts +0 -108
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { parse, stringify } from "yaml";
|
|
2
|
-
/**
|
|
3
|
-
* フロントマターの処理を担当
|
|
4
|
-
*/
|
|
5
|
-
export class DocContentMdFrontMatterValue {
|
|
6
|
-
data;
|
|
7
|
-
yamlText;
|
|
8
|
-
constructor(data, yamlText = "") {
|
|
9
|
-
this.data = data;
|
|
10
|
-
this.yamlText = yamlText;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* YAMLテキストからフロントマターインスタンスを作成
|
|
14
|
-
*/
|
|
15
|
-
static fromYamlText(yamlText) {
|
|
16
|
-
if (!yamlText || typeof yamlText !== "string" || !yamlText.trim()) {
|
|
17
|
-
return new DocContentMdFrontMatterValue({}, "");
|
|
18
|
-
}
|
|
19
|
-
const parsed = parse(yamlText) || {};
|
|
20
|
-
return new DocContentMdFrontMatterValue(parsed, yamlText);
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Markdownテキストからフロントマターインスタンスを作成
|
|
24
|
-
*/
|
|
25
|
-
static fromMarkdown(markdownText) {
|
|
26
|
-
if (!markdownText || !markdownText.startsWith("---")) {
|
|
27
|
-
return DocContentMdFrontMatterValue.empty();
|
|
28
|
-
}
|
|
29
|
-
const startIndex = markdownText.indexOf("---");
|
|
30
|
-
const endIndex = markdownText.indexOf("---", startIndex + 3);
|
|
31
|
-
if (endIndex === -1) {
|
|
32
|
-
return DocContentMdFrontMatterValue.empty();
|
|
33
|
-
}
|
|
34
|
-
const yamlText = markdownText.slice(startIndex + 3, endIndex).trim();
|
|
35
|
-
return DocContentMdFrontMatterValue.fromYamlText(yamlText);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* 空のフロントマターインスタンスを作成
|
|
39
|
-
*/
|
|
40
|
-
static empty() {
|
|
41
|
-
return new DocContentMdFrontMatterValue(null, "");
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* フロントマターデータからインスタンスを作成
|
|
45
|
-
*/
|
|
46
|
-
static fromFrontMatter(data) {
|
|
47
|
-
const instance = new DocContentMdFrontMatterValue(data, "");
|
|
48
|
-
// YAMLテキストを生成して保存
|
|
49
|
-
const yamlText = instance.frontMatterText();
|
|
50
|
-
return new DocContentMdFrontMatterValue(data, yamlText);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* フロントマターをYAMLテキストに変換
|
|
54
|
-
*/
|
|
55
|
-
frontMatterText() {
|
|
56
|
-
if (this.data === null || Object.keys(this.data).length === 0)
|
|
57
|
-
return "";
|
|
58
|
-
return stringify(this.data).trim();
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* フロントマターを更新した新しいインスタンスを作成
|
|
62
|
-
*/
|
|
63
|
-
update(draft) {
|
|
64
|
-
const updatedData = { ...(this.data || {}) };
|
|
65
|
-
for (const [key, value] of Object.entries(draft)) {
|
|
66
|
-
updatedData[key] = value;
|
|
67
|
-
}
|
|
68
|
-
return DocContentMdFrontMatterValue.fromFrontMatter(updatedData);
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* フロントマターが空かどうか
|
|
72
|
-
*/
|
|
73
|
-
isEmpty() {
|
|
74
|
-
return this.data === null || Object.keys(this.data).length === 0;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* 指定したキーの値を取得
|
|
78
|
-
*/
|
|
79
|
-
get(key) {
|
|
80
|
-
return this.data?.[key];
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* 指定したキーが存在するか
|
|
84
|
-
*/
|
|
85
|
-
has(key) {
|
|
86
|
-
return this.data !== null && key in this.data;
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* フロントマターのキー一覧を取得
|
|
90
|
-
*/
|
|
91
|
-
keys() {
|
|
92
|
-
return this.data ? Object.keys(this.data) : [];
|
|
93
|
-
}
|
|
94
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"doc-content-md-front-matter-value.test.d.ts","sourceRoot":"","sources":["../../lib/values/doc-content-md-front-matter-value.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "bun:test";
|
|
2
|
-
import { DocContentMdFrontMatterValue } from "./doc-content-md-front-matter-value";
|
|
3
|
-
describe("OpenMarkdownFrontmatter", () => {
|
|
4
|
-
describe("fromMarkdown", () => {
|
|
5
|
-
it("Markdownテキストからフロントマターを抽出できる", () => {
|
|
6
|
-
const markdown = `---
|
|
7
|
-
title: テストタイトル
|
|
8
|
-
description: テスト説明
|
|
9
|
-
tags:
|
|
10
|
-
- tag1
|
|
11
|
-
- tag2
|
|
12
|
-
---
|
|
13
|
-
# 見出し
|
|
14
|
-
本文コンテンツ`;
|
|
15
|
-
const frontMatter = DocContentMdFrontMatterValue.fromMarkdown(markdown);
|
|
16
|
-
expect(frontMatter.data).toEqual({
|
|
17
|
-
title: "テストタイトル",
|
|
18
|
-
description: "テスト説明",
|
|
19
|
-
tags: ["tag1", "tag2"],
|
|
20
|
-
});
|
|
21
|
-
expect(frontMatter.yamlText).toBe(`title: テストタイトル
|
|
22
|
-
description: テスト説明
|
|
23
|
-
tags:
|
|
24
|
-
- tag1
|
|
25
|
-
- tag2`);
|
|
26
|
-
});
|
|
27
|
-
it("フロントマターがない場合は空のインスタンスを返す", () => {
|
|
28
|
-
const markdown = `# 見出し
|
|
29
|
-
本文コンテンツ`;
|
|
30
|
-
const frontMatter = DocContentMdFrontMatterValue.fromMarkdown(markdown);
|
|
31
|
-
expect(frontMatter.data).toBeNull();
|
|
32
|
-
expect(frontMatter.yamlText).toBe("");
|
|
33
|
-
});
|
|
34
|
-
it("フロントマターの終わりがない場合は空のインスタンスを返す", () => {
|
|
35
|
-
const markdown = `---
|
|
36
|
-
title: テストタイトル
|
|
37
|
-
# 見出し
|
|
38
|
-
本文コンテンツ`;
|
|
39
|
-
const frontMatter = DocContentMdFrontMatterValue.fromMarkdown(markdown);
|
|
40
|
-
expect(frontMatter.data).toBeNull();
|
|
41
|
-
expect(frontMatter.yamlText).toBe("");
|
|
42
|
-
});
|
|
43
|
-
it("空のフロントマターも正しく処理する", () => {
|
|
44
|
-
const markdown = `---
|
|
45
|
-
---
|
|
46
|
-
# 見出し
|
|
47
|
-
本文コンテンツ`;
|
|
48
|
-
const frontMatter = DocContentMdFrontMatterValue.fromMarkdown(markdown);
|
|
49
|
-
expect(frontMatter.data).toEqual({});
|
|
50
|
-
expect(frontMatter.yamlText).toBe("");
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
describe("update", () => {
|
|
54
|
-
it("更新後もyamlTextが保持される", () => {
|
|
55
|
-
const frontMatter = DocContentMdFrontMatterValue.fromFrontMatter({
|
|
56
|
-
title: "元のタイトル",
|
|
57
|
-
description: "元の説明",
|
|
58
|
-
});
|
|
59
|
-
const updated = frontMatter.update({
|
|
60
|
-
title: "新しいタイトル",
|
|
61
|
-
newField: "新しいフィールド",
|
|
62
|
-
});
|
|
63
|
-
expect(updated.data).toEqual({
|
|
64
|
-
title: "新しいタイトル",
|
|
65
|
-
description: "元の説明",
|
|
66
|
-
newField: "新しいフィールド",
|
|
67
|
-
});
|
|
68
|
-
expect(updated.yamlText).toContain("title: 新しいタイトル");
|
|
69
|
-
expect(updated.yamlText).toContain("description: 元の説明");
|
|
70
|
-
expect(updated.yamlText).toContain("newField: 新しいフィールド");
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
});
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { DocContentMdFrontMatterValue } from "./doc-content-md-front-matter-value";
|
|
2
|
-
/**
|
|
3
|
-
* Markdownの解析と生成
|
|
4
|
-
*/
|
|
5
|
-
export declare class DocContentMdValue {
|
|
6
|
-
readonly text: string;
|
|
7
|
-
constructor(text: string);
|
|
8
|
-
/**
|
|
9
|
-
* Front Matter
|
|
10
|
-
*/
|
|
11
|
-
get frontMatter(): DocContentMdFrontMatterValue;
|
|
12
|
-
/**
|
|
13
|
-
* body
|
|
14
|
-
*/
|
|
15
|
-
get content(): string;
|
|
16
|
-
/**
|
|
17
|
-
* title
|
|
18
|
-
*/
|
|
19
|
-
get title(): string;
|
|
20
|
-
/**
|
|
21
|
-
* H1の次の段落、またはH1がない場合は最初の段落をdescriptionとして取得する
|
|
22
|
-
*/
|
|
23
|
-
get description(): string | null;
|
|
24
|
-
/**
|
|
25
|
-
* 新しいフロントマターとコンテンツでMarkdownインスタンスを作成
|
|
26
|
-
*/
|
|
27
|
-
static fromProps(props: {
|
|
28
|
-
frontMatter: Record<string, unknown>;
|
|
29
|
-
content: string;
|
|
30
|
-
}): DocContentMdValue;
|
|
31
|
-
/**
|
|
32
|
-
* 現在のフロントマターをYAMLテキストに変換する
|
|
33
|
-
*/
|
|
34
|
-
frontMatterToText(): string;
|
|
35
|
-
/**
|
|
36
|
-
* 現在のフロントマターを更新して新しいMarkdownテキストを生成
|
|
37
|
-
*/
|
|
38
|
-
updateFrontMatter(draft: Record<string, unknown>): string;
|
|
39
|
-
/**
|
|
40
|
-
* 新しいフロントマターでOpenMarkdownインスタンスを作成
|
|
41
|
-
*/
|
|
42
|
-
withFrontMatter(frontMatter: Record<string, unknown>): DocContentMdValue;
|
|
43
|
-
/**
|
|
44
|
-
* フロントマターを更新した新しいOpenMarkdownインスタンスを作成
|
|
45
|
-
*/
|
|
46
|
-
withUpdatedFrontMatter(draft: Record<string, unknown>): DocContentMdValue;
|
|
47
|
-
/**
|
|
48
|
-
* マークダウンをtitle、description、本文の3つの部分に分離する
|
|
49
|
-
*/
|
|
50
|
-
private parseContentParts;
|
|
51
|
-
/**
|
|
52
|
-
* title、description、本文からマークダウンを構築する
|
|
53
|
-
*/
|
|
54
|
-
private buildContent;
|
|
55
|
-
/**
|
|
56
|
-
* H1タイトルを更新した新しいOpenMarkdownインスタンスを作成
|
|
57
|
-
*/
|
|
58
|
-
withTitle(newTitle: string): DocContentMdValue;
|
|
59
|
-
/**
|
|
60
|
-
* H1の次のdescription段落を更新した新しいOpenMarkdownインスタンスを作成
|
|
61
|
-
* @param newDescription 新しいdescription
|
|
62
|
-
* @param defaultTitle H1がない場合に使用するデフォルトタイトル
|
|
63
|
-
*/
|
|
64
|
-
withDescription(newDescription: string, defaultTitle?: string): DocContentMdValue;
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=doc-content-md-value.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"doc-content-md-value.d.ts","sourceRoot":"","sources":["../../lib/values/doc-content-md-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAA;AAElF;;GAEG;AACH,qBAAa,iBAAiB;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAjC,YAAqB,IAAI,EAAE,MAAM,EAAI;IAErC;;OAEG;IACH,IAAI,WAAW,IAAI,4BAA4B,CAE9C;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAyBpB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAalB;IAED;;OAEG;IACH,IAAW,WAAW,IAAI,MAAM,GAAG,IAAI,CAsBtC;IAED;;OAEG;IACH,OAAc,SAAS,CAAC,KAAK,EAAE;QAC7B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACpC,OAAO,EAAE,MAAM,CAAA;KAChB,GAAG,iBAAiB,CAkBpB;IAED;;OAEG;IACI,iBAAiB,IAAI,MAAM,CAEjC;IAED;;OAEG;IACI,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAM/D;IAED;;OAEG;IACI,eAAe,CACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,iBAAiB,CAKnB;IAED;;OAEG;IACI,sBAAsB,CAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,iBAAiB,CAGnB;IAED;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwDzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACI,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAYpD;IAED;;;;OAIG;IACI,eAAe,CACpB,cAAc,EAAE,MAAM,EACtB,YAAY,CAAC,EAAE,MAAM,GACpB,iBAAiB,CAoBnB;CACF"}
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import { DocContentMdFrontMatterValue } from "./doc-content-md-front-matter-value";
|
|
2
|
-
/**
|
|
3
|
-
* Markdownの解析と生成
|
|
4
|
-
*/
|
|
5
|
-
export class DocContentMdValue {
|
|
6
|
-
text;
|
|
7
|
-
constructor(text) {
|
|
8
|
-
this.text = text;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Front Matter
|
|
12
|
-
*/
|
|
13
|
-
get frontMatter() {
|
|
14
|
-
return DocContentMdFrontMatterValue.fromMarkdown(this.text);
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* body
|
|
18
|
-
*/
|
|
19
|
-
get content() {
|
|
20
|
-
if (!this.text || typeof this.text !== "string") {
|
|
21
|
-
return this.text || "";
|
|
22
|
-
}
|
|
23
|
-
if (!this.text.startsWith("---")) {
|
|
24
|
-
return this.text;
|
|
25
|
-
}
|
|
26
|
-
const startIndex = this.text.indexOf("---");
|
|
27
|
-
const endIndex = this.text.indexOf("---", startIndex + 3);
|
|
28
|
-
if (endIndex === -1) {
|
|
29
|
-
return this.text;
|
|
30
|
-
}
|
|
31
|
-
let content = this.text.slice(endIndex + 3);
|
|
32
|
-
if (this.text.slice(endIndex + 3).startsWith("\n\n")) {
|
|
33
|
-
content = `\n${this.text.slice(endIndex + 4).trim()}`;
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
content = this.text.slice(endIndex + 3).trim();
|
|
37
|
-
}
|
|
38
|
-
return content.trim();
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* title
|
|
42
|
-
*/
|
|
43
|
-
get title() {
|
|
44
|
-
const content = this.content;
|
|
45
|
-
if (!content || typeof content !== "string") {
|
|
46
|
-
return "";
|
|
47
|
-
}
|
|
48
|
-
const titleMatch = content.match(/^#\s+(.*?)$/m);
|
|
49
|
-
if (!titleMatch || !titleMatch[1]) {
|
|
50
|
-
return "";
|
|
51
|
-
}
|
|
52
|
-
return titleMatch[1].trim();
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* H1の次の段落、またはH1がない場合は最初の段落をdescriptionとして取得する
|
|
56
|
-
*/
|
|
57
|
-
get description() {
|
|
58
|
-
const content = this.content;
|
|
59
|
-
// H1を見つける
|
|
60
|
-
const h1Match = content.match(/^#\s+(.+)$/m);
|
|
61
|
-
let searchContent;
|
|
62
|
-
if (h1Match) {
|
|
63
|
-
// H1がある場合は、H1の後の内容から検索
|
|
64
|
-
const h1EndIndex = (h1Match.index ?? 0) + h1Match[0].length;
|
|
65
|
-
searchContent = content.substring(h1EndIndex);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
// H1がない場合は、コンテンツ全体から検索
|
|
69
|
-
searchContent = content;
|
|
70
|
-
}
|
|
71
|
-
// 空行をスキップして最初の段落を取得(見出しやリストが来るまで)
|
|
72
|
-
const paragraphMatch = searchContent.match(/^\s*\n*([^#\n*-][^\n]*(?:\n(?![#\s*-])[^\n]*)*)/m);
|
|
73
|
-
return paragraphMatch ? (paragraphMatch[1]?.trim() ?? null) : null;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* 新しいフロントマターとコンテンツでMarkdownインスタンスを作成
|
|
77
|
-
*/
|
|
78
|
-
static fromProps(props) {
|
|
79
|
-
const contentOpenMarkdown = new DocContentMdValue(props.content);
|
|
80
|
-
const existingContent = contentOpenMarkdown.content;
|
|
81
|
-
// 新しいフロントマターでMarkdownテキストを生成
|
|
82
|
-
const frontMatterInstance = DocContentMdFrontMatterValue.fromFrontMatter(props.frontMatter);
|
|
83
|
-
const frontMatterText = frontMatterInstance.frontMatterText();
|
|
84
|
-
let markdownText;
|
|
85
|
-
if (frontMatterText) {
|
|
86
|
-
markdownText = `---\n${frontMatterText}\n---\n\n${existingContent}`.trim();
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
markdownText = existingContent;
|
|
90
|
-
}
|
|
91
|
-
return new DocContentMdValue(markdownText);
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* 現在のフロントマターをYAMLテキストに変換する
|
|
95
|
-
*/
|
|
96
|
-
frontMatterToText() {
|
|
97
|
-
return this.frontMatter.frontMatterText();
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* 現在のフロントマターを更新して新しいMarkdownテキストを生成
|
|
101
|
-
*/
|
|
102
|
-
updateFrontMatter(draft) {
|
|
103
|
-
const updatedFrontMatter = this.frontMatter.update(draft);
|
|
104
|
-
return DocContentMdValue.fromProps({
|
|
105
|
-
frontMatter: updatedFrontMatter.data || {},
|
|
106
|
-
content: this.content,
|
|
107
|
-
}).text;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* 新しいフロントマターでOpenMarkdownインスタンスを作成
|
|
111
|
-
*/
|
|
112
|
-
withFrontMatter(frontMatter) {
|
|
113
|
-
return DocContentMdValue.fromProps({
|
|
114
|
-
frontMatter,
|
|
115
|
-
content: this.content,
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* フロントマターを更新した新しいOpenMarkdownインスタンスを作成
|
|
120
|
-
*/
|
|
121
|
-
withUpdatedFrontMatter(draft) {
|
|
122
|
-
const updatedFrontMatter = this.frontMatter.update(draft);
|
|
123
|
-
return this.withFrontMatter(updatedFrontMatter.data || {});
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* マークダウンをtitle、description、本文の3つの部分に分離する
|
|
127
|
-
*/
|
|
128
|
-
parseContentParts() {
|
|
129
|
-
const content = this.content;
|
|
130
|
-
// H1を見つける
|
|
131
|
-
const h1Match = content.match(/^#\s+(.+)$/m);
|
|
132
|
-
if (!h1Match) {
|
|
133
|
-
// H1がない場合、最初の段落をdescriptionとして抽出
|
|
134
|
-
const paragraphMatch = content.match(/^(\s*)([^#\n*-][^\n]*(?:\n(?![#\s*-])[^\n]*)*)(.*)/ms);
|
|
135
|
-
if (paragraphMatch) {
|
|
136
|
-
const [, , descriptionPart, remaining] = paragraphMatch;
|
|
137
|
-
return {
|
|
138
|
-
title: null,
|
|
139
|
-
description: descriptionPart?.trim() ?? "",
|
|
140
|
-
body: remaining?.trim() ?? "",
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
return {
|
|
144
|
-
title: null,
|
|
145
|
-
description: null,
|
|
146
|
-
body: content.trim(),
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
const title = h1Match[1]?.trim() ?? "";
|
|
150
|
-
const h1EndIndex = (h1Match.index ?? 0) + h1Match[0].length;
|
|
151
|
-
const afterH1 = content.substring(h1EndIndex);
|
|
152
|
-
// description段落を見つける
|
|
153
|
-
const paragraphMatch = afterH1.match(/^(\s*\n*)([^#\n*-][^\n]*(?:\n(?![#\s*-])[^\n]*)*)(.*)/ms);
|
|
154
|
-
if (paragraphMatch) {
|
|
155
|
-
const [, , descriptionPart, remaining] = paragraphMatch;
|
|
156
|
-
return {
|
|
157
|
-
title,
|
|
158
|
-
description: descriptionPart?.trim() ?? "",
|
|
159
|
-
body: remaining?.trim() ?? "",
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
return {
|
|
163
|
-
title,
|
|
164
|
-
description: null,
|
|
165
|
-
body: afterH1.trim(),
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* title、description、本文からマークダウンを構築する
|
|
170
|
-
*/
|
|
171
|
-
buildContent(title, description, body) {
|
|
172
|
-
const parts = [];
|
|
173
|
-
if (title) {
|
|
174
|
-
parts.push(`# ${title}`);
|
|
175
|
-
}
|
|
176
|
-
if (description) {
|
|
177
|
-
parts.push(description);
|
|
178
|
-
}
|
|
179
|
-
if (body) {
|
|
180
|
-
parts.push(body);
|
|
181
|
-
}
|
|
182
|
-
return parts.join("\n\n");
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* H1タイトルを更新した新しいOpenMarkdownインスタンスを作成
|
|
186
|
-
*/
|
|
187
|
-
withTitle(newTitle) {
|
|
188
|
-
const { description, body } = this.parseContentParts();
|
|
189
|
-
const updatedContent = this.buildContent(newTitle, description, body);
|
|
190
|
-
// 既存のFrontMatterを保持
|
|
191
|
-
const frontMatterData = this.frontMatter.data !== null ? this.frontMatter.data : {};
|
|
192
|
-
return DocContentMdValue.fromProps({
|
|
193
|
-
frontMatter: frontMatterData,
|
|
194
|
-
content: updatedContent,
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* H1の次のdescription段落を更新した新しいOpenMarkdownインスタンスを作成
|
|
199
|
-
* @param newDescription 新しいdescription
|
|
200
|
-
* @param defaultTitle H1がない場合に使用するデフォルトタイトル
|
|
201
|
-
*/
|
|
202
|
-
withDescription(newDescription, defaultTitle) {
|
|
203
|
-
const { title, body } = this.parseContentParts();
|
|
204
|
-
// H1がない場合、デフォルトタイトルを使用
|
|
205
|
-
const finalTitle = title || defaultTitle;
|
|
206
|
-
if (!finalTitle) {
|
|
207
|
-
// タイトルが提供されない場合は変更しない
|
|
208
|
-
return this;
|
|
209
|
-
}
|
|
210
|
-
const updatedContent = this.buildContent(finalTitle, newDescription, body);
|
|
211
|
-
// 既存のFrontMatterを保持
|
|
212
|
-
const frontMatterData = this.frontMatter.data !== null ? this.frontMatter.data : {};
|
|
213
|
-
return DocContentMdValue.fromProps({
|
|
214
|
-
frontMatter: frontMatterData,
|
|
215
|
-
content: updatedContent,
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"doc-content-md-value.test.d.ts","sourceRoot":"","sources":["../../lib/values/doc-content-md-value.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "bun:test";
|
|
2
|
-
import { z } from "zod/v4";
|
|
3
|
-
import { DocContentMdValue } from "./doc-content-md-value";
|
|
4
|
-
describe("parseMarkdown", () => {
|
|
5
|
-
it("フロントマターがある場合は正しく抽出する", () => {
|
|
6
|
-
const text = `---
|
|
7
|
-
title: テストタイトル
|
|
8
|
-
description: テスト説明
|
|
9
|
-
---
|
|
10
|
-
# 見出し
|
|
11
|
-
本文コンテンツ`;
|
|
12
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
13
|
-
expect(openMarkdown.frontMatter.data).toEqual({
|
|
14
|
-
title: "テストタイトル",
|
|
15
|
-
description: "テスト説明",
|
|
16
|
-
});
|
|
17
|
-
expect(openMarkdown.content).toBe("# 見出し\n本文コンテンツ");
|
|
18
|
-
expect(openMarkdown.title).toBe("見出し");
|
|
19
|
-
});
|
|
20
|
-
it("フロントマターがない場合はnullを返す", () => {
|
|
21
|
-
const text = `# 見出し
|
|
22
|
-
本文コンテンツ`;
|
|
23
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
24
|
-
expect(openMarkdown.frontMatter.data).toBeNull();
|
|
25
|
-
expect(openMarkdown.content).toBe("# 見出し\n本文コンテンツ");
|
|
26
|
-
expect(openMarkdown.title).toBe("見出し");
|
|
27
|
-
});
|
|
28
|
-
it("最初の行が---でもフロントマターの終わりがない場合はnullを返す", () => {
|
|
29
|
-
const text = `---
|
|
30
|
-
ここには終わりがない
|
|
31
|
-
# 見出し
|
|
32
|
-
本文コンテンツ`;
|
|
33
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
34
|
-
expect(openMarkdown.frontMatter.data).toBeNull();
|
|
35
|
-
expect(openMarkdown.content).toContain("---");
|
|
36
|
-
});
|
|
37
|
-
it("空のフロントマターを処理できる", () => {
|
|
38
|
-
const text = `---
|
|
39
|
-
---
|
|
40
|
-
# 見出し
|
|
41
|
-
コンテンツ部分`;
|
|
42
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
43
|
-
expect(openMarkdown.frontMatter.data).toEqual({});
|
|
44
|
-
expect(openMarkdown.content).toBe("# 見出し\nコンテンツ部分");
|
|
45
|
-
expect(openMarkdown.title).toBe("見出し");
|
|
46
|
-
});
|
|
47
|
-
it("フロントマターの後に空行がある場合も処理できる", () => {
|
|
48
|
-
const text = `---
|
|
49
|
-
title: テストタイトル
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
# 見出し
|
|
53
|
-
本文コンテンツ`;
|
|
54
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
55
|
-
expect(openMarkdown.frontMatter.data).toEqual({ title: "テストタイトル" });
|
|
56
|
-
expect(openMarkdown.content).toBe("# 見出し\n本文コンテンツ");
|
|
57
|
-
expect(openMarkdown.title).toBe("見出し");
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
describe("OpenMarkdown instance", () => {
|
|
61
|
-
it("基本的なfront matterを解析できる", () => {
|
|
62
|
-
const text = `---
|
|
63
|
-
title: テストタイトル
|
|
64
|
-
description: テスト説明
|
|
65
|
-
---
|
|
66
|
-
# 見出し
|
|
67
|
-
本文コンテンツ`;
|
|
68
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
69
|
-
expect(openMarkdown.frontMatter.data).toEqual({
|
|
70
|
-
title: "テストタイトル",
|
|
71
|
-
description: "テスト説明",
|
|
72
|
-
});
|
|
73
|
-
expect(openMarkdown.content).toBe("# 見出し\n本文コンテンツ");
|
|
74
|
-
expect(openMarkdown.title).toBe("見出し");
|
|
75
|
-
});
|
|
76
|
-
it("空のfront matterも処理できる", () => {
|
|
77
|
-
const text = `---
|
|
78
|
-
---
|
|
79
|
-
# 見出し
|
|
80
|
-
本文コンテンツ`;
|
|
81
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
82
|
-
expect(openMarkdown.frontMatter.data).toEqual({});
|
|
83
|
-
expect(openMarkdown.content).toBe("# 見出し\n本文コンテンツ");
|
|
84
|
-
expect(openMarkdown.title).toBe("見出し");
|
|
85
|
-
});
|
|
86
|
-
it("配列値を含むfront matterを処理できる", () => {
|
|
87
|
-
const text = `---
|
|
88
|
-
title: テストタイトル
|
|
89
|
-
tags:
|
|
90
|
-
- タグ1
|
|
91
|
-
- タグ2
|
|
92
|
-
- タグ3
|
|
93
|
-
---
|
|
94
|
-
# 見出し
|
|
95
|
-
本文コンテンツ`;
|
|
96
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
97
|
-
expect(openMarkdown.frontMatter.data).toEqual({
|
|
98
|
-
title: "テストタイトル",
|
|
99
|
-
tags: ["タグ1", "タグ2", "タグ3"],
|
|
100
|
-
});
|
|
101
|
-
expect(openMarkdown.content).toBe("# 見出し\n本文コンテンツ");
|
|
102
|
-
expect(openMarkdown.title).toBe("見出し");
|
|
103
|
-
});
|
|
104
|
-
it("型変換を含むスキーマでも正しく動作する", () => {
|
|
105
|
-
// スキーマの型を明示的に定義
|
|
106
|
-
const schema = z.object({
|
|
107
|
-
title: z.string(),
|
|
108
|
-
count: z.number().transform((val) => val * 2),
|
|
109
|
-
});
|
|
110
|
-
const text = `---
|
|
111
|
-
title: テストタイトル
|
|
112
|
-
count: 42
|
|
113
|
-
---
|
|
114
|
-
# 見出し
|
|
115
|
-
本文コンテンツ`;
|
|
116
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
117
|
-
const data = schema.parse(openMarkdown.frontMatter.data);
|
|
118
|
-
expect(data).toEqual({
|
|
119
|
-
title: "テストタイトル",
|
|
120
|
-
count: 84,
|
|
121
|
-
});
|
|
122
|
-
expect(openMarkdown.content).toBe("# 見出し\n本文コンテンツ");
|
|
123
|
-
expect(openMarkdown.title).toBe("見出し");
|
|
124
|
-
});
|
|
125
|
-
it("fromPropsメソッドでMarkdownテキストを生成できる", () => {
|
|
126
|
-
const text = `---
|
|
127
|
-
title: テストタイトル
|
|
128
|
-
---
|
|
129
|
-
# 見出し
|
|
130
|
-
本文コンテンツ`;
|
|
131
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
132
|
-
const generatedMarkdown = DocContentMdValue.fromProps({
|
|
133
|
-
frontMatter: openMarkdown.frontMatter.data || {},
|
|
134
|
-
content: openMarkdown.content,
|
|
135
|
-
});
|
|
136
|
-
expect(generatedMarkdown.text).toContain("title: テストタイトル");
|
|
137
|
-
expect(generatedMarkdown.text).toContain("# 見出し");
|
|
138
|
-
expect(generatedMarkdown.text).toContain("本文コンテンツ");
|
|
139
|
-
});
|
|
140
|
-
it("updateFrontMatterメソッドでフロントマターを更新できる", () => {
|
|
141
|
-
const text = `---
|
|
142
|
-
title: テストタイトル
|
|
143
|
-
---
|
|
144
|
-
# 見出し
|
|
145
|
-
本文コンテンツ`;
|
|
146
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
147
|
-
const updatedText = openMarkdown.updateFrontMatter({
|
|
148
|
-
title: "更新されたタイトル",
|
|
149
|
-
description: "新しい説明",
|
|
150
|
-
});
|
|
151
|
-
expect(updatedText).toContain("title: 更新されたタイトル");
|
|
152
|
-
expect(updatedText).toContain("description: 新しい説明");
|
|
153
|
-
expect(updatedText).toContain("# 見出し");
|
|
154
|
-
expect(updatedText).toContain("本文コンテンツ");
|
|
155
|
-
});
|
|
156
|
-
it("frontMatter.yamlTextでフロントマターYAMLテキストを取得できる", () => {
|
|
157
|
-
const text = `---
|
|
158
|
-
title: テストタイトル
|
|
159
|
-
description: テスト説明
|
|
160
|
-
tags:
|
|
161
|
-
- tag1
|
|
162
|
-
- tag2
|
|
163
|
-
---
|
|
164
|
-
# 見出し
|
|
165
|
-
本文コンテンツ`;
|
|
166
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
167
|
-
expect(openMarkdown.frontMatter.yamlText).toBe(`title: テストタイトル
|
|
168
|
-
description: テスト説明
|
|
169
|
-
tags:
|
|
170
|
-
- tag1
|
|
171
|
-
- tag2`);
|
|
172
|
-
});
|
|
173
|
-
it("フロントマターがない場合frontMatter.yamlTextは空文字", () => {
|
|
174
|
-
const text = `# 見出し
|
|
175
|
-
本文コンテンツ`;
|
|
176
|
-
const openMarkdown = new DocContentMdValue(text);
|
|
177
|
-
expect(openMarkdown.frontMatter.yamlText).toBe("");
|
|
178
|
-
});
|
|
179
|
-
});
|