@netlify/plugin-nextjs 4.40.1 → 4.40.2

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 (161) hide show
  1. package/lib/helpers/edge.js +1 -0
  2. package/lib/templates/vendor.js +20 -0
  3. package/package.json +7 -4
  4. package/src/templates/edge/next-dev.js +3 -3
  5. package/src/templates/edge/shims.js +6 -6
  6. package/src/templates/edge-shared/next-utils.ts +3 -3
  7. package/src/templates/edge-shared/utils.ts +1 -1
  8. package/src/templates/vendor/deno.land/std@0.134.0/fmt/colors.ts +536 -0
  9. package/src/templates/vendor/deno.land/std@0.134.0/testing/_diff.ts +360 -0
  10. package/src/templates/vendor/deno.land/std@0.134.0/testing/asserts.ts +866 -0
  11. package/src/templates/vendor/deno.land/std@0.175.0/_util/asserts.ts +25 -0
  12. package/src/templates/vendor/deno.land/std@0.175.0/_util/os.ts +23 -0
  13. package/src/templates/vendor/deno.land/std@0.175.0/async/abortable.ts +149 -0
  14. package/src/templates/vendor/deno.land/std@0.175.0/async/deadline.ts +30 -0
  15. package/src/templates/vendor/deno.land/std@0.175.0/async/debounce.ts +79 -0
  16. package/src/templates/vendor/deno.land/std@0.175.0/async/deferred.ts +48 -0
  17. package/src/templates/vendor/deno.land/std@0.175.0/async/delay.ts +67 -0
  18. package/src/templates/vendor/deno.land/std@0.175.0/async/mod.ts +18 -0
  19. package/src/templates/vendor/deno.land/std@0.175.0/async/mux_async_iterator.ts +97 -0
  20. package/src/templates/vendor/deno.land/std@0.175.0/async/pool.ts +95 -0
  21. package/src/templates/vendor/deno.land/std@0.175.0/async/retry.ts +81 -0
  22. package/src/templates/vendor/deno.land/std@0.175.0/async/tee.ts +100 -0
  23. package/src/templates/vendor/deno.land/std@0.175.0/bytes/index_of_needle.ts +49 -0
  24. package/src/templates/vendor/deno.land/std@0.175.0/crypto/timing_safe_equal.ts +29 -0
  25. package/src/templates/vendor/deno.land/std@0.175.0/datetime/to_imf.ts +45 -0
  26. package/src/templates/vendor/deno.land/std@0.175.0/encoding/base64.ts +144 -0
  27. package/src/templates/vendor/deno.land/std@0.175.0/encoding/base64url.ts +70 -0
  28. package/src/templates/vendor/deno.land/std@0.175.0/flags/mod.ts +785 -0
  29. package/src/templates/vendor/deno.land/std@0.175.0/fmt/colors.ts +569 -0
  30. package/src/templates/vendor/deno.land/std@0.175.0/fmt/printf.ts +939 -0
  31. package/src/templates/vendor/deno.land/std@0.175.0/http/cookie.ts +403 -0
  32. package/src/templates/vendor/deno.land/std@0.175.0/node/_core.ts +77 -0
  33. package/src/templates/vendor/deno.land/std@0.175.0/node/_events.d.ts +848 -0
  34. package/src/templates/vendor/deno.land/std@0.175.0/node/_events.mjs +1033 -0
  35. package/src/templates/vendor/deno.land/std@0.175.0/node/_global.d.ts +66 -0
  36. package/src/templates/vendor/deno.land/std@0.175.0/node/_next_tick.ts +173 -0
  37. package/src/templates/vendor/deno.land/std@0.175.0/node/_process/exiting.ts +4 -0
  38. package/src/templates/vendor/deno.land/std@0.175.0/node/_process/process.ts +131 -0
  39. package/src/templates/vendor/deno.land/std@0.175.0/node/_process/stdio.mjs +7 -0
  40. package/src/templates/vendor/deno.land/std@0.175.0/node/_process/streams.mjs +146 -0
  41. package/src/templates/vendor/deno.land/std@0.175.0/node/_stream.d.ts +1488 -0
  42. package/src/templates/vendor/deno.land/std@0.175.0/node/_stream.mjs +746 -0
  43. package/src/templates/vendor/deno.land/std@0.175.0/node/_util/_util_callbackify.ts +129 -0
  44. package/src/templates/vendor/deno.land/std@0.175.0/node/_utils.ts +206 -0
  45. package/src/templates/vendor/deno.land/std@0.175.0/node/assert.ts +940 -0
  46. package/src/templates/vendor/deno.land/std@0.175.0/node/assertion_error.ts +579 -0
  47. package/src/templates/vendor/deno.land/std@0.175.0/node/async_hooks.ts +331 -0
  48. package/src/templates/vendor/deno.land/std@0.175.0/node/buffer.ts +13 -0
  49. package/src/templates/vendor/deno.land/std@0.175.0/node/events.ts +14 -0
  50. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/buffer.d.ts +2074 -0
  51. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/buffer.mjs +2607 -0
  52. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/crypto/_keys.ts +16 -0
  53. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/crypto/constants.ts +5 -0
  54. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/error_codes.ts +7 -0
  55. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/errors.ts +2867 -0
  56. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/fixed_queue.ts +123 -0
  57. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/hide_stack_frames.ts +16 -0
  58. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/net.ts +95 -0
  59. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/normalize_encoding.mjs +72 -0
  60. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/options.ts +45 -0
  61. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/primordials.mjs +30 -0
  62. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/process/per_thread.mjs +272 -0
  63. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/readline/callbacks.mjs +137 -0
  64. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/readline/utils.mjs +580 -0
  65. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/streams/destroy.mjs +320 -0
  66. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/streams/end-of-stream.mjs +229 -0
  67. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/streams/utils.mjs +242 -0
  68. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/util/comparisons.ts +669 -0
  69. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/util/debuglog.ts +118 -0
  70. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/util/inspect.mjs +2237 -0
  71. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/util/types.ts +113 -0
  72. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/util.mjs +143 -0
  73. package/src/templates/vendor/deno.land/std@0.175.0/node/internal/validators.mjs +317 -0
  74. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_libuv_winerror.ts +229 -0
  75. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_listen.ts +16 -0
  76. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_node.ts +18 -0
  77. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_timingSafeEqual.ts +12 -0
  78. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_utils.ts +86 -0
  79. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_winerror.ts +16873 -0
  80. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/ares.ts +66 -0
  81. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/async_wrap.ts +152 -0
  82. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/buffer.ts +130 -0
  83. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/cares_wrap.ts +541 -0
  84. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/config.ts +3 -0
  85. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/connection_wrap.ts +80 -0
  86. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/constants.ts +900 -0
  87. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/contextify.ts +3 -0
  88. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/credentials.ts +3 -0
  89. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/crypto.ts +14 -0
  90. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/errors.ts +3 -0
  91. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/fs.ts +3 -0
  92. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/fs_dir.ts +3 -0
  93. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/fs_event_wrap.ts +3 -0
  94. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/handle_wrap.ts +50 -0
  95. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/heap_utils.ts +3 -0
  96. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/http_parser.ts +3 -0
  97. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/icu.ts +3 -0
  98. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/inspector.ts +3 -0
  99. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/js_stream.ts +3 -0
  100. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/messaging.ts +3 -0
  101. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/mod.ts +108 -0
  102. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/module_wrap.ts +3 -0
  103. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/native_module.ts +3 -0
  104. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/natives.ts +3 -0
  105. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/node_file.ts +84 -0
  106. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/node_options.ts +39 -0
  107. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/options.ts +3 -0
  108. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/os.ts +3 -0
  109. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/performance.ts +3 -0
  110. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/pipe_wrap.ts +392 -0
  111. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/process_methods.ts +3 -0
  112. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/report.ts +3 -0
  113. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/serdes.ts +3 -0
  114. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/signal_wrap.ts +3 -0
  115. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/spawn_sync.ts +3 -0
  116. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/stream_wrap.ts +354 -0
  117. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/string_decoder.ts +15 -0
  118. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/symbols.ts +27 -0
  119. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/task_queue.ts +3 -0
  120. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/tcp_wrap.ts +488 -0
  121. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/timers.ts +3 -0
  122. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/tls_wrap.ts +3 -0
  123. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/trace_events.ts +3 -0
  124. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/tty_wrap.ts +3 -0
  125. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/types.ts +186 -0
  126. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/udp_wrap.ts +496 -0
  127. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/url.ts +3 -0
  128. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/util.ts +126 -0
  129. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/uv.ts +437 -0
  130. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/v8.ts +3 -0
  131. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/worker.ts +3 -0
  132. package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/zlib.ts +3 -0
  133. package/src/templates/vendor/deno.land/std@0.175.0/node/process.ts +705 -0
  134. package/src/templates/vendor/deno.land/std@0.175.0/node/stream.ts +37 -0
  135. package/src/templates/vendor/deno.land/std@0.175.0/node/string_decoder.ts +337 -0
  136. package/src/templates/vendor/deno.land/std@0.175.0/node/util/types.ts +4 -0
  137. package/src/templates/vendor/deno.land/std@0.175.0/node/util.ts +289 -0
  138. package/src/templates/vendor/deno.land/std@0.175.0/path/_constants.ts +49 -0
  139. package/src/templates/vendor/deno.land/std@0.175.0/path/_interface.ts +30 -0
  140. package/src/templates/vendor/deno.land/std@0.175.0/path/_util.ts +194 -0
  141. package/src/templates/vendor/deno.land/std@0.175.0/path/common.ts +40 -0
  142. package/src/templates/vendor/deno.land/std@0.175.0/path/glob.ts +418 -0
  143. package/src/templates/vendor/deno.land/std@0.175.0/path/mod.ts +53 -0
  144. package/src/templates/vendor/deno.land/std@0.175.0/path/posix.ts +487 -0
  145. package/src/templates/vendor/deno.land/std@0.175.0/path/separator.ts +7 -0
  146. package/src/templates/vendor/deno.land/std@0.175.0/path/win32.ts +962 -0
  147. package/src/templates/vendor/deno.land/std@0.175.0/streams/write_all.ts +64 -0
  148. package/src/templates/vendor/deno.land/std@0.175.0/testing/_diff.ts +440 -0
  149. package/src/templates/vendor/deno.land/std@0.175.0/testing/_format.ts +23 -0
  150. package/src/templates/vendor/deno.land/std@0.175.0/testing/asserts.ts +906 -0
  151. package/src/templates/vendor/deno.land/std@0.175.0/types.d.ts +89 -0
  152. package/src/templates/vendor/deno.land/x/html_rewriter@v0.1.0-pre.17/index.ts +133 -0
  153. package/src/templates/vendor/deno.land/x/html_rewriter@v0.1.0-pre.17/vendor/asyncify.js +112 -0
  154. package/src/templates/vendor/deno.land/x/html_rewriter@v0.1.0-pre.17/vendor/html_rewriter.d.ts +88 -0
  155. package/src/templates/vendor/deno.land/x/html_rewriter@v0.1.0-pre.17/vendor/html_rewriter.js +974 -0
  156. package/src/templates/vendor/deno.land/x/path_to_regexp@v6.2.1/index.ts +621 -0
  157. package/src/templates/vendor/esm.sh/v91/next@12.2.5/deno/dist/compiled/cookie.js +13 -0
  158. package/src/templates/vendor/esm.sh/v91/next@12.2.5/deno/dist/server/web/spec-extension/request.js +12 -0
  159. package/src/templates/vendor/esm.sh/v91/next@12.2.5/deno/dist/server/web/spec-extension/response.js +5 -0
  160. package/src/templates/vendor/import_map.json +13 -0
  161. package/src/templates/vendor/raw.githubusercontent.com/worker-tools/resolvable-promise/master/index.ts +50 -0
