@matter/testing 0.13.1-alpha.0-20250508-047aa0277 → 0.13.1-alpha.0-20250511-74ef153aa

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.
@@ -15,7 +15,7 @@ export interface Test {
15
15
  path: string;
16
16
  descriptor: TestDescriptor;
17
17
  container: Container;
18
- edit(editor: edit.Editor): Promise<void>;
18
+ edit(...editors: edit.Editor[]): Promise<void>;
19
19
  initializeSubject(subject: Subject): Promise<void>;
20
20
  invoke(subject: Subject, step: (title: string) => void, args: string[]): Promise<void>;
21
21
  }
@@ -26,7 +26,7 @@ export declare abstract class BaseTest implements Test {
26
26
  get path(): string;
27
27
  get descriptor(): TestFileDescriptor;
28
28
  get container(): Container;
29
- edit(editor: edit.Editor): Promise<void>;
29
+ edit(...editors: edit.Editor[]): Promise<void>;
30
30
  abstract initializeSubject(subject: Subject): Promise<void>;
31
31
  abstract invoke(subject: Subject, step: (title: string) => void, args: string[]): Promise<void>;
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/device/test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAED,8BAAsB,QAAS,YAAW,IAAI;;gBAI9B,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS;IAKhE,IAAI,IAAI,WAEP;IAED,IAAI,IAAI,WAEP;IAED,IAAI,UAAU,uBAEb;IAED,IAAI,SAAS,cAEZ;IAED,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM;IAIxB,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAClG;AAED,yBAAiB,IAAI,CAAC;IAClB;;OAEG;IACH,UAAiB,UAAU;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;QACvC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;KAC7B;IAED,UAAiB,UAAU,CAAC;QACxB,UAAiB,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,CAAC;SACjB;KACJ;IAED;;OAEG;IACH,SAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,UAM1C;CACJ"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/device/test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAED,8BAAsB,QAAS,YAAW,IAAI;;gBAI9B,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS;IAKhE,IAAI,IAAI,WAEP;IAED,IAAI,IAAI,WAEP;IAED,IAAI,UAAU,uBAEb;IAED,IAAI,SAAS,cAEZ;IAEK,IAAI,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;IAMpC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAClG;AAED,yBAAiB,IAAI,CAAC;IAClB;;OAEG;IACH,UAAiB,UAAU;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;QACvC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;KAC7B;IAED,UAAiB,UAAU,CAAC;QACxB,UAAiB,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,CAAC;SACjB;KACJ;IAED;;OAEG;IACH,SAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,UAM1C;CACJ"}
@@ -46,8 +46,10 @@ class BaseTest {
46
46
  get container() {
47
47
  return this.#container;
48
48
  }
49
- edit(editor) {
50
- return this.#container.edit(editor, this.#descriptor.path);
49
+ async edit(...editors) {
50
+ for (const editor of editors) {
51
+ await this.#container.edit(editor, this.#descriptor.path);
52
+ }
51
53
  }
52
54
  }
53
55
  var Test;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/device/test.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBO,MAAe,SAAyB;AAAA,EAC3C;AAAA,EACA;AAAA,EAEA,YAAY,YAAgC,WAAsB;AAC9D,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAEA,IAAI,aAAa;AACb,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,YAAY;AACZ,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,KAAK,QAAqB;AACtB,WAAO,KAAK,WAAW,KAAK,QAAQ,KAAK,YAAY,IAAI;AAAA,EAC7D;AAIJ;AAEO,IAAU;AAAA,CAAV,CAAUA,UAAV;AAyBI,WAAS,eAAe,MAAc;AACzC,WAAO,KACF,YAAY,EACZ,MAAM,GAAG,EACT,IAAI,aAAY,QAAQ,MAAM,OAAO,IAAI,QAAQ,SAAS,GAAG,GAAG,IAAI,OAAQ,EAC5E,KAAK,GAAG;AAAA,EACjB;AANO,EAAAA,MAAS;AAAA,GAzBH;",
4
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBO,MAAe,SAAyB;AAAA,EAC3C;AAAA,EACA;AAAA,EAEA,YAAY,YAAgC,WAAsB;AAC9D,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAEA,IAAI,aAAa;AACb,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,YAAY;AACZ,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,QAAQ,SAAwB;AAClC,eAAW,UAAU,SAAS;AAC1B,YAAM,KAAK,WAAW,KAAK,QAAQ,KAAK,YAAY,IAAI;AAAA,IAC5D;AAAA,EACJ;AAIJ;AAEO,IAAU;AAAA,CAAV,CAAUA,UAAV;AAyBI,WAAS,eAAe,MAAc;AACzC,WAAO,KACF,YAAY,EACZ,MAAM,GAAG,EACT,IAAI,aAAY,QAAQ,MAAM,OAAO,IAAI,QAAQ,SAAS,GAAG,GAAG,IAAI,OAAQ,EAC5E,KAAK,GAAG;AAAA,EACjB;AANO,EAAAA,MAAS;AAAA,GAzBH;",
5
5
  "names": ["Test"]
6
6
  }
