@makano/rew 1.2.90 → 1.2.92
Sign up to get free protection for your applications and to get access to all the features.
package/lib/rew/const/default.js
CHANGED
@@ -5,7 +5,7 @@ const future = require('../functions/future');
|
|
5
5
|
const sleep = require('../functions/sleep');
|
6
6
|
const { match } = require('../functions/match');
|
7
7
|
const { map } = require('../functions/map');
|
8
|
-
const { typex, typeis, typedef, typei, int, float, num, str, bool } = require('../functions/types');
|
8
|
+
const { typex, typeis, typedef, typei, int, float, num, str, bool, typef } = require('../functions/types');
|
9
9
|
const { isEmpty, clone, deepClone, merge, uniqueId, compose, curry, getters, setters } = require('../functions/core');
|
10
10
|
const { print, input, clear, printf } = require('../functions/stdout');
|
11
11
|
const { curl } = require('../functions/curl');
|
@@ -31,6 +31,7 @@ module.exports = {
|
|
31
31
|
typei,
|
32
32
|
typeis,
|
33
33
|
typedef,
|
34
|
+
typef,
|
34
35
|
|
35
36
|
int,
|
36
37
|
float,
|
@@ -14,8 +14,19 @@ function getType(value) {
|
|
14
14
|
return typeof value === 'object' ? (Array.isArray(value) ? 'array' : typeof value) : typeof value;
|
15
15
|
}
|
16
16
|
|
17
|
+
class Type{
|
18
|
+
constructor(o){
|
19
|
+
for(let i in o){
|
20
|
+
this[i] = o[i];
|
21
|
+
}
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
17
25
|
function typedef(value, strict = false) {
|
18
|
-
|
26
|
+
if(typeof value == "function" && value.type instanceof Type){
|
27
|
+
value = value.type;
|
28
|
+
}
|
29
|
+
return value instanceof Type ? value : new Type({
|
19
30
|
strict,
|
20
31
|
defaultValue: value,
|
21
32
|
class:
|
@@ -27,12 +38,37 @@ function typedef(value, strict = false) {
|
|
27
38
|
type: getType(value),
|
28
39
|
isConstucted: typeof value === 'object' && value !== null && !Array.isArray(value),
|
29
40
|
isEmpty: typeof value == 'object' ? !Object.keys(value).length : typeof value == 'string' ? value == '' : typeof value !== 'function',
|
30
|
-
};
|
41
|
+
});
|
42
|
+
}
|
43
|
+
|
44
|
+
function typef(fn, returnType) {
|
45
|
+
if(typeof returnType == "function"){
|
46
|
+
const ref = fn;
|
47
|
+
fn = returnType;
|
48
|
+
returnType = ref;
|
49
|
+
}
|
50
|
+
if (typeof fn !== 'function') {
|
51
|
+
throw new Error('First argument must be a function');
|
52
|
+
}
|
53
|
+
if (typeof returnType == 'function' && returnType.type instanceof Type) returnType = returnType.type;
|
54
|
+
const wrappedFn = function(...args){
|
55
|
+
const result = fn.call(this, ...args);
|
56
|
+
if(!typeis(result, wrappedFn.returnType)){
|
57
|
+
throw new TypeError(`Function ${fn.name || '<anonymous>'} does not return it's own return type.`);
|
58
|
+
}
|
59
|
+
return result;
|
60
|
+
}
|
61
|
+
wrappedFn.returnType = returnType;
|
62
|
+
wrappedFn.type = returnType;
|
63
|
+
return wrappedFn;
|
64
|
+
}
|
65
|
+
typef.is = function(func, returnType){
|
66
|
+
return typeis(func.returnType.defaultValue, returnType);
|
31
67
|
}
|
32
68
|
|
33
69
|
function typeis(obj, typeDef) {
|
34
70
|
// Resolve Type
|
35
|
-
if (typeof typeDef == 'function' && typeDef.type) typeDef = typeDef.type;
|
71
|
+
if (typeof typeDef == 'function' && typeDef.type instanceof Type) typeDef = typeDef.type;
|
36
72
|
|
37
73
|
if (typeDef.isConstucted && typeDef.class && !(obj instanceof typeDef.class)) {
|
38
74
|
return false;
|
@@ -112,6 +148,7 @@ module.exports = {
|
|
112
148
|
typei,
|
113
149
|
typeis,
|
114
150
|
typedef,
|
151
|
+
typef,
|
115
152
|
|
116
153
|
int,
|
117
154
|
float,
|
@@ -86,6 +86,15 @@ function tokenizeCoffeeScript(code) {
|
|
86
86
|
}
|
87
87
|
tokens.push({ type: 'IDENTIFIER', value: identifier });
|
88
88
|
i--; // Move back one character to recheck
|
89
|
+
} else if (/[a-f0-9.n]/.test(char)) {
|
90
|
+
let num = char;
|
91
|
+
i++;
|
92
|
+
while (i < code.length && /[a-f0-9.n]/.test(code[i])) {
|
93
|
+
num += code[i];
|
94
|
+
i++;
|
95
|
+
}
|
96
|
+
tokens.push({ type: 'NUMBER', value: num });
|
97
|
+
i--; // Move back one character to recheck
|
89
98
|
} else {
|
90
99
|
// Other characters
|
91
100
|
tokens.push({ type: 'OTHER', value: char });
|
@@ -153,7 +162,7 @@ function declareAlias(aliases, token) {
|
|
153
162
|
aliasValue = (token, tokens, code, hooks, index, setIndex) => {
|
154
163
|
const nextToken = tokens[index+1]
|
155
164
|
let nextToken2 = gnextToken(index, 3, tokens);
|
156
|
-
if (nextToken
|
165
|
+
if (nextToken?.value == '(' || tokens[index+2]?.value == '(') {
|
157
166
|
let params = '';
|
158
167
|
index += 2;
|
159
168
|
let openBrackets = 1;
|
@@ -172,7 +181,7 @@ function declareAlias(aliases, token) {
|
|
172
181
|
let nextToken = gnextToken(index, offset+1, tokens);
|
173
182
|
const args = nextToken.token.value;
|
174
183
|
setIndex(ti + offset);
|
175
|
-
return `${nextToken2.value} = ${token.value} ${args && args !== '(' ? `${args},` : ''} ${params.trim()}, ${args == '(' ? args : ''}
|
184
|
+
return `${nextToken2.value} = ${token.value} ${args && args !== '(' && args !== '-' && args !== '=' ? `${args},` : ''} ${params.trim()}, ${args == '(' || args == '=' || args == '-' ? args : ''}`.replace(/,(| )$/, '');
|
176
185
|
} else if(nextToken?.value == ' ' && (isDecOnly || nextToken2?.token.value == '=' || nextToken2?.token.value == ':')){
|
177
186
|
nextToken.value = '';
|
178
187
|
if(isDecOnly){
|
@@ -204,7 +213,21 @@ function declareAlias(aliases, token) {
|
|
204
213
|
}
|
205
214
|
}
|
206
215
|
|
207
|
-
|
216
|
+
const stdTypes = (isPublic) => {
|
217
|
+
let r = '';
|
218
|
+
const dec = (name, fn) => {
|
219
|
+
r += `#declare${isPublic?'*':''} key "=${name}" = ${fn || name};\n`
|
220
|
+
}
|
221
|
+
dec('int');
|
222
|
+
dec('str');
|
223
|
+
dec('float');
|
224
|
+
dec('num');
|
225
|
+
dec('bool');
|
226
|
+
dec('typedef');
|
227
|
+
dec('typef');
|
228
|
+
dec('struct');
|
229
|
+
return r;
|
230
|
+
};
|
208
231
|
const includeFile = (includeContent, options) => {
|
209
232
|
straceLog('INCLUDE()', includeContent);
|
210
233
|
const dontInclude = includeContent.startsWith('*');
|
@@ -212,27 +235,36 @@ const includeFile = (includeContent, options) => {
|
|
212
235
|
includeContent = includeContent.slice(1);
|
213
236
|
straceLog('==> IGNORING OUTPUT', includeContent);
|
214
237
|
};
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
238
|
+
const fp = path.resolve(path.dirname(options.filename || ''), includeContent);
|
239
|
+
let packageName = options.filename ? (existsSync(fp) ? fp : includeContent) : includeContent;
|
240
|
+
const file = packageName.startsWith('./') || packageName.startsWith('../');
|
241
|
+
if(!(file) && packageName.match('/')) packageName = packageName.split('/').pop();
|
242
|
+
if(file) packageName = path.extname(packageName) ? packageName.replace(path.extname(packageName), '.h.coffee') : packageName;
|
243
|
+
if(file && !packageName.endsWith('.h.coffee')) packageName += '.h.coffee';
|
244
|
+
if(includeContent == 'std') packageName = 'std';
|
245
|
+
|
246
|
+
const _inc = (filename, c) => {
|
247
|
+
options.included = true;
|
248
|
+
options.filename = filename;
|
249
|
+
return '\n'+ compileRewStuff(c ? filename : readFileSync(filename).toString(), options)+'\n'
|
250
|
+
};
|
221
251
|
let r = '';
|
222
|
-
if
|
223
|
-
|
224
|
-
|
252
|
+
if(packageName == 'std'){
|
253
|
+
r = _inc(stdTypes(dontInclude), true);
|
254
|
+
} else if (existsSync(packageName)) {
|
255
|
+
straceLog('==> INCLUDE FILE', packageName);
|
256
|
+
r = _inc(packageName);
|
225
257
|
} else {
|
226
258
|
const packageName = includeContent.match('/') ? includeContent.split('/')[0] : includeContent;
|
227
259
|
const headerFile = includeContent.match('/') ? includeContent.replace(packageName+'/', '') : 'main.h.coffee';
|
228
260
|
const pathname = path.join(CONFIG_PATH, packageName, 'app', headerFile);
|
229
|
-
straceLog('==> INCLUDE PACKAGE',
|
261
|
+
straceLog('==> INCLUDE PACKAGE', packageName);
|
230
262
|
if(existsSync(pathname)) r = _inc(pathname);
|
231
263
|
}
|
232
|
-
if(
|
233
|
-
return
|
264
|
+
if(dontInclude){
|
265
|
+
return 'intentional-nothing';
|
234
266
|
}
|
235
|
-
return
|
267
|
+
return r;
|
236
268
|
}
|
237
269
|
|
238
270
|
function useImp(token, options){
|
@@ -245,16 +277,22 @@ function useImp(token, options){
|
|
245
277
|
const value = token.value.slice(1, -1);
|
246
278
|
let packageName = value.slice(1);
|
247
279
|
token.value = dem+packageName+dem;
|
248
|
-
const file = packageName.startsWith('./') || packageName.startsWith('../');
|
249
|
-
if(!(file) && packageName.match('/')) packageName = packageName.split('/').pop();
|
250
|
-
if(file) packageName = path.extname(packageName) ? packageName.replace(path.extname(packageName), '.h.coffee') : packageName;
|
251
|
-
if(file && !packageName.endsWith('.h.coffee')) packageName += '.h.coffee';
|
252
280
|
straceLog('IMP() with HEADER for', packageName);
|
253
281
|
return includeFile(packageName, options);
|
254
282
|
}
|
255
283
|
return '';
|
256
284
|
}
|
257
285
|
|
286
|
+
function updateAliases(aliases, o = execOptions._syntaxAliases){
|
287
|
+
for(let h in o){
|
288
|
+
for(let i in o[h]){
|
289
|
+
if(!aliases[h]) aliases[h] = {};
|
290
|
+
aliases[h][i] = o[h][i]
|
291
|
+
}
|
292
|
+
}
|
293
|
+
return aliases;
|
294
|
+
}
|
295
|
+
|
258
296
|
function compileRewStuff(content, options) {
|
259
297
|
straceLog('TOKENIZE() for CURRENTFILE');
|
260
298
|
const tokens = tokenizeCoffeeScript(content);
|
@@ -309,28 +347,6 @@ function compileRewStuff(content, options) {
|
|
309
347
|
}
|
310
348
|
}
|
311
349
|
|
312
|
-
if (token.type === 'IDENTIFIER' && token.value === 'imp') {
|
313
|
-
straceLog('IMP() Detected');
|
314
|
-
let { token: t1 } = gnextToken(i, 1, tokens) || {};
|
315
|
-
let { token: t2 } = gnextToken(i, 2, tokens) || {};
|
316
|
-
let r = '';
|
317
|
-
|
318
|
-
if(t1.value == '('){
|
319
|
-
if(t2.type == 'STRING'){
|
320
|
-
r = useImp(t2, options);
|
321
|
-
}
|
322
|
-
} else if(t1.type == 'STRING'){
|
323
|
-
r = useImp(t1, options);
|
324
|
-
}
|
325
|
-
|
326
|
-
if(r) {
|
327
|
-
aliases = {
|
328
|
-
...aliases,
|
329
|
-
...execOptions._syntaxAliases
|
330
|
-
}
|
331
|
-
}
|
332
|
-
}
|
333
|
-
|
334
350
|
if (token.type === 'COMMENT' && token.value.slice(1).trim().startsWith('@jsx')) {
|
335
351
|
options.jsx = true;
|
336
352
|
straceLog('JSX() ENABLE WITH COMMENTS');
|
@@ -390,6 +406,7 @@ function compileRewStuff(content, options) {
|
|
390
406
|
if (nextToken.type === 'STRING') {
|
391
407
|
straceLog('==> SIMPLE');
|
392
408
|
result += `inc ${nextToken.value}`;
|
409
|
+
if(useImp(nameToken, options)) updateAliases(aliases);
|
393
410
|
i += n;
|
394
411
|
} else if (nextToken.value === '{') {
|
395
412
|
const closingBraceToken = fnextToken(ind, tokens, 'OTHER', '}');
|
@@ -405,6 +422,7 @@ function compileRewStuff(content, options) {
|
|
405
422
|
|
406
423
|
straceLog('==>', exports, 'from', nameToken.value);
|
407
424
|
|
425
|
+
if(useImp(nameToken, options)) updateAliases(aliases);
|
408
426
|
result += `{ ${exports} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken.value}`;
|
409
427
|
i = nameToken.ti;
|
410
428
|
}
|
@@ -415,6 +433,7 @@ function compileRewStuff(content, options) {
|
|
415
433
|
const nextToken = fnextToken(asToken.ti + 1, tokens, 'IDENTIFIER');
|
416
434
|
defaultName = nextToken.value;
|
417
435
|
straceLog('==>', defaultName, 'from', nameToken.value);
|
436
|
+
if(useImp(nameToken, options)) updateAliases(aliases);
|
418
437
|
result += `${defaultName} ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken.value}`;
|
419
438
|
i = ind + 6;
|
420
439
|
}
|
@@ -433,10 +452,12 @@ function compileRewStuff(content, options) {
|
|
433
452
|
.filter((t, i, arr) => !arr[i+1]?.match(':') && !arr[i-1]?.match(':'))
|
434
453
|
.join(', ');
|
435
454
|
straceLog('==>', defaultName, 'and', exports, 'from', nameToken.value);
|
455
|
+
if(useImp(nameToken, options)) updateAliases(aliases);
|
436
456
|
result += `{ default: ${defaultName}, ${exports} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken?.value || ''}`;
|
437
457
|
i = closingBraceToken.ti + 4;
|
438
458
|
}
|
439
459
|
} else {
|
460
|
+
if(useImp(nameToken || {}, options)) updateAliases(aliases);
|
440
461
|
result += `{ default: ${defaultName} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken?.value || ''}`;
|
441
462
|
i = ind + 2;
|
442
463
|
}
|
@@ -464,6 +485,25 @@ function compileRewStuff(content, options) {
|
|
464
485
|
continue;
|
465
486
|
}
|
466
487
|
|
488
|
+
if (token.type === 'IDENTIFIER' && (token.value === 'imp' || token.value === 'inc')) {
|
489
|
+
straceLog('IMP() Detected');
|
490
|
+
let { token: t1 } = gnextToken(i, 1, tokens) || {};
|
491
|
+
let { token: t2 } = gnextToken(i, 2, tokens) || {};
|
492
|
+
let r = '';
|
493
|
+
|
494
|
+
if(t1?.value == '('){
|
495
|
+
if(t2?.type == 'STRING'){
|
496
|
+
r = useImp(t2, options);
|
497
|
+
}
|
498
|
+
} else if(t1?.type == 'STRING'){
|
499
|
+
r = useImp(t1, options);
|
500
|
+
}
|
501
|
+
|
502
|
+
if(r) {
|
503
|
+
updateAliases(aliases);
|
504
|
+
}
|
505
|
+
}
|
506
|
+
|
467
507
|
if (
|
468
508
|
token.type === 'IDENTIFIER' &&
|
469
509
|
token.value === 'pub' &&
|
@@ -516,16 +556,18 @@ function compileRewStuff(content, options) {
|
|
516
556
|
|
517
557
|
if (token.type === "COMMENT" && token.value.startsWith('#include')) {
|
518
558
|
const includeContent = token.value.split(' ')[1].trim() || '';
|
519
|
-
const
|
559
|
+
const _o = {...options};
|
560
|
+
const r = includeFile(includeContent, _o);
|
520
561
|
if(r){
|
521
|
-
result += r;
|
522
|
-
aliases
|
523
|
-
...aliases,
|
524
|
-
...execOptions._syntaxAliases
|
525
|
-
}
|
562
|
+
result += r == 'intentional-nothing' ? '' : r;
|
563
|
+
updateAliases(aliases, _o.aliases);
|
526
564
|
}
|
527
565
|
}
|
528
566
|
}
|
567
|
+
|
568
|
+
if(options.included){
|
569
|
+
options.aliases = aliases;
|
570
|
+
}
|
529
571
|
// console.log(aliases);
|
530
572
|
// console.log(result);
|
531
573
|
return result;
|