@tbsten/mir-core 0.0.2-alpha07 → 0.0.2-alpha09
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/dist/generated/validate-mirconfig.js +10 -8
- package/dist/generated/validate-mirconfig.js.map +1 -1
- package/dist/i18n/locales/en.js +1 -4
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/ja.js +1 -4
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/types.d.ts +0 -2
- package/package.json +1 -1
- package/dist/__tests__/__snapshots__/remote-registry-authorization.test.js.snap +0 -36
- package/dist/__tests__/errors.test.d.ts +0 -1
- package/dist/__tests__/errors.test.js +0 -51
- package/dist/__tests__/errors.test.js.map +0 -1
- package/dist/__tests__/expand-default-value.test.d.ts +0 -1
- package/dist/__tests__/expand-default-value.test.js +0 -104
- package/dist/__tests__/expand-default-value.test.js.map +0 -1
- package/dist/__tests__/helpers/new-helpers.test.d.ts +0 -1
- package/dist/__tests__/helpers/new-helpers.test.js +0 -48
- package/dist/__tests__/helpers/new-helpers.test.js.map +0 -1
- package/dist/__tests__/helpers/string-helpers.test.d.ts +0 -1
- package/dist/__tests__/helpers/string-helpers.test.js +0 -61
- package/dist/__tests__/helpers/string-helpers.test.js.map +0 -1
- package/dist/__tests__/hooks.test.d.ts +0 -1
- package/dist/__tests__/hooks.test.js +0 -125
- package/dist/__tests__/hooks.test.js.map +0 -1
- package/dist/__tests__/i18n.test.d.ts +0 -1
- package/dist/__tests__/i18n.test.js +0 -51
- package/dist/__tests__/i18n.test.js.map +0 -1
- package/dist/__tests__/remote-registry-authorization.test.d.ts +0 -1
- package/dist/__tests__/remote-registry-authorization.test.js +0 -132
- package/dist/__tests__/remote-registry-authorization.test.js.map +0 -1
- package/dist/__tests__/remote-registry.test.d.ts +0 -1
- package/dist/__tests__/remote-registry.test.js +0 -251
- package/dist/__tests__/remote-registry.test.js.map +0 -1
- package/dist/__tests__/safe-yaml-parser.test.d.ts +0 -1
- package/dist/__tests__/safe-yaml-parser.test.js +0 -159
- package/dist/__tests__/safe-yaml-parser.test.js.map +0 -1
- package/dist/__tests__/snapshots/__snapshots__/error-messages.snapshot.test.js.snap +0 -27
- package/dist/__tests__/snapshots/__snapshots__/snippet-schema-output.snapshot.test.js.snap +0 -78
- package/dist/__tests__/snapshots/__snapshots__/template-output.snapshot.test.js.snap +0 -45
- package/dist/__tests__/snapshots/error-messages.snapshot.test.d.ts +0 -1
- package/dist/__tests__/snapshots/error-messages.snapshot.test.js +0 -52
- package/dist/__tests__/snapshots/error-messages.snapshot.test.js.map +0 -1
- package/dist/__tests__/snapshots/snippet-schema-output.snapshot.test.d.ts +0 -1
- package/dist/__tests__/snapshots/snippet-schema-output.snapshot.test.js +0 -93
- package/dist/__tests__/snapshots/snippet-schema-output.snapshot.test.js.map +0 -1
- package/dist/__tests__/snapshots/template-output.snapshot.test.d.ts +0 -1
- package/dist/__tests__/snapshots/template-output.snapshot.test.js +0 -60
- package/dist/__tests__/snapshots/template-output.snapshot.test.js.map +0 -1
- package/dist/__tests__/snippet-schema.test.d.ts +0 -1
- package/dist/__tests__/snippet-schema.test.js +0 -137
- package/dist/__tests__/snippet-schema.test.js.map +0 -1
- package/dist/__tests__/symlink-checker.test.d.ts +0 -1
- package/dist/__tests__/symlink-checker.test.js +0 -81
- package/dist/__tests__/symlink-checker.test.js.map +0 -1
- package/dist/__tests__/template-engine.test.d.ts +0 -1
- package/dist/__tests__/template-engine.test.js +0 -175
- package/dist/__tests__/template-engine.test.js.map +0 -1
- package/dist/__tests__/validate-name.test.d.ts +0 -1
- package/dist/__tests__/validate-name.test.js +0 -49
- package/dist/__tests__/validate-name.test.js.map +0 -1
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* mir-core: snippet-schema の unit テスト
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect } from "vitest";
|
|
5
|
-
import { parseSnippetYaml, serializeSnippetYaml, validateSnippetDefinition, ValidationError, } from "../index.js";
|
|
6
|
-
// TODO: 現時点では理想の挙動をテストケースとして記述。後で有効化する。
|
|
7
|
-
describe("parseSnippetYaml", () => {
|
|
8
|
-
it("最小限の YAML をパースできる", () => {
|
|
9
|
-
const def = parseSnippetYaml("name: my-snippet\n");
|
|
10
|
-
expect(def.name).toBe("my-snippet");
|
|
11
|
-
});
|
|
12
|
-
it("変数付き YAML をパースできる", () => {
|
|
13
|
-
const yaml = `
|
|
14
|
-
name: react-hook
|
|
15
|
-
description: React カスタムフック
|
|
16
|
-
variables:
|
|
17
|
-
name:
|
|
18
|
-
description: フック名
|
|
19
|
-
schema:
|
|
20
|
-
type: string
|
|
21
|
-
`;
|
|
22
|
-
const def = parseSnippetYaml(yaml);
|
|
23
|
-
expect(def.name).toBe("react-hook");
|
|
24
|
-
expect(def.variables?.name?.description).toBe("フック名");
|
|
25
|
-
expect(def.variables?.name?.schema?.type).toBe("string");
|
|
26
|
-
});
|
|
27
|
-
it("hooks 付き YAML をパースできる", () => {
|
|
28
|
-
const yaml = `
|
|
29
|
-
name: test-snippet
|
|
30
|
-
hooks:
|
|
31
|
-
before-install:
|
|
32
|
-
- echo: "Installing..."
|
|
33
|
-
after-install:
|
|
34
|
-
- echo: "Done!"
|
|
35
|
-
`;
|
|
36
|
-
const def = parseSnippetYaml(yaml);
|
|
37
|
-
expect(def.hooks?.["before-install"]).toHaveLength(1);
|
|
38
|
-
expect(def.hooks?.["after-install"]).toHaveLength(1);
|
|
39
|
-
});
|
|
40
|
-
it("dependencies 付き YAML をパースできる", () => {
|
|
41
|
-
const yaml = `
|
|
42
|
-
name: react-component
|
|
43
|
-
description: React component
|
|
44
|
-
dependencies:
|
|
45
|
-
- react-hook
|
|
46
|
-
- typescript-setup
|
|
47
|
-
`;
|
|
48
|
-
const def = parseSnippetYaml(yaml);
|
|
49
|
-
expect(def.dependencies).toEqual(["react-hook", "typescript-setup"]);
|
|
50
|
-
});
|
|
51
|
-
it("不正な YAML でエラー", () => {
|
|
52
|
-
expect(() => parseSnippetYaml("not a yaml object: [")).toThrow();
|
|
53
|
-
});
|
|
54
|
-
it("name がない YAML でエラー", () => {
|
|
55
|
-
expect(() => parseSnippetYaml("description: no name\n")).toThrow(ValidationError);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
describe("serializeSnippetYaml", () => {
|
|
59
|
-
it("SnippetDefinition を YAML 文字列に変換する", () => {
|
|
60
|
-
const yaml = serializeSnippetYaml({ name: "test" });
|
|
61
|
-
expect(yaml).toContain("name: test");
|
|
62
|
-
});
|
|
63
|
-
it("パースと逆変換で元に戻る", () => {
|
|
64
|
-
const original = { name: "test", description: "desc" };
|
|
65
|
-
const yaml = serializeSnippetYaml(original);
|
|
66
|
-
const parsed = parseSnippetYaml(yaml);
|
|
67
|
-
expect(parsed.name).toBe(original.name);
|
|
68
|
-
expect(parsed.description).toBe(original.description);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
describe("validateSnippetDefinition", () => {
|
|
72
|
-
it("最小限の定義はバリデーション通過", () => {
|
|
73
|
-
expect(() => validateSnippetDefinition({ name: "valid" })).not.toThrow();
|
|
74
|
-
});
|
|
75
|
-
it("name が空だとエラー", () => {
|
|
76
|
-
expect(() => validateSnippetDefinition({ name: "" })).toThrow(ValidationError);
|
|
77
|
-
});
|
|
78
|
-
it("suggests が配列でないとエラー", () => {
|
|
79
|
-
expect(() => validateSnippetDefinition({
|
|
80
|
-
name: "test",
|
|
81
|
-
variables: {
|
|
82
|
-
key: { suggests: "not-array" },
|
|
83
|
-
},
|
|
84
|
-
})).toThrow(ValidationError);
|
|
85
|
-
});
|
|
86
|
-
it("schema.type が不正だとエラー", () => {
|
|
87
|
-
expect(() => validateSnippetDefinition({
|
|
88
|
-
name: "test",
|
|
89
|
-
variables: {
|
|
90
|
-
key: {
|
|
91
|
-
schema: { type: "invalid" },
|
|
92
|
-
},
|
|
93
|
-
},
|
|
94
|
-
})).toThrow(ValidationError);
|
|
95
|
-
});
|
|
96
|
-
it("正しい schema.type は通過 (string, number, boolean)", () => {
|
|
97
|
-
expect(() => validateSnippetDefinition({
|
|
98
|
-
name: "test",
|
|
99
|
-
variables: {
|
|
100
|
-
a: { schema: { type: "string" } },
|
|
101
|
-
b: { schema: { type: "number" } },
|
|
102
|
-
c: { schema: { type: "boolean" } },
|
|
103
|
-
},
|
|
104
|
-
})).not.toThrow();
|
|
105
|
-
});
|
|
106
|
-
it("dependencies が配列の場合は通過", () => {
|
|
107
|
-
expect(() => validateSnippetDefinition({
|
|
108
|
-
name: "react-component",
|
|
109
|
-
dependencies: ["react-hook"],
|
|
110
|
-
})).not.toThrow();
|
|
111
|
-
});
|
|
112
|
-
it("dependencies に複数要素を持つ場合は通過", () => {
|
|
113
|
-
expect(() => validateSnippetDefinition({
|
|
114
|
-
name: "test",
|
|
115
|
-
dependencies: ["dep1", "dep2", "dep3"],
|
|
116
|
-
})).not.toThrow();
|
|
117
|
-
});
|
|
118
|
-
it("dependencies が配列でないとエラー", () => {
|
|
119
|
-
expect(() => validateSnippetDefinition({
|
|
120
|
-
name: "test",
|
|
121
|
-
dependencies: "not-array",
|
|
122
|
-
})).toThrow(ValidationError);
|
|
123
|
-
});
|
|
124
|
-
it("dependencies の要素が文字列でないとエラー", () => {
|
|
125
|
-
expect(() => validateSnippetDefinition({
|
|
126
|
-
name: "test",
|
|
127
|
-
dependencies: ["valid-dep", 123],
|
|
128
|
-
})).toThrow(ValidationError);
|
|
129
|
-
});
|
|
130
|
-
it("dependencies の要素に不正な名前があるとエラー", () => {
|
|
131
|
-
expect(() => validateSnippetDefinition({
|
|
132
|
-
name: "test",
|
|
133
|
-
dependencies: ["-invalid-dep-name"],
|
|
134
|
-
})).toThrow(ValidationError);
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
//# sourceMappingURL=snippet-schema.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"snippet-schema.test.js","sourceRoot":"","sources":["../../src/__tests__/snippet-schema.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,yBAAyB,EACzB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,wCAAwC;AAExC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,GAAG,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,IAAI,GAAG;;;;;;;;CAQhB,CAAC;QACE,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG;;;;;;;CAOhB,CAAC;QACE,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG;;;;;;CAMhB,CAAC;QACE,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QACvB,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAC9D,eAAe,CAChB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG,oBAAoB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QACtB,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QACtB,MAAM,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAC3D,eAAe,CAChB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE;gBACT,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAkC,EAAE;aACtD;SACF,CAAC,CACH,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE;gBACT,GAAG,EAAE;oBACH,MAAM,EAAE,EAAE,IAAI,EAAE,SAAqB,EAAE;iBACxC;aACF;SACF,CAAC,CACH,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE;gBACT,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACjC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACjC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;aACnC;SACF,CAAC,CACH,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,IAAI,EAAE,iBAAiB;YACvB,YAAY,EAAE,CAAC,YAAY,CAAC;SAC7B,CAAC,CACH,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SACvC,CAAC,CACH,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,WAAkC;SACjD,CAAC,CACH,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,CAAC,WAAW,EAAE,GAAwB,CAAC;SACtD,CAAC,CACH,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,CAAC,mBAAmB,CAAC;SACpC,CAAC,CACH,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import os from "node:os";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import { isSymbolicLink, findSymlinksInDirectory } from "../lib/symlink-checker.js";
|
|
6
|
-
let tmpDir;
|
|
7
|
-
beforeEach(() => {
|
|
8
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "mir-symlink-test-"));
|
|
9
|
-
});
|
|
10
|
-
afterEach(() => {
|
|
11
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
12
|
-
});
|
|
13
|
-
describe("isSymbolicLink", () => {
|
|
14
|
-
it("通常のファイルに対して false を返す", () => {
|
|
15
|
-
const filePath = path.join(tmpDir, "regular.txt");
|
|
16
|
-
fs.writeFileSync(filePath, "content");
|
|
17
|
-
expect(isSymbolicLink(filePath)).toBe(false);
|
|
18
|
-
});
|
|
19
|
-
it("ディレクトリに対して false を返す", () => {
|
|
20
|
-
const dirPath = path.join(tmpDir, "subdir");
|
|
21
|
-
fs.mkdirSync(dirPath);
|
|
22
|
-
expect(isSymbolicLink(dirPath)).toBe(false);
|
|
23
|
-
});
|
|
24
|
-
it("シンボリックリンクに対して true を返す", () => {
|
|
25
|
-
const targetPath = path.join(tmpDir, "target.txt");
|
|
26
|
-
const linkPath = path.join(tmpDir, "link.txt");
|
|
27
|
-
fs.writeFileSync(targetPath, "content");
|
|
28
|
-
fs.symlinkSync(targetPath, linkPath);
|
|
29
|
-
expect(isSymbolicLink(linkPath)).toBe(true);
|
|
30
|
-
});
|
|
31
|
-
it("存在しないパスに対して false を返す", () => {
|
|
32
|
-
expect(isSymbolicLink(path.join(tmpDir, "nonexistent"))).toBe(false);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
describe("findSymlinksInDirectory", () => {
|
|
36
|
-
it("シンボリックリンクがない場合 hasSymlinks=false を返す", () => {
|
|
37
|
-
fs.writeFileSync(path.join(tmpDir, "index.ts"), "content");
|
|
38
|
-
const result = findSymlinksInDirectory(tmpDir);
|
|
39
|
-
expect(result.hasSymlinks).toBe(false);
|
|
40
|
-
expect(result.symlinkPaths).toHaveLength(0);
|
|
41
|
-
});
|
|
42
|
-
it("シンボリックリンクを検出する", () => {
|
|
43
|
-
const targetPath = path.join(tmpDir, "target.txt");
|
|
44
|
-
const linkPath = path.join(tmpDir, "link.txt");
|
|
45
|
-
fs.writeFileSync(targetPath, "content");
|
|
46
|
-
fs.symlinkSync(targetPath, linkPath);
|
|
47
|
-
const result = findSymlinksInDirectory(tmpDir);
|
|
48
|
-
expect(result.hasSymlinks).toBe(true);
|
|
49
|
-
expect(result.symlinkPaths).toContain("link.txt");
|
|
50
|
-
});
|
|
51
|
-
it("サブディレクトリ内のシンボリックリンクを検出する", () => {
|
|
52
|
-
const subDir = path.join(tmpDir, "src");
|
|
53
|
-
fs.mkdirSync(subDir);
|
|
54
|
-
const targetPath = path.join(tmpDir, "target.txt");
|
|
55
|
-
const linkPath = path.join(subDir, "link.txt");
|
|
56
|
-
fs.writeFileSync(targetPath, "content");
|
|
57
|
-
fs.symlinkSync(targetPath, linkPath);
|
|
58
|
-
const result = findSymlinksInDirectory(tmpDir);
|
|
59
|
-
expect(result.hasSymlinks).toBe(true);
|
|
60
|
-
expect(result.symlinkPaths.some((p) => p.includes("link.txt"))).toBe(true);
|
|
61
|
-
});
|
|
62
|
-
it("複数のシンボリックリンクをすべて検出する", () => {
|
|
63
|
-
const target1 = path.join(tmpDir, "target1.txt");
|
|
64
|
-
const target2 = path.join(tmpDir, "target2.txt");
|
|
65
|
-
const link1 = path.join(tmpDir, "link1.txt");
|
|
66
|
-
const link2 = path.join(tmpDir, "link2.txt");
|
|
67
|
-
fs.writeFileSync(target1, "content1");
|
|
68
|
-
fs.writeFileSync(target2, "content2");
|
|
69
|
-
fs.symlinkSync(target1, link1);
|
|
70
|
-
fs.symlinkSync(target2, link2);
|
|
71
|
-
const result = findSymlinksInDirectory(tmpDir);
|
|
72
|
-
expect(result.hasSymlinks).toBe(true);
|
|
73
|
-
expect(result.symlinkPaths).toHaveLength(2);
|
|
74
|
-
});
|
|
75
|
-
it("存在しないディレクトリに対して空の結果を返す", () => {
|
|
76
|
-
const result = findSymlinksInDirectory(path.join(tmpDir, "nonexistent"));
|
|
77
|
-
expect(result.hasSymlinks).toBe(false);
|
|
78
|
-
expect(result.symlinkPaths).toHaveLength(0);
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
//# sourceMappingURL=symlink-checker.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"symlink-checker.test.js","sourceRoot":"","sources":["../../src/__tests__/symlink-checker.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* mir-core: テンプレートエンジンの unit テスト
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
5
|
-
import fs from "node:fs";
|
|
6
|
-
import os from "node:os";
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import { expandTemplate, expandPath, extractVariables, extractVariablesFromDirectory, } from "../index.js";
|
|
9
|
-
// TODO: 現時点では理想の挙動をテストケースとして記述。後で有効化する。
|
|
10
|
-
describe("expandTemplate", () => {
|
|
11
|
-
it("変数を展開する", () => {
|
|
12
|
-
expect(expandTemplate("Hello, {{ name }}!", { name: "World" })).toBe("Hello, World!");
|
|
13
|
-
});
|
|
14
|
-
it("複数変数を展開する", () => {
|
|
15
|
-
const result = expandTemplate("{{ greeting }}, {{ name }}!", { greeting: "Hi", name: "User" });
|
|
16
|
-
expect(result).toBe("Hi, User!");
|
|
17
|
-
});
|
|
18
|
-
it("変数が未定義の場合は空文字に展開", () => {
|
|
19
|
-
expect(expandTemplate("Hello, {{ name }}!", {})).toBe("Hello, !");
|
|
20
|
-
});
|
|
21
|
-
it("変数を含まないテンプレートはそのまま返す", () => {
|
|
22
|
-
expect(expandTemplate("plain text", {})).toBe("plain text");
|
|
23
|
-
});
|
|
24
|
-
it("空テンプレートは空文字を返す", () => {
|
|
25
|
-
expect(expandTemplate("", {})).toBe("");
|
|
26
|
-
});
|
|
27
|
-
it("Handlebars の #if ブロックを展開する", () => {
|
|
28
|
-
const template = "{{#if enabled}}ON{{else}}OFF{{/if}}";
|
|
29
|
-
expect(expandTemplate(template, { enabled: true })).toBe("ON");
|
|
30
|
-
expect(expandTemplate(template, { enabled: false })).toBe("OFF");
|
|
31
|
-
});
|
|
32
|
-
it("noEscape モードで HTML タグがエスケープされない", () => {
|
|
33
|
-
expect(expandTemplate("{{ html }}", { html: "<div>test</div>" })).toBe("<div>test</div>");
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
describe("expandPath", () => {
|
|
37
|
-
it("パス内の変数を展開する", () => {
|
|
38
|
-
expect(expandPath("{{ name }}.ts", { name: "useAuth" })).toBe("useAuth.ts");
|
|
39
|
-
});
|
|
40
|
-
it("ネストしたパスの変数を展開する", () => {
|
|
41
|
-
const result = expandPath("{{ dir }}/{{ name }}.ts", {
|
|
42
|
-
dir: "hooks",
|
|
43
|
-
name: "useAuth",
|
|
44
|
-
});
|
|
45
|
-
expect(result).toMatch(/hooks[/\\]useAuth\.ts/);
|
|
46
|
-
});
|
|
47
|
-
it("パス区切りを正規化する", () => {
|
|
48
|
-
const result = expandPath("a//b/c", {});
|
|
49
|
-
expect(result).not.toContain("//");
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe("extractVariables", () => {
|
|
53
|
-
it("単一変数を抽出する", () => {
|
|
54
|
-
expect(extractVariables("{{ name }}")).toContain("name");
|
|
55
|
-
});
|
|
56
|
-
it("複数変数を抽出する", () => {
|
|
57
|
-
const vars = extractVariables("{{ name }} {{ description }}");
|
|
58
|
-
expect(vars).toContain("name");
|
|
59
|
-
expect(vars).toContain("description");
|
|
60
|
-
});
|
|
61
|
-
it("重複変数は1つにまとめる", () => {
|
|
62
|
-
const vars = extractVariables("{{ name }} {{ name }}");
|
|
63
|
-
expect(vars.filter((v) => v === "name")).toHaveLength(1);
|
|
64
|
-
});
|
|
65
|
-
it("変数がない場合は空配列", () => {
|
|
66
|
-
expect(extractVariables("no variables")).toEqual([]);
|
|
67
|
-
});
|
|
68
|
-
it("#if ブロック内の変数を抽出する", () => {
|
|
69
|
-
const vars = extractVariables("{{#if enabled}}{{ name }}{{/if}}");
|
|
70
|
-
expect(vars).toContain("enabled");
|
|
71
|
-
expect(vars).toContain("name");
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
describe("expandTemplate with helpers", () => {
|
|
75
|
-
it("lowercase ヘルパー", () => {
|
|
76
|
-
expect(expandTemplate("{{lowercase name}}", { name: "HELLO" })).toBe("hello");
|
|
77
|
-
});
|
|
78
|
-
it("uppercase ヘルパー", () => {
|
|
79
|
-
expect(expandTemplate("{{uppercase name}}", { name: "hello" })).toBe("HELLO");
|
|
80
|
-
});
|
|
81
|
-
it("replace ヘルパー", () => {
|
|
82
|
-
expect(expandTemplate('{{replace package "/" "."}}', { package: "com/example/app" })).toBe("com.example.app");
|
|
83
|
-
});
|
|
84
|
-
it("camelCase ヘルパー", () => {
|
|
85
|
-
expect(expandTemplate("{{camelCase name}}", { name: "my-component" })).toBe("myComponent");
|
|
86
|
-
});
|
|
87
|
-
it("pascalCase ヘルパー", () => {
|
|
88
|
-
expect(expandTemplate("{{pascalCase name}}", { name: "my-component" })).toBe("MyComponent");
|
|
89
|
-
});
|
|
90
|
-
it("snakeCase ヘルパー", () => {
|
|
91
|
-
expect(expandTemplate("{{snakeCase name}}", { name: "myComponent" })).toBe("my_component");
|
|
92
|
-
});
|
|
93
|
-
it("kebabCase ヘルパー", () => {
|
|
94
|
-
expect(expandTemplate("{{kebabCase name}}", { name: "MyComponent" })).toBe("my-component");
|
|
95
|
-
});
|
|
96
|
-
it("capitalize ヘルパー", () => {
|
|
97
|
-
expect(expandTemplate("{{capitalize name}}", { name: "hello" })).toBe("Hello");
|
|
98
|
-
});
|
|
99
|
-
it("uncapitalize ヘルパー", () => {
|
|
100
|
-
expect(expandTemplate("{{uncapitalize name}}", { name: "Hello" })).toBe("hello");
|
|
101
|
-
});
|
|
102
|
-
it("trim ヘルパー", () => {
|
|
103
|
-
expect(expandTemplate("{{trim name}}", { name: " hello " })).toBe("hello");
|
|
104
|
-
});
|
|
105
|
-
it("サブ式(ネスト): lowercase(replace(...))", () => {
|
|
106
|
-
expect(expandTemplate('{{lowercase (replace name "/" ".")}}', {
|
|
107
|
-
name: "COM/EXAMPLE/APP",
|
|
108
|
-
})).toBe("com.example.app");
|
|
109
|
-
});
|
|
110
|
-
it("サブ式(ネスト): pascalCase(replace(...))", () => {
|
|
111
|
-
expect(expandTemplate('{{pascalCase (replace pkg "/" "-")}}', {
|
|
112
|
-
pkg: "my/cool/component",
|
|
113
|
-
})).toBe("MyCoolComponent");
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
describe("extractVariables with helpers", () => {
|
|
117
|
-
it("ヘルパー名を変数に含めない", () => {
|
|
118
|
-
const vars = extractVariables("{{lowercase name}}");
|
|
119
|
-
expect(vars).toContain("name");
|
|
120
|
-
expect(vars).not.toContain("lowercase");
|
|
121
|
-
});
|
|
122
|
-
it("replace ヘルパーで変数のみ抽出", () => {
|
|
123
|
-
const vars = extractVariables('{{replace package "/" "."}}');
|
|
124
|
-
expect(vars).toContain("package");
|
|
125
|
-
expect(vars).not.toContain("replace");
|
|
126
|
-
});
|
|
127
|
-
it("サブ式でもヘルパー名を除外", () => {
|
|
128
|
-
const vars = extractVariables('{{lowercase (replace name "/" ".")}}');
|
|
129
|
-
expect(vars).toContain("name");
|
|
130
|
-
expect(vars).not.toContain("lowercase");
|
|
131
|
-
expect(vars).not.toContain("replace");
|
|
132
|
-
});
|
|
133
|
-
it("ヘルパーと通常変数が混在", () => {
|
|
134
|
-
const vars = extractVariables("{{name}} {{lowercase title}}");
|
|
135
|
-
expect(vars).toContain("name");
|
|
136
|
-
expect(vars).toContain("title");
|
|
137
|
-
expect(vars).not.toContain("lowercase");
|
|
138
|
-
});
|
|
139
|
-
it("組み込みヘルパー (if/each) も変数に含めない", () => {
|
|
140
|
-
const vars = extractVariables("{{#if enabled}}{{name}}{{/if}}");
|
|
141
|
-
expect(vars).toContain("enabled");
|
|
142
|
-
expect(vars).toContain("name");
|
|
143
|
-
expect(vars).not.toContain("if");
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
describe("extractVariablesFromDirectory", () => {
|
|
147
|
-
let tmpDir;
|
|
148
|
-
beforeEach(() => {
|
|
149
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "mir-core-test-"));
|
|
150
|
-
});
|
|
151
|
-
afterEach(() => {
|
|
152
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
153
|
-
});
|
|
154
|
-
it("ファイル内容から変数を抽出する", () => {
|
|
155
|
-
fs.writeFileSync(path.join(tmpDir, "index.ts"), "export {{ name }}", "utf-8");
|
|
156
|
-
const vars = extractVariablesFromDirectory(tmpDir);
|
|
157
|
-
expect(vars).toContain("name");
|
|
158
|
-
});
|
|
159
|
-
it("ファイル名から変数を抽出する", () => {
|
|
160
|
-
fs.writeFileSync(path.join(tmpDir, "{{ name }}.ts"), "content", "utf-8");
|
|
161
|
-
const vars = extractVariablesFromDirectory(tmpDir);
|
|
162
|
-
expect(vars).toContain("name");
|
|
163
|
-
});
|
|
164
|
-
it("サブディレクトリ名から変数を抽出する", () => {
|
|
165
|
-
const subDir = path.join(tmpDir, "{{ module }}");
|
|
166
|
-
fs.mkdirSync(subDir, { recursive: true });
|
|
167
|
-
fs.writeFileSync(path.join(subDir, "index.ts"), "export {}", "utf-8");
|
|
168
|
-
const vars = extractVariablesFromDirectory(tmpDir);
|
|
169
|
-
expect(vars).toContain("module");
|
|
170
|
-
});
|
|
171
|
-
it("存在しないディレクトリは空配列", () => {
|
|
172
|
-
expect(extractVariablesFromDirectory("/nonexistent")).toEqual([]);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
//# sourceMappingURL=template-engine.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template-engine.test.js","sourceRoot":"","sources":["../../src/__tests__/template-engine.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* mir-core: validateSnippetName の unit テスト
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect } from "vitest";
|
|
5
|
-
import { validateSnippetName, ValidationError } from "../index.js";
|
|
6
|
-
// TODO: 現時点では理想の挙動をテストケースとして記述。後で有効化する。
|
|
7
|
-
describe("validateSnippetName", () => {
|
|
8
|
-
describe("正常系", () => {
|
|
9
|
-
it("英小文字のみ", () => {
|
|
10
|
-
expect(() => validateSnippetName("react")).not.toThrow();
|
|
11
|
-
});
|
|
12
|
-
it("英数字 + ハイフン", () => {
|
|
13
|
-
expect(() => validateSnippetName("react-hook")).not.toThrow();
|
|
14
|
-
});
|
|
15
|
-
it("数字始まり", () => {
|
|
16
|
-
expect(() => validateSnippetName("1component")).not.toThrow();
|
|
17
|
-
});
|
|
18
|
-
it("大文字含む", () => {
|
|
19
|
-
expect(() => validateSnippetName("MyComponent")).not.toThrow();
|
|
20
|
-
});
|
|
21
|
-
it("1文字", () => {
|
|
22
|
-
expect(() => validateSnippetName("a")).not.toThrow();
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
describe("異常系", () => {
|
|
26
|
-
it("空文字でエラー", () => {
|
|
27
|
-
expect(() => validateSnippetName("")).toThrow(ValidationError);
|
|
28
|
-
});
|
|
29
|
-
it("アンダースコアでエラー", () => {
|
|
30
|
-
expect(() => validateSnippetName("my_comp")).toThrow(ValidationError);
|
|
31
|
-
});
|
|
32
|
-
it("先頭ハイフンでエラー", () => {
|
|
33
|
-
expect(() => validateSnippetName("-invalid")).toThrow(ValidationError);
|
|
34
|
-
});
|
|
35
|
-
it("スペース含むとエラー", () => {
|
|
36
|
-
expect(() => validateSnippetName("my comp")).toThrow(ValidationError);
|
|
37
|
-
});
|
|
38
|
-
it("日本語でエラー", () => {
|
|
39
|
-
expect(() => validateSnippetName("テスト")).toThrow(ValidationError);
|
|
40
|
-
});
|
|
41
|
-
it("特殊文字でエラー", () => {
|
|
42
|
-
expect(() => validateSnippetName("react@hook")).toThrow(ValidationError);
|
|
43
|
-
});
|
|
44
|
-
it("ドット含むとエラー", () => {
|
|
45
|
-
expect(() => validateSnippetName("my.comp")).toThrow(ValidationError);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
//# sourceMappingURL=validate-name.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-name.test.js","sourceRoot":"","sources":["../../src/__tests__/validate-name.test.ts"],"names":[],"mappings":"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"}
|