@@ -11,22 +11,31 @@ export declare namespace edit {
11
11
  interface Editor {
12
12
  (container: Container, files: string[]): Promise<void>;
13
13
  }
14
- interface LineEditor {
14
+ interface InsertionEditor {
15
+ after?: LineDetector;
16
+ before?: LineDetector;
17
+ lines?: LineProducer;
18
+ }
19
+ interface RegionEditor {
15
20
  from?: LineDetector;
16
21
  to?: LineDetector;
17
22
  after?: LineDetector;
18
23
  before?: LineDetector;
19
- replacement?: LineReplacement;
24
+ replacement?: LineProducer;
20
25
  }
21
26
  type LineDetector = string | RegExp | ((line: string) => boolean);
22
- type LineReplacement = string | string[] | ((lines: string[]) => string[]);
27
+ type LineProducer = string | string[] | ((...lines: string[]) => string[]);
23
28
  /**
24
29
  * Modify a file using sed -iz.
25
30
  */
26
31
  function sed(...scripts: string[]): Editor;
32
+ /**
33
+ * Insert lines before/after key lines.
34
+ */
35
+ function insert(...edits: InsertionEditor[]): Editor;
27
36
  /**
28
37
  * Replace regions of a file demarcated by key lines.
29
38
  */
30
- function lines(...edits: LineEditor[]): Editor;
39
+ function region(...edits: RegionEditor[]): Editor;
31
40
  }
32
41
  //# sourceMappingURL=edit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/docker/edit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;GAEG;AACH,yBAAiB,IAAI,CAAC;IAClB,UAAiB,MAAM;QACnB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1D;IAED,UAAiB,UAAU;QACvB,IAAI,CAAC,EAAE,YAAY,CAAC;QACpB,EAAE,CAAC,EAAE,YAAY,CAAC;QAClB,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,MAAM,CAAC,EAAE,YAAY,CAAC;QACtB,WAAW,CAAC,EAAE,eAAe,CAAC;KACjC;IAED,KAAY,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACzE,KAAY,eAAe,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IAElF;;OAEG;IACH,SAAgB,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAGhD;IAED;;OAEG;IACH,SAAgB,KAAK,CAAC,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAMpD;CACJ"}
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/docker/edit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;GAEG;AACH,yBAAiB,IAAI,CAAC;IAClB,UAAiB,MAAM;QACnB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1D;IAED,UAAiB,eAAe;QAC5B,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,MAAM,CAAC,EAAE,YAAY,CAAC;QACtB,KAAK,CAAC,EAAE,YAAY,CAAC;KACxB;IAED,UAAiB,YAAY;QACzB,IAAI,CAAC,EAAE,YAAY,CAAC;QACpB,EAAE,CAAC,EAAE,YAAY,CAAC;QAClB,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,MAAM,CAAC,EAAE,YAAY,CAAC;QACtB,WAAW,CAAC,EAAE,YAAY,CAAC;KAC9B;IAED,KAAY,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACzE,KAAY,YAAY,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IAElF;;OAEG;IACH,SAAgB,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAGhD;IAED;;OAEG;IACH,SAAgB,MAAM,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,CAM1D;IAED;;OAEG;IACH,SAAgB,MAAM,CAAC,GAAG,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAMvD;CACJ"}
@@ -33,17 +33,49 @@ var edit;
33
33
  return (container, paths) => container.exec(["sed", "-iz", script, ...paths]);
34
34
  }
35
35
  edit2.sed = sed;
