kimaki 0.4.2 → 0.4.4

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.
@@ -0,0 +1,146 @@
1
+ import { test, expect } from 'vitest'
2
+ import { Lexer } from 'marked'
3
+ import { escapeBackticksInCodeBlocks } from './discordBot.js'
4
+
5
+
6
+
7
+ test('escapes single backticks in code blocks', () => {
8
+ const input = '```js\nconst x = `hello`\n```'
9
+ const result = escapeBackticksInCodeBlocks(input)
10
+
11
+ expect(result).toMatchInlineSnapshot(`
12
+ "\`\`\`js
13
+ const x = \\\`hello\\\`
14
+ \`\`\`
15
+ "
16
+ `)
17
+ })
18
+
19
+ test('escapes backticks in code blocks with language', () => {
20
+ const input = '```typescript\nconst greeting = `Hello, ${name}!`\nconst inline = `test`\n```'
21
+ const result = escapeBackticksInCodeBlocks(input)
22
+
23
+ expect(result).toMatchInlineSnapshot(`
24
+ "\`\`\`typescript
25
+ const greeting = \\\`Hello, \${name}!\\\`
26
+ const inline = \\\`test\\\`
27
+ \`\`\`
28
+ "
29
+ `)
30
+ })
31
+
32
+ test('does not escape backticks outside code blocks', () => {
33
+ const input = 'This is `inline code` and this is a code block:\n```\nconst x = `template`\n```'
34
+ const result = escapeBackticksInCodeBlocks(input)
35
+
36
+ expect(result).toMatchInlineSnapshot(`
37
+ "This is \`inline code\` and this is a code block:
38
+ \`\`\`
39
+ const x = \\\`template\\\`
40
+ \`\`\`
41
+ "
42
+ `)
43
+ })
44
+
45
+ test('handles multiple code blocks', () => {
46
+ const input = `First block:
47
+ \`\`\`js
48
+ const a = \`test\`
49
+ \`\`\`
50
+
51
+ Some text with \`inline\` code
52
+
53
+ Second block:
54
+ \`\`\`python
55
+ name = f\`hello {world}\`
56
+ \`\`\``
57
+
58
+ const result = escapeBackticksInCodeBlocks(input)
59
+
60
+ expect(result).toMatchInlineSnapshot(`
61
+ "First block:
62
+ \`\`\`js
63
+ const a = \\\`test\\\`
64
+ \`\`\`
65
+
66
+
67
+ Some text with \`inline\` code
68
+
69
+ Second block:
70
+ \`\`\`python
71
+ name = f\\\`hello {world}\\\`
72
+ \`\`\`
73
+ "
74
+ `)
75
+ })
76
+
77
+ test('handles code blocks without language', () => {
78
+ const input = '```\nconst x = `value`\n```'
79
+ const result = escapeBackticksInCodeBlocks(input)
80
+
81
+ expect(result).toMatchInlineSnapshot(`
82
+ "\`\`\`
83
+ const x = \\\`value\\\`
84
+ \`\`\`
85
+ "
86
+ `)
87
+ })
88
+
89
+ test('handles nested backticks in code blocks', () => {
90
+ const input = '```js\nconst nested = `outer ${`inner`} text`\n```'
91
+ const result = escapeBackticksInCodeBlocks(input)
92
+
93
+ expect(result).toMatchInlineSnapshot(`
94
+ "\`\`\`js
95
+ const nested = \\\`outer \${\\\`inner\\\`} text\\\`
96
+ \`\`\`
97
+ "
98
+ `)
99
+ })
100
+
101
+ test('preserves markdown outside code blocks', () => {
102
+ const input = `# Heading
103
+
104
+ This is **bold** and *italic* text
105
+
106
+ \`\`\`js
107
+ const code = \`with template\`
108
+ \`\`\`
109
+
110
+ - List item 1
111
+ - List item 2`
112
+
113
+ const result = escapeBackticksInCodeBlocks(input)
114
+
115
+ expect(result).toMatchInlineSnapshot(`
116
+ "# Heading
117
+
118
+ This is **bold** and *italic* text
119
+
120
+ \`\`\`js
121
+ const code = \\\`with template\\\`
122
+ \`\`\`
123
+
124
+
125
+ - List item 1
126
+ - List item 2"
127
+ `)
128
+ })
129
+
130
+ test('does not escape code block delimiter backticks', () => {
131
+ const input = '```js\nconst x = `hello`\n```'
132
+ const result = escapeBackticksInCodeBlocks(input)
133
+
134
+ expect(result.startsWith('```')).toBe(true)
135
+ expect(result.endsWith('```\n')).toBe(true)
136
+ expect(result).toContain('\\`hello\\`')
137
+ expect(result).not.toContain('\\`\\`\\`js')
138
+ expect(result).not.toContain('\\`\\`\\`\n')
139
+
140
+ expect(result).toMatchInlineSnapshot(`
141
+ "\`\`\`js
142
+ const x = \\\`hello\\\`
143
+ \`\`\`
144
+ "
145
+ `)
146
+ })