@makano/rew 1.2.5 → 1.2.6
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/civet/main.js +17239 -0
- package/lib/rew/cli/cli.js +34 -5
- package/lib/rew/cli/utils.js +43 -12
- package/lib/rew/const/default.js +2 -1
- package/lib/rew/const/ext.js +5 -0
- package/lib/rew/const/opt.js +7 -2
- package/lib/rew/const/usage.js +15 -0
- package/lib/rew/functions/export.js +1 -1
- package/lib/rew/functions/fs.js +6 -1
- package/lib/rew/functions/import.js +17 -12
- package/lib/rew/functions/require.js +17 -1
- package/lib/rew/functions/stdout.js +4 -0
- package/lib/rew/main.js +1 -13
- package/lib/rew/modules/compiler.js +103 -34
- package/lib/rew/modules/context.js +13 -1
- package/lib/rew/modules/runtime.js +37 -20
- package/lib/rew/pkgs/serve.js +373 -0
- package/lib/rew/pkgs/stream.js +10 -0
- package/lib/rew/pkgs/web.js +504 -0
- package/package.json +7 -5
- package/runtime.d.ts +718 -146
- package/jsconfig.json +0 -13
- package/lib/coffeescript/browser.js +0 -156
- package/lib/coffeescript/cake.js +0 -134
- package/lib/coffeescript/coffeescript.js +0 -465
- package/lib/coffeescript/command.js +0 -832
- package/lib/coffeescript/grammar.js +0 -1930
- package/lib/coffeescript/helpers.js +0 -513
- package/lib/coffeescript/index.js +0 -230
- package/lib/coffeescript/lexer.js +0 -2316
- package/lib/coffeescript/nodes.js +0 -9784
- package/lib/coffeescript/optparse.js +0 -258
- package/lib/coffeescript/parser.js +0 -20384
- package/lib/coffeescript/register.js +0 -120
- package/lib/coffeescript/repl.js +0 -328
- package/lib/coffeescript/rewriter.js +0 -1448
- package/lib/coffeescript/scope.js +0 -191
- package/lib/coffeescript/sourcemap.js +0 -244
@@ -1,4 +1,4 @@
|
|
1
|
-
const { compile } = require('../../
|
1
|
+
const { compile: compileCivet } = require('../../civet/main');
|
2
2
|
const { execOptions } = require('../const/opt');
|
3
3
|
const { findAppInfo } = require('../misc/findAppInfo');
|
4
4
|
const { from_qrew } = require('../qrew/compile');
|
@@ -7,6 +7,9 @@ const babel = require('@babel/core');
|
|
7
7
|
const path = require('path');
|
8
8
|
const babelReact = require('@babel/preset-react');
|
9
9
|
const { readFileSync } = require('fs');
|
10
|
+
const { wait } = require('../functions/wait');
|
11
|
+
const { REW_FILE_TYPE } = require('../const/ext');
|
12
|
+
const { USING_DEFAULT } = require('../const/usage');
|
10
13
|
|
11
14
|
function tokenizeCoffeeScript(code) {
|
12
15
|
const tokens = [];
|
@@ -115,18 +118,25 @@ function compileRewStuff(content, options) {
|
|
115
118
|
const token = tokens[i];
|
116
119
|
let { token: nextToken, n } = gnextToken(i, 1, tokens) || {};
|
117
120
|
|
118
|
-
if
|
121
|
+
if(token.type == "COMMENT" && i < 2 && token.value.startsWith('#!')){
|
122
|
+
continue;
|
123
|
+
}
|
124
|
+
|
125
|
+
if (token.type === 'IDENTIFIER' && token.value === 'opt.set') {
|
119
126
|
const { token: nextNextToken } = gnextToken(i, 2, tokens) || {};
|
120
|
-
if (nextNextToken && nextNextToken.value == 'jsxPragma') {
|
127
|
+
if (nextNextToken && nextNextToken.value.slice(1).slice(0, -1) == 'jsxPragma') {
|
121
128
|
const { token: nextLastToken } = gnextToken(i, 5, tokens) || {};
|
122
129
|
execOptions.jsxPragma = nextLastToken.value.slice(1).slice(0, -1);
|
123
130
|
}
|
124
131
|
}
|
125
132
|
|
126
|
-
if (token.type === 'COMMENT' && token.value.slice(1).trim()
|
133
|
+
if (token.type === 'COMMENT' && token.value.slice(1).trim().startsWith('@jsx')) {
|
127
134
|
options.jsx = true;
|
135
|
+
if(token.value.split('@jsx')[1].trim()){
|
136
|
+
options.jsxPragma = token.value.split('@jsx')[1].trim();
|
137
|
+
}
|
128
138
|
}
|
129
|
-
|
139
|
+
|
130
140
|
if (token.type === 'COMMENT' && token.value.slice(1).trim() === '@cls') {
|
131
141
|
options.cls = true;
|
132
142
|
}
|
@@ -146,19 +156,20 @@ function compileRewStuff(content, options) {
|
|
146
156
|
}
|
147
157
|
|
148
158
|
|
149
|
-
if (token.type === 'IDENTIFIER' && token.value === '
|
150
|
-
|
151
|
-
hooks.push({
|
152
|
-
index: fnextToken(i, tokens, 'OTHER', ';').ti,
|
153
|
-
value: `\``,
|
154
|
-
});
|
159
|
+
if (token.type === 'IDENTIFIER' && token.value === 'export' && !options.keepImports) {
|
160
|
+
token.value = 'pub';
|
155
161
|
}
|
156
162
|
|
157
|
-
if (token.type === 'IDENTIFIER' && token.value === '
|
158
|
-
|
163
|
+
if (token.type === 'IDENTIFIER' && token.value === 'using' && !options.disableUse) {
|
164
|
+
const next = nextToken.value;
|
165
|
+
if(next in USING_DEFAULT) {
|
166
|
+
const { use } = USING_DEFAULT[next];
|
167
|
+
use?.(options);
|
168
|
+
nextToken.value = `"${nextToken.value}"`
|
169
|
+
}
|
159
170
|
}
|
160
171
|
|
161
|
-
if (token.type === 'IDENTIFIER' && token.value === 'import') {
|
172
|
+
if (token.type === 'IDENTIFIER' && token.value === 'import' && !options.keepImports) {
|
162
173
|
// console.log(nextToken.type);
|
163
174
|
let ind = i + n + 2;
|
164
175
|
|
@@ -173,9 +184,12 @@ function compileRewStuff(content, options) {
|
|
173
184
|
const exportsTokens = tokens.slice(ind, closingBraceToken.ti);
|
174
185
|
const exports = exportsTokens
|
175
186
|
.filter((t) => t.type === 'IDENTIFIER')
|
176
|
-
.map((t) => t.value)
|
187
|
+
.map((t, i, arr) => t.value == 'as' ? [arr[i-1].value +': '+arr[i+1].value] : t.value)
|
188
|
+
.flat(1)
|
189
|
+
.filter((t, i, arr) => !arr[i+1]?.match(':') && !arr[i-1]?.match(':'))
|
177
190
|
.join(', ');
|
178
|
-
|
191
|
+
|
192
|
+
result += `{ ${exports} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken.value}`;
|
179
193
|
i = nameToken.ti;
|
180
194
|
}
|
181
195
|
} else if (nextToken.value === '*') {
|
@@ -184,7 +198,7 @@ function compileRewStuff(content, options) {
|
|
184
198
|
if (asToken) {
|
185
199
|
const nextToken = fnextToken(asToken.ti + 1, tokens, 'IDENTIFIER');
|
186
200
|
defaultName = nextToken.value;
|
187
|
-
result += `${defaultName} = inc ${nameToken.value}`;
|
201
|
+
result += `${defaultName} ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken.value}`;
|
188
202
|
i = ind + 6;
|
189
203
|
}
|
190
204
|
} else if (nextToken) {
|
@@ -197,13 +211,15 @@ function compileRewStuff(content, options) {
|
|
197
211
|
const exportsTokens = tokens.slice(ind, closingBraceToken.ti);
|
198
212
|
const exports = exportsTokens
|
199
213
|
.filter((t) => t.type === 'IDENTIFIER')
|
200
|
-
.map((t) => t.value)
|
214
|
+
.map((t, i, arr) => t.value == 'as' ? [arr[i-1].value +': '+arr[i+1].value] : t.value)
|
215
|
+
.flat(1)
|
216
|
+
.filter((t, i, arr) => !arr[i+1]?.match(':') && !arr[i-1]?.match(':'))
|
201
217
|
.join(', ');
|
202
|
-
result += `{ default: ${defaultName}, ${exports} } = inc ${nameToken?.value || ''}`;
|
218
|
+
result += `{ default: ${defaultName}, ${exports} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken?.value || ''}`;
|
203
219
|
i = closingBraceToken.ti + 4;
|
204
220
|
}
|
205
221
|
} else {
|
206
|
-
result += `{ default: ${defaultName} } = inc ${nameToken?.value || ''}`;
|
222
|
+
result += `{ default: ${defaultName} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken?.value || ''}`;
|
207
223
|
i = ind + 2;
|
208
224
|
}
|
209
225
|
}
|
@@ -224,7 +240,7 @@ function compileRewStuff(content, options) {
|
|
224
240
|
nextToken &&
|
225
241
|
nextToken.type === 'IDENTIFIER' &&
|
226
242
|
nextToken.value &&
|
227
|
-
nextToken.value !== 'undefined'
|
243
|
+
nextToken.value !== 'undefined' && !options.keepImports
|
228
244
|
) {
|
229
245
|
let next = {...nextToken};
|
230
246
|
if(next.value == 'default'){
|
@@ -255,37 +271,90 @@ function compileRewStuff(content, options) {
|
|
255
271
|
return result;
|
256
272
|
}
|
257
273
|
|
258
|
-
const
|
259
|
-
|
274
|
+
const compileCivetStuff = (file, options) => {
|
275
|
+
const compileOptions = {
|
260
276
|
...options,
|
261
|
-
|
262
|
-
|
277
|
+
bare: true,
|
278
|
+
filename: file.content,
|
263
279
|
inlineMap: false,
|
280
|
+
js: true
|
281
|
+
};
|
282
|
+
|
283
|
+
const prepared = compileRewStuff(file.content, options);
|
284
|
+
|
285
|
+
const compiled = options.async ? compileCivet(prepared, compileOptions) : wait(compileCivet, prepared, compileOptions);
|
286
|
+
|
287
|
+
return {
|
288
|
+
compiled,
|
289
|
+
options
|
290
|
+
};
|
291
|
+
}
|
292
|
+
|
293
|
+
const cpl = (module.exports.compile = function (file, options = {}) {
|
294
|
+
let compiledCode;
|
295
|
+
const result = compileCivetStuff(file, {
|
296
|
+
...options,
|
297
|
+
parseOptions: {
|
298
|
+
coffeeCompat: options.type == "coffee",
|
299
|
+
}
|
264
300
|
});
|
301
|
+
|
302
|
+
options = result.options;
|
303
|
+
compiledCode = result.compiled;
|
304
|
+
|
305
|
+
const babelify = (code, options) => babel.transformSync(code, {
|
306
|
+
presets: [
|
307
|
+
...(doJSX ? [[babelReact, { pragma: options.jsxPragma || execOptions.jsxPragma }]] : [])
|
308
|
+
],
|
309
|
+
plugins: [
|
310
|
+
...(doDecorators ? [[require('@babel/plugin-proposal-decorators'), { version: '2023-05' }], [require('@babel/plugin-proposal-class-properties'), { loose: true }], [require('@babel/plugin-transform-class-static-block'), {}]] : [])
|
311
|
+
],
|
312
|
+
}).code;
|
313
|
+
|
314
|
+
const doJSX = execOptions.jsx || options.jsx;
|
315
|
+
const doTypes = execOptions.typescript || options.typescript;
|
316
|
+
const doDecorators = execOptions.decorators || options.decorators;
|
317
|
+
const doBabel = doJSX || doTypes || doDecorators;
|
318
|
+
|
319
|
+
if(compiledCode instanceof Promise){
|
320
|
+
return compiledCode.then((compiledCode) => {
|
321
|
+
if (doBabel) {
|
322
|
+
compiledCode = babelify(compiledCode, options);
|
323
|
+
}
|
324
|
+
return compiledCode;
|
325
|
+
});
|
326
|
+
}
|
327
|
+
|
265
328
|
// console.log(c);
|
266
|
-
if (
|
267
|
-
|
268
|
-
presets: [[babelReact, { pragma: execOptions.jsxPragma }]],
|
269
|
-
plugins: [],
|
270
|
-
}).code;
|
329
|
+
if (doBabel) {
|
330
|
+
compiledCode = babelify(compiledCode, options);
|
271
331
|
}
|
272
|
-
return
|
332
|
+
return compiledCode;
|
273
333
|
});
|
274
334
|
|
275
335
|
module.exports.compileFile = function (filepath, options = {}) {
|
276
|
-
const f = getFile(filepath);
|
336
|
+
const f = typeof filepath == "object" ? filepath : getFile(filepath);
|
337
|
+
if(typeof filepath == "object") filepath = filepath.path;
|
277
338
|
let qrew = false;
|
278
339
|
|
279
340
|
if(options.qrew || path.extname(filepath) == '.qrew') {
|
280
341
|
qrew = true
|
281
342
|
f.content = from_qrew(readFileSync(f.path), options.package || findAppInfo(filepath)?.config.manifest.package || path.basename(filepath).split('.').slice(0, -1).join('.')).toString();
|
343
|
+
options.type = f.content.split('\n')[0]?.match(/"initFile (.+)"/)?.[1]?.split('.').pop();
|
282
344
|
}
|
283
345
|
|
284
346
|
let compiled_code = cpl(f, { ...options });
|
285
347
|
|
286
348
|
if(options.onlyCompile && !qrew){
|
287
|
-
|
288
|
-
|
349
|
+
if(compiled_code instanceof Promise){
|
350
|
+
compiled_code.then((r) => {
|
351
|
+
console.log(r);
|
352
|
+
process.exit();
|
353
|
+
});
|
354
|
+
} else {
|
355
|
+
console.log(compiled_code);
|
356
|
+
process.exit();
|
357
|
+
}
|
289
358
|
}
|
290
359
|
|
291
360
|
return {
|
@@ -7,6 +7,7 @@ const fsLib = require("../functions/fs");
|
|
7
7
|
const pathLib = require("../functions/path");
|
8
8
|
const execLib = require("../functions/exec");
|
9
9
|
const { findAppInfo } = require("../misc/findAppInfo");
|
10
|
+
const { USING_DEFAULT } = require("../const/usage");
|
10
11
|
|
11
12
|
let mainFile = "";
|
12
13
|
const isMainFile = (filepath) => filepath == mainFile;
|
@@ -25,11 +26,12 @@ module.exports.prepareContext = function (
|
|
25
26
|
imports: [],
|
26
27
|
},
|
27
28
|
imports: {
|
28
|
-
meta: {},
|
29
|
+
meta: { url: new URL('file://'+filepath), main: isMainFile(filepath) },
|
29
30
|
assert: options.import ?? {},
|
30
31
|
},
|
31
32
|
app: findAppInfo(filepath),
|
32
33
|
...fsLib(filepath),
|
34
|
+
__using__: {}
|
33
35
|
};
|
34
36
|
if (options.useContext) {
|
35
37
|
context = {
|
@@ -91,6 +93,16 @@ module.exports.prepareContext = function (
|
|
91
93
|
context.pub = pubFunction(context);
|
92
94
|
context.exports = exportsFunction(context);
|
93
95
|
|
96
|
+
context.using = (name, ...params) => {
|
97
|
+
if(USING_DEFAULT[name]){
|
98
|
+
if(USING_DEFAULT[name].param) {
|
99
|
+
context.__using__[name] = USING_DEFAULT[name].param(...params);
|
100
|
+
}
|
101
|
+
} else {
|
102
|
+
context.__using__[name] = params.length ? params.length > 1 ? [...params] : params : true;
|
103
|
+
}
|
104
|
+
};
|
105
|
+
|
94
106
|
if (
|
95
107
|
context.module.main ||
|
96
108
|
(options.fromMain == true && options.as == "main")
|
@@ -1,5 +1,5 @@
|
|
1
1
|
const vm = require('vm');
|
2
|
-
const { compileFile } = require('./compiler');
|
2
|
+
const { compileFile, compile } = require('./compiler');
|
3
3
|
const { prepareContext } = require('./context');
|
4
4
|
const { existsSync, readFileSync } = require('fs');
|
5
5
|
const { CONFIG_PATH } = require('../const/config_path');
|
@@ -7,37 +7,54 @@ const path = require('path');
|
|
7
7
|
|
8
8
|
const preScript = readFileSync(path.join(__dirname, '../const/pre-exec.js'), { encoding: 'utf-8' });
|
9
9
|
|
10
|
-
const exec = (module.exports.exec = function (code, context) {
|
11
|
-
return vm.runInNewContext(code, vm.createContext(context), {
|
10
|
+
const exec = (module.exports.exec = function (code, context, original = '') {
|
11
|
+
return vm.runInNewContext(code, context.do ? null : vm.createContext(context), {
|
12
12
|
filename: context.module.filepath,
|
13
|
-
lineOffset:
|
13
|
+
lineOffset: (original.split('\n').length + preScript.split('\n').length) - code.split('\n').length,
|
14
14
|
displayErrors: true,
|
15
15
|
});
|
16
16
|
});
|
17
17
|
|
18
18
|
module.exports.runPath = function runPath(filepath, options = {}, custom_context = {}) {
|
19
19
|
if(filepath.endsWith('.js')) options.type = 'js';
|
20
|
-
|
21
|
-
|
20
|
+
if(filepath.endsWith('.coffee')) options.type = 'coffee';
|
21
|
+
if(filepath.endsWith('.qrew')) options.type = 'qrew';
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
if(options.import?.async) options.async = true;
|
24
|
+
let { compiled_code, file } = compileFile(options.code ? { content: options.code, path: filepath } : filepath, options);
|
25
|
+
// context.module.compiled = compiled_code;
|
26
|
+
// context.process.exit = (int) => process.exit(int);
|
25
27
|
|
26
|
-
|
27
|
-
const
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
const doCode = () => {
|
29
|
+
const context = options.import?.takeThisContext ? custom_context : prepareContext(custom_context, options, file.path, runPath);
|
30
|
+
|
31
|
+
if(context.app){
|
32
|
+
const p = path.join(CONFIG_PATH, context.app.config.manifest.package, 'app');
|
33
|
+
if(existsSync(p) && context.app.path !== p){
|
34
|
+
console.log("App with the same package name has been installed. Conflicts happened. \nTo fix this, change your app's package name or remove the app making the conflict.");
|
35
|
+
return {
|
36
|
+
context: { module: { exports: null } },
|
37
|
+
returns: null
|
38
|
+
}
|
33
39
|
}
|
34
40
|
}
|
41
|
+
|
42
|
+
compiled_code = preScript+'\n'+compiled_code;
|
43
|
+
|
44
|
+
return {
|
45
|
+
context,
|
46
|
+
returns: exec(compiled_code, context, file.content),
|
47
|
+
};
|
35
48
|
}
|
36
49
|
|
37
|
-
|
50
|
+
if(options.async){
|
51
|
+
return new Promise(async (r, re) => {
|
52
|
+
compiled_code.then((e) => {
|
53
|
+
compiled_code = e;
|
54
|
+
r(doCode());
|
55
|
+
});
|
56
|
+
});
|
57
|
+
}
|
38
58
|
|
39
|
-
return
|
40
|
-
context,
|
41
|
-
returns: exec(compiled_code, context),
|
42
|
-
};
|
59
|
+
return doCode();
|
43
60
|
};
|