@makano/rew 1.2.96 → 1.2.98
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.
- package/README.md +7 -1
- package/lib/rew/cli/run.js +5 -0
- package/lib/rew/const/stdns.js +1 -0
- package/lib/rew/const/usage.js +41 -2
- package/lib/rew/functions/import.js +2 -1
- package/lib/rew/functions/types.js +2 -2
- package/lib/rew/modules/compiler.js +23 -4
- package/lib/rew/modules/context.js +41 -32
- package/lib/rew/modules/runtime.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
@@ -12,9 +12,15 @@ Rew
|
|
12
12
|
<a href="https://www.npmjs.com/package/rayous"> <img src="https://img.shields.io/npm/v/@makano/rew?style=for-the-badge&logo=npm&color=b4befe&logoColor=9399b2&labelColor=181825" alt="npm version" /></a>
|
13
13
|
</p>
|
14
14
|
|
15
|
-
Rew is a simple lightweight coffeescript runtime, made to
|
15
|
+
Rew is a simple lightweight coffeescript runtime, made to simplify using coffescript and revive it
|
16
16
|
in the process.
|
17
17
|
|
18
|
+
```coffee
|
19
|
+
using namespace std::ns ->
|
20
|
+
define Main ->
|
21
|
+
print 'hello world' |> str
|
22
|
+
```
|
23
|
+
|
18
24
|
## Getting Started
|
19
25
|
1. Install `rew` globally
|
20
26
|
```bash
|
package/lib/rew/cli/run.js
CHANGED
@@ -44,6 +44,11 @@ function runFileWithArgv(filePath, options = {}, cargv) {
|
|
44
44
|
}
|
45
45
|
if (argv.includes('--')) {
|
46
46
|
argv = argv.slice(argv.indexOf('--') + 1, argv.length);
|
47
|
+
} else {
|
48
|
+
const index = argv.find(p => filePath.endsWith(p.replace(/(\.|\.\.)\//, '/')));
|
49
|
+
if(index){
|
50
|
+
argv = argv.slice(argv.indexOf(index) + 1, argv.length);
|
51
|
+
}
|
47
52
|
}
|
48
53
|
runFile(filePath, options, argv);
|
49
54
|
}
|
@@ -0,0 +1 @@
|
|
1
|
+
module.exports = class STDNS {}
|
package/lib/rew/const/usage.js
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
const STDNS = require("./stdns");
|
1
2
|
|
2
3
|
|
3
4
|
|
4
5
|
const JSX_FRAGMENT_SYMBOL = Symbol('fragment');
|
5
|
-
module.exports.USING_DEFAULT = {
|
6
|
+
const USING_DEFAULT = module.exports.USING_DEFAULT = {
|
6
7
|
JSX: {
|
7
8
|
param: (param, fragment) => param ? ({ createElement: param, Fragment: fragment || param(JSX_FRAGMENT_SYMBOL, { isFragment: true }), fragmentSymbol: JSX_FRAGMENT_SYMBOL }) : {},
|
8
9
|
use: (options) => options.jsx = true
|
@@ -15,7 +16,7 @@ module.exports.USING_DEFAULT = {
|
|
15
16
|
}
|
16
17
|
}
|
17
18
|
|
18
|
-
|
19
|
+
class Usage {
|
19
20
|
name = "null";
|
20
21
|
trigger = () => {};
|
21
22
|
save = true;
|
@@ -61,6 +62,7 @@ module.exports.Usage = class Usage {
|
|
61
62
|
}
|
62
63
|
}
|
63
64
|
}
|
65
|
+
module.exports.Usage = Usage;
|
64
66
|
|
65
67
|
class Namespace extends module.exports.Usage {
|
66
68
|
namespace = {};
|
@@ -84,7 +86,44 @@ class Namespace extends module.exports.Usage {
|
|
84
86
|
module.exports.Namespace = Namespace;
|
85
87
|
|
86
88
|
module.exports.namespace = (namespace, cb, parent) => {
|
89
|
+
if(namespace instanceof STDNS) {
|
90
|
+
if(namespace['@cb'] && !cb) {
|
91
|
+
cb = namespace['@cb'];
|
92
|
+
delete namespace['@cb'];
|
93
|
+
}
|
94
|
+
}
|
87
95
|
return new Namespace(namespace, cb, parent);
|
88
96
|
}
|
89
97
|
|
98
|
+
module.exports.usingFunction = (context, runtime) => {
|
99
|
+
return function using(name, ...params) {
|
100
|
+
if(name instanceof Usage.Group){
|
101
|
+
params.unshift(...name.g.slice(1));
|
102
|
+
name = name.g[0];
|
103
|
+
}
|
104
|
+
if(USING_DEFAULT[name]){
|
105
|
+
if(USING_DEFAULT[name].param) {
|
106
|
+
context.__using__[name] = USING_DEFAULT[name].param(...params);
|
107
|
+
}
|
108
|
+
} else if(name instanceof Namespace) {
|
109
|
+
const trigger = name.trigger;
|
110
|
+
const parentContext = name.parent || context;
|
111
|
+
const childContext = {...parentContext, ...name.namespace, trigger};
|
112
|
+
childContext.$self = name.namespace;
|
113
|
+
childContext.$parent = parentContext;
|
114
|
+
const code = `(${trigger.toString()})()`;
|
115
|
+
if(name.onUse) name.onUse();
|
116
|
+
const r = runtime.exec(code, childContext, code, context.module.filepath);
|
117
|
+
if(name.onAfterUse) name.onAfterUse();
|
118
|
+
return r;
|
119
|
+
} else if(name instanceof Usage) {
|
120
|
+
const v = name.trigger(...params) || true;
|
121
|
+
if(name.save !== false) context.__using__[name.name] = v;
|
122
|
+
return v;
|
123
|
+
} else {
|
124
|
+
context.__using__[name] = params.length ? params.length > 1 ? [...params] : params : true;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
90
129
|
module.exports.namespace.group = (group, props) => new Namespace.Group(group, props);
|
@@ -43,9 +43,10 @@ const lookUpInOtherApps = (fullPath) => {
|
|
43
43
|
module.exports.imp = function (runPath, context) {
|
44
44
|
return function (filename, options = {}) {
|
45
45
|
if (!options) options = {};
|
46
|
+
if(filename == 'std' || filename == '#std') return {};
|
46
47
|
let type = options.type ? options.type : filename.endsWith('.coffee') ? 'coffee' : (
|
47
48
|
filename.endsWith(REW_FILE_TYPE.EXTENSION) ? REW_FILE_TYPE.TYPE :
|
48
|
-
|
49
|
+
'coffee'
|
49
50
|
);
|
50
51
|
let exports,
|
51
52
|
ispkg = findPackage(filename);
|
@@ -36,7 +36,7 @@ function typedef(value, strict = false) {
|
|
36
36
|
? value.constructor
|
37
37
|
: _defaultConstructors[getType(value)],
|
38
38
|
type: getType(value),
|
39
|
-
|
39
|
+
isConstructed: typeof value === 'object' && value !== null && !Array.isArray(value),
|
40
40
|
isEmpty: typeof value == 'object' ? !Object.keys(value).length : typeof value == 'string' ? value == '' : typeof value !== 'function',
|
41
41
|
});
|
42
42
|
}
|
@@ -70,7 +70,7 @@ function typeis(obj, typeDef, missingObjects = false) {
|
|
70
70
|
// Resolve Type
|
71
71
|
if (typeof typeDef == 'function' && typeDef.type instanceof Type) typeDef = typeDef.type;
|
72
72
|
|
73
|
-
if (typeDef.
|
73
|
+
if (typeDef.isConstructed && typeDef.class && !(obj instanceof typeDef.class)) {
|
74
74
|
return missingObjects ? [false] : false;
|
75
75
|
}
|
76
76
|
|
@@ -285,7 +285,7 @@ function useImp(token, options){
|
|
285
285
|
let packageName = value.slice(1);
|
286
286
|
token.value = dem+packageName+dem;
|
287
287
|
straceLog('IMP() with HEADER for', packageName);
|
288
|
-
return includeFile(packageName, options);
|
288
|
+
return includeFile(packageName !== 'std' ? packageName : '*'+packageName, options);
|
289
289
|
}
|
290
290
|
return '';
|
291
291
|
}
|
@@ -378,7 +378,7 @@ function compileRewStuff(content, options) {
|
|
378
378
|
|
379
379
|
if (token.type === 'COMMENT' && token.value.slice(1).trim() === '@cls') {
|
380
380
|
options.cls = true;
|
381
|
-
straceLog('
|
381
|
+
straceLog('CLI_SYNTAX() ENABLE');
|
382
382
|
straceLog('===> HIGHLY EXPERIMENTAL FEATURE DETECTED');
|
383
383
|
}
|
384
384
|
|
@@ -401,6 +401,25 @@ function compileRewStuff(content, options) {
|
|
401
401
|
token.value = 'pub';
|
402
402
|
straceLog('EXPORT() => TRANSLATING TO pub');
|
403
403
|
}
|
404
|
+
|
405
|
+
if (token.type === 'IDENTIFIER' && token.value === 'package' && nextToken.type == 'STRING') {
|
406
|
+
token.value = 'appPackage';
|
407
|
+
straceLog('APP_PACKAGE_CHANGE()');
|
408
|
+
}
|
409
|
+
|
410
|
+
if (
|
411
|
+
token.type === 'OTHER' && token.value === '-' &&
|
412
|
+
nextToken.type == 'IDENTIFIER' && nextToken.value === 'wait'
|
413
|
+
) {
|
414
|
+
const { token: nextNextToken } = gnextToken(i, 2, tokens) || {};
|
415
|
+
if(nextNextToken?.type == 'IDENTIFIER'){
|
416
|
+
token.value = '';
|
417
|
+
hooks.push({
|
418
|
+
index: i + 3,
|
419
|
+
value: ','
|
420
|
+
});
|
421
|
+
}
|
422
|
+
}
|
404
423
|
|
405
424
|
if (token.type === 'IDENTIFIER' && token.value === 'using' && !options.disableUse) {
|
406
425
|
straceLog('USING()');
|
@@ -432,15 +451,15 @@ function compileRewStuff(content, options) {
|
|
432
451
|
if (token.type === 'IDENTIFIER' && token.value === 'import' && !options.keepImports) {
|
433
452
|
// console.log(nextToken.type);
|
434
453
|
straceLog('IMPORT()');
|
435
|
-
straceLog('==> WARN: SLOWS DOWN
|
454
|
+
straceLog('==> WARN: SLOWS DOWN COMPILATION');
|
436
455
|
let ind = i + n + 2;
|
437
456
|
let isAs = false;
|
438
457
|
|
439
458
|
let defaultName;
|
440
459
|
if (nextToken.type === 'STRING') {
|
441
460
|
straceLog('==> SIMPLE');
|
461
|
+
if(useImp(nextToken, options)) updateAliases(aliases);
|
442
462
|
result += `inc ${nextToken.value}`;
|
443
|
-
if(useImp(nameToken, options)) updateAliases(aliases);
|
444
463
|
i += n;
|
445
464
|
} else if (nextToken.value === '{') {
|
446
465
|
const closingBraceToken = fnextToken(ind, tokens, 'OTHER', '}');
|
@@ -8,11 +8,11 @@ const pathLib = require("../functions/path");
|
|
8
8
|
const path = require("path");
|
9
9
|
const execLib = require("../functions/exec");
|
10
10
|
const { findAppInfo } = require("../misc/findAppInfo");
|
11
|
-
const {
|
11
|
+
const { Usage, usingFunction } = require("../const/usage");
|
12
12
|
const runtime = require("./runtime");
|
13
|
-
const { permission } = require("process");
|
14
13
|
const { straceLog } = require("../misc/strace");
|
15
14
|
const reval = require("../functions/reval");
|
15
|
+
const STDNS = require("../const/stdns");
|
16
16
|
|
17
17
|
let mainFile = "";
|
18
18
|
const isMainFile = (filepath) => filepath == mainFile;
|
@@ -47,14 +47,41 @@ module.exports.prepareContext = function (
|
|
47
47
|
...context,
|
48
48
|
};
|
49
49
|
} else {
|
50
|
+
const std = {...defaultContext};
|
50
51
|
context = {
|
51
52
|
...context,
|
52
|
-
...
|
53
|
+
...std,
|
53
54
|
...pathLib(filepath),
|
54
55
|
...execLib(filepath),
|
55
56
|
...custom_context,
|
56
57
|
Usage
|
57
58
|
};
|
59
|
+
std.prototype = { ns: (cb) => {
|
60
|
+
return new (class extends STDNS {
|
61
|
+
constructor(){
|
62
|
+
super();
|
63
|
+
for(let i in std){
|
64
|
+
this[i] = std[i];
|
65
|
+
}
|
66
|
+
this.define = std.prototype.define;
|
67
|
+
this.Main = std.prototype.Main;
|
68
|
+
this['@cb'] = cb;
|
69
|
+
}
|
70
|
+
});
|
71
|
+
}, define: (name, object) => {
|
72
|
+
if(Array.isArray(name) && name.length == 2 && typeof name[0] == 'string'){
|
73
|
+
object = name[1];
|
74
|
+
name = name[0];
|
75
|
+
}
|
76
|
+
if(!context.module.exports) context.module.exports = {};
|
77
|
+
context.module.exports[name] = object;
|
78
|
+
context[name] = object;
|
79
|
+
}, Main: (cb) => (['main', cb?.main ?? cb]), attach: (object) => {
|
80
|
+
for(let i in object){
|
81
|
+
if(!context[i]) context[i] = object[i];
|
82
|
+
}
|
83
|
+
} }
|
84
|
+
context.std = std;
|
58
85
|
}
|
59
86
|
if (!context.process)
|
60
87
|
context.process = {
|
@@ -70,10 +97,19 @@ module.exports.prepareContext = function (
|
|
70
97
|
abort: () => process.abort(),
|
71
98
|
kill: () => process.kill(),
|
72
99
|
exit: (code) => process.exit(code),
|
100
|
+
chdir: (dir) => process.chdir(dir),
|
101
|
+
disconnect: () => process.disconnect(),
|
73
102
|
arch: process.arch,
|
74
103
|
pid: process.pid,
|
75
104
|
platform: process.platform,
|
76
|
-
|
105
|
+
channel: process.channel,
|
106
|
+
uptime: () => process.uptime(),
|
107
|
+
nextTick: (callback, ...args) => process.nextTick(callback, ...args),
|
108
|
+
permission: process.permission,
|
109
|
+
transmit: {
|
110
|
+
send: (...data) => process.send(...data),
|
111
|
+
recieve: (cb) => process.on('message', cb)
|
112
|
+
}
|
77
113
|
};
|
78
114
|
|
79
115
|
context.global = context;
|
@@ -120,34 +156,7 @@ module.exports.prepareContext = function (
|
|
120
156
|
context.pub = pubFunction(context);
|
121
157
|
context.exports = exportsFunction(context);
|
122
158
|
|
123
|
-
context.using = (
|
124
|
-
if(name instanceof Usage.Group){
|
125
|
-
params.unshift(...name.g.slice(1));
|
126
|
-
name = name.g[0];
|
127
|
-
}
|
128
|
-
if(USING_DEFAULT[name]){
|
129
|
-
if(USING_DEFAULT[name].param) {
|
130
|
-
context.__using__[name] = USING_DEFAULT[name].param(...params);
|
131
|
-
}
|
132
|
-
} else if(name instanceof Namespace) {
|
133
|
-
const trigger = name.trigger;
|
134
|
-
const parentContext = name.parent || context;
|
135
|
-
const childContext = {...parentContext, ...name.namespace, trigger};
|
136
|
-
childContext.currentNamespace = name.namespace;
|
137
|
-
childContext.parentNamespace = parentContext;
|
138
|
-
const code = `(${trigger.toString()})()`;
|
139
|
-
if(name.onUse) name.onUse();
|
140
|
-
const r = runtime.exec(code, childContext, code, context.module.filepath);
|
141
|
-
if(name.onAfterUse) name.onAfterUse();
|
142
|
-
return r;
|
143
|
-
} else if(name instanceof Usage) {
|
144
|
-
const v = name.trigger(...params) || true;
|
145
|
-
if(name.save !== false) context.__using__[name.name] = v;
|
146
|
-
return v;
|
147
|
-
} else {
|
148
|
-
context.__using__[name] = params.length ? params.length > 1 ? [...params] : params : true;
|
149
|
-
}
|
150
|
-
};
|
159
|
+
context.using = usingFunction(context, runtime);
|
151
160
|
|
152
161
|
if(context.app?.config?.exec?.['auto import']){
|
153
162
|
const autoipath = path.join(context.app.path, context.app.config?.exec?.['auto import']);
|
@@ -54,7 +54,7 @@ module.exports.runPath = function runPath(filepath, options = {}, custom_context
|
|
54
54
|
const mainFn = context.module.exports.main ?? context.module.exports;
|
55
55
|
return {
|
56
56
|
context,
|
57
|
-
returns: mainFn(context.process.argv)
|
57
|
+
returns: mainFn.call(context, context.process.argv)
|
58
58
|
}
|
59
59
|
} else {
|
60
60
|
return {
|