forked from ts-defold/types
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpatch.mjs
243 lines (232 loc) · 6.96 KB
/
patch.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
// @ts-check
/**
* Automatically make opinionated changes to the output of `type-gen`.
* Uses arrays of data pairs ['findThis', 'replaceWithThis']
* Ultimately uses `String.replace`, which accepts either strings or regex.
*/
import * as fs from 'fs';
import { earlyChanges } from './patches/_earlyChanges.mjs';
import { socket } from './patches/socket.mjs';
import { b2d } from './patches/b2d.mjs';
import { b2dBody } from './patches/b2d.body.mjs';
import { go } from './patches/go.mjs';
import { gui } from './patches/gui.mjs';
import { physics } from './patches/physics.mjs';
import { profiler } from './patches/profiler.mjs';
import { render } from './patches/render.mjs';
import { crash } from './patches/crash.mjs';
import { resource } from './patches/resource.mjs';
import { sys } from './patches/sys.mjs';
import { windowChanges } from './patches/window.mjs';
import { bufferChanges } from './patches/buffer.mjs';
import { html5 } from './patches/html5.mjs';
import { http } from './patches/http.mjs';
import { image } from './patches/image.mjs';
import { jsonChanges } from './patches/json.mjs';
import { msg } from './patches/msg.mjs';
import { timer } from './patches/timer.mjs';
import { vmathChanges } from './patches/vmath.mjs';
import { zlib } from './patches/zlib.mjs';
import { camera } from './patches/camera.mjs';
import { collectionFactory } from './patches/collectionFactory.mjs';
import { collectionProxy } from './patches/collectionProxy.mjs';
import { factory } from './patches/factory.mjs';
import { label } from './patches/label.mjs';
import { liveupdate } from './patches/liveupdate.mjs';
import { model } from './patches/model.mjs';
import { particleFx } from './patches/particleFx.mjs';
import { sound } from './patches/sound.mjs';
import { sprite } from './patches/sprite.mjs';
import { types } from './patches/types.mjs';
import { graphics } from './patches/graphics.mjs';
import { tilemap } from './patches/tilemap.mjs';
import { finalChanges } from './patches/_finalChanges.mjs';
import { getApiDocLinks } from './patches/_getApiDocLinks.mjs';
const patches = [
// The following are in order of appearance in the final definitions file
{
regex: /(declare namespace socket {)([\s\S]*?)(declare namespace)/s,
replacements: socket,
},
{
regex: /(declare namespace b2d {)([\s\S]*?)(declare namespace)/s,
replacements: b2d,
},
{
regex: /(declare namespace b2d.body {)([\s\S]*?)(declare namespace)/s,
replacements: b2dBody,
},
{
regex: /(declare namespace crash {)([\s\S]*?)(declare namespace)/s,
replacements: crash,
},
{
regex: /(declare namespace go {)([\s\S]*?)(declare namespace)/s,
replacements: go,
},
{
regex: /(declare namespace gui {)([\s\S]*?)(declare namespace)/s,
replacements: gui,
},
{
regex: /(declare namespace physics {)([\s\S]*?)(declare namespace)/s,
replacements: physics,
},
{
regex: /(declare namespace profiler {)([\s\S]*?)(declare namespace)/s,
replacements: profiler,
},
{
regex: /(declare namespace render {)([\s\S]*?)(declare namespace)/s,
replacements: render,
},
{
regex: /(declare namespace resource {)([\s\S]*?)(declare namespace)/s,
replacements: resource,
},
{
regex: /(declare namespace sys {)([\s\S]*?)(declare namespace)/s,
replacements: sys,
},
{
regex: /(declare namespace window {)([\s\S]*?)(declare namespace)/s,
replacements: windowChanges,
},
{
regex: /(declare namespace buffer {)([\s\S]*?)(declare namespace)/s,
replacements: bufferChanges,
},
{
regex: /(declare namespace html5 {)([\s\S]*?)(declare namespace)/s,
replacements: html5,
},
{
regex: /(declare namespace http {)([\s\S]*?)(declare namespace)/s,
replacements: http,
},
{
regex: /(declare namespace image {)([\s\S]*?)(declare namespace)/s,
replacements: image,
},
{
regex: /(declare namespace json {)([\s\S]*?)(declare namespace)/s,
replacements: jsonChanges,
},
{
regex: /(declare namespace msg {)([\s\S]*?)(declare namespace)/s,
replacements: msg,
},
{
regex: /(declare namespace timer {)([\s\S]*?)(declare namespace)/s,
replacements: timer,
},
{
// greedy because there are two instances of namespace vmath
regex: /(declare namespace vmath {)([\s\S]*?)(declare namespace)/gs,
replacements: vmathChanges,
},
{
regex: /(declare namespace zlib {)([\s\S]*?)(declare namespace)/s,
replacements: zlib,
},
{
regex: /(declare namespace camera {)([\s\S]*?)(declare namespace)/s,
replacements: camera,
},
{
regex:
/(declare namespace collectionfactory {)([\s\S]*?)(declare namespace)/s,
replacements: collectionFactory,
},
{
regex:
/(declare namespace collectionproxy {)([\s\S]*?)(declare namespace)/s,
replacements: collectionProxy,
},
{
regex: /(declare namespace factory {)([\s\S]*?)(declare namespace)/s,
replacements: factory,
},
{
regex: /(declare namespace label {)([\s\S]*?)(declare namespace)/s,
replacements: label,
},
{
regex: /(declare namespace liveupdate {)([\s\S]*?)(declare namespace)/s,
replacements: liveupdate,
},
{
regex: /(declare namespace model {)([\s\S]*?)(declare namespace)/s,
replacements: model,
},
{
regex: /(declare namespace particlefx {)([\s\S]*?)(declare namespace)/s,
replacements: particleFx,
},
{
regex: /(declare namespace sound {)([\s\S]*?)(declare namespace)/s,
replacements: sound,
},
{
regex: /(declare namespace sprite {)([\s\S]*?)(declare namespace)/s,
replacements: sprite,
},
{
regex: /(declare namespace types {)([\s\S]*?)(declare namespace)/s,
replacements: types,
},
{
regex: /(declare namespace graphics {)([\s\S]*?)(declare namespace)/s,
replacements: graphics,
},
{
regex: /(declare namespace tilemap {)([\s\S]*?)(})/s,
replacements: tilemap,
},
];
const filePath = 'index.d.ts';
/**
* Load the contents of the file
*/
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
console.error('Error reading file:', err);
return;
}
console.time('Patching definitions');
// Make early find and replace changes
earlyChanges.forEach((pair) => {
typeof pair[1] === 'string'
? (data = data.replace(pair[0], pair[1]))
: console.error('Expected pair[1] to be string');
});
// Loop through namespace changes
for (const patch of patches) {
const { regex, replacements } = patch;
data = data.replace(regex, (_match, namespace, group, namespace2) => {
// Apply replacements using string.replace dynamically
replacements.forEach(([search, replace]) => {
group = group.replace(search, replace);
});
return `${namespace}${group}${namespace2}`;
});
}
// Make final find and replace changes
finalChanges.forEach((pair) => {
typeof pair[1] === 'string'
? (data = data.replace(pair[0], pair[1]))
: console.error('Expected pair[1] to be string');
});
console.timeEnd('Patching definitions');
// Insert API links
data = getApiDocLinks(data);
// Save the modified contents back to the file
console.time('Saving file');
fs.writeFile(filePath, data, 'utf8', (err) => {
if (err) {
console.error('Error writing file:', err);
return;
}
console.timeEnd('Saving file');
});
});