diffity 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +71 -0
  4. package/development.md +156 -0
  5. package/package.json +32 -0
  6. package/packages/cli/build.js +38 -0
  7. package/packages/cli/package.json +51 -0
  8. package/packages/cli/src/agent.ts +187 -0
  9. package/packages/cli/src/db.ts +58 -0
  10. package/packages/cli/src/index.ts +196 -0
  11. package/packages/cli/src/review-routes.ts +150 -0
  12. package/packages/cli/src/server.ts +370 -0
  13. package/packages/cli/src/session.ts +48 -0
  14. package/packages/cli/src/threads.ts +238 -0
  15. package/packages/cli/tsconfig.json +13 -0
  16. package/packages/git/package.json +24 -0
  17. package/packages/git/src/commits.ts +28 -0
  18. package/packages/git/src/diff.ts +97 -0
  19. package/packages/git/src/exec.ts +35 -0
  20. package/packages/git/src/index.ts +5 -0
  21. package/packages/git/src/repo.ts +63 -0
  22. package/packages/git/src/status.ts +9 -0
  23. package/packages/git/src/types.ts +12 -0
  24. package/packages/git/tsconfig.json +9 -0
  25. package/packages/parser/package.json +26 -0
  26. package/packages/parser/src/index.ts +12 -0
  27. package/packages/parser/src/parse.ts +299 -0
  28. package/packages/parser/src/types.ts +52 -0
  29. package/packages/parser/src/word-diff.ts +155 -0
  30. package/packages/parser/tests/fixtures/binary-deleted.diff +4 -0
  31. package/packages/parser/tests/fixtures/binary-file.diff +4 -0
  32. package/packages/parser/tests/fixtures/binary-modified.diff +3 -0
  33. package/packages/parser/tests/fixtures/copied-file.diff +12 -0
  34. package/packages/parser/tests/fixtures/deleted-file.diff +9 -0
  35. package/packages/parser/tests/fixtures/empty.diff +0 -0
  36. package/packages/parser/tests/fixtures/hunk-with-context.diff +12 -0
  37. package/packages/parser/tests/fixtures/mode-change-with-content.diff +10 -0
  38. package/packages/parser/tests/fixtures/mode-change.diff +3 -0
  39. package/packages/parser/tests/fixtures/multi-file.diff +22 -0
  40. package/packages/parser/tests/fixtures/new-file.diff +9 -0
  41. package/packages/parser/tests/fixtures/no-newline.diff +10 -0
  42. package/packages/parser/tests/fixtures/renamed-file.diff +12 -0
  43. package/packages/parser/tests/fixtures/single-file-additions.diff +11 -0
  44. package/packages/parser/tests/fixtures/single-file-deletions.diff +11 -0
  45. package/packages/parser/tests/fixtures/single-file-mixed.diff +15 -0
  46. package/packages/parser/tests/fixtures/single-file-multi-hunk.diff +22 -0
  47. package/packages/parser/tests/fixtures/spaces-in-path.diff +9 -0
  48. package/packages/parser/tests/fixtures/submodule.diff +7 -0
  49. package/packages/parser/tests/fixtures/unicode-content.diff +11 -0
  50. package/packages/parser/tests/parse.test.ts +312 -0
  51. package/packages/parser/tests/word-diff-integration.test.ts +52 -0
  52. package/packages/parser/tests/word-diff.test.ts +121 -0
  53. package/packages/parser/tsconfig.json +10 -0
  54. package/packages/skills/diffity-resolve/SKILL.md +55 -0
  55. package/packages/skills/diffity-review/SKILL.md +74 -0
  56. package/packages/skills/diffity-start/SKILL.md +25 -0
  57. package/packages/ui/index.html +13 -0
  58. package/packages/ui/package.json +35 -0
  59. package/packages/ui/public/brand.svg +12 -0
  60. package/packages/ui/public/favicon.svg +15 -0
  61. package/packages/ui/src/app.tsx +14 -0
  62. package/packages/ui/src/components/comment-bubble.tsx +78 -0
  63. package/packages/ui/src/components/comment-form-row.tsx +58 -0
  64. package/packages/ui/src/components/comment-form.tsx +78 -0
  65. package/packages/ui/src/components/comment-line-number.tsx +60 -0
  66. package/packages/ui/src/components/comment-thread.tsx +209 -0
  67. package/packages/ui/src/components/commit-list.tsx +100 -0
  68. package/packages/ui/src/components/dashboard.tsx +84 -0
  69. package/packages/ui/src/components/diff-line.tsx +90 -0
  70. package/packages/ui/src/components/diff-page.tsx +332 -0
  71. package/packages/ui/src/components/diff-stats.tsx +20 -0
  72. package/packages/ui/src/components/diff-view.tsx +278 -0
  73. package/packages/ui/src/components/expand-row.tsx +45 -0
  74. package/packages/ui/src/components/file-block.tsx +536 -0
  75. package/packages/ui/src/components/file-tree-item.tsx +84 -0
  76. package/packages/ui/src/components/file-tree.tsx +72 -0
  77. package/packages/ui/src/components/general-comments.tsx +174 -0
  78. package/packages/ui/src/components/hunk-block-split.tsx +357 -0
  79. package/packages/ui/src/components/hunk-block.tsx +161 -0
  80. package/packages/ui/src/components/hunk-header.tsx +144 -0
  81. package/packages/ui/src/components/hunk-with-gap.tsx +113 -0
  82. package/packages/ui/src/components/icons/arrow-down-icon.tsx +7 -0
  83. package/packages/ui/src/components/icons/arrow-up-icon.tsx +7 -0
  84. package/packages/ui/src/components/icons/check-circle-icon.tsx +8 -0
  85. package/packages/ui/src/components/icons/check-icon.tsx +9 -0
  86. package/packages/ui/src/components/icons/chevron-down-icon.tsx +11 -0
  87. package/packages/ui/src/components/icons/chevron-icon.tsx +20 -0
  88. package/packages/ui/src/components/icons/chevron-up-down-icon.tsx +7 -0
  89. package/packages/ui/src/components/icons/chevron-up-icon.tsx +11 -0
  90. package/packages/ui/src/components/icons/comment-icon.tsx +9 -0
  91. package/packages/ui/src/components/icons/copy-icon.tsx +10 -0
  92. package/packages/ui/src/components/icons/eye-icon.tsx +10 -0
  93. package/packages/ui/src/components/icons/eye-off-icon.tsx +12 -0
  94. package/packages/ui/src/components/icons/file-icon.tsx +7 -0
  95. package/packages/ui/src/components/icons/folder-icon.tsx +19 -0
  96. package/packages/ui/src/components/icons/git-branch-icon.tsx +13 -0
  97. package/packages/ui/src/components/icons/keyboard-icon.tsx +13 -0
  98. package/packages/ui/src/components/icons/moon-icon.tsx +9 -0
  99. package/packages/ui/src/components/icons/plus-icon.tsx +9 -0
  100. package/packages/ui/src/components/icons/search-icon.tsx +10 -0
  101. package/packages/ui/src/components/icons/sidebar-icon.tsx +10 -0
  102. package/packages/ui/src/components/icons/spinner.tsx +7 -0
  103. package/packages/ui/src/components/icons/split-view-icon.tsx +10 -0
  104. package/packages/ui/src/components/icons/sun-icon.tsx +17 -0
  105. package/packages/ui/src/components/icons/trash-icon.tsx +11 -0
  106. package/packages/ui/src/components/icons/undo-icon.tsx +9 -0
  107. package/packages/ui/src/components/icons/unified-view-icon.tsx +12 -0
  108. package/packages/ui/src/components/icons/x-icon.tsx +10 -0
  109. package/packages/ui/src/components/line-number-cell.tsx +18 -0
  110. package/packages/ui/src/components/markdown-content.tsx +139 -0
  111. package/packages/ui/src/components/orphaned-threads.tsx +80 -0
  112. package/packages/ui/src/components/overview-file-list.tsx +57 -0
  113. package/packages/ui/src/components/render-expansion-rows.tsx +47 -0
  114. package/packages/ui/src/components/shortcut-modal.tsx +93 -0
  115. package/packages/ui/src/components/sidebar.tsx +80 -0
  116. package/packages/ui/src/components/skeleton.tsx +9 -0
  117. package/packages/ui/src/components/stale-diff-banner.tsx +21 -0
  118. package/packages/ui/src/components/summary-bar.tsx +39 -0
  119. package/packages/ui/src/components/toolbar.tsx +246 -0
  120. package/packages/ui/src/components/ui/badge.tsx +17 -0
  121. package/packages/ui/src/components/ui/confirm-dialog.tsx +52 -0
  122. package/packages/ui/src/components/ui/icon-button.tsx +23 -0
  123. package/packages/ui/src/components/ui/status-badge.tsx +57 -0
  124. package/packages/ui/src/components/ui/thread-badge.tsx +35 -0
  125. package/packages/ui/src/components/word-diff.tsx +126 -0
  126. package/packages/ui/src/hooks/use-comment-actions.ts +97 -0
  127. package/packages/ui/src/hooks/use-commits.ts +12 -0
  128. package/packages/ui/src/hooks/use-copy.ts +18 -0
  129. package/packages/ui/src/hooks/use-diff-staleness.ts +58 -0
  130. package/packages/ui/src/hooks/use-diff.ts +12 -0
  131. package/packages/ui/src/hooks/use-highlighter.ts +190 -0
  132. package/packages/ui/src/hooks/use-info.ts +12 -0
  133. package/packages/ui/src/hooks/use-keyboard.ts +55 -0
  134. package/packages/ui/src/hooks/use-line-selection.ts +157 -0
  135. package/packages/ui/src/hooks/use-overview.ts +12 -0
  136. package/packages/ui/src/hooks/use-review-threads.ts +12 -0
  137. package/packages/ui/src/hooks/use-search-params.ts +26 -0
  138. package/packages/ui/src/hooks/use-theme.ts +34 -0
  139. package/packages/ui/src/hooks/use-thread-navigation.ts +43 -0
  140. package/packages/ui/src/lib/api.ts +232 -0
  141. package/packages/ui/src/lib/cn.ts +6 -0
  142. package/packages/ui/src/lib/context-expansion.ts +122 -0
  143. package/packages/ui/src/lib/diff-utils.ts +268 -0
  144. package/packages/ui/src/lib/dom-utils.ts +13 -0
  145. package/packages/ui/src/lib/file-tree.ts +122 -0
  146. package/packages/ui/src/lib/query-client.ts +10 -0
  147. package/packages/ui/src/lib/render-content.tsx +23 -0
  148. package/packages/ui/src/lib/syntax-token.ts +4 -0
  149. package/packages/ui/src/main.tsx +14 -0
  150. package/packages/ui/src/queries/commits.ts +9 -0
  151. package/packages/ui/src/queries/diff.ts +9 -0
  152. package/packages/ui/src/queries/file.ts +10 -0
  153. package/packages/ui/src/queries/info.ts +9 -0
  154. package/packages/ui/src/queries/overview.ts +9 -0
  155. package/packages/ui/src/styles/app.css +178 -0
  156. package/packages/ui/src/types/comment.ts +61 -0
  157. package/packages/ui/src/vite-env.d.ts +1 -0
  158. package/packages/ui/tests/context-expansion.test.ts +279 -0
  159. package/packages/ui/tests/diff-utils.test.ts +409 -0
  160. package/packages/ui/tsconfig.json +14 -0
  161. package/packages/ui/vite.config.ts +23 -0
  162. package/scripts/build-skills.ts +26 -0
  163. package/scripts/build.ts +15 -0
  164. package/scripts/dev.ts +32 -0
  165. package/scripts/lib/transformers/claude-code.ts +11 -0
  166. package/scripts/lib/transformers/codex.ts +17 -0
  167. package/scripts/lib/transformers/cursor.ts +17 -0
  168. package/scripts/lib/transformers/index.ts +3 -0
  169. package/scripts/lib/utils.ts +70 -0
  170. package/scripts/link-dev.ts +54 -0
  171. package/skills/diffity-resolve/SKILL.md +55 -0
  172. package/skills/diffity-review/SKILL.md +74 -0
  173. package/skills/diffity-start/SKILL.md +27 -0
  174. package/tsconfig.json +22 -0