36
- function lines(...edits) {
36
+ function insert(...edits) {
37
+ return async (Container, paths) => {
38
+ for (const path of paths) {
39
+ await insertLinesInto(Container, path, edits);
40
+ }
41
+ };
42
+ }
43
+ edit2.insert = insert;
44
+ function region(...edits) {
37
45
  return async (container, paths) => {
38
46
  for (const path of paths) {
39
- await editLinesOf(container, path, edits);
47
+ await editRegionsOf(container, path, edits);
40
48
  }
41
49
  };
42
50
  }
43
- edit2.lines = lines;
51
+ edit2.region = region;
44
52
  })(edit || (edit = {}));
45
- async function editLinesOf(container, path, edits) {
46
- const editors = editorsOf(edits);
53
+ async function insertLinesInto(container, path, edits) {
54
+ const editors = insertionEditorsOf(edits);
55
+ const input = (await container.read(path)).split("\n");
56
+ const output = Array();
57
+ for (const line of input) {
58
+ for (const editor of editors) {
59
+ if (editor.before?.(line)) {
60
+ output.push(...editor.lines(line));
61
+ }
62
+ output.push(line);
63
+ if (editor.after?.(line)) {
64
+ output.push(...editor.lines(line));
65
+ }
66
+ }
67
+ }
68
+ await container.write(path, output.join("\n"));
69
+ }
70
+ function insertionEditorsOf(edits) {
71
+ return edits.map(({ before, after, lines }) => ({
72
+ before: detectorOf(before),
73
+ after: detectorOf(after),
74
+ lines: replacementOf(lines)
75
+ }));
76
+ }
77
+ async function editRegionsOf(container, path, edits) {
78
+ const editors = regionEditorsOf(edits);
47
79
  let editor;
48
80
  const input = (await container.read(path)).split("\n");
49
81
  const output = Array();
@@ -66,7 +98,7 @@ async function editLinesOf(container, path, edits) {
66
98
  editor?.finish(output);
67
99
  await container.write(path, output.join("\n"));
68
100
  }
69
- function editorsOf(edits) {
101
+ function regionEditorsOf(edits) {
70
102
  return edits.map(({ from, to, after, before, replacement }) => {
71
103
  let collecting = from === void 0 && after === void 0;
72
104
  from = detectorOf(from);
@@ -91,13 +123,13 @@ function editorsOf(edits) {
91
123
  collect(line, output) {
92
124
  if (collecting) {
93
125
  if (to?.(line)) {
94
- output.push(...replacement(collected));
126
+ output.push(...replacement(...collected));
95
127
  collected.length = 0;
96
128
  collecting = false;
97
129
  return true;
98
130
  }
99
131
  if (before?.(line)) {
100
- output.push(...replacement(collected));
132
+ output.push(...replacement(...collected));
101
133
  collected.length = 0;
102
134
  collecting = false;
103
135
  return false;
@@ -108,7 +140,7 @@ function editorsOf(edits) {
108
140
  },
109
141
  finish(output) {
110
142
  if (collecting && to === void 0 && before === void 0) {
111
- output.push(...replacement(collected));
143
+ output.push(...replacement(...collected));
112
144
  }
113
145
  }
114
146
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/docker/edit.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["edit"]
6
6
  }
@@ -15,7 +15,7 @@ export interface Test {
15
15
  path: string;
16
16
  descriptor: TestDescriptor;
17
17
  container: Container;
18
- edit(editor: edit.Editor): Promise<void>;
18
+ edit(...editors: edit.Editor[]): Promise<void>;
19
19
  initializeSubject(subject: Subject): Promise<void>;
20
20
  invoke(subject: Subject, step: (title: string) => void, args: string[]): Promise<void>;
21
21
  }
@@ -26,7 +26,7 @@ export declare abstract class BaseTest implements Test {
26
26
  get path(): string;
27
27
  get descriptor(): TestFileDescriptor;
28
28
  get container(): Container;
29
- edit(editor: edit.Editor): Promise<void>;
29
+ edit(...editors: edit.Editor[]): Promise<void>;
30
30
  abstract initializeSubject(subject: Subject): Promise<void>;
31
31
  abstract invoke(subject: Subject, step: (title: string) => void, args: string[]): Promise<void>;
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/device/test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAED,8BAAsB,QAAS,YAAW,IAAI;;gBAI9B,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS;IAKhE,IAAI,IAAI,WAEP;IAED,IAAI,IAAI,WAEP;IAED,IAAI,UAAU,uBAEb;IAED,IAAI,SAAS,cAEZ;IAED,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM;IAIxB,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAClG;AAED,yBAAiB,IAAI,CAAC;IAClB;;OAEG;IACH,UAAiB,UAAU;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;QACvC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;KAC7B;IAED,UAAiB,UAAU,CAAC;QACxB,UAAiB,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,CAAC;SACjB;KACJ;IAED;;OAEG;IACH,SAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,UAM1C;CACJ"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/device/test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAED,8BAAsB,QAAS,YAAW,IAAI;;gBAI9B,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS;IAKhE,IAAI,IAAI,WAEP;IAED,IAAI,IAAI,WAEP;IAED,IAAI,UAAU,uBAEb;IAED,IAAI,SAAS,cAEZ;IAEK,IAAI,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;IAMpC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAClG;AAED,yBAAiB,IAAI,CAAC;IAClB;;OAEG;IACH,UAAiB,UAAU;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;QACvC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;KAC7B;IAED,UAAiB,UAAU,CAAC;QACxB,UAAiB,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,CAAC;SACjB;KACJ;IAED;;OAEG;IACH,SAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,UAM1C;CACJ"}
@@ -22,8 +22,10 @@ class BaseTest {
22
22
  get container() {
23
23
  return this.#container;
24
24
  }
25
- edit(editor) {
26
- return this.#container.edit(editor, this.#descriptor.path);
25
+ async edit(...editors) {
26
+ for (const editor of editors) {
27
+ await this.#container.edit(editor, this.#descriptor.path);
28
+ }
27
29
  }
28
30
  }
29
31
  var Test;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/device/test.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAwBO,MAAe,SAAyB;AAAA,EAC3C;AAAA,EACA;AAAA,EAEA,YAAY,YAAgC,WAAsB;AAC9D,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAEA,IAAI,aAAa;AACb,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,YAAY;AACZ,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,KAAK,QAAqB;AACtB,WAAO,KAAK,WAAW,KAAK,QAAQ,KAAK,YAAY,IAAI;AAAA,EAC7D;AAIJ;AAEO,IAAU;AAAA,CAAV,CAAUA,UAAV;AAyBI,WAAS,eAAe,MAAc;AACzC,WAAO,KACF,YAAY,EACZ,MAAM,GAAG,EACT,IAAI,aAAY,QAAQ,MAAM,OAAO,IAAI,QAAQ,SAAS,GAAG,GAAG,IAAI,OAAQ,EAC5E,KAAK,GAAG;AAAA,EACjB;AANO,EAAAA,MAAS;AAAA,GAzBH;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAwBO,MAAe,SAAyB;AAAA,EAC3C;AAAA,EACA;AAAA,EAEA,YAAY,YAAgC,WAAsB;AAC9D,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAEA,IAAI,aAAa;AACb,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,YAAY;AACZ,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,QAAQ,SAAwB;AAClC,eAAW,UAAU,SAAS;AAC1B,YAAM,KAAK,WAAW,KAAK,QAAQ,KAAK,YAAY,IAAI;AAAA,IAC5D;AAAA,EACJ;AAIJ;AAEO,IAAU;AAAA,CAAV,CAAUA,UAAV;AAyBI,WAAS,eAAe,MAAc;AACzC,WAAO,KACF,YAAY,EACZ,MAAM,GAAG,EACT,IAAI,aAAY,QAAQ,MAAM,OAAO,IAAI,QAAQ,SAAS,GAAG,GAAG,IAAI,OAAQ,EAC5E,KAAK,GAAG;AAAA,EACjB;AANO,EAAAA,MAAS;AAAA,GAzBH;",
5
5
  "names": ["Test"]
6
6
  }
@@ -11,22 +11,31 @@ export declare namespace edit {
11
11
  interface Editor {
12
12
  (container: Container, files: string[]): Promise<void>;
13
13
  }
14
- interface LineEditor {
14
+ interface InsertionEditor {
15
+ after?: LineDetector;
16
+ before?: LineDetector;
17
+ lines?: LineProducer;
18
+ }
19
+ interface RegionEditor {
15
20
  from?: LineDetector;
16
21
  to?: LineDetector;
17
22
  after?: LineDetector;
18
23
  before?: LineDetector;
19
- replacement?: LineReplacement;
24
+ replacement?: LineProducer;
20
25
  }
21
26
  type LineDetector = string | RegExp | ((line: string) => boolean);
22
- type LineReplacement = string | string[] | ((lines: string[]) => string[]);
27
+ type LineProducer = string | string[] | ((...lines: string[]) => string[]);
23
28
  /**
24
29
  * Modify a file using sed -iz.
25
30
  */
26
31
  function sed(...scripts: string[]): Editor;
32
+ /**
33
+ * Insert lines before/after key lines.
34
+ */
35
+ function insert(...edits: InsertionEditor[]): Editor;
27
36
  /**
28
37
  * Replace regions of a file demarcated by key lines.
29
38
  */
30
- function lines(...edits: LineEditor[]): Editor;
39
+ function region(...edits: RegionEditor[]): Editor;
31
40
  }
32
41
  //# sourceMappingURL=edit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/docker/edit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;GAEG;AACH,yBAAiB,IAAI,CAAC;IAClB,UAAiB,MAAM;QACnB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1D;IAED,UAAiB,UAAU;QACvB,IAAI,CAAC,EAAE,YAAY,CAAC;QACpB,EAAE,CAAC,EAAE,YAAY,CAAC;QAClB,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,MAAM,CAAC,EAAE,YAAY,CAAC;QACtB,WAAW,CAAC,EAAE,eAAe,CAAC;KACjC;IAED,KAAY,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACzE,KAAY,eAAe,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IAElF;;OAEG;IACH,SAAgB,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAGhD;IAED;;OAEG;IACH,SAAgB,KAAK,CAAC,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAMpD;CACJ"}
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/docker/edit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;GAEG;AACH,yBAAiB,IAAI,CAAC;IAClB,UAAiB,MAAM;QACnB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1D;IAED,UAAiB,eAAe;QAC5B,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,MAAM,CAAC,EAAE,YAAY,CAAC;QACtB,KAAK,CAAC,EAAE,YAAY,CAAC;KACxB;IAED,UAAiB,YAAY;QACzB,IAAI,CAAC,EAAE,YAAY,CAAC;QACpB,EAAE,CAAC,EAAE,YAAY,CAAC;QAClB,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,MAAM,CAAC,EAAE,YAAY,CAAC;QACtB,WAAW,CAAC,EAAE,YAAY,CAAC;KAC9B;IAED,KAAY,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACzE,KAAY,YAAY,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IAElF;;OAEG;IACH,SAAgB,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAGhD;IAED;;OAEG;IACH,SAAgB,MAAM,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,CAM1D;IAED;;OAEG;IACH,SAAgB,MAAM,CAAC,GAAG,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAMvD;CACJ"}
@@ -10,17 +10,49 @@ var edit;
10
10
  return (container, paths) => container.exec(["sed", "-iz", script, ...paths]);
11
11
  }
12
12
  edit2.sed = sed;
13
- function lines(...edits) {
13
+ function insert(...edits) {
14
+ return async (Container, paths) => {
15
+ for (const path of paths) {
16
+ await insertLinesInto(Container, path, edits);
17
+ }
18
+ };
19
+ }
20
+ edit2.insert = insert;
21
+ function region(...edits) {
14
22
  return async (container, paths) => {
15
23
  for (const path of paths) {
16
- await editLinesOf(container, path, edits);
24
+ await editRegionsOf(container, path, edits);
17
25
  }
18
26
  };
19
27
  }
20
- edit2.lines = lines;
28
+ edit2.region = region;
21
29
  })(edit || (edit = {}));
22
- async function editLinesOf(container, path, edits) {
23
- const editors = editorsOf(edits);
30
+ async function insertLinesInto(container, path, edits) {
31
+ const editors = insertionEditorsOf(edits);
32
+ const input = (await container.read(path)).split("\n");
33
+ const output = Array();
34
+ for (const line of input) {
35
+ for (const editor of editors) {
36
+ if (editor.before?.(line)) {
37
+ output.push(...editor.lines(line));
38
+ }
39
+ output.push(line);
40
+ if (editor.after?.(line)) {
41
+ output.push(...editor.lines(line));
42
+ }
43
+ }
44
+ }
45
+ await container.write(path, output.join("\n"));
46
+ }
47
+ function insertionEditorsOf(edits) {
48
+ return edits.map(({ before, after, lines }) => ({
49
+ before: detectorOf(before),
50
+ after: detectorOf(after),
51
+ lines: replacementOf(lines)
52
+ }));
53
+ }
54
+ async function editRegionsOf(container, path, edits) {
55
+ const editors = regionEditorsOf(edits);
24
56
  let editor;
25
57
  const input = (await container.read(path)).split("\n");
26
58
  const output = Array();
@@ -43,7 +75,7 @@ async function editLinesOf(container, path, edits) {
43
75
  editor?.finish(output);
44
76
  await container.write(path, output.join("\n"));
45
77
  }
46
- function editorsOf(edits) {
78
+ function regionEditorsOf(edits) {
47
79
  return edits.map(({ from, to, after, before, replacement }) => {
48
80
  let collecting = from === void 0 && after === void 0;
49
81
  from = detectorOf(from);
@@ -68,13 +100,13 @@ function editorsOf(edits) {
68
100
  collect(line, output) {
69
101
  if (collecting) {
70
102
  if (to?.(line)) {
71
- output.push(...replacement(collected));
103
+ output.push(...replacement(...collected));
72
104
  collected.length = 0;
73
105
  collecting = false;
74
106
  return true;
75
107
  }
76
108
  if (before?.(line)) {
77
- output.push(...replacement(collected));
109
+ output.push(...replacement(...collected));
78
110
  collected.length = 0;
79
111
  collecting = false;
80
112
  return false;
@@ -85,7 +117,7 @@ function editorsOf(edits) {
85
117
  },
86
118
  finish(output) {
87
119
  if (collecting && to === void 0 && before === void 0) {
88
- output.push(...replacement(collected));
120
+ output.push(...replacement(...collected));
89
121
  }
90
122
  }
91
123
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/docker/edit.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["edit"]
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/testing",
3
- "version": "0.13.1-alpha.0-20250508-047aa0277",
3
+ "version": "0.13.1-alpha.0-20250511-74ef153aa",
4
4
  "description": "Test harness for running JavaScript and Matter certification tests",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -45,7 +45,7 @@
45
45
  "#tools/ansi-text": "@matter/tools/ansi-text"
46
46
  },
47
47
  "dependencies": {
48
- "@matter/tools": "0.13.1-alpha.0-20250508-047aa0277",
48
+ "@matter/tools": "0.13.1-alpha.0-20250511-74ef153aa",
49
49
  "@types/express": "^5.0.1",
50
50
  "ansi-colors": "^4.1.3",
51
51
  "chai": "^4.5.0",
@@ -17,7 +17,7 @@ export interface Test {
17
17
  path: string;
18
18
  descriptor: TestDescriptor;
19
19
  container: Container;
20
- edit(editor: edit.Editor): Promise<void>;
20
+ edit(...editors: edit.Editor[]): Promise<void>;
21
21
  initializeSubject(subject: Subject): Promise<void>;
22
22
  invoke(subject: Subject, step: (title: string) => void, args: string[]): Promise<void>;
23
23
  }
@@ -47,8 +47,10 @@ export abstract class BaseTest implements Test {
47
47
  return this.#container;
48
48
  }
49
49
 
50
- edit(editor: edit.Editor) {
51
- return this.#container.edit(editor, this.#descriptor.path);
50
+ async edit(...editors: edit.Editor[]) {
51
+ for (const editor of editors) {
52
+ await this.#container.edit(editor, this.#descriptor.path);
53
+ }
52
54
  }
53
55
 
54
56
  abstract initializeSubject(subject: Subject): Promise<void>;
@@ -14,16 +14,22 @@ export namespace edit {
14
14
  (container: Container, files: string[]): Promise<void>;
15
15
  }
16
16
 
17
- export interface LineEditor {
17
+ export interface InsertionEditor {
18
+ after?: LineDetector;
19
+ before?: LineDetector;
20
+ lines?: LineProducer;
21
+ }
22
+
23
+ export interface RegionEditor {
18
24
  from?: LineDetector;
19
25
  to?: LineDetector;
20
26
  after?: LineDetector;
21
27
  before?: LineDetector;
22
- replacement?: LineReplacement;
28
+ replacement?: LineProducer;
23
29
  }
24
30
 
25
31
  export type LineDetector = string | RegExp | ((line: string) => boolean);
26
- export type LineReplacement = string | string[] | ((lines: string[]) => string[]);
32
+ export type LineProducer = string | string[] | ((...lines: string[]) => string[]);
27
33
 
28
34
  /**
29
35
  * Modify a file using sed -iz.
@@ -33,13 +39,24 @@ export namespace edit {
33
39
  return (container, paths) => container.exec(["sed", "-iz", script, ...paths]);
34
40
  }
35
41
 
42
+ /**
43
+ * Insert lines before/after key lines.
44
+ */
45
+ export function insert(...edits: InsertionEditor[]): Editor {
46
+ return async (Container, paths) => {
47
+ for (const path of paths) {
48
+ await insertLinesInto(Container, path, edits);
49
+ }
50
+ };
51
+ }
52
+
36
53
  /**
37
54
  * Replace regions of a file demarcated by key lines.
38
55
  */
39
- export function lines(...edits: LineEditor[]): Editor {
56
+ export function region(...edits: RegionEditor[]): Editor {
40
57
  return async (container, paths) => {
41
58
  for (const path of paths) {
42
- await editLinesOf(container, path, edits);
59
+ await editRegionsOf(container, path, edits);
43
60
  }
44
61
  };
45
62
  }
@@ -51,8 +68,36 @@ interface CompiledLineEditor {
51
68
  finish(output: string[]): void;
52
69
  }
53
70
 
54
- async function editLinesOf(container: Container, path: string, edits: edit.LineEditor[]) {
55
- const editors = editorsOf(edits);
71
+ async function insertLinesInto(container: Container, path: string, edits: edit.InsertionEditor[]) {
72
+ const editors = insertionEditorsOf(edits);
73
+ const input = (await container.read(path)).split("\n");
74
+ const output = Array<string>();
75
+
76
+ for (const line of input) {
77
+ for (const editor of editors) {
78
+ if (editor.before?.(line)) {
79
+ output.push(...editor.lines(line));
80
+ }
81
+ output.push(line);
82
+ if (editor.after?.(line)) {
83
+ output.push(...editor.lines(line));
84
+ }
85
+ }
86
+ }
87
+
88
+ await container.write(path, output.join("\n"));
89
+ }
90
+
91
+ function insertionEditorsOf(edits: edit.InsertionEditor[]) {
92
+ return edits.map(({ before, after, lines }) => ({
93
+ before: detectorOf(before),
94
+ after: detectorOf(after),
95
+ lines: replacementOf(lines),
96
+ }));
97
+ }
98
+
99
+ async function editRegionsOf(container: Container, path: string, edits: edit.RegionEditor[]) {
100
+ const editors = regionEditorsOf(edits);
56
101
  let editor: CompiledLineEditor | undefined;
57
102
  const input = (await container.read(path)).split("\n");
58
103
  const output = Array<string>();
@@ -81,7 +126,7 @@ async function editLinesOf(container: Container, path: string, edits: edit.LineE
81
126
  await container.write(path, output.join("\n"));
82
127
  }
83
128
 
84
- function editorsOf(edits: edit.LineEditor[]): CompiledLineEditor[] {
129
+ function regionEditorsOf(edits: edit.RegionEditor[]): CompiledLineEditor[] {
85
130
  return edits.map(({ from, to, after, before, replacement }) => {
86
131
  // Start out in collecting state iff we have no detector that would start collection
87
132
  let collecting = from === undefined && after === undefined;
@@ -112,13 +157,13 @@ function editorsOf(edits: edit.LineEditor[]): CompiledLineEditor[] {
112
157
  collect(line: string, output: string[]) {
113
158
  if (collecting) {
114
159
  if (to?.(line)) {
115
- output.push(...replacement(collected));
160
+ output.push(...replacement(...collected));
116
161
  collected.length = 0;
117
162
  collecting = false;
118
163
  return true;
119
164
  }
120
165
  if (before?.(line)) {
121
- output.push(...replacement(collected));
166
+ output.push(...replacement(...collected));
122
167
  collected.length = 0;
123
168
  collecting = false;
124
169
  return false;
@@ -130,7 +175,7 @@ function editorsOf(edits: edit.LineEditor[]): CompiledLineEditor[] {
130
175
 
131
176
  finish(output: string[]) {
132
177
  if (collecting && to === undefined && before === undefined) {
133
- output.push(...replacement(collected));
178
+ output.push(...replacement(...collected));
134
179
  }
135
180
  },
136
181
  };
@@ -153,7 +198,7 @@ function detectorOf(detector?: edit.LineDetector) {
153
198
  return detector;
154
199
  }
155
200
 
156
- function replacementOf(replacement?: edit.LineReplacement): (lines: string[]) => string[] {
201
+ function replacementOf(replacement?: edit.LineProducer): (...lines: string[]) => string[] {
157
202
  if (replacement === undefined) {
158
203
  return () => [];
159
204
  }