Skip to content

Commit e494d09

Browse files
committed
feat: support custom separator on set
1 parent 164b627 commit e494d09

File tree

2 files changed

+172
-149
lines changed

2 files changed

+172
-149
lines changed

src/properties.spec.ts

+168-147
Original file line numberDiff line numberDiff line change
@@ -102,168 +102,189 @@ describe('data access', () => {
102102
['foo23', 'bar23']
103103
]
104104

105-
it.each(samplePairs)('should get property "%s"', (key, expected) => {
106-
const result = properties.get(sample, key)
107-
expect(result).toBe(expected)
108-
})
109-
110-
it.each([
111-
['foo6'],
112-
['foo7']
113-
])('should not get commented property "%s"', (key) => {
114-
const result = properties.get(sample, key)
115-
expect(result).toBeUndefined()
116-
})
105+
describe('get value', () => {
106+
it.each(samplePairs)('should get property "%s"', (key, expected) => {
107+
const result = properties.get(sample, key)
108+
expect(result).toBe(expected)
109+
})
117110

111+
it.each([
112+
['foo6'],
113+
['foo7']
114+
])('should not get commented property "%s"', (key) => {
115+
const result = properties.get(sample, key)
116+
expect(result).toBeUndefined()
117+
})
118118

119-
it('should return last value of duplicate key', () => {
120-
const config: properties.Properties = {
121-
lines: [
122-
'key1=foo1',
123-
'key2=foo2',
124-
'key1=foo3'
125-
]
126-
}
127119

128-
const result = properties.get(config, 'key1')
129-
expect(result).toBe('foo3')
130-
})
120+
it('should return last value of duplicate key', () => {
121+
const config: properties.Properties = {
122+
lines: [
123+
'key1=foo1',
124+
'key2=foo2',
125+
'key1=foo3'
126+
]
127+
}
131128

132-
it.each([
133-
['foo1', 'bar', 'foo1=bar'],
134-
['foo8:', 'bar8', 'foo8\\:=bar8'],
135-
['foo9=', 'bar9', 'foo9\\==bar9'],
136-
['foo10=', 'bar10', 'foo10\\==bar10'],
137-
['foo11 ', 'bar11', 'foo11\\ =bar11'],
138-
[' foo12', 'bar12 ', '\\ foo12=bar12 '],
139-
['#foo13', 'bar13', '\\#foo13=bar13'],
140-
['!foo14#', 'bar14', '\\!foo14\\#=bar14'],
141-
['foo15', '#bar15', 'foo15=\\#bar15'],
142-
['f o o18', ' bar18', 'f\\ o\\ \\ o18=\\ bar18'],
143-
['foo19\n', 'bar\t\f\r19\n', 'foo19\\n=bar\\t\\f\\r19\\n'],
144-
['foo20', '', 'foo20='],
145-
['foo22', '\\', 'foo22=\\\\']
146-
])('should format key pair for "%s"', (key, value, expected) => {
147-
const config = properties.empty()
148-
properties.set(config, key, value)
149-
expect(config.lines).toEqual([expected])
129+
const result = properties.get(config, 'key1')
130+
expect(result).toBe('foo3')
131+
})
150132
})
151133

152-
it.each([
153-
['foo=bar', 'a=b'],
154-
['foo = bar', 'a = b'],
155-
['foo:bar', 'a:b'],
156-
['foo: bar', 'a: b'],
157-
['foo bar', 'a b'],
158-
['# comment', 'a=b']
159-
])('should reuse last separator from "%s"', (line, expected) => {
160-
const config: properties.Properties = {
161-
lines: [line]
162-
}
163-
properties.set(config, 'a', 'b')
164-
expect(config.lines).toEqual([line, expected])
165-
})
134+
describe('set value', () => {
135+
it.each([
136+
['foo1', 'bar', 'foo1=bar'],
137+
['foo8:', 'bar8', 'foo8\\:=bar8'],
138+
['foo9=', 'bar9', 'foo9\\==bar9'],
139+
['foo10=', 'bar10', 'foo10\\==bar10'],
140+
['foo11 ', 'bar11', 'foo11\\ =bar11'],
141+
[' foo12', 'bar12 ', '\\ foo12=bar12 '],
142+
['#foo13', 'bar13', '\\#foo13=bar13'],
143+
['!foo14#', 'bar14', '\\!foo14\\#=bar14'],
144+
['foo15', '#bar15', 'foo15=\\#bar15'],
145+
['f o o18', ' bar18', 'f\\ o\\ \\ o18=\\ bar18'],
146+
['foo19\n', 'bar\t\f\r19\n', 'foo19\\n=bar\\t\\f\\r19\\n'],
147+
['foo20', '', 'foo20='],
148+
['foo22', '\\', 'foo22=\\\\']
149+
])('should format key pair for "%s"', (key, value, expected) => {
150+
const config = properties.empty()
151+
properties.set(config, key, value)
152+
expect(config.lines).toEqual([expected])
153+
})
166154

167-
it('should replace key pairs', () => {
168-
const keys = [
169-
'foo0',
170-
'foo1',
171-
'foo2',
172-
'foo3',
173-
'foo4',
174-
'foo5',
175-
'foo6',
176-
'foo8:',
177-
'foo9=',
178-
'foo10=',
179-
'foo11 ',
180-
' foo12',
181-
'#foo13',
182-
'!foo14#',
183-
'foo15',
184-
'foo16',
185-
'foo17',
186-
'f o o18',
187-
'foo19\n',
188-
'foo20',
189-
'foo21',
190-
'foo22',
191-
'foo23'
192-
]
193-
keys.forEach(key => properties.set(sample, key, 'x'))
194-
195-
expect(sample.lines).toEqual([
196-
'foo0=x',
197-
'foo1=x',
198-
'foo2:x',
199-
'foo3 x',
200-
'foo4 x',
201-
'foo5 = x',
202-
'# foo6 = bar6',
203-
' ! foo7 = bar7',
204-
'foo8\\::x',
205-
'foo9\\==x',
206-
'foo10\\=:x',
207-
'foo11\\ x',
208-
'\\ foo12 = x',
209-
'\\#foo13 = x',
210-
'\\!foo14\\# = x',
211-
'foo15 = x',
212-
'foo16 = x',
213-
'foo17 = x',
214-
'f\\ o\\ \\ o18 =x',
215-
'foo19\\n= x',
216-
'foo20 = x',
217-
'foo21 =x',
218-
'foo22 =x',
219-
'foo23 x',
220-
'foo6 x'
221-
])
222-
})
155+
it.each([
156+
['foo=bar', 'a=b'],
157+
['foo = bar', 'a = b'],
158+
['foo:bar', 'a:b'],
159+
['foo: bar', 'a: b'],
160+
['foo bar', 'a b'],
161+
['# comment', 'a=b']
162+
])('should reuse last separator from "%s"', (line, expected) => {
163+
const config: properties.Properties = {
164+
lines: [line]
165+
}
166+
properties.set(config, 'a', 'b')
167+
expect(config.lines).toEqual([line, expected])
168+
})
223169

224-
it('should remove duplicate keys on set', () => {
225-
const config: properties.Properties = {
226-
lines: [
227-
'key1=foo1',
228-
'key2=foo2',
229-
'key1=foo3'
170+
it('should replace key pairs', () => {
171+
const keys = [
172+
'foo0',
173+
'foo1',
174+
'foo2',
175+
'foo3',
176+
'foo4',
177+
'foo5',
178+
'foo6',
179+
'foo8:',
180+
'foo9=',
181+
'foo10=',
182+
'foo11 ',
183+
' foo12',
184+
'#foo13',
185+
'!foo14#',
186+
'foo15',
187+
'foo16',
188+
'foo17',
189+
'f o o18',
190+
'foo19\n',
191+
'foo20',
192+
'foo21',
193+
'foo22',
194+
'foo23'
230195
]
231-
}
196+
keys.forEach(key => properties.set(sample, key, 'x'))
197+
198+
expect(sample.lines).toEqual([
199+
'foo0=x',
200+
'foo1=x',
201+
'foo2:x',
202+
'foo3 x',
203+
'foo4 x',
204+
'foo5 = x',
205+
'# foo6 = bar6',
206+
' ! foo7 = bar7',
207+
'foo8\\::x',
208+
'foo9\\==x',
209+
'foo10\\=:x',
210+
'foo11\\ x',
211+
'\\ foo12 = x',
212+
'\\#foo13 = x',
213+
'\\!foo14\\# = x',
214+
'foo15 = x',
215+
'foo16 = x',
216+
'foo17 = x',
217+
'f\\ o\\ \\ o18 =x',
218+
'foo19\\n= x',
219+
'foo20 = x',
220+
'foo21 =x',
221+
'foo22 =x',
222+
'foo23 x',
223+
'foo6 x'
224+
])
225+
})
232226

233-
properties.set(config, 'key1', 'test')
234-
expect(config.lines).toEqual([
235-
'key1=test',
236-
'key2=foo2'
237-
])
238-
})
227+
it('should use custom separator', () => {
228+
const config: properties.Properties = {
229+
lines: [
230+
'key1=foo1',
231+
'key2=foo2'
232+
]
233+
}
239234

240-
it('should remove existing key with set undefined', () => {
241-
const config: properties.Properties = {
242-
lines: ['foo=bar']
243-
}
244-
properties.set(config, 'foo', undefined)
245-
expect(config.lines).toEqual([])
246-
})
235+
properties.set(config, 'key1', 'test', {separator: ': '})
236+
expect(config.lines).toEqual([
237+
'key1: test',
238+
'key2=foo2'
239+
])
240+
})
247241

248-
it('should remove existing key with remove', () => {
249-
const config: properties.Properties = {
250-
lines: ['foo=bar']
251-
}
252-
properties.remove(config, 'foo')
253-
expect(config.lines).toEqual([])
242+
it('should remove duplicate keys on set', () => {
243+
const config: properties.Properties = {
244+
lines: [
245+
'key1=foo1',
246+
'key2=foo2',
247+
'key1=foo3'
248+
]
249+
}
250+
251+
properties.set(config, 'key1', 'test')
252+
expect(config.lines).toEqual([
253+
'key1=test',
254+
'key2=foo2'
255+
])
256+
})
254257
})
255258

256-
it('should remove all duplicate keys with remove', () => {
257-
const config: properties.Properties = {
258-
lines: [
259-
'key1=foo1',
260-
'key2=foo2',
261-
'key1=foo3'
262-
]
263-
}
259+
describe('remove value', () => {
260+
it('should remove existing key with set undefined', () => {
261+
const config: properties.Properties = {
262+
lines: ['foo=bar']
263+
}
264+
properties.set(config, 'foo', undefined)
265+
expect(config.lines).toEqual([])
266+
})
267+
268+
it('should remove existing key with remove', () => {
269+
const config: properties.Properties = {
270+
lines: ['foo=bar']
271+
}
272+
properties.remove(config, 'foo')
273+
expect(config.lines).toEqual([])
274+
})
264275

265-
properties.remove(config, 'key1')
266-
expect(config.lines).toEqual(['key2=foo2'])
276+
it('should remove all duplicate keys with remove', () => {
277+
const config: properties.Properties = {
278+
lines: [
279+
'key1=foo1',
280+
'key2=foo2',
281+
'key1=foo3'
282+
]
283+
}
284+
285+
properties.remove(config, 'key1')
286+
expect(config.lines).toEqual(['key2=foo2'])
287+
})
267288
})
268289

269290
describe('list', () => {

src/properties.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -138,19 +138,21 @@ export const toMap = (config: Properties): Map<string, string> => {
138138
* @param config Java properties set.
139139
* @param key Key name.
140140
* @param value New value. If undefined or null, key will be removed.
141+
* @param options Optionally override set behavior.
141142
*/
142143
export const set = (
143144
config: Properties,
144145
key: string,
145-
value: string | undefined | null
146+
value: string | undefined | null,
147+
options?: {separator?: string}
146148
): void => {
147149
// Find existing
148150
const {start, len, sep} = findValue(config.lines, key)
149151

150152
// Prepare value
151153
const items =
152154
typeof value === 'string'
153-
? [`${escapeKey(key)}${sep || '='}${escapeValue(value)}`]
155+
? [`${escapeKey(key)}${options?.separator || sep || '='}${escapeValue(value)}`]
154156
: []
155157

156158
// If found

0 commit comments

Comments
 (0)