@nx/devkit 0.0.0-pr-22179-271588f

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 (98) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +68 -0
  3. package/index.d.ts +14 -0
  4. package/index.js +18 -0
  5. package/migrations.json +18 -0
  6. package/ngcli-adapter.d.ts +4 -0
  7. package/ngcli-adapter.js +11 -0
  8. package/nx.d.ts +1 -0
  9. package/nx.js +19 -0
  10. package/package.json +50 -0
  11. package/public-api.d.ts +78 -0
  12. package/public-api.js +100 -0
  13. package/src/executors/parse-target-string.d.ts +44 -0
  14. package/src/executors/parse-target-string.js +55 -0
  15. package/src/executors/read-target-options.d.ts +8 -0
  16. package/src/executors/read-target-options.js +38 -0
  17. package/src/generators/add-build-target-defaults.d.ts +2 -0
  18. package/src/generators/add-build-target-defaults.js +18 -0
  19. package/src/generators/artifact-name-and-directory-utils.d.ts +48 -0
  20. package/src/generators/artifact-name-and-directory-utils.js +239 -0
  21. package/src/generators/executor-options-utils.d.ts +21 -0
  22. package/src/generators/executor-options-utils.js +49 -0
  23. package/src/generators/format-files.d.ts +6 -0
  24. package/src/generators/format-files.js +91 -0
  25. package/src/generators/generate-files.d.ts +26 -0
  26. package/src/generators/generate-files.js +91 -0
  27. package/src/generators/project-name-and-root-utils.d.ts +47 -0
  28. package/src/generators/project-name-and-root-utils.js +298 -0
  29. package/src/generators/run-tasks-in-serial.d.ts +7 -0
  30. package/src/generators/run-tasks-in-serial.js +16 -0
  31. package/src/generators/to-js.d.ts +11 -0
  32. package/src/generators/to-js.js +24 -0
  33. package/src/generators/typescript/insert-import.d.ts +1 -0
  34. package/src/generators/typescript/insert-import.js +5 -0
  35. package/src/generators/typescript/insert-statement.d.ts +1 -0
  36. package/src/generators/typescript/insert-statement.js +5 -0
  37. package/src/generators/update-ts-configs-to-js.d.ts +4 -0
  38. package/src/generators/update-ts-configs-to-js.js +49 -0
  39. package/src/generators/visit-not-ignored-files.d.ts +5 -0
  40. package/src/generators/visit-not-ignored-files.js +41 -0
  41. package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.d.ts +2 -0
  42. package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.js +9 -0
  43. package/src/migrations/update-16-9-0/migrate-mf-util-usage.d.ts +4 -0
  44. package/src/migrations/update-16-9-0/migrate-mf-util-usage.js +201 -0
  45. package/src/tasks/install-packages-task.d.ts +10 -0
  46. package/src/tasks/install-packages-task.js +41 -0
  47. package/src/utils/async-iterable/combine-async-iterables.d.ts +3 -0
  48. package/src/utils/async-iterable/combine-async-iterables.js +58 -0
  49. package/src/utils/async-iterable/create-async-iterable.d.ts +6 -0
  50. package/src/utils/async-iterable/create-async-iterable.js +58 -0
  51. package/src/utils/async-iterable/index.d.ts +4 -0
  52. package/src/utils/async-iterable/index.js +7 -0
  53. package/src/utils/async-iterable/map-async-iteratable.d.ts +1 -0
  54. package/src/utils/async-iterable/map-async-iteratable.js +18 -0
  55. package/src/utils/async-iterable/tap-async-iteratable.d.ts +1 -0
  56. package/src/utils/async-iterable/tap-async-iteratable.js +11 -0
  57. package/src/utils/binary-extensions.d.ts +1 -0
  58. package/src/utils/binary-extensions.js +275 -0
  59. package/src/utils/calculate-hash-for-create-nodes.d.ts +2 -0
  60. package/src/utils/calculate-hash-for-create-nodes.js +16 -0
  61. package/src/utils/config-utils.d.ts +4 -0
  62. package/src/utils/config-utils.js +75 -0
  63. package/src/utils/convert-nx-executor.d.ts +7 -0
  64. package/src/utils/convert-nx-executor.js +89 -0
  65. package/src/utils/get-named-inputs.d.ts +8 -0
  66. package/src/utils/get-named-inputs.js +26 -0
  67. package/src/utils/get-workspace-layout.d.ts +24 -0
  68. package/src/utils/get-workspace-layout.js +52 -0
  69. package/src/utils/invoke-nx-generator.d.ts +6 -0
  70. package/src/utils/invoke-nx-generator.js +172 -0
  71. package/src/utils/log-show-project-command.d.ts +1 -0
  72. package/src/utils/log-show-project-command.js +14 -0
  73. package/src/utils/move-dir.d.ts +5 -0
  74. package/src/utils/move-dir.js +28 -0
  75. package/src/utils/names.d.ts +18 -0
  76. package/src/utils/names.js +63 -0
  77. package/src/utils/offset-from-root.d.ts +13 -0
  78. package/src/utils/offset-from-root.js +29 -0
  79. package/src/utils/package-json.d.ts +78 -0
  80. package/src/utils/package-json.js +375 -0
  81. package/src/utils/replace-package.d.ts +2 -0
  82. package/src/utils/replace-package.js +125 -0
  83. package/src/utils/replace-project-configuration-with-plugin.d.ts +3 -0
  84. package/src/utils/replace-project-configuration-with-plugin.js +136 -0
  85. package/src/utils/rxjs-for-await.d.ts +109 -0
  86. package/src/utils/rxjs-for-await.js +363 -0
  87. package/src/utils/semver.d.ts +1 -0
  88. package/src/utils/semver.js +18 -0
  89. package/src/utils/string-change.d.ts +62 -0
  90. package/src/utils/string-change.js +109 -0
  91. package/src/utils/string-utils.d.ts +95 -0
  92. package/src/utils/string-utils.js +147 -0
  93. package/src/utils/update-package-scripts.d.ts +3 -0
  94. package/src/utils/update-package-scripts.js +175 -0
  95. package/src/utils/versions.d.ts +1 -0
  96. package/src/utils/versions.js +4 -0
  97. package/testing.d.ts +1 -0
  98. package/testing.js +5 -0