@@ -0,0 +1,360 @@
1
+ // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
2
+ // This module is browser compatible.
3
+
4
+ interface FarthestPoint {
5
+ y: number;
6
+ id: number;
7
+ }
8
+
9
+ export enum DiffType {
10
+ removed = "removed",
11
+ common = "common",
12
+ added = "added",
13
+ }
14
+
15
+ export interface DiffResult<T> {
16
+ type: DiffType;
17
+ value: T;
18
+ details?: Array<DiffResult<T>>;
19
+ }
20
+
21
+ const REMOVED = 1;
22
+ const COMMON = 2;
23
+ const ADDED = 3;
24
+
25
+ function createCommon<T>(A: T[], B: T[], reverse?: boolean): T[] {
26
+ const common = [];
27
+ if (A.length === 0 || B.length === 0) return [];
28
+ for (let i = 0; i < Math.min(A.length, B.length); i += 1) {
29
+ if (
30
+ A[reverse ? A.length - i - 1 : i] === B[reverse ? B.length - i - 1 : i]
31
+ ) {
32
+ common.push(A[reverse ? A.length - i - 1 : i]);
33
+ } else {
34
+ return common;
35
+ }
36
+ }
37
+ return common;
38
+ }
39
+
40
+ /**
41
+ * Renders the differences between the actual and expected values
42
+ * @param A Actual value
43
+ * @param B Expected value
44
+ */
45
+ export function diff<T>(A: T[], B: T[]): Array<DiffResult<T>> {
46
+ const prefixCommon = createCommon(A, B);
47
+ const suffixCommon = createCommon(
48
+ A.slice(prefixCommon.length),
49
+ B.slice(prefixCommon.length),
50
+ true,
51
+ ).reverse();
52
+ A = suffixCommon.length
53
+ ? A.slice(prefixCommon.length, -suffixCommon.length)
54
+ : A.slice(prefixCommon.length);
55
+ B = suffixCommon.length
56
+ ? B.slice(prefixCommon.length, -suffixCommon.length)
57
+ : B.slice(prefixCommon.length);
58
+ const swapped = B.length > A.length;
59
+ [A, B] = swapped ? [B, A] : [A, B];
60
+ const M = A.length;
61
+ const N = B.length;
62
+ if (!M && !N && !suffixCommon.length && !prefixCommon.length) return [];
63
+ if (!N) {
64
+ return [
65
+ ...prefixCommon.map(
66
+ (c): DiffResult<typeof c> => ({ type: DiffType.common, value: c }),
67
+ ),
68
+ ...A.map(
69
+ (a): DiffResult<typeof a> => ({
70
+ type: swapped ? DiffType.added : DiffType.removed,
71
+ value: a,
72
+ }),
73
+ ),
74
+ ...suffixCommon.map(
75
+ (c): DiffResult<typeof c> => ({ type: DiffType.common, value: c }),
76
+ ),
77
+ ];
78
+ }
79
+ const offset = N;
80
+ const delta = M - N;
81
+ const size = M + N + 1;
82
+ const fp: FarthestPoint[] = Array.from(
83
+ { length: size },
84
+ () => ({ y: -1, id: -1 }),
85
+ );
86
+ /**
87
+ * INFO:
88
+ * This buffer is used to save memory and improve performance.
89
+ * The first half is used to save route and last half is used to save diff
90
+ * type.
91
+ * This is because, when I kept new uint8array area to save type,performance
92
+ * worsened.
93
+ */
94
+ const routes = new Uint32Array((M * N + size + 1) * 2);
95
+ const diffTypesPtrOffset = routes.length / 2;
96
+ let ptr = 0;
97
+ let p = -1;
98
+
99
+ function backTrace<T>(
100
+ A: T[],
101
+ B: T[],
102
+ current: FarthestPoint,
103
+ swapped: boolean,
104
+ ): Array<{
105
+ type: DiffType;
106
+ value: T;
107
+ }> {
108
+ const M = A.length;
109
+ const N = B.length;
110
+ const result = [];
111
+ let a = M - 1;
112
+ let b = N - 1;
113
+ let j = routes[current.id];
114
+ let type = routes[current.id + diffTypesPtrOffset];
115
+ while (true) {
116
+ if (!j && !type) break;
117
+ const prev = j;
118
+ if (type === REMOVED) {
119
+ result.unshift({
120
+ type: swapped ? DiffType.removed : DiffType.added,
121
+ value: B[b],
122
+ });
123
+ b -= 1;
124
+ } else if (type === ADDED) {
125
+ result.unshift({
126
+ type: swapped ? DiffType.added : DiffType.removed,
127
+ value: A[a],
128
+ });
129
+ a -= 1;
130
+ } else {
131
+ result.unshift({ type: DiffType.common, value: A[a] });
132
+ a -= 1;
133
+ b -= 1;
134
+ }
135
+ j = routes[prev];
136
+ type = routes[prev + diffTypesPtrOffset];
137
+ }
138
+ return result;
139
+ }
140
+
141
+ function createFP(
142
+ slide: FarthestPoint,
143
+ down: FarthestPoint,
144
+ k: number,
145
+ M: number,
146
+ ): FarthestPoint {
147
+ if (slide && slide.y === -1 && down && down.y === -1) {
148
+ return { y: 0, id: 0 };
149
+ }
150
+ if (
151
+ (down && down.y === -1) ||
152
+ k === M ||
153
+ (slide && slide.y) > (down && down.y) + 1
154
+ ) {
155
+ const prev = slide.id;
156
+ ptr++;
157
+ routes[ptr] = prev;
158
+ routes[ptr + diffTypesPtrOffset] = ADDED;
159
+ return { y: slide.y, id: ptr };
160
+ } else {
161
+ const prev = down.id;
162
+ ptr++;
163
+ routes[ptr] = prev;
164
+ routes[ptr + diffTypesPtrOffset] = REMOVED;
165
+ return { y: down.y + 1, id: ptr };
166
+ }
167
+ }
168
+
169
+ function snake<T>(
170
+ k: number,
171
+ slide: FarthestPoint,
172
+ down: FarthestPoint,
173
+ _offset: number,
174
+ A: T[],
175
+ B: T[],
176
+ ): FarthestPoint {
177
+ const M = A.length;
178
+ const N = B.length;
179
+ if (k < -N || M < k) return { y: -1, id: -1 };
180
+ const fp = createFP(slide, down, k, M);
181
+ while (fp.y + k < M && fp.y < N && A[fp.y + k] === B[fp.y]) {
182
+ const prev = fp.id;
183
+ ptr++;
184
+ fp.id = ptr;
185
+ fp.y += 1;
186
+ routes[ptr] = prev;
187
+ routes[ptr + diffTypesPtrOffset] = COMMON;
188
+ }
189
+ return fp;
190
+ }
191
+
192
+ while (fp[delta + offset].y < N) {
193
+ p = p + 1;
194
+ for (let k = -p; k < delta; ++k) {
195
+ fp[k + offset] = snake(
196
+ k,
197
+ fp[k - 1 + offset],
198
+ fp[k + 1 + offset],
199
+ offset,
200
+ A,
201
+ B,
202
+ );
203
+ }
204
+ for (let k = delta + p; k > delta; --k) {
205
+ fp[k + offset] = snake(
206
+ k,
207
+ fp[k - 1 + offset],
208
+ fp[k + 1 + offset],
209
+ offset,
210
+ A,
211
+ B,
212
+ );
213
+ }
214
+ fp[delta + offset] = snake(
215
+ delta,
216
+ fp[delta - 1 + offset],
217
+ fp[delta + 1 + offset],
218
+ offset,
219
+ A,
220
+ B,
221
+ );
222
+ }
223
+ return [
224
+ ...prefixCommon.map(
225
+ (c): DiffResult<typeof c> => ({ type: DiffType.common, value: c }),
226
+ ),
227
+ ...backTrace(A, B, fp[delta + offset], swapped),
228
+ ...suffixCommon.map(
229
+ (c): DiffResult<typeof c> => ({ type: DiffType.common, value: c }),
230
+ ),
231
+ ];
232
+ }
233
+
234
+ /**
235
+ * Renders the differences between the actual and expected strings
236
+ * Partially inspired from https://github.com/kpdecker/jsdiff
237
+ * @param A Actual string
238
+ * @param B Expected string
239
+ */
240
+ export function diffstr(A: string, B: string) {
241
+ function unescape(string: string): string {
242
+ // unescape invisible characters.
243
+ // ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#escape_sequences
244
+ return string
245
+ .replaceAll("\b", "\\b")
246
+ .replaceAll("\f", "\\f")
247
+ .replaceAll("\t", "\\t")
248
+ .replaceAll("\v", "\\v")
249
+ .replaceAll( // does not remove line breaks
250
+ /\r\n|\r|\n/g,
251
+ (str) => str === "\r" ? "\\r" : str === "\n" ? "\\n\n" : "\\r\\n\r\n",
252
+ );
253
+ }
254
+
255
+ function tokenize(string: string, { wordDiff = false } = {}): string[] {
256
+ if (wordDiff) {
257
+ // Split string on whitespace symbols
258
+ const tokens = string.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/);
259
+ // Extended Latin character set
260
+ const words =
261
+ /^[a-zA-Z\u{C0}-\u{FF}\u{D8}-\u{F6}\u{F8}-\u{2C6}\u{2C8}-\u{2D7}\u{2DE}-\u{2FF}\u{1E00}-\u{1EFF}]+$/u;
262
+
263
+ // Join boundary splits that we do not consider to be boundaries and merge empty strings surrounded by word chars
264
+ for (let i = 0; i < tokens.length - 1; i++) {
265
+ if (
266
+ !tokens[i + 1] && tokens[i + 2] && words.test(tokens[i]) &&
267
+ words.test(tokens[i + 2])
268
+ ) {
269
+ tokens[i] += tokens[i + 2];
270
+ tokens.splice(i + 1, 2);
271
+ i--;
272
+ }
273
+ }
274
+ return tokens.filter((token) => token);
275
+ } else {
276
+ // Split string on new lines symbols
277
+ const tokens = [], lines = string.split(/(\n|\r\n)/);
278
+
279
+ // Ignore final empty token when text ends with a newline
280
+ if (!lines[lines.length - 1]) {
281
+ lines.pop();
282
+ }
283
+
284
+ // Merge the content and line separators into single tokens
285
+ for (let i = 0; i < lines.length; i++) {
286
+ if (i % 2) {
287
+ tokens[tokens.length - 1] += lines[i];
288
+ } else {
289
+ tokens.push(lines[i]);
290
+ }
291
+ }
292
+ return tokens;
293
+ }
294
+ }
295
+
296
+ // Create details by filtering relevant word-diff for current line
297
+ // and merge "space-diff" if surrounded by word-diff for cleaner displays
298
+ function createDetails(
299
+ line: DiffResult<string>,
300
+ tokens: Array<DiffResult<string>>,
301
+ ) {
302
+ return tokens.filter(({ type }) =>
303
+ type === line.type || type === DiffType.common
304
+ ).map((result, i, t) => {
305
+ if (
306
+ (result.type === DiffType.common) && (t[i - 1]) &&
307
+ (t[i - 1]?.type === t[i + 1]?.type) && /\s+/.test(result.value)
308
+ ) {
309
+ result.type = t[i - 1].type;
310
+ }
311
+ return result;
312
+ });
313
+ }
314
+
315
+ // Compute multi-line diff
316
+ const diffResult = diff(
317
+ tokenize(`${unescape(A)}\n`),
318
+ tokenize(`${unescape(B)}\n`),
319
+ );
320
+
321
+ const added = [], removed = [];
322
+ for (const result of diffResult) {
323
+ if (result.type === DiffType.added) {
324
+ added.push(result);
325
+ }
326
+ if (result.type === DiffType.removed) {
327
+ removed.push(result);
328
+ }
329
+ }
330
+
331
+ // Compute word-diff
332
+ const aLines = added.length < removed.length ? added : removed;
333
+ const bLines = aLines === removed ? added : removed;
334
+ for (const a of aLines) {
335
+ let tokens = [] as Array<DiffResult<string>>,
336
+ b: undefined | DiffResult<string>;
337
+ // Search another diff line with at least one common token
338
+ while (bLines.length) {
339
+ b = bLines.shift();
340
+ tokens = diff(
341
+ tokenize(a.value, { wordDiff: true }),
342
+ tokenize(b?.value ?? "", { wordDiff: true }),
343
+ );
344
+ if (
345
+ tokens.some(({ type, value }) =>
346
+ type === DiffType.common && value.trim().length
347
+ )
348
+ ) {
349
+ break;
350
+ }
351
+ }
352
+ // Register word-diff details
353
+ a.details = createDetails(a, tokens);
354
+ if (b) {
355
+ b.details = createDetails(b, tokens);
356
+ }
357
+ }
358
+
359
+ return diffResult;
360
+ }