@tbsten/mir-core 0.0.2-alpha06 → 0.0.2-alpha08

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.
Files changed (77) hide show
  1. package/dist/generated/validate-mirconfig.d.ts +9 -0
  2. package/dist/generated/validate-mirconfig.js +339 -0
  3. package/dist/generated/validate-mirconfig.js.map +1 -0
  4. package/dist/generated/validate-snippet.d.ts +9 -0
  5. package/dist/generated/validate-snippet.js +685 -0
  6. package/dist/generated/validate-snippet.js.map +1 -0
  7. package/dist/helpers/index.js +16 -0
  8. package/dist/helpers/index.js.map +1 -1
  9. package/dist/helpers/string-helpers.d.ts +16 -0
  10. package/dist/helpers/string-helpers.js +45 -2
  11. package/dist/helpers/string-helpers.js.map +1 -1
  12. package/dist/hooks.js +2 -2
  13. package/dist/hooks.js.map +1 -1
  14. package/dist/i18n/locales/en.js +6 -4
  15. package/dist/i18n/locales/en.js.map +1 -1
  16. package/dist/i18n/locales/ja.js +6 -4
  17. package/dist/i18n/locales/ja.js.map +1 -1
  18. package/dist/i18n/types.d.ts +4 -2
  19. package/dist/index.d.ts +3 -2
  20. package/dist/index.js +4 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/schema-validator.d.ts +9 -0
  23. package/dist/schema-validator.js +51 -0
  24. package/dist/schema-validator.js.map +1 -0
  25. package/dist/snippet-schema.d.ts +5 -0
  26. package/dist/snippet-schema.js +12 -49
  27. package/dist/snippet-schema.js.map +1 -1
  28. package/dist/template-engine.d.ts +5 -0
  29. package/dist/template-engine.js +12 -0
  30. package/dist/template-engine.js.map +1 -1
  31. package/package.json +6 -1
  32. package/dist/__tests__/__snapshots__/remote-registry-authorization.test.js.snap +0 -36
  33. package/dist/__tests__/errors.test.d.ts +0 -1
  34. package/dist/__tests__/errors.test.js +0 -51
  35. package/dist/__tests__/errors.test.js.map +0 -1
  36. package/dist/__tests__/helpers/string-helpers.test.d.ts +0 -1
  37. package/dist/__tests__/helpers/string-helpers.test.js +0 -61
  38. package/dist/__tests__/helpers/string-helpers.test.js.map +0 -1
  39. package/dist/__tests__/hooks.test.d.ts +0 -1
  40. package/dist/__tests__/hooks.test.js +0 -125
  41. package/dist/__tests__/hooks.test.js.map +0 -1
  42. package/dist/__tests__/i18n.test.d.ts +0 -1
  43. package/dist/__tests__/i18n.test.js +0 -51
  44. package/dist/__tests__/i18n.test.js.map +0 -1
  45. package/dist/__tests__/remote-registry-authorization.test.d.ts +0 -1
  46. package/dist/__tests__/remote-registry-authorization.test.js +0 -132
  47. package/dist/__tests__/remote-registry-authorization.test.js.map +0 -1
  48. package/dist/__tests__/remote-registry.test.d.ts +0 -1
  49. package/dist/__tests__/remote-registry.test.js +0 -251
  50. package/dist/__tests__/remote-registry.test.js.map +0 -1
  51. package/dist/__tests__/safe-yaml-parser.test.d.ts +0 -1
  52. package/dist/__tests__/safe-yaml-parser.test.js +0 -159
  53. package/dist/__tests__/safe-yaml-parser.test.js.map +0 -1
  54. package/dist/__tests__/snapshots/__snapshots__/error-messages.snapshot.test.js.snap +0 -27
  55. package/dist/__tests__/snapshots/__snapshots__/snippet-schema-output.snapshot.test.js.snap +0 -78
  56. package/dist/__tests__/snapshots/__snapshots__/template-output.snapshot.test.js.snap +0 -45
  57. package/dist/__tests__/snapshots/error-messages.snapshot.test.d.ts +0 -1
  58. package/dist/__tests__/snapshots/error-messages.snapshot.test.js +0 -52
  59. package/dist/__tests__/snapshots/error-messages.snapshot.test.js.map +0 -1
  60. package/dist/__tests__/snapshots/snippet-schema-output.snapshot.test.d.ts +0 -1
  61. package/dist/__tests__/snapshots/snippet-schema-output.snapshot.test.js +0 -93
  62. package/dist/__tests__/snapshots/snippet-schema-output.snapshot.test.js.map +0 -1
  63. package/dist/__tests__/snapshots/template-output.snapshot.test.d.ts +0 -1
  64. package/dist/__tests__/snapshots/template-output.snapshot.test.js +0 -60
  65. package/dist/__tests__/snapshots/template-output.snapshot.test.js.map +0 -1
  66. package/dist/__tests__/snippet-schema.test.d.ts +0 -1
  67. package/dist/__tests__/snippet-schema.test.js +0 -137
  68. package/dist/__tests__/snippet-schema.test.js.map +0 -1
  69. package/dist/__tests__/symlink-checker.test.d.ts +0 -1
  70. package/dist/__tests__/symlink-checker.test.js +0 -81
  71. package/dist/__tests__/symlink-checker.test.js.map +0 -1
  72. package/dist/__tests__/template-engine.test.d.ts +0 -1
  73. package/dist/__tests__/template-engine.test.js +0 -175
  74. package/dist/__tests__/template-engine.test.js.map +0 -1
  75. package/dist/__tests__/validate-name.test.d.ts +0 -1
  76. package/dist/__tests__/validate-name.test.js +0 -49
  77. package/dist/__tests__/validate-name.test.js.map +0 -1