@@ -0,0 +1,155 @@
1
+ import type { WordDiffSegment, LineDiffType } from './types.js';
2
+
3
+ function tokenize(text: string): string[] {
4
+ const tokens: string[] = [];
5
+ let current = '';
6
+
7
+ for (let i = 0; i < text.length; i++) {
8
+ const char = text[i];
9
+ const isWordChar = /\w/.test(char);
10
+
11
+ if (current.length === 0) {
12
+ current = char;
13
+ continue;
14
+ }
15
+
16
+ const prevIsWordChar = /\w/.test(current[current.length - 1]);
17
+
18
+ if (isWordChar === prevIsWordChar) {
19
+ current += char;
20
+ } else {
21
+ tokens.push(current);
22
+ current = char;
23
+ }
24
+ }
25
+
26
+ if (current.length > 0) {
27
+ tokens.push(current);
28
+ }
29
+
30
+ return tokens;
31
+ }
32
+
33
+ function lcs(a: string[], b: string[]): string[][] {
34
+ const m = a.length;
35
+ const n = b.length;
36
+ const dp: number[][] = Array.from({ length: m + 1 }, () =>
37
+ new Array(n + 1).fill(0)
38
+ );
39
+
40
+ for (let i = 1; i <= m; i++) {
41
+ for (let j = 1; j <= n; j++) {
42
+ if (a[i - 1] === b[j - 1]) {
43
+ dp[i][j] = dp[i - 1][j - 1] + 1;
44
+ } else {
45
+ dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
46
+ }
47
+ }
48
+ }
49
+
50
+ const result: string[][] = [];
51
+ let i = m;
52
+ let j = n;
53
+
54
+ while (i > 0 && j > 0) {
55
+ if (a[i - 1] === b[j - 1]) {
56
+ result.unshift([a[i - 1], 'equal']);
57
+ i--;
58
+ j--;
59
+ } else if (dp[i - 1][j] > dp[i][j - 1]) {
60
+ i--;
61
+ } else {
62
+ j--;
63
+ }
64
+ }
65
+
66
+ return result;
67
+ }
68
+
69
+ export function computeWordDiff(
70
+ oldLine: string,
71
+ newLine: string
72
+ ): WordDiffSegment[] {
73
+ if (oldLine === newLine) {
74
+ return [{ text: oldLine, type: 'equal' }];
75
+ }
76
+
77
+ if (oldLine.length === 0) {
78
+ return [{ text: newLine, type: 'insert' }];
79
+ }
80
+
81
+ if (newLine.length === 0) {
82
+ return [{ text: oldLine, type: 'delete' }];
83
+ }
84
+
85
+ const oldTokens = tokenize(oldLine);
86
+ const newTokens = tokenize(newLine);
87
+ const common = lcs(oldTokens, newTokens);
88
+
89
+ const segments: WordDiffSegment[] = [];
90
+ let oi = 0;
91
+ let ni = 0;
92
+ let ci = 0;
93
+
94
+ while (ci < common.length) {
95
+ const commonToken = common[ci][0];
96
+
97
+ let deleteText = '';
98
+ while (oi < oldTokens.length && oldTokens[oi] !== commonToken) {
99
+ deleteText += oldTokens[oi];
100
+ oi++;
101
+ }
102
+
103
+ let insertText = '';
104
+ while (ni < newTokens.length && newTokens[ni] !== commonToken) {
105
+ insertText += newTokens[ni];
106
+ ni++;
107
+ }
108
+
109
+ if (deleteText) {
110
+ segments.push({ text: deleteText, type: 'delete' });
111
+ }
112
+ if (insertText) {
113
+ segments.push({ text: insertText, type: 'insert' });
114
+ }
115
+
116
+ let equalText = '';
117
+ while (
118
+ oi < oldTokens.length &&
119
+ ni < newTokens.length &&
120
+ ci < common.length &&
121
+ oldTokens[oi] === common[ci][0] &&
122
+ newTokens[ni] === common[ci][0]
123
+ ) {
124
+ equalText += oldTokens[oi];
125
+ oi++;
126
+ ni++;
127
+ ci++;
128
+ }
129
+
130
+ if (equalText) {
131
+ segments.push({ text: equalText, type: 'equal' });
132
+ }
133
+ }
134
+
135
+ let trailingDelete = '';
136
+ while (oi < oldTokens.length) {
137
+ trailingDelete += oldTokens[oi];
138
+ oi++;
139
+ }
140
+
141
+ let trailingInsert = '';
142
+ while (ni < newTokens.length) {
143
+ trailingInsert += newTokens[ni];
144
+ ni++;
145
+ }
146
+
147
+ if (trailingDelete) {
148
+ segments.push({ text: trailingDelete, type: 'delete' });
149
+ }
150
+ if (trailingInsert) {
151
+ segments.push({ text: trailingInsert, type: 'insert' });
152
+ }
153
+
154
+ return segments;
155
+ }
@@ -0,0 +1,4 @@
1
+ diff --git a/image.png b/image.png
2
+ deleted file mode 100644
3
+ index abcdefg..0000000
4
+ Binary files a/image.png and /dev/null differ
@@ -0,0 +1,4 @@
1
+ diff --git a/image.png b/image.png
2
+ new file mode 100644
3
+ index 0000000..abcdefg
4
+ Binary files /dev/null and b/image.png differ
@@ -0,0 +1,3 @@
1
+ diff --git a/image.png b/image.png
2
+ index 1234567..abcdefg 100644
3
+ Binary files a/image.png and b/image.png differ
@@ -0,0 +1,12 @@
1
+ diff --git a/original.ts b/copy.ts
2
+ similarity index 90%
3
+ copy from original.ts
4
+ copy to copy.ts
5
+ index 1234567..abcdefg 100644
6
+ --- a/original.ts
7
+ +++ b/copy.ts
8
+ @@ -1,3 +1,3 @@
9
+ -export const name = 'original';
10
+ +export const name = 'copy';
11
+ export const version = '1.0.0';
12
+ export default name;
@@ -0,0 +1,9 @@
1
+ diff --git a/old-file.ts b/old-file.ts
2
+ deleted file mode 100644
3
+ index abcdefg..0000000
4
+ --- a/old-file.ts
5
+ +++ /dev/null
6
+ @@ -1,3 +0,0 @@
7
+ -export const legacy = true;
8
+ -export const deprecated = true;
9
+ -export default legacy;
File without changes
@@ -0,0 +1,12 @@
1
+ diff --git a/app.ts b/app.ts
2
+ index 1234567..abcdefg 100644
3
+ --- a/app.ts
4
+ +++ b/app.ts
5
+ @@ -10,5 +10,7 @@ function processData() {
6
+ const data = getData();
7
+ const filtered = data.filter(Boolean);
8
+ - return filtered;
9
+ + const sorted = filtered.sort();
10
+ + const unique = [...new Set(sorted)];
11
+ + return unique;
12
+ }
@@ -0,0 +1,10 @@
1
+ diff --git a/script.sh b/script.sh
2
+ old mode 100644
3
+ new mode 100755
4
+ index 1234567..abcdefg
5
+ --- a/script.sh
6
+ +++ b/script.sh
7
+ @@ -1,2 +1,3 @@
8
+ +#!/bin/bash
9
+ echo "hello"
10
+ echo "world"
@@ -0,0 +1,3 @@
1
+ diff --git a/script.sh b/script.sh
2
+ old mode 100644
3
+ new mode 100755
@@ -0,0 +1,22 @@
1
+ diff --git a/index.ts b/index.ts
2
+ index 1234567..abcdefg 100644
3
+ --- a/index.ts
4
+ +++ b/index.ts
5
+ @@ -1,3 +1,4 @@
6
+ import { run } from './runner';
7
+ +import { config } from './config';
8
+
9
+ -run();
10
+ +run(config);
11
+ diff --git a/runner.ts b/runner.ts
12
+ index 1234567..abcdefg 100644
13
+ --- a/runner.ts
14
+ +++ b/runner.ts
15
+ @@ -1,3 +1,5 @@
16
+ -export function run() {
17
+ - console.log('running');
18
+ +export function run(config: Record<string, unknown>) {
19
+ + console.log('running with config');
20
+ + console.log(config);
21
+ + return true;
22
+ }
@@ -0,0 +1,9 @@
1
+ diff --git a/newfile.ts b/newfile.ts
2
+ new file mode 100644
3
+ index 0000000..abcdefg
4
+ --- /dev/null
5
+ +++ b/newfile.ts
6
+ @@ -0,0 +1,3 @@
7
+ +export const foo = 'bar';
8
+ +export const baz = 42;
9
+ +export default foo;
@@ -0,0 +1,10 @@
1
+ diff --git a/file.txt b/file.txt
2
+ index 1234567..abcdefg 100644
3
+ --- a/file.txt
4
+ +++ b/file.txt
5
+ @@ -1,3 +1,3 @@
6
+ line one
7
+ -line two
8
+ +line two modified
9
+ line three
10
+
@@ -0,0 +1,12 @@
1
+ diff --git a/old-name.ts b/new-name.ts
2
+ similarity index 85%
3
+ rename from old-name.ts
4
+ rename to new-name.ts
5
+ index 1234567..abcdefg 100644
6
+ --- a/old-name.ts
7
+ +++ b/new-name.ts
8
+ @@ -1,3 +1,3 @@
9
+ -export const name = 'old';
10
+ +export const name = 'new';
11
+ export const version = '1.0.0';
12
+ export default name;
@@ -0,0 +1,11 @@
1
+ diff --git a/hello.ts b/hello.ts
2
+ index 1234567..abcdefg 100644
3
+ --- a/hello.ts
4
+ +++ b/hello.ts
5
+ @@ -1,3 +1,6 @@
6
+ const greeting = 'hello';
7
+ +const name = 'world';
8
+ +const message = `${greeting}, ${name}\!`;
9
+ +console.log(message);
10
+
11
+ export default greeting;
@@ -0,0 +1,11 @@
1
+ diff --git a/utils.ts b/utils.ts
2
+ index 1234567..abcdefg 100644
3
+ --- a/utils.ts
4
+ +++ b/utils.ts
5
+ @@ -1,5 +1,2 @@
6
+ export function add(a: number, b: number) {
7
+ - console.log('adding', a, b);
8
+ - const result = a + b;
9
+ - return result;
10
+ + return a + b;
11
+ }
@@ -0,0 +1,15 @@
1
+ diff --git a/config.ts b/config.ts
2
+ index 1234567..abcdefg 100644
3
+ --- a/config.ts
4
+ +++ b/config.ts
5
+ @@ -1,7 +1,8 @@
6
+ export const config = {
7
+ - port: 3000,
8
+ + port: 8080,
9
+ host: 'localhost',
10
+ - debug: false,
11
+ + debug: true,
12
+ + verbose: true,
13
+ };
14
+
15
+ export default config;
@@ -0,0 +1,22 @@
1
+ diff --git a/server.ts b/server.ts
2
+ index 1234567..abcdefg 100644
3
+ --- a/server.ts
4
+ +++ b/server.ts
5
+ @@ -1,5 +1,5 @@
6
+ import express from 'express';
7
+ -import { logger } from './logger';
8
+ +import { logger, format } from './logger';
9
+
10
+ const app = express();
11
+
12
+ @@ -20,6 +20,10 @@ app.get('/health', (req, res) => {
13
+ res.json({ status: 'ok' });
14
+ });
15
+
16
+ +app.get('/version', (req, res) => {
17
+ + res.json({ version: '1.0.0' });
18
+ +});
19
+ +
20
+ app.listen(3000, () => {
21
+ logger.info('Server started');
22
+ });
@@ -0,0 +1,9 @@
1
+ diff --git a/my folder/my file.ts b/my folder/my file.ts
2
+ index 1234567..abcdefg 100644
3
+ --- a/my folder/my file.ts
4
+ +++ b/my folder/my file.ts
5
+ @@ -1,3 +1,3 @@
6
+ -export const x = 1;
7
+ +export const x = 2;
8
+ export const y = 3;
9
+ export default x;
@@ -0,0 +1,7 @@
1
+ diff --git a/vendor/lib b/vendor/lib
2
+ index abc1234..def5678 160000
3
+ --- a/vendor/lib
4
+ +++ b/vendor/lib
5
+ @@ -1 +1 @@
6
+ -Subproject commit abc1234567890abcdef1234567890abcdef123456
7
+ +Subproject commit def5678901234567890abcdef1234567890abcdef
@@ -0,0 +1,11 @@
1
+ diff --git a/i18n.ts b/i18n.ts
2
+ index 1234567..abcdefg 100644
3
+ --- a/i18n.ts
4
+ +++ b/i18n.ts
5
+ @@ -1,4 +1,5 @@
6
+ export const messages = {
7
+ hello: '你好世界',
8
+ - goodbye: 'さようなら',
9
+ + goodbye: 'さよなら',
10
+ + emoji: '🎉🚀✨',
11
+ };