@@ -0,0 +1,109 @@
1
+ import type { Observable } from 'rxjs';
2
+ export declare class Deferred<T> {
3
+ resolve: (value: T | PromiseLike<T>) => void;
4
+ reject: (reason?: any) => void;
5
+ promise: Promise<T>;
6
+ }
7
+ /**
8
+ * Will subscribe to the `source` observable provided,
9
+ *
10
+ * Allowing a `for await..of` loop to iterate over every
11
+ * value that the source emits.
12
+ *
13
+ * **WARNING**: If the async loop is slower than the observable
14
+ * producing values, the values will build up in a buffer
15
+ * and you could experience an out of memory error.
16
+ *
17
+ * This is a lossless subscription method. No value
18
+ * will be missed or duplicated.
19
+ *
20
+ * Example usage:
21
+ *
22
+ * ```ts
23
+ * async function test() {
24
+ * const source$ = getSomeObservable();
25
+ *
26
+ * for await(const value of eachValueFrom(source$)) {
27
+ * console.log(value);
28
+ * }
29
+ * }
30
+ * ```
31
+ *
32
+ * @param source the Observable source to await values from
33
+ */
34
+ export declare function eachValueFrom<T>(source: Observable<T>): AsyncIterableIterator<T>;
35
+ /**
36
+ * Will subscribe to the `source` observable provided
37
+ * and build the emitted values up in a buffer. Allowing
38
+ * `for await..of` loops to iterate and get the buffer
39
+ * on each loop.
40
+ *
41
+ * This is a lossless subscription method. No value
42
+ * will be missed or duplicated.
43
+ *
44
+ * Example usage:
45
+ *
46
+ * ```ts
47
+ * async function test() {
48
+ * const source$ = getSomeObservable();
49
+ *
50
+ * for await(const buffer of bufferedValuesFrom(source$)) {
51
+ * for (const value of buffer) {
52
+ * console.log(value);
53
+ * }
54
+ * }
55
+ * }
56
+ * ```
57
+ *
58
+ * @param source the Observable source to await values from
59
+ */
60
+ export declare function bufferedValuesFrom<T>(source: Observable<T>): AsyncGenerator<T[]>;
61
+ /**
62
+ * Will subscribe to the provided `source` observable,
63
+ * allowing `for await..of` loops to iterate and get the
64
+ * most recent value that was emitted. Will not iterate out
65
+ * the same emission twice.
66
+ *
67
+ * This is a lossy subscription method. Do not use if
68
+ * every value is important.
69
+ *
70
+ * Example usage:
71
+ *
72
+ * ```ts
73
+ * async function test() {
74
+ * const source$ = getSomeObservable();
75
+ *
76
+ * for await(const value of latestValueFrom(source$)) {
77
+ * console.log(value);
78
+ * }
79
+ * }
80
+ * ```
81
+ *
82
+ * @param source the Observable source to await values from
83
+ */
84
+ export declare function latestValueFrom<T>(source: Observable<T>): AsyncGenerator<T>;
85
+ /**
86
+ * Subscribes to the provided `source` observable and allows
87
+ * `for await..of` loops to iterate over it, such that
88
+ * all values are dropped until the iteration occurs, then
89
+ * the very next value that arrives is provided to the
90
+ * `for await` loop.
91
+ *
92
+ * This is a lossy subscription method. Do not use if
93
+ * every value is important.
94
+ *
95
+ * Example usage:
96
+ *
97
+ * ```ts
98
+ * async function test() {
99
+ * const source$ = getSomeObservable();
100
+ *
101
+ * for await(const value of nextValueFrom(source$)) {
102
+ * console.log(value);
103
+ * }
104
+ * }
105
+ * ```
106
+ *
107
+ * @param source the Observable source to await values from
108
+ */
109
+ export declare function nextValueFrom<T>(source: Observable<T>): AsyncGenerator<T, void, void>;
@@ -0,0 +1,363 @@
1
+ "use strict";
2
+ // Remove this if https://github.com/benlesh/rxjs-for-await/issues/15 is addressed
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.nextValueFrom = exports.latestValueFrom = exports.bufferedValuesFrom = exports.eachValueFrom = exports.Deferred = void 0;
5
+ class Deferred {
6
+ constructor() {
7
+ this.resolve = null;
8
+ this.reject = null;
9
+ this.promise = new Promise((a, b) => {
10
+ this.resolve = a;
11
+ this.reject = b;
12
+ });
13
+ }
14
+ }
15
+ exports.Deferred = Deferred;
16
+ const RESOLVED = Promise.resolve();
17
+ /**
18
+ * Will subscribe to the `source` observable provided,
19
+ *
20
+ * Allowing a `for await..of` loop to iterate over every
21
+ * value that the source emits.
22
+ *
23
+ * **WARNING**: If the async loop is slower than the observable
24
+ * producing values, the values will build up in a buffer
25
+ * and you could experience an out of memory error.
26
+ *
27
+ * This is a lossless subscription method. No value
28
+ * will be missed or duplicated.
29
+ *
30
+ * Example usage:
31
+ *
32
+ * ```ts
33
+ * async function test() {
34
+ * const source$ = getSomeObservable();
35
+ *
36
+ * for await(const value of eachValueFrom(source$)) {
37
+ * console.log(value);
38
+ * }
39
+ * }
40
+ * ```
41
+ *
42
+ * @param source the Observable source to await values from
43
+ */
44
+ async function* eachValueFrom(source) {
45
+ const deferreds = [];
46
+ const values = [];
47
+ let hasError = false;
48
+ let error = null;
49
+ let completed = false;
50
+ const subs = source.subscribe({
51
+ next: (value) => {
52
+ if (deferreds.length > 0) {
53
+ deferreds.shift().resolve({ value, done: false });
54
+ }
55
+ else {
56
+ values.push(value);
57
+ }
58
+ },
59
+ error: (err) => {
60
+ hasError = true;
61
+ error = err;
62
+ while (deferreds.length > 0) {
63
+ deferreds.shift().reject(err);
64
+ }
65
+ },
66
+ complete: () => {
67
+ completed = true;
68
+ while (deferreds.length > 0) {
69
+ deferreds.shift().resolve({ value: undefined, done: true });
70
+ }
71
+ },
72
+ });
73
+ try {
74
+ while (true) {
75
+ if (values.length > 0) {
76
+ yield values.shift();
77
+ }
78
+ else if (completed) {
79
+ return;
80
+ }
81
+ else if (hasError) {
82
+ throw error;
83
+ }
84
+ else {
85
+ const d = new Deferred();
86
+ deferreds.push(d);
87
+ const result = await d.promise;
88
+ if (result.done) {
89
+ return;
90
+ }
91
+ else {
92
+ yield result.value;
93
+ }
94
+ }
95
+ }
96
+ }
97
+ catch (err) {
98
+ throw err;
99
+ }
100
+ finally {
101
+ subs.unsubscribe();
102
+ }
103
+ }
104
+ exports.eachValueFrom = eachValueFrom;
105
+ /**
106
+ * Will subscribe to the `source` observable provided
107
+ * and build the emitted values up in a buffer. Allowing
108
+ * `for await..of` loops to iterate and get the buffer
109
+ * on each loop.
110
+ *
111
+ * This is a lossless subscription method. No value
112
+ * will be missed or duplicated.
113
+ *
114
+ * Example usage:
115
+ *
116
+ * ```ts
117
+ * async function test() {
118
+ * const source$ = getSomeObservable();
119
+ *
120
+ * for await(const buffer of bufferedValuesFrom(source$)) {
121
+ * for (const value of buffer) {
122
+ * console.log(value);
123
+ * }
124
+ * }
125
+ * }
126
+ * ```
127
+ *
128
+ * @param source the Observable source to await values from
129
+ */
130
+ async function* bufferedValuesFrom(source) {
131
+ let deferred = null;
132
+ const buffer = [];
133
+ let hasError = false;
134
+ let error = null;
135
+ let completed = false;
136
+ const subs = source.subscribe({
137
+ next: (value) => {
138
+ if (deferred) {
139
+ deferred.resolve(RESOLVED.then(() => {
140
+ const bufferCopy = buffer.slice();
141
+ buffer.length = 0;
142
+ return { value: bufferCopy, done: false };
143
+ }));
144
+ deferred = null;
145
+ }
146
+ buffer.push(value);
147
+ },
148
+ error: (err) => {
149
+ hasError = true;
150
+ error = err;
151
+ if (deferred) {
152
+ deferred.reject(err);
153
+ deferred = null;
154
+ }
155
+ },
156
+ complete: () => {
157
+ completed = true;
158
+ if (deferred) {
159
+ deferred.resolve({ value: undefined, done: true });
160
+ deferred = null;
161
+ }
162
+ },
163
+ });
164
+ try {
165
+ while (true) {
166
+ if (buffer.length > 0) {
167
+ const bufferCopy = buffer.slice();
168
+ buffer.length = 0;
169
+ yield bufferCopy;
170
+ }
171
+ else if (completed) {
172
+ return;
173
+ }
174
+ else if (hasError) {
175
+ throw error;
176
+ }
177
+ else {
178
+ deferred = new Deferred();
179
+ const result = await deferred.promise;
180
+ if (result.done) {
181
+ return;
182
+ }
183
+ else {
184
+ yield result.value;
185
+ }
186
+ }
187
+ }
188
+ }
189
+ catch (err) {
190
+ throw err;
191
+ }
192
+ finally {
193
+ subs.unsubscribe();
194
+ }
195
+ }
196
+ exports.bufferedValuesFrom = bufferedValuesFrom;
197
+ /**
198
+ * Will subscribe to the provided `source` observable,
199
+ * allowing `for await..of` loops to iterate and get the
200
+ * most recent value that was emitted. Will not iterate out
201
+ * the same emission twice.
202
+ *
203
+ * This is a lossy subscription method. Do not use if
204
+ * every value is important.
205
+ *
206
+ * Example usage:
207
+ *
208
+ * ```ts
209
+ * async function test() {
210
+ * const source$ = getSomeObservable();
211
+ *
212
+ * for await(const value of latestValueFrom(source$)) {
213
+ * console.log(value);
214
+ * }
215
+ * }
216
+ * ```
217
+ *
218
+ * @param source the Observable source to await values from
219
+ */
220
+ async function* latestValueFrom(source) {
221
+ let deferred = undefined;
222
+ let latestValue;
223
+ let hasLatestValue = false;
224
+ let hasError = false;
225
+ let error = null;
226
+ let completed = false;
227
+ const subs = source.subscribe({
228
+ next: (value) => {
229
+ hasLatestValue = true;
230
+ latestValue = value;
231
+ if (deferred) {
232
+ deferred.resolve(RESOLVED.then(() => {
233
+ hasLatestValue = false;
234
+ return { value: latestValue, done: false };
235
+ }));
236
+ }
237
+ },
238
+ error: (err) => {
239
+ hasError = true;
240
+ error = err;
241
+ if (deferred) {
242
+ deferred.reject(err);
243
+ }
244
+ },
245
+ complete: () => {
246
+ completed = true;
247
+ if (deferred) {
248
+ hasLatestValue = false;
249
+ deferred.resolve({ value: undefined, done: true });
250
+ }
251
+ },
252
+ });
253
+ try {
254
+ while (true) {
255
+ if (hasLatestValue) {
256
+ await RESOLVED;
257
+ const value = latestValue;
258
+ hasLatestValue = false;
259
+ yield value;
260
+ }
261
+ else if (completed) {
262
+ return;
263
+ }
264
+ else if (hasError) {
265
+ throw error;
266
+ }
267
+ else {
268
+ deferred = new Deferred();
269
+ const result = await deferred.promise;
270
+ if (result.done) {
271
+ return;
272
+ }
273
+ else {
274
+ yield result.value;
275
+ }
276
+ }
277
+ }
278
+ }
279
+ catch (err) {
280
+ throw err;
281
+ }
282
+ finally {
283
+ subs.unsubscribe();
284
+ }
285
+ }
286
+ exports.latestValueFrom = latestValueFrom;
287
+ /**
288
+ * Subscribes to the provided `source` observable and allows
289
+ * `for await..of` loops to iterate over it, such that
290
+ * all values are dropped until the iteration occurs, then
291
+ * the very next value that arrives is provided to the
292
+ * `for await` loop.
293
+ *
294
+ * This is a lossy subscription method. Do not use if
295
+ * every value is important.
296
+ *
297
+ * Example usage:
298
+ *
299
+ * ```ts
300
+ * async function test() {
301
+ * const source$ = getSomeObservable();
302
+ *
303
+ * for await(const value of nextValueFrom(source$)) {
304
+ * console.log(value);
305
+ * }
306
+ * }
307
+ * ```
308
+ *
309
+ * @param source the Observable source to await values from
310
+ */
311
+ async function* nextValueFrom(source) {
312
+ let deferred = undefined;
313
+ let hasError = false;
314
+ let error = null;
315
+ let completed = false;
316
+ const subs = source.subscribe({
317
+ next: (value) => {
318
+ if (deferred) {
319
+ deferred.resolve({ value, done: false });
320
+ }
321
+ },
322
+ error: (err) => {
323
+ hasError = true;
324
+ error = err;
325
+ if (deferred) {
326
+ deferred.reject(err);
327
+ }
328
+ },
329
+ complete: () => {
330
+ completed = true;
331
+ if (deferred) {
332
+ deferred.resolve({ value: undefined, done: true });
333
+ }
334
+ },
335
+ });
336
+ try {
337
+ while (true) {
338
+ if (completed) {
339
+ return;
340
+ }
341
+ else if (hasError) {
342
+ throw error;
343
+ }
344
+ else {
345
+ deferred = new Deferred();
346
+ const result = await deferred.promise;
347
+ if (result.done) {
348
+ return;
349
+ }
350
+ else {
351
+ yield result.value;
352
+ }
353
+ }
354
+ }
355
+ }
356
+ catch (err) {
357
+ throw err;
358
+ }
359
+ finally {
360
+ subs.unsubscribe();
361
+ }
362
+ }
363
+ exports.nextValueFrom = nextValueFrom;
@@ -0,0 +1 @@
1
+ export declare function checkAndCleanWithSemver(pkgName: string, version: string): string;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkAndCleanWithSemver = void 0;
4
+ const semver_1 = require("semver");
5
+ function checkAndCleanWithSemver(pkgName, version) {
6
+ let newVersion = version;
7
+ if ((0, semver_1.valid)(newVersion)) {
8
+ return newVersion;
9
+ }
10
+ if (version.startsWith('~') || version.startsWith('^')) {
11
+ newVersion = version.substring(1);
12
+ }
13
+ if (!(0, semver_1.valid)(newVersion)) {
14
+ throw new Error(`The package.json lists a version of ${pkgName} that Nx is unable to validate - (${version})`);
15
+ }
16
+ return newVersion;
17
+ }
18
+ exports.checkAndCleanWithSemver = checkAndCleanWithSemver;
@@ -0,0 +1,62 @@
1
+ export declare enum ChangeType {
2
+ Delete = "Delete",
3
+ Insert = "Insert"
4
+ }
5
+ export interface StringDeletion {
6
+ type: ChangeType.Delete;
7
+ /**
8
+ * Place in the original text to start deleting characters
9
+ */
10
+ start: number;
11
+ /**
12
+ * Number of characters to delete
13
+ */
14
+ length: number;
15
+ }
16
+ export interface StringInsertion {
17
+ type: ChangeType.Insert;
18
+ /**
19
+ * Text to insert into the original text
20
+ */
21
+ text: string;
22
+ /**
23
+ * Place in the original text to insert new text
24
+ */
25
+ index: number;
26
+ }
27
+ /**
28
+ * A change to be made to a string
29
+ */
30
+ export type StringChange = StringInsertion | StringDeletion;
31
+ /**
32
+ * Applies a list of changes to a string's original value.
33
+ *
34
+ * This is useful when working with ASTs.
35
+ *
36
+ * For Example, to rename a property in a method's options:
37
+ *
38
+ * ```typescript
39
+ * const code = `bootstrap({
40
+ * target: document.querySelector('#app')
41
+ * })`;
42
+ *
43
+ * const indexOfPropertyName = 13; // Usually determined by analyzing an AST.
44
+ * const updatedCode = applyChangesToString(code, [
45
+ * {
46
+ * type: ChangeType.Insert,
47
+ * index: indexOfPropertyName,
48
+ * text: 'element'
49
+ * },
50
+ * {
51
+ * type: ChangeType.Delete,
52
+ * start: indexOfPropertyName,
53
+ * length: 6
54
+ * },
55
+ * ]);
56
+ *
57
+ * bootstrap({
58
+ * element: document.querySelector('#app')
59
+ * });
60
+ * ```
61
+ */
62
+ export declare function applyChangesToString(text: string, changes: StringChange[]): string;
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyChangesToString = exports.ChangeType = void 0;
4
+ var ChangeType;
5
+ (function (ChangeType) {
6
+ ChangeType["Delete"] = "Delete";
7
+ ChangeType["Insert"] = "Insert";
8
+ })(ChangeType || (exports.ChangeType = ChangeType = {}));
9
+ /**
10
+ * Applies a list of changes to a string's original value.
11
+ *
12
+ * This is useful when working with ASTs.
13
+ *
14
+ * For Example, to rename a property in a method's options:
15
+ *
16
+ * ```typescript
17
+ * const code = `bootstrap({
18
+ * target: document.querySelector('#app')
19
+ * })`;
20
+ *
21
+ * const indexOfPropertyName = 13; // Usually determined by analyzing an AST.
22
+ * const updatedCode = applyChangesToString(code, [
23
+ * {
24
+ * type: ChangeType.Insert,
25
+ * index: indexOfPropertyName,
26
+ * text: 'element'
27
+ * },
28
+ * {
29
+ * type: ChangeType.Delete,
30
+ * start: indexOfPropertyName,
31
+ * length: 6
32
+ * },
33
+ * ]);
34
+ *
35
+ * bootstrap({
36
+ * element: document.querySelector('#app')
37
+ * });
38
+ * ```
39
+ */
40
+ function applyChangesToString(text, changes) {
41
+ assertChangesValid(changes);
42
+ const sortedChanges = changes.sort((a, b) => {
43
+ const diff = getChangeIndex(a) - getChangeIndex(b);
44
+ if (diff === 0) {
45
+ if (a.type === b.type) {
46
+ return 0;
47
+ }
48
+ else {
49
+ // When at the same place, Insert before Delete
50
+ return isStringInsertion(a) ? -1 : 1;
51
+ }
52
+ }
53
+ return diff;
54
+ });
55
+ let offset = 0;
56
+ for (const change of sortedChanges) {
57
+ const index = getChangeIndex(change) + offset;
58
+ if (isStringInsertion(change)) {
59
+ text = text.slice(0, index) + change.text + text.slice(index);
60
+ offset += change.text.length;
61
+ }
62
+ else {
63
+ text = text.slice(0, index) + text.slice(index + change.length);
64
+ offset -= change.length;
65
+ }
66
+ }
67
+ return text;
68
+ }
69
+ exports.applyChangesToString = applyChangesToString;
70
+ function assertChangesValid(changes) {
71
+ for (const change of changes) {
72
+ if (isStringInsertion(change)) {
73
+ if (!Number.isInteger(change.index)) {
74
+ throw new TypeError(`${change.index} must be an integer.`);
75
+ }
76
+ if (change.index < 0) {
77
+ throw new Error(`${change.index} must be a positive integer.`);
78
+ }
79
+ if (typeof change.text !== 'string') {
80
+ throw new Error(`${change.text} must be a string.`);
81
+ }
82
+ }
83
+ else {
84
+ if (!Number.isInteger(change.start)) {
85
+ throw new TypeError(`${change.start} must be an integer.`);
86
+ }
87
+ if (change.start < 0) {
88
+ throw new Error(`${change.start} must be a positive integer.`);
89
+ }
90
+ if (!Number.isInteger(change.length)) {
91
+ throw new TypeError(`${change.length} must be an integer.`);
92
+ }
93
+ if (change.length < 0) {
94
+ throw new Error(`${change.length} must be a positive integer.`);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ function getChangeIndex(change) {
100
+ if (isStringInsertion(change)) {
101
+ return change.index;
102
+ }
103
+ else {
104
+ return change.start;
105
+ }
106
+ }
107
+ function isStringInsertion(change) {
108
+ return change.type === ChangeType.Insert;
109
+ }