@@ -1,251 +0,0 @@
1
- import { describe, it, expect, vi, afterEach } from "vitest";
2
- import { fetchRegistryManifest, listRemoteSnippets, fetchSnippetDefinition, fetchRemoteFiles, fetchRemoteSnippet, expandRemoteTemplateFiles, clearAllRemoteRegistryCaches, } from "../remote-registry.js";
3
- import { RemoteRegistryFetchError, InvalidManifestError } from "../errors.js";
4
- const BASE_URL = "https://example.com/registry";
5
- const validManifest = {
6
- snippets: {
7
- "react-hook": { files: ["{{ name }}.ts", "{{ name }}.test.ts"] },
8
- "express-api": { files: ["index.ts"] },
9
- },
10
- };
11
- const reactHookYaml = `
12
- name: react-hook
13
- description: React カスタムフック雛形
14
- variables:
15
- name:
16
- description: フック名
17
- schema:
18
- type: string
19
- `;
20
- function mockFetch(handlers) {
21
- return vi.fn(async (url) => {
22
- const handler = handlers[url];
23
- if (!handler) {
24
- return { ok: false, status: 404, json: async () => ({}), text: async () => "" };
25
- }
26
- return {
27
- ok: handler.status >= 200 && handler.status < 300,
28
- status: handler.status,
29
- json: async () => JSON.parse(handler.body),
30
- text: async () => handler.body,
31
- };
32
- });
33
- }
34
- describe("fetchRegistryManifest", () => {
35
- afterEach(() => {
36
- vi.restoreAllMocks();
37
- clearAllRemoteRegistryCaches();
38
- });
39
- it("正常なマニフェストを取得できる", async () => {
40
- vi.stubGlobal("fetch", mockFetch({
41
- [`${BASE_URL}/index.json`]: {
42
- status: 200,
43
- body: JSON.stringify(validManifest),
44
- },
45
- }));
46
- const manifest = await fetchRegistryManifest(BASE_URL);
47
- expect(manifest.snippets).toHaveProperty("react-hook");
48
- expect(manifest.snippets["react-hook"].files).toHaveLength(2);
49
- });
50
- it("末尾スラッシュ付き URL でも取得できる", async () => {
51
- vi.stubGlobal("fetch", mockFetch({
52
- [`${BASE_URL}/index.json`]: {
53
- status: 200,
54
- body: JSON.stringify(validManifest),
55
- },
56
- }));
57
- const manifest = await fetchRegistryManifest(`${BASE_URL}/`);
58
- expect(manifest.snippets).toHaveProperty("react-hook");
59
- });
60
- it("HTTP エラーで RemoteRegistryFetchError", async () => {
61
- vi.stubGlobal("fetch", mockFetch({
62
- [`${BASE_URL}/index.json`]: { status: 500, body: "error" },
63
- }));
64
- await expect(fetchRegistryManifest(BASE_URL)).rejects.toThrow(RemoteRegistryFetchError);
65
- });
66
- it("ネットワークエラーで RemoteRegistryFetchError", async () => {
67
- vi.stubGlobal("fetch", vi.fn(async () => {
68
- throw new TypeError("fetch failed");
69
- }));
70
- await expect(fetchRegistryManifest(BASE_URL)).rejects.toThrow(RemoteRegistryFetchError);
71
- });
72
- it("不正なマニフェストで InvalidManifestError", async () => {
73
- vi.stubGlobal("fetch", mockFetch({
74
- [`${BASE_URL}/index.json`]: {
75
- status: 200,
76
- body: JSON.stringify({ invalid: true }),
77
- },
78
- }));
79
- await expect(fetchRegistryManifest(BASE_URL)).rejects.toThrow(InvalidManifestError);
80
- });
81
- });
82
- describe("listRemoteSnippets", () => {
83
- afterEach(() => {
84
- vi.restoreAllMocks();
85
- });
86
- it("snippet 名一覧を返す", async () => {
87
- vi.stubGlobal("fetch", mockFetch({
88
- [`${BASE_URL}/index.json`]: {
89
- status: 200,
90
- body: JSON.stringify(validManifest),
91
- },
92
- }));
93
- const names = await listRemoteSnippets(BASE_URL);
94
- expect(names).toEqual(["react-hook", "express-api"]);
95
- });
96
- });
97
- describe("fetchSnippetDefinition", () => {
98
- afterEach(() => {
99
- vi.restoreAllMocks();
100
- });
101
- it("YAML を parse して SnippetDefinition を返す", async () => {
102
- vi.stubGlobal("fetch", mockFetch({
103
- [`${BASE_URL}/react-hook.yaml`]: {
104
- status: 200,
105
- body: reactHookYaml,
106
- },
107
- }));
108
- const def = await fetchSnippetDefinition(BASE_URL, "react-hook");
109
- expect(def.name).toBe("react-hook");
110
- expect(def.variables).toHaveProperty("name");
111
- });
112
- it("404 で RemoteRegistryFetchError", async () => {
113
- vi.stubGlobal("fetch", mockFetch({}));
114
- await expect(fetchSnippetDefinition(BASE_URL, "nonexistent")).rejects.toThrow(RemoteRegistryFetchError);
115
- });
116
- });
117
- describe("fetchRemoteFiles", () => {
118
- afterEach(() => {
119
- vi.restoreAllMocks();
120
- });
121
- it("テンプレートファイルを並列取得する", async () => {
122
- vi.stubGlobal("fetch", mockFetch({
123
- [`${BASE_URL}/react-hook/${encodeURIComponent("{{ name }}.ts")}`]: {
124
- status: 200,
125
- body: "export function {{ name }}() {}",
126
- },
127
- [`${BASE_URL}/react-hook/${encodeURIComponent("{{ name }}.test.ts")}`]: {
128
- status: 200,
129
- body: 'test("{{ name }}", () => {});',
130
- },
131
- }));
132
- const files = await fetchRemoteFiles(BASE_URL, "react-hook", [
133
- "{{ name }}.ts",
134
- "{{ name }}.test.ts",
135
- ]);
136
- expect(files.size).toBe(2);
137
- expect(files.get("{{ name }}.ts")).toContain("{{ name }}");
138
- });
139
- });
140
- describe("fetchRemoteSnippet", () => {
141
- afterEach(() => {
142
- vi.restoreAllMocks();
143
- clearAllRemoteRegistryCaches();
144
- });
145
- it("definition + files を統合して返す", async () => {
146
- vi.stubGlobal("fetch", mockFetch({
147
- [`${BASE_URL}/index.json`]: {
148
- status: 200,
149
- body: JSON.stringify(validManifest),
150
- },
151
- [`${BASE_URL}/react-hook.yaml`]: {
152
- status: 200,
153
- body: reactHookYaml,
154
- },
155
- [`${BASE_URL}/react-hook/${encodeURIComponent("{{ name }}.ts")}`]: {
156
- status: 200,
157
- body: "export function {{ name }}() {}",
158
- },
159
- [`${BASE_URL}/react-hook/${encodeURIComponent("{{ name }}.test.ts")}`]: {
160
- status: 200,
161
- body: 'test("{{ name }}", () => {});',
162
- },
163
- }));
164
- const snippet = await fetchRemoteSnippet(BASE_URL, "react-hook");
165
- expect(snippet.definition.name).toBe("react-hook");
166
- expect(snippet.files.size).toBe(2);
167
- });
168
- it("マニフェストに存在しない snippet は 404 エラー", async () => {
169
- vi.stubGlobal("fetch", mockFetch({
170
- [`${BASE_URL}/index.json`]: {
171
- status: 200,
172
- body: JSON.stringify(validManifest),
173
- },
174
- }));
175
- await expect(fetchRemoteSnippet(BASE_URL, "nonexistent")).rejects.toThrow(RemoteRegistryFetchError);
176
- });
177
- it("マニフェストの authorizationStatus を返す", async () => {
178
- const manifestWithAuth = {
179
- snippets: {
180
- "react-hook": {
181
- files: ["{{ name }}.ts"],
182
- authorizationStatus: "approved",
183
- },
184
- "untrusted-snippet": {
185
- files: ["index.ts"],
186
- authorizationStatus: "examination",
187
- },
188
- "rejected-snippet": {
189
- files: ["index.ts"],
190
- authorizationStatus: "rejected",
191
- },
192
- },
193
- };
194
- vi.stubGlobal("fetch", mockFetch({
195
- [`${BASE_URL}/index.json`]: {
196
- status: 200,
197
- body: JSON.stringify(manifestWithAuth),
198
- },
199
- [`${BASE_URL}/react-hook.yaml`]: {
200
- status: 200,
201
- body: reactHookYaml,
202
- },
203
- [`${BASE_URL}/react-hook/${encodeURIComponent("{{ name }}.ts")}`]: {
204
- status: 200,
205
- body: "export function {{ name }}() {}",
206
- },
207
- }));
208
- const snippet = await fetchRemoteSnippet(BASE_URL, "react-hook");
209
- expect(snippet.authorizationStatus).toBe("approved");
210
- });
211
- it("authorizationStatus が未指定の場合は undefined", async () => {
212
- vi.stubGlobal("fetch", mockFetch({
213
- [`${BASE_URL}/index.json`]: {
214
- status: 200,
215
- body: JSON.stringify(validManifest),
216
- },
217
- [`${BASE_URL}/react-hook.yaml`]: {
218
- status: 200,
219
- body: reactHookYaml,
220
- },
221
- [`${BASE_URL}/react-hook/${encodeURIComponent("{{ name }}.ts")}`]: {
222
- status: 200,
223
- body: "export function {{ name }}() {}",
224
- },
225
- [`${BASE_URL}/react-hook/${encodeURIComponent("{{ name }}.test.ts")}`]: {
226
- status: 200,
227
- body: 'test("{{ name }}", () => {});',
228
- },
229
- }));
230
- const snippet = await fetchRemoteSnippet(BASE_URL, "react-hook");
231
- expect(snippet.authorizationStatus).toBeUndefined();
232
- });
233
- });
234
- describe("expandRemoteTemplateFiles", () => {
235
- it("ファイルパスと内容の変数を展開する", () => {
236
- const files = new Map([
237
- ["{{ name }}.ts", "export function {{ name }}() {}"],
238
- ["{{ name }}.test.ts", 'test("{{ name }}", () => {});'],
239
- ]);
240
- const expanded = expandRemoteTemplateFiles(files, { name: "useAuth" });
241
- expect(expanded.has("useAuth.ts")).toBe(true);
242
- expect(expanded.get("useAuth.ts")).toBe("export function useAuth() {}");
243
- expect(expanded.has("useAuth.test.ts")).toBe(true);
244
- });
245
- it("変数が空の場合もそのまま展開する", () => {
246
- const files = new Map([["index.ts", "console.log('hello');"]]);
247
- const expanded = expandRemoteTemplateFiles(files, {});
248
- expect(expanded.get("index.ts")).toBe("console.log('hello');");
249
- });
250
- });
251
- //# sourceMappingURL=remote-registry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"remote-registry.test.js","sourceRoot":"","sources":["../../src/__tests__/remote-registry.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,159 +0,0 @@
1
- /**
2
- * mir-core: safe-yaml-parser のセキュリティテスト
3
- *
4
- * YAML Injection 攻撃シナリオ(チケット 008-yaml-injection)の検証
5
- */
6
- import { describe, it, expect } from "vitest";
7
- import { safeParseYaml, checkNoRefInSchema, YAML_MAX_SIZE_BYTES, } from "../safe-yaml-parser.js";
8
- import { ValidationError } from "../index.js";
9
- // ---------------------------------------------------------------------------
10
- // 正常系: 通常の YAML は引き続きパースできること
11
- // ---------------------------------------------------------------------------
12
- describe("safeParseYaml - 正常系", () => {
13
- it("プレーンな文字列 YAML をパースできる", () => {
14
- const result = safeParseYaml("name: my-snippet\n");
15
- expect(result).toEqual({ name: "my-snippet" });
16
- });
17
- it("ネストしたオブジェクトをパースできる", () => {
18
- const yaml = `
19
- name: react-hook
20
- variables:
21
- foo:
22
- description: フック名
23
- schema:
24
- type: string
25
- `;
26
- const result = safeParseYaml(yaml);
27
- expect(result.name).toBe("react-hook");
28
- });
29
- it("配列をパースできる", () => {
30
- const yaml = "tags:\n - react\n - typescript\n";
31
- const result = safeParseYaml(yaml);
32
- expect(result.tags).toEqual(["react", "typescript"]);
33
- });
34
- it("真偽値をパースできる", () => {
35
- const yaml = "enabled: true\ndisabled: false\n";
36
- const result = safeParseYaml(yaml);
37
- expect(result.enabled).toBe(true);
38
- expect(result.disabled).toBe(false);
39
- });
40
- it("数値をパースできる", () => {
41
- const yaml = "count: 42\nfloat: 3.14\n";
42
- const result = safeParseYaml(yaml);
43
- expect(result.count).toBe(42);
44
- expect(result.float).toBe(3.14);
45
- });
46
- it("null をパースできる", () => {
47
- const result = safeParseYaml("value: null\n");
48
- expect(result.value).toBeNull();
49
- });
50
- });
51
- // ---------------------------------------------------------------------------
52
- // YAML Bomb (Billion Laughs) 対策
53
- // ---------------------------------------------------------------------------
54
- describe("safeParseYaml - YAML Bomb 対策", () => {
55
- it("最大サイズを超える YAML は ValidationError を投げる", () => {
56
- const oversized = "x: " + "a".repeat(YAML_MAX_SIZE_BYTES);
57
- expect(() => safeParseYaml(oversized)).toThrow(ValidationError);
58
- });
59
- it("最大サイズちょうどの YAML は許可される (境界値)", () => {
60
- // 境界値ちょうどのサイズのシンプルな YAML は OK
61
- const small = "name: ok\n";
62
- expect(() => safeParseYaml(small)).not.toThrow();
63
- });
64
- it("エイリアスを大量に展開する YAML Bomb はサイズ制限で防がれる", () => {
65
- // 実際の YAML bomb を小さめに再現
66
- const bomb = [
67
- "a: &a [lol,lol,lol,lol,lol,lol,lol,lol,lol]",
68
- "b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]",
69
- "c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]",
70
- "d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]",
71
- ].join("\n");
72
- // サイズは小さいのでパースは通るが、爆発的な展開はしない
73
- // (js-yaml は alias を参照のまま扱い、展開しない)
74
- // ここではエラーを投げないことを確認(サイズ制限内)
75
- expect(() => safeParseYaml(bomb)).not.toThrow();
76
- });
77
- });
78
- // ---------------------------------------------------------------------------
79
- // YAML タグ攻撃対策
80
- // ---------------------------------------------------------------------------
81
- describe("safeParseYaml - カスタムタグ攻撃対策", () => {
82
- it("!!js/undefined タグは無視されて通常の文字列になる", () => {
83
- // CORE_SCHEMA では未知のタグはエラーまたは文字列として扱われる
84
- // js-yaml の CORE_SCHEMA は !!js タグを認識しないのでエラーになる
85
- expect(() => safeParseYaml("name: !!js/undefined foo")).toThrow();
86
- });
87
- it("!!js/regexp タグはエラーになる", () => {
88
- expect(() => safeParseYaml("re: !!js/regexp /foo/")).toThrow();
89
- });
90
- it("!!js/function タグはエラーになる", () => {
91
- expect(() => safeParseYaml("fn: !!js/function 'function(){}'")).toThrow();
92
- });
93
- });
94
- // ---------------------------------------------------------------------------
95
- // checkNoRefInSchema - JSON Schema $ref 禁止チェック
96
- // ---------------------------------------------------------------------------
97
- describe("checkNoRefInSchema", () => {
98
- it("$ref がなければエラーを投げない", () => {
99
- const schema = { type: "string", default: "hello" };
100
- expect(() => checkNoRefInSchema(schema)).not.toThrow();
101
- });
102
- it("$ref があれば ValidationError を投げる", () => {
103
- const schema = { $ref: "https://evil.com/schema.json" };
104
- expect(() => checkNoRefInSchema(schema)).toThrow(ValidationError);
105
- });
106
- it("ネストされた $ref も検出する", () => {
107
- const schema = {
108
- type: "object",
109
- properties: {
110
- name: { $ref: "#/definitions/Name" },
111
- },
112
- };
113
- expect(() => checkNoRefInSchema(schema)).toThrow(ValidationError);
114
- });
115
- it("$ref を含む文字列値は検出する(キーではなく値でも禁止)", () => {
116
- // $ref というキーそのものを禁止
117
- const schema = { anyOf: [{ $ref: "https://example.com/schema" }] };
118
- expect(() => checkNoRefInSchema(schema)).toThrow(ValidationError);
119
- });
120
- it("null や undefined を渡してもエラーにならない", () => {
121
- expect(() => checkNoRefInSchema(null)).not.toThrow();
122
- expect(() => checkNoRefInSchema(undefined)).not.toThrow();
123
- });
124
- it("空オブジェクトはエラーにならない", () => {
125
- expect(() => checkNoRefInSchema({})).not.toThrow();
126
- });
127
- });
128
- // ---------------------------------------------------------------------------
129
- // parseSnippetYaml との統合確認
130
- // ---------------------------------------------------------------------------
131
- describe("parseSnippetYaml - $ref を含む snippet は拒否される", () => {
132
- it("variables.schema に $ref があれば ValidationError を投げる", async () => {
133
- const { parseSnippetYaml } = await import("../index.js");
134
- const yaml = `
135
- name: evil-snippet
136
- variables:
137
- name:
138
- schema:
139
- $ref: "https://evil.com/schema.json"
140
- `;
141
- expect(() => parseSnippetYaml(yaml)).toThrow(ValidationError);
142
- });
143
- it("通常の snippet YAML は引き続きパースできる", async () => {
144
- const { parseSnippetYaml } = await import("../index.js");
145
- const yaml = `
146
- name: normal-snippet
147
- variables:
148
- name:
149
- description: 名前
150
- schema:
151
- type: string
152
- default: world
153
- `;
154
- const def = parseSnippetYaml(yaml);
155
- expect(def.name).toBe("normal-snippet");
156
- expect(def.variables?.name?.schema?.type).toBe("string");
157
- });
158
- });
159
- //# sourceMappingURL=safe-yaml-parser.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safe-yaml-parser.test.js","sourceRoot":"","sources":["../../src/__tests__/safe-yaml-parser.test.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
-
3
- exports[`エラーメッセージ snapshot (日本語) > FileConflictError 1`] = `"ファイル "index.ts" は既に存在します。\`--no-interactive\` で全て上書きするか、\`--out-dir\` で別ディレクトリを指定してください"`;
4
-
5
- exports[`エラーメッセージ snapshot (日本語) > PathTraversalError 1`] = `"セキュリティエラー: ファイルパス "../etc/passwd" が出力範囲外を参照しています。テンプレートファイルを確認してください"`;
6
-
7
- exports[`エラーメッセージ snapshot (日本語) > RegistryNotFoundError 1`] = `"Registry "official" が見つかりません。\`~/.mir/mirconfig.yaml\` で registry を設定してください"`;
8
-
9
- exports[`エラーメッセージ snapshot (日本語) > RegistryRemoteError (名前あり) 1`] = `"Registry "official" はリモート registry のため publish できません"`;
10
-
11
- exports[`エラーメッセージ snapshot (日本語) > RegistryRemoteError (名前なし) 1`] = `"リモート registry には publish できません"`;
12
-
13
- exports[`エラーメッセージ snapshot (日本語) > SnippetAlreadyExistsError 1`] = `"Snippet "react-hook" は既に存在します。\`--force\` で上書きするか、別の名前を指定してください"`;
14
-
15
- exports[`エラーメッセージ snapshot (日本語) > SnippetNotFoundError 1`] = `"Snippet "react-hook" が見つかりません。\`mir list\` で利用可能な snippet を確認するか、\`--registry\` で別の registry を指定してください"`;
16
-
17
- exports[`エラーメッセージ snapshot (英語) > FileConflictError 1`] = `"File "index.ts" already exists. Use \`--no-interactive\` to overwrite all files or \`--out-dir\` to specify another directory"`;
18
-
19
- exports[`エラーメッセージ snapshot (英語) > PathTraversalError 1`] = `"Security error: File path "../etc/passwd" references outside the output directory. Check your template files"`;
20
-
21
- exports[`エラーメッセージ snapshot (英語) > RegistryNotFoundError 1`] = `"Registry "official" not found. Configure registries in \`~/.mir/mirconfig.yaml\`"`;
22
-
23
- exports[`エラーメッセージ snapshot (英語) > RegistryRemoteError (名前あり) 1`] = `"Cannot publish to registry "official" because it is a remote registry"`;
24
-
25
- exports[`エラーメッセージ snapshot (英語) > SnippetAlreadyExistsError 1`] = `"Snippet "react-hook" already exists. Use \`--force\` to overwrite or specify a different name"`;
26
-
27
- exports[`エラーメッセージ snapshot (英語) > SnippetNotFoundError 1`] = `"Snippet "react-hook" not found. Use \`mir list\` to see available snippets or specify \`--registry\` for another registry"`;
@@ -1,78 +0,0 @@
1
- // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
-
3
- exports[`snippet スキーマ snapshot > hooks 付き snippet 定義の YAML 出力 1`] = `
4
- "name: with-hooks
5
- hooks:
6
- before-install:
7
- - echo: インストールを開始します
8
- - input:
9
- confirm:
10
- description: 続行しますか?
11
- answer-to: confirmed
12
- schema:
13
- type: boolean
14
- default: true
15
- after-install:
16
- - echo: ✅ インストール完了
17
- "
18
- `;
19
-
20
- exports[`snippet スキーマ snapshot > suggests 付き変数の YAML 出力 1`] = `
21
- "name: css-setup
22
- variables:
23
- framework:
24
- description: CSSフレームワーク
25
- suggests:
26
- - tailwind
27
- - vanilla-extract
28
- - css-modules
29
- schema:
30
- type: string
31
- default: tailwind
32
- "
33
- `;
34
-
35
- exports[`snippet スキーマ snapshot > フル構成 YAML のパース → シリアライズ往復 1`] = `
36
- "name: full-example
37
- description: フル構成のサンプル
38
- variables:
39
- name:
40
- description: コンポーネント名
41
- schema:
42
- type: string
43
- framework:
44
- description: フレームワーク
45
- suggests:
46
- - react
47
- - vue
48
- schema:
49
- type: string
50
- default: react
51
- hooks:
52
- before-install:
53
- - echo: セットアップ中...
54
- after-install:
55
- - echo: '完了: {{ name }}'
56
- "
57
- `;
58
-
59
- exports[`snippet スキーマ snapshot > 変数付き snippet 定義の YAML 出力 1`] = `
60
- "name: react-hook
61
- description: React カスタムフック雛形
62
- variables:
63
- name:
64
- description: フック名
65
- schema:
66
- type: string
67
- description:
68
- description: 説明文
69
- schema:
70
- type: string
71
- default: ''
72
- "
73
- `;
74
-
75
- exports[`snippet スキーマ snapshot > 最小限の snippet 定義の YAML 出力 1`] = `
76
- "name: minimal
77
- "
78
- `;
@@ -1,45 +0,0 @@
1
- // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
-
3
- exports[`テンプレート展開結果 snapshot > React コンポーネントテンプレート 1`] = `
4
- "import React from "react";
5
-
6
- export interface ButtonProps {
7
- children?: React.ReactNode;
8
- }
9
-
10
- export function Button({ children }: ButtonProps) {
11
- return <div className="Button">{children}</div>;
12
- }"
13
- `;
14
-
15
- exports[`テンプレート展開結果 snapshot > React フックテンプレート 1`] = `
16
- "import { useState, useCallback } from "react";
17
-
18
- /**
19
- * 認証フック
20
- */
21
- export function useAuth() {
22
- const [state, setState] = useState(null);
23
- return { state, setState };
24
- }"
25
- `;
26
-
27
- exports[`テンプレート展開結果 snapshot > ネストしたディレクトリパス展開 1`] = `"src/features/auth/index.ts"`;
28
-
29
- exports[`テンプレート展開結果 snapshot > パス展開 1`] = `"hooks/useAuth.ts"`;
30
-
31
- exports[`テンプレート展開結果 snapshot > 条件分岐付きテンプレート 1`] = `
32
- "import type { FC } from "react";
33
-
34
- export const App = () => {
35
- return <div>App</div>;
36
- };"
37
- `;
38
-
39
- exports[`テンプレート展開結果 snapshot > 条件分岐付きテンプレート 2`] = `
40
- "import React from "react";
41
-
42
- export const App = () => {
43
- return <div>App</div>;
44
- };"
45
- `;
@@ -1,52 +0,0 @@
1
- /**
2
- * mir-core: エラーメッセージの snapshot テスト (日英)
3
- */
4
- import { describe, it, expect, beforeEach } from "vitest";
5
- import { SnippetNotFoundError, SnippetAlreadyExistsError, RegistryNotFoundError, RegistryRemoteError, PathTraversalError, FileConflictError, setLocale, } from "../../index.js";
6
- // TODO: 現時点では理想の挙動をテストケースとして記述。後で有効化する。
7
- describe("エラーメッセージ snapshot (日本語)", () => {
8
- beforeEach(() => setLocale("ja"));
9
- it("SnippetNotFoundError", () => {
10
- expect(new SnippetNotFoundError("react-hook").message).toMatchSnapshot();
11
- });
12
- it("SnippetAlreadyExistsError", () => {
13
- expect(new SnippetAlreadyExistsError("react-hook").message).toMatchSnapshot();
14
- });
15
- it("RegistryNotFoundError", () => {
16
- expect(new RegistryNotFoundError("official").message).toMatchSnapshot();
17
- });
18
- it("RegistryRemoteError (名前あり)", () => {
19
- expect(new RegistryRemoteError("official").message).toMatchSnapshot();
20
- });
21
- it("RegistryRemoteError (名前なし)", () => {
22
- expect(new RegistryRemoteError().message).toMatchSnapshot();
23
- });
24
- it("PathTraversalError", () => {
25
- expect(new PathTraversalError("../etc/passwd").message).toMatchSnapshot();
26
- });
27
- it("FileConflictError", () => {
28
- expect(new FileConflictError("index.ts").message).toMatchSnapshot();
29
- });
30
- });
31
- describe("エラーメッセージ snapshot (英語)", () => {
32
- beforeEach(() => setLocale("en"));
33
- it("SnippetNotFoundError", () => {
34
- expect(new SnippetNotFoundError("react-hook").message).toMatchSnapshot();
35
- });
36
- it("SnippetAlreadyExistsError", () => {
37
- expect(new SnippetAlreadyExistsError("react-hook").message).toMatchSnapshot();
38
- });
39
- it("RegistryNotFoundError", () => {
40
- expect(new RegistryNotFoundError("official").message).toMatchSnapshot();
41
- });
42
- it("RegistryRemoteError (名前あり)", () => {
43
- expect(new RegistryRemoteError("official").message).toMatchSnapshot();
44
- });
45
- it("PathTraversalError", () => {
46
- expect(new PathTraversalError("../etc/passwd").message).toMatchSnapshot();
47
- });
48
- it("FileConflictError", () => {
49
- expect(new FileConflictError("index.ts").message).toMatchSnapshot();
50
- });
51
- });
52
- //# sourceMappingURL=error-messages.snapshot.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-messages.snapshot.test.js","sourceRoot":"","sources":["../../../src/__tests__/snapshots/error-messages.snapshot.test.ts"],"names":[],"mappings":"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"}