@makano/rew 1.2.901 → 1.2.971
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/cli.js +31 -4
- package/lib/rew/cli/helpers.js +26 -1
- package/lib/rew/cli/miscUtils.js +41 -0
- package/lib/rew/cli/utils.js +52 -10
- package/lib/rew/const/default.js +2 -1
- package/lib/rew/const/stdns.js +1 -0
- package/lib/rew/const/usage.js +41 -2
- package/lib/rew/functions/import.js +19 -9
- package/lib/rew/functions/reval.js +16 -0
- package/lib/rew/functions/types.js +65 -14
- package/lib/rew/modules/compiler.js +135 -51
- package/lib/rew/modules/context.js +43 -32
- package/lib/rew/modules/runtime.js +17 -6
- 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/cli.js
CHANGED
|
@@ -338,18 +338,45 @@ yargs(hideBin(process.argv))
|
|
|
338
338
|
}
|
|
339
339
|
},
|
|
340
340
|
)
|
|
341
|
-
|
|
342
341
|
.command(
|
|
343
342
|
'cache <command>',
|
|
344
343
|
'Manage cache',
|
|
344
|
+
(yargs) => {
|
|
345
|
+
yargs
|
|
346
|
+
.positional('command', {
|
|
347
|
+
describe: 'Command to clear/list/show',
|
|
348
|
+
type: 'string',
|
|
349
|
+
})
|
|
350
|
+
.example('rew cache list', 'Lists all caches')
|
|
351
|
+
.example('rew cache clear', 'Clears all caches')
|
|
352
|
+
.example('rew cache clear all', 'Clears all caches')
|
|
353
|
+
.example('rew cache clear [id]', 'Clears all caches for id [id]')
|
|
354
|
+
.example('rew cache show [id]', 'Shows commits downloaded for [id]')
|
|
355
|
+
.example('rew cache show [id]', 'Shows commits downloaded for [id]')
|
|
356
|
+
.example('rew cache show [id]/clone', 'Shows the contents for [id]')
|
|
357
|
+
.example('rew cache show [id]#tag', 'Shows the tag for [id]')
|
|
358
|
+
.example('rew cache show [id]#commit', 'Shows the current commit for [id]')
|
|
359
|
+
.example('rew cache show [id]#name', 'Shows the name for [id]')
|
|
360
|
+
.example('rew cache show [id]/clone/app.yaml', 'Shows the app config for [id]')
|
|
361
|
+
.example('rew cache show [id]/clone/path/to/file', 'Gives you the path to the file inside [id]')
|
|
362
|
+
.example('rew cache show [id]/clone/path/to/file', 'Gives you the path to the file inside [id]')
|
|
363
|
+
.example('rew cache install [id]', 'Installs cache')
|
|
364
|
+
},
|
|
365
|
+
async (argv) => {
|
|
366
|
+
require('./utils').cache(argv.command, ...argv._.slice(1));
|
|
367
|
+
},
|
|
368
|
+
)
|
|
369
|
+
.command(
|
|
370
|
+
'misc <command>',
|
|
371
|
+
'Misc functions',
|
|
345
372
|
(yargs) => {
|
|
346
373
|
yargs.positional('command', {
|
|
347
|
-
describe: '
|
|
374
|
+
describe: 'Misc command name',
|
|
348
375
|
type: 'string',
|
|
349
376
|
});
|
|
350
377
|
},
|
|
351
|
-
|
|
352
|
-
require('./
|
|
378
|
+
(argv) => {
|
|
379
|
+
require('./miscUtils')[argv.command](...argv._.slice(1));
|
|
353
380
|
},
|
|
354
381
|
)
|
|
355
382
|
.command(
|
package/lib/rew/cli/helpers.js
CHANGED
|
@@ -35,11 +35,36 @@ function getAllPipeInput(){
|
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
* @param {string} string
|
|
41
|
+
* @param {Record<string,(replacedString: string, originalString: string) => any>} order
|
|
42
|
+
* @returns { { string: string, [key: string]: any } }
|
|
43
|
+
*/
|
|
44
|
+
function hashTags(string, order){
|
|
45
|
+
const hashes = Object.keys(order);
|
|
46
|
+
const h = {};
|
|
47
|
+
let s = string;
|
|
48
|
+
for(let i of hashes){
|
|
49
|
+
if(string.includes(`#${i}`)){
|
|
50
|
+
const str = s.replace(`#${i}`, '');
|
|
51
|
+
h[i] = order[i](str, string);
|
|
52
|
+
if(h[i]?.$set) {s = h[i].$set; string = s }
|
|
53
|
+
else s = str;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
string: s,
|
|
58
|
+
...h
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
38
62
|
module.exports = {
|
|
39
63
|
binpath,
|
|
40
64
|
logspath,
|
|
41
65
|
cachepath,
|
|
42
66
|
localBinPath,
|
|
43
67
|
npm_package_name,
|
|
44
|
-
getAllPipeInput
|
|
68
|
+
getAllPipeInput,
|
|
69
|
+
hashTags
|
|
45
70
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const { findAppInfo } = require("../misc/findAppInfo");
|
|
2
|
+
const { log } = require("./log");
|
|
3
|
+
const colors = require('colors');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
const { CONFIG_PATH } = require("../const/config_path");
|
|
7
|
+
|
|
8
|
+
module.exports = {
|
|
9
|
+
types(projectPath){
|
|
10
|
+
if(!projectPath) projectPath = process.cwd();
|
|
11
|
+
else projectPath = path.resolve(process.cwd(), projectPath);
|
|
12
|
+
const projectinfo = findAppInfo(projectPath+'/app.yaml');
|
|
13
|
+
if(!projectinfo){
|
|
14
|
+
log('Path not a rew app'.red.bold, ':end')
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
let typesToLoad = ['rew'];
|
|
18
|
+
if(projectinfo.config?.types){
|
|
19
|
+
typesToLoad = projectinfo.config?.types;
|
|
20
|
+
}
|
|
21
|
+
fs.mkdirSync(path.join(projectPath, 'node_modules/@types/rew'), { recursive: true });
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
typesToLoad.forEach(name => {
|
|
25
|
+
let filename = name+'.d.ts';
|
|
26
|
+
if(name == 'rew'){
|
|
27
|
+
fs.copyFileSync(path.join(__dirname, '../../../runtime.d.ts'), path.join(projectPath, 'node_modules/@types/rew/index.d.ts'));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
let p = path.resolve(CONFIG_PATH, name, 'app', 'types.d.ts');
|
|
31
|
+
|
|
32
|
+
if(name.indexOf('/') > -1) {
|
|
33
|
+
const fn = name.split('/').slice(1).join('/')+'.d.ts';
|
|
34
|
+
p = path.resolve(CONFIG_PATH, name.split('/')[0], 'app', fn);
|
|
35
|
+
filename = name.split('/')[0]+'-'+path.basename(fn);
|
|
36
|
+
}
|
|
37
|
+
if(fs.existsSync(p)) fs.copyFileSync(p, path.join(projectPath, 'node_modules/@types/rew/'+filename));
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
}
|
package/lib/rew/cli/utils.js
CHANGED
|
@@ -12,9 +12,7 @@ const { to_qrew } = require('../qrew/compile');
|
|
|
12
12
|
const { findAppInfo } = require('../misc/findAppInfo');
|
|
13
13
|
const { req } = require('../misc/req');
|
|
14
14
|
const { CONFIG_PATH } = require('../const/config_path');
|
|
15
|
-
const {
|
|
16
|
-
const { execRewFile, runFileWithArgv } = require('./run');
|
|
17
|
-
const { seededID } = require('../misc/seededid');
|
|
15
|
+
const { runFileWithArgv } = require('./run');
|
|
18
16
|
const loading = require('loading-cli');
|
|
19
17
|
const sleep = require('../functions/sleep');
|
|
20
18
|
const { gen_key } = require('../misc/bin');
|
|
@@ -24,7 +22,8 @@ const {
|
|
|
24
22
|
binpath,
|
|
25
23
|
logspath,
|
|
26
24
|
cachepath,
|
|
27
|
-
localBinPath
|
|
25
|
+
localBinPath,
|
|
26
|
+
hashTags
|
|
28
27
|
} = require('./helpers');
|
|
29
28
|
const { input } = require('../functions/stdout');
|
|
30
29
|
|
|
@@ -94,9 +93,13 @@ module.exports = {
|
|
|
94
93
|
const project = {};
|
|
95
94
|
const create = () => {
|
|
96
95
|
fs.mkdirSync(projectPath, { recursive: true });
|
|
96
|
+
const confObj = { manifest: { package: project.package, private: false }, exec: { entry: 'main'+(project.civet ? REW_FILE_TYPE.EXTENSION : '.coffee') }, assets: { icon: 'assets/icon.png', folder: './assets' }, install: { requirements: [] } };
|
|
97
97
|
const confPath = path.join(projectPath, 'app.yaml');
|
|
98
98
|
const entryFile = path.join(projectPath, 'main'+(project.civet ? REW_FILE_TYPE.EXTENSION : '.coffee'));
|
|
99
|
-
|
|
99
|
+
if(project.intellisense) {
|
|
100
|
+
confObj.types = ['rew'];
|
|
101
|
+
}
|
|
102
|
+
fs.writeFileSync(confPath, jsYaml.dump(confObj));
|
|
100
103
|
fs.writeFileSync(entryFile, `print("Hello World!")`);
|
|
101
104
|
fs.mkdirSync(path.join(projectPath, 'assets'), { recursive: true });
|
|
102
105
|
if (project.git) {
|
|
@@ -104,8 +107,8 @@ module.exports = {
|
|
|
104
107
|
execSync('cd ' + projectPath + ' && git init . && git branch -m main', { stdio: 'ignore' });
|
|
105
108
|
}
|
|
106
109
|
if(project.intellisense){
|
|
107
|
-
|
|
108
|
-
|
|
110
|
+
require('./miscUtils')
|
|
111
|
+
.types(projectPath);
|
|
109
112
|
}
|
|
110
113
|
execSync('cd ' + projectPath + ' && npm init -y', { stdio: 'ignore' });
|
|
111
114
|
if(project.civet){
|
|
@@ -382,11 +385,50 @@ module.exports = {
|
|
|
382
385
|
processFile(filePath, importsArray);
|
|
383
386
|
log(' Compiled'.yellow, (importsArray.length + 1 + '').blue, `file${importsArray.length ? 's' : ''}.`.yellow, ':end');
|
|
384
387
|
},
|
|
385
|
-
cache(command){
|
|
388
|
+
cache(command, file){
|
|
389
|
+
|
|
390
|
+
const findGitCommitPath = (p) => {
|
|
391
|
+
const heads = path.join(p, '.git/refs/heads');
|
|
392
|
+
if(!fs.existsSync(heads)) return '';
|
|
393
|
+
const refs = fs.readdirSync(heads);
|
|
394
|
+
if(!refs.length) return '';
|
|
395
|
+
return fs.readFileSync(path.join(heads, refs[0]), { encoding: 'utf-8' }).trim();
|
|
396
|
+
}
|
|
397
|
+
|
|
386
398
|
if(command == 'list'){
|
|
387
399
|
console.log(fs.readdirSync(cachepath).join('\n').trim());
|
|
388
|
-
} else {
|
|
389
|
-
|
|
400
|
+
} else if(command == 'clear'){
|
|
401
|
+
if(file) fs.rmSync(path.join(cachepath, file), { recursive: true });
|
|
402
|
+
else if(file == 'all') fs.readdirSync(cachepath).forEach(file => fs.rmSync(path.join(cachepath, file), { recursive: true }));
|
|
403
|
+
} else if(command == 'install'){
|
|
404
|
+
if(!file) return process.exit(1);
|
|
405
|
+
this.installApp(path.join(cachepath, file, 'clone'), {
|
|
406
|
+
update: true
|
|
407
|
+
});
|
|
408
|
+
} else if(command == 'show'){
|
|
409
|
+
if(!file) return console.log(fs.readdirSync(cachepath).join('\n').trim());
|
|
410
|
+
|
|
411
|
+
const hashed = hashTags(file, {
|
|
412
|
+
tag: (str) => ({ $set: str + '#name#commit' }),
|
|
413
|
+
commit: (file) => findGitCommitPath(path.join(cachepath, file.replace(/#name/, ''), 'clone')),
|
|
414
|
+
name: (file) => jsYaml.load(fs.readFileSync(path.join(cachepath, file, 'clone/app.yaml'), { encoding: 'utf-8' }).trim()).manifest.package
|
|
415
|
+
});
|
|
416
|
+
file = hashed.string;
|
|
417
|
+
|
|
418
|
+
if(hashed.tag){
|
|
419
|
+
return console.log(hashed.name +':'+ hashed.commit);
|
|
420
|
+
}
|
|
421
|
+
if(hashed.commit) return console.log(hashed.commit);
|
|
422
|
+
if(hashed.name) return console.log(hashed.name);
|
|
423
|
+
|
|
424
|
+
const f = path.join(cachepath, file);
|
|
425
|
+
if(!fs.existsSync(f)) return;
|
|
426
|
+
if(fs.statSync(f).isDirectory()) console.log(
|
|
427
|
+
fs.readdirSync(f).join('\n')
|
|
428
|
+
);
|
|
429
|
+
else if(file.endsWith('app.yaml')){
|
|
430
|
+
console.log(fs.readFileSync(f, { encoding: 'utf-8' }).trim());
|
|
431
|
+
} else console.log(f);
|
|
390
432
|
}
|
|
391
433
|
},
|
|
392
434
|
async cloneGit(gitpath, opts) {
|
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,
|
|
@@ -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);
|
|
@@ -9,6 +9,12 @@ const { execOptions } = require('../const/opt');
|
|
|
9
9
|
const { REW_FILE_TYPE } = require('../const/ext');
|
|
10
10
|
const { straceLog } = require('../misc/strace');
|
|
11
11
|
|
|
12
|
+
const _returns = (options, content) => {
|
|
13
|
+
if(options.useDefaultForPackages){
|
|
14
|
+
return content?.default ? content : { default: content };
|
|
15
|
+
} else return content;
|
|
16
|
+
}
|
|
17
|
+
|
|
12
18
|
const cachedFiles = [];
|
|
13
19
|
module.exports.cleanCache = () => {
|
|
14
20
|
while(cachedFiles.length) cachedFiles.pop();
|
|
@@ -37,7 +43,11 @@ const lookUpInOtherApps = (fullPath) => {
|
|
|
37
43
|
module.exports.imp = function (runPath, context) {
|
|
38
44
|
return function (filename, options = {}) {
|
|
39
45
|
if (!options) options = {};
|
|
40
|
-
|
|
46
|
+
if(filename == 'std' || filename == '#std') return {};
|
|
47
|
+
let type = options.type ? options.type : filename.endsWith('.coffee') ? 'coffee' : (
|
|
48
|
+
filename.endsWith(REW_FILE_TYPE.EXTENSION) ? REW_FILE_TYPE.TYPE :
|
|
49
|
+
'coffee'
|
|
50
|
+
);
|
|
41
51
|
let exports,
|
|
42
52
|
ispkg = findPackage(filename);
|
|
43
53
|
|
|
@@ -58,10 +68,10 @@ module.exports.imp = function (runPath, context) {
|
|
|
58
68
|
else filepath = otherPath;
|
|
59
69
|
};
|
|
60
70
|
|
|
61
|
-
const foundCache = cachedFiles.find((f) => f.filepath == filepath);
|
|
71
|
+
const foundCache = cachedFiles.find((f) => f.filepath == type+':'+filepath);
|
|
62
72
|
|
|
63
73
|
if (!ispkg && foundCache) {
|
|
64
|
-
exports = foundCache.exports;
|
|
74
|
+
exports = options.useDefaultForPackages === false ? foundCache.exports.default || foundCache.exports : _returns(options, foundCache.exports);
|
|
65
75
|
}
|
|
66
76
|
|
|
67
77
|
if (!ispkg && !existsSync(filepath) && !foundCache) {
|
|
@@ -117,17 +127,17 @@ module.exports.imp = function (runPath, context) {
|
|
|
117
127
|
const f = getFile(filepath);
|
|
118
128
|
if (type == 'yaml') {
|
|
119
129
|
straceLog('===> FROM_YAML()');
|
|
120
|
-
exports = importYaml(f.path, f);
|
|
130
|
+
exports = _returns(options, importYaml(f.path, f));
|
|
121
131
|
} else if (type == 'json') {
|
|
122
132
|
straceLog('===>');
|
|
123
133
|
try {
|
|
124
|
-
exports = JSON.parse(f.content);
|
|
134
|
+
exports = _returns(options, JSON.parse(f.content));
|
|
125
135
|
} catch (e) {
|
|
126
|
-
exports = {};
|
|
136
|
+
exports = _returns(options, {});
|
|
127
137
|
}
|
|
128
138
|
} else {
|
|
129
139
|
straceLog('===> FROM_TEXT');
|
|
130
|
-
exports = f.content;
|
|
140
|
+
exports = _returns(options, f.content);
|
|
131
141
|
}
|
|
132
142
|
}
|
|
133
143
|
|
|
@@ -143,13 +153,13 @@ module.exports.imp = function (runPath, context) {
|
|
|
143
153
|
// descriptive code
|
|
144
154
|
// you put them in comment blocks
|
|
145
155
|
// and name it something
|
|
146
|
-
// then you can
|
|
156
|
+
// then you can simply see
|
|
147
157
|
// which part of a code contains a certain
|
|
148
158
|
// task. cool right?
|
|
149
159
|
|
|
150
160
|
//** If is not package, post exec section
|
|
151
161
|
/**/ if (!ispkg) context.module.imports.push(filepath);
|
|
152
|
-
/**/ if (!ispkg) cachedFiles.push({ filepath, exports });
|
|
162
|
+
/**/ if (!ispkg) cachedFiles.push({ filepath: type+':'+filepath, exports });
|
|
153
163
|
//**
|
|
154
164
|
|
|
155
165
|
//** Mock imports section
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const { compile } = require("../modules/compiler")
|
|
2
|
+
|
|
3
|
+
const _compilePart = (code, filepath) => compile(
|
|
4
|
+
{
|
|
5
|
+
path: filepath,
|
|
6
|
+
content: code
|
|
7
|
+
},
|
|
8
|
+
{}
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
module.exports = (filepath) => ({
|
|
12
|
+
_compilePart: (code) => {
|
|
13
|
+
return _compilePart(code, filepath);
|
|
14
|
+
},
|
|
15
|
+
_call: (fn, ...args) => args.length ? fn.call(...args) : fn()
|
|
16
|
+
})
|
|
@@ -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:
|
|
@@ -25,25 +36,50 @@ function typedef(value, strict = false) {
|
|
|
25
36
|
? value.constructor
|
|
26
37
|
: _defaultConstructors[getType(value)],
|
|
27
38
|
type: getType(value),
|
|
28
|
-
|
|
39
|
+
isConstructed: 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
|
-
function typeis(obj, typeDef) {
|
|
69
|
+
function typeis(obj, typeDef, missingObjects = false) {
|
|
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
|
-
if (typeDef.
|
|
38
|
-
return false;
|
|
73
|
+
if (typeDef.isConstructed && typeDef.class && !(obj instanceof typeDef.class)) {
|
|
74
|
+
return missingObjects ? [false] : false;
|
|
39
75
|
}
|
|
40
76
|
|
|
41
77
|
if (getType(obj) == 'object' && typeDef.type == 'function') {
|
|
42
|
-
return obj instanceof typeDef.class;
|
|
78
|
+
return missingObjects ? [obj instanceof typeDef.class] : obj instanceof typeDef.class;
|
|
43
79
|
}
|
|
44
80
|
|
|
45
81
|
if (getType(obj) !== typeDef.type) {
|
|
46
|
-
return false;
|
|
82
|
+
return missingObjects ? [false] : false;
|
|
47
83
|
}
|
|
48
84
|
|
|
49
85
|
if (!typeDef.isEmpty) {
|
|
@@ -55,14 +91,28 @@ function typeis(obj, typeDef) {
|
|
|
55
91
|
|
|
56
92
|
if (typeof propTypeDef === 'object') {
|
|
57
93
|
if (!typeis(obj[key], propTypeDef)) {
|
|
58
|
-
return false
|
|
94
|
+
return missingObjects ? [false, {
|
|
95
|
+
[key]: {
|
|
96
|
+
type_mismatch: propTypeDef,
|
|
97
|
+
given: obj[gen_key]
|
|
98
|
+
}
|
|
99
|
+
}] : false;
|
|
59
100
|
}
|
|
60
|
-
} else if (typeof obj[key] !== propTypeDef) {
|
|
61
|
-
return false
|
|
101
|
+
} else if (typeof obj[key] !== typeof propTypeDef) {
|
|
102
|
+
return missingObjects ? [false, {
|
|
103
|
+
[key]: obj[key] ? {
|
|
104
|
+
type_mismatch: typeof propTypeDef,
|
|
105
|
+
given: typeof obj[key]
|
|
106
|
+
} : {
|
|
107
|
+
not_found: true
|
|
108
|
+
}
|
|
109
|
+
}] : false;
|
|
62
110
|
}
|
|
63
111
|
}
|
|
64
112
|
if (typeDef.strict) {
|
|
65
|
-
if (Object.keys(obj).some((key) => !Object.keys(typeDef.defaultValue).includes(key))) return
|
|
113
|
+
if (Object.keys(obj).some((key) => !Object.keys(typeDef.defaultValue).includes(key))) return missingObjects ?
|
|
114
|
+
[false, Object.fromEntries(Object.keys(obj).filter((key) => !Object.keys(typeDef.defaultValue).includes(key)).map((key) => [key, { is_extra: true }]))]
|
|
115
|
+
: false;
|
|
66
116
|
}
|
|
67
117
|
} else if (typeDef.type == 'string') {
|
|
68
118
|
return typeDef.defaultValue == obj;
|
|
@@ -71,7 +121,7 @@ function typeis(obj, typeDef) {
|
|
|
71
121
|
}
|
|
72
122
|
}
|
|
73
123
|
|
|
74
|
-
return true;
|
|
124
|
+
return missingObjects ? [true] : true;
|
|
75
125
|
}
|
|
76
126
|
|
|
77
127
|
function typex(child, parent) {
|
|
@@ -112,6 +162,7 @@ module.exports = {
|
|
|
112
162
|
typei,
|
|
113
163
|
typeis,
|
|
114
164
|
typedef,
|
|
165
|
+
typef,
|
|
115
166
|
|
|
116
167
|
int,
|
|
117
168
|
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 });
|
|
@@ -106,6 +115,13 @@ const ValueIfy = (val) => {
|
|
|
106
115
|
}
|
|
107
116
|
}
|
|
108
117
|
|
|
118
|
+
function insertTokenAt(array, index, value) {
|
|
119
|
+
if (index < 0 || index > array.length) {
|
|
120
|
+
throw new RangeError('Index out of bounds');
|
|
121
|
+
}
|
|
122
|
+
array.splice(index, 0, value);
|
|
123
|
+
}
|
|
124
|
+
|
|
109
125
|
const gnextToken = (i, n, tokens) => {
|
|
110
126
|
return tokens[i + n] ? (tokens[i + n].type == 'WHITESPACE' ? gnextToken(i, n + 1, tokens) : { token: tokens[i + n], n, ti: i + n }) : null;
|
|
111
127
|
};
|
|
@@ -153,7 +169,7 @@ function declareAlias(aliases, token) {
|
|
|
153
169
|
aliasValue = (token, tokens, code, hooks, index, setIndex) => {
|
|
154
170
|
const nextToken = tokens[index+1]
|
|
155
171
|
let nextToken2 = gnextToken(index, 3, tokens);
|
|
156
|
-
if (nextToken
|
|
172
|
+
if (nextToken?.value == '(' || tokens[index+2]?.value == '(') {
|
|
157
173
|
let params = '';
|
|
158
174
|
index += 2;
|
|
159
175
|
let openBrackets = 1;
|
|
@@ -172,7 +188,7 @@ function declareAlias(aliases, token) {
|
|
|
172
188
|
let nextToken = gnextToken(index, offset+1, tokens);
|
|
173
189
|
const args = nextToken.token.value;
|
|
174
190
|
setIndex(ti + offset);
|
|
175
|
-
return `${nextToken2.value} = ${token.value} ${args && args !== '(' ? `${args},` : ''} ${params.trim()
|
|
191
|
+
return `${nextToken2.value} = ${token.value} ${args && args !== '(' && args !== '{' && args !== '[' && args !== '-' && args !== '=' ? `${args},` : ''} ${params.trim() ? params.trim() + ', ' : ''}${args == '(' || args == '[' || args == '{' || args == '=' || args == '-' ? args : ''}`.replace(/,(| )$/, '');
|
|
176
192
|
} else if(nextToken?.value == ' ' && (isDecOnly || nextToken2?.token.value == '=' || nextToken2?.token.value == ':')){
|
|
177
193
|
nextToken.value = '';
|
|
178
194
|
if(isDecOnly){
|
|
@@ -204,7 +220,21 @@ function declareAlias(aliases, token) {
|
|
|
204
220
|
}
|
|
205
221
|
}
|
|
206
222
|
|
|
207
|
-
|
|
223
|
+
const stdTypes = (isPublic) => {
|
|
224
|
+
let r = '';
|
|
225
|
+
const dec = (name, fn) => {
|
|
226
|
+
r += `#declare${isPublic?'*':''} key "=${name}" = ${fn || name};\n`
|
|
227
|
+
}
|
|
228
|
+
dec('int');
|
|
229
|
+
dec('str');
|
|
230
|
+
dec('float');
|
|
231
|
+
dec('num');
|
|
232
|
+
dec('bool');
|
|
233
|
+
dec('typedef');
|
|
234
|
+
dec('typef');
|
|
235
|
+
dec('struct');
|
|
236
|
+
return r;
|
|
237
|
+
};
|
|
208
238
|
const includeFile = (includeContent, options) => {
|
|
209
239
|
straceLog('INCLUDE()', includeContent);
|
|
210
240
|
const dontInclude = includeContent.startsWith('*');
|
|
@@ -212,21 +242,30 @@ const includeFile = (includeContent, options) => {
|
|
|
212
242
|
includeContent = includeContent.slice(1);
|
|
213
243
|
straceLog('==> IGNORING OUTPUT', includeContent);
|
|
214
244
|
};
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
245
|
+
const fp = path.resolve(path.dirname(options.filename || ''), includeContent);
|
|
246
|
+
let packageName = options.filename ? (existsSync(fp) ? fp : includeContent) : includeContent;
|
|
247
|
+
const file = packageName.startsWith('./') || packageName.startsWith('../');
|
|
248
|
+
if(!(file) && packageName.match('/')) packageName = packageName.split('/').pop();
|
|
249
|
+
if(file) packageName = path.extname(packageName) ? packageName.replace(path.extname(packageName), '.h.coffee') : packageName;
|
|
250
|
+
if(file && !packageName.endsWith('.h.coffee')) packageName += '.h.coffee';
|
|
251
|
+
if(includeContent == 'std') packageName = 'std';
|
|
252
|
+
|
|
253
|
+
const _inc = (filename, c) => {
|
|
254
|
+
options.included = true;
|
|
255
|
+
options.filename = filename;
|
|
256
|
+
return '\n'+ compileRewStuff(c ? filename : readFileSync(filename).toString(), options)+'\n'
|
|
257
|
+
};
|
|
221
258
|
let r = '';
|
|
222
|
-
if
|
|
223
|
-
|
|
224
|
-
|
|
259
|
+
if(packageName == 'std'){
|
|
260
|
+
r = _inc(stdTypes(dontInclude), true);
|
|
261
|
+
} else if (existsSync(packageName)) {
|
|
262
|
+
straceLog('==> INCLUDE FILE', packageName);
|
|
263
|
+
r = _inc(packageName);
|
|
225
264
|
} else {
|
|
226
265
|
const packageName = includeContent.match('/') ? includeContent.split('/')[0] : includeContent;
|
|
227
266
|
const headerFile = includeContent.match('/') ? includeContent.replace(packageName+'/', '') : 'main.h.coffee';
|
|
228
267
|
const pathname = path.join(CONFIG_PATH, packageName, 'app', headerFile);
|
|
229
|
-
straceLog('==> INCLUDE PACKAGE',
|
|
268
|
+
straceLog('==> INCLUDE PACKAGE', packageName);
|
|
230
269
|
if(existsSync(pathname)) r = _inc(pathname);
|
|
231
270
|
}
|
|
232
271
|
if(dontInclude){
|
|
@@ -245,16 +284,22 @@ function useImp(token, options){
|
|
|
245
284
|
const value = token.value.slice(1, -1);
|
|
246
285
|
let packageName = value.slice(1);
|
|
247
286
|
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
287
|
straceLog('IMP() with HEADER for', packageName);
|
|
253
|
-
return includeFile(packageName, options);
|
|
288
|
+
return includeFile(packageName !== 'std' ? packageName : '*'+packageName, options);
|
|
254
289
|
}
|
|
255
290
|
return '';
|
|
256
291
|
}
|
|
257
292
|
|
|
293
|
+
function updateAliases(aliases, o = execOptions._syntaxAliases){
|
|
294
|
+
for(let h in o){
|
|
295
|
+
for(let i in o[h]){
|
|
296
|
+
if(!aliases[h]) aliases[h] = {};
|
|
297
|
+
aliases[h][i] = o[h][i]
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return aliases;
|
|
301
|
+
}
|
|
302
|
+
|
|
258
303
|
function compileRewStuff(content, options) {
|
|
259
304
|
straceLog('TOKENIZE() for CURRENTFILE');
|
|
260
305
|
const tokens = tokenizeCoffeeScript(content);
|
|
@@ -292,6 +337,19 @@ function compileRewStuff(content, options) {
|
|
|
292
337
|
}
|
|
293
338
|
}
|
|
294
339
|
|
|
340
|
+
if (token.type === "COMMENT" && token.value.startsWith('#alias')) {
|
|
341
|
+
let value = '#declare';
|
|
342
|
+
if(token.value.match(/^#alias\*/)) value += '*';
|
|
343
|
+
let subs;
|
|
344
|
+
subs = token.value.replace(/^#alias/, '');
|
|
345
|
+
if(token.value.endsWith('*')) subs.split('*')[1];
|
|
346
|
+
|
|
347
|
+
value += ' key';
|
|
348
|
+
value += ' ' + subs.replace(/([\S]+)\s*=\s*([\S]+)/, '"$1" = $2').trim();
|
|
349
|
+
value += ';';
|
|
350
|
+
declareAlias(aliases, {...token, value});
|
|
351
|
+
}
|
|
352
|
+
|
|
295
353
|
if (token.type === "COMMENT" && token.value.startsWith('#declare')) {
|
|
296
354
|
if (token.value.includes(';')) {
|
|
297
355
|
declareAlias(aliases, token);
|
|
@@ -309,28 +367,6 @@ function compileRewStuff(content, options) {
|
|
|
309
367
|
}
|
|
310
368
|
}
|
|
311
369
|
|
|
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
370
|
if (token.type === 'COMMENT' && token.value.slice(1).trim().startsWith('@jsx')) {
|
|
335
371
|
options.jsx = true;
|
|
336
372
|
straceLog('JSX() ENABLE WITH COMMENTS');
|
|
@@ -342,7 +378,7 @@ function compileRewStuff(content, options) {
|
|
|
342
378
|
|
|
343
379
|
if (token.type === 'COMMENT' && token.value.slice(1).trim() === '@cls') {
|
|
344
380
|
options.cls = true;
|
|
345
|
-
straceLog('
|
|
381
|
+
straceLog('CLI_SYNTAX() ENABLE');
|
|
346
382
|
straceLog('===> HIGHLY EXPERIMENTAL FEATURE DETECTED');
|
|
347
383
|
}
|
|
348
384
|
|
|
@@ -365,6 +401,11 @@ function compileRewStuff(content, options) {
|
|
|
365
401
|
token.value = 'pub';
|
|
366
402
|
straceLog('EXPORT() => TRANSLATING TO pub');
|
|
367
403
|
}
|
|
404
|
+
|
|
405
|
+
if (token.type === 'IDENTIFIER' && token.value === 'package' && nextToken.type == 'STRING') {
|
|
406
|
+
token.value = 'appPackage';
|
|
407
|
+
straceLog('APP_PACKAGE_CHANGE()');
|
|
408
|
+
}
|
|
368
409
|
|
|
369
410
|
if (token.type === 'IDENTIFIER' && token.value === 'using' && !options.disableUse) {
|
|
370
411
|
straceLog('USING()');
|
|
@@ -380,15 +421,30 @@ function compileRewStuff(content, options) {
|
|
|
380
421
|
} else straceLog('==> UNKNOWN');
|
|
381
422
|
}
|
|
382
423
|
|
|
424
|
+
if (token.type === 'IDENTIFIER' && token.value === 'as' && !options.keepImports) {
|
|
425
|
+
const isFrom = gnextToken(i, 3, tokens);
|
|
426
|
+
const isInImport = tokens[i-2];
|
|
427
|
+
if(isFrom?.token.value == 'from' && isInImport?.value !== '*'){
|
|
428
|
+
insertTokenAt(tokens, i, { type: 'WHITESPACE', value: ' ' });
|
|
429
|
+
insertTokenAt(tokens, i, { type: 'OTHER', value: '*' });
|
|
430
|
+
insertTokenAt(tokens, i, { type: 'WHITESPACE', value: ' ' });
|
|
431
|
+
insertTokenAt(tokens, i, { type: 'IDENTIFIER', value: 'import' });
|
|
432
|
+
i -= 1;
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
383
437
|
if (token.type === 'IDENTIFIER' && token.value === 'import' && !options.keepImports) {
|
|
384
438
|
// console.log(nextToken.type);
|
|
385
439
|
straceLog('IMPORT()');
|
|
386
|
-
straceLog('==> WARN: SLOWS DOWN
|
|
440
|
+
straceLog('==> WARN: SLOWS DOWN COMPILATION');
|
|
387
441
|
let ind = i + n + 2;
|
|
442
|
+
let isAs = false;
|
|
388
443
|
|
|
389
444
|
let defaultName;
|
|
390
445
|
if (nextToken.type === 'STRING') {
|
|
391
446
|
straceLog('==> SIMPLE');
|
|
447
|
+
if(useImp(nextToken, options)) updateAliases(aliases);
|
|
392
448
|
result += `inc ${nextToken.value}`;
|
|
393
449
|
i += n;
|
|
394
450
|
} else if (nextToken.value === '{') {
|
|
@@ -405,18 +461,21 @@ function compileRewStuff(content, options) {
|
|
|
405
461
|
|
|
406
462
|
straceLog('==>', exports, 'from', nameToken.value);
|
|
407
463
|
|
|
464
|
+
if(useImp(nameToken, options)) updateAliases(aliases);
|
|
408
465
|
result += `{ ${exports} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken.value}`;
|
|
409
466
|
i = nameToken.ti;
|
|
410
467
|
}
|
|
411
468
|
} else if (nextToken.value === '*') {
|
|
412
469
|
const asToken = fnextToken(ind, tokens, 'IDENTIFIER', 'as');
|
|
413
|
-
const nameToken = fnextToken(asToken.ri, tokens, 'STRING');
|
|
414
470
|
if (asToken) {
|
|
471
|
+
const nameToken = fnextToken(asToken.ti, tokens, 'STRING');
|
|
415
472
|
const nextToken = fnextToken(asToken.ti + 1, tokens, 'IDENTIFIER');
|
|
416
473
|
defaultName = nextToken.value;
|
|
417
474
|
straceLog('==>', defaultName, 'from', nameToken.value);
|
|
475
|
+
if(useImp(nameToken, options)) updateAliases(aliases);
|
|
418
476
|
result += `${defaultName} ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken.value}`;
|
|
419
477
|
i = ind + 6;
|
|
478
|
+
isAs = true;
|
|
420
479
|
}
|
|
421
480
|
} else if (nextToken) {
|
|
422
481
|
const nameToken = fnextToken(ind, tokens, 'STRING');
|
|
@@ -433,10 +492,12 @@ function compileRewStuff(content, options) {
|
|
|
433
492
|
.filter((t, i, arr) => !arr[i+1]?.match(':') && !arr[i-1]?.match(':'))
|
|
434
493
|
.join(', ');
|
|
435
494
|
straceLog('==>', defaultName, 'and', exports, 'from', nameToken.value);
|
|
495
|
+
if(useImp(nameToken, options)) updateAliases(aliases);
|
|
436
496
|
result += `{ default: ${defaultName}, ${exports} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken?.value || ''}`;
|
|
437
497
|
i = closingBraceToken.ti + 4;
|
|
438
498
|
}
|
|
439
499
|
} else {
|
|
500
|
+
if(useImp(nameToken || {}, options)) updateAliases(aliases);
|
|
440
501
|
result += `{ default: ${defaultName} } ${options.type == 'coffee' ? '=' : ':='} inc ${nameToken?.value || ''}`;
|
|
441
502
|
i = ind + 2;
|
|
442
503
|
}
|
|
@@ -451,19 +512,38 @@ function compileRewStuff(content, options) {
|
|
|
451
512
|
if(assertionToken.token.type == 'OTHER' && assertionToken.token.value == '{'){
|
|
452
513
|
hooks.push({
|
|
453
514
|
index: assertionToken.token.ti,
|
|
454
|
-
value: ' useDefaultForPackages: true, '
|
|
515
|
+
value: ' useDefaultForPackages: '+(isAs?'false':'true')+', '
|
|
455
516
|
})
|
|
456
517
|
} else {
|
|
457
|
-
result += 'useDefaultForPackages: true, '
|
|
518
|
+
result += 'useDefaultForPackages: '+(isAs?'false':'true')+', '
|
|
458
519
|
}
|
|
459
520
|
i += 3;
|
|
460
521
|
} else {
|
|
461
|
-
result += ", { useDefaultForPackages: true }"
|
|
522
|
+
result += ", { useDefaultForPackages: "+(isAs?'false':'true')+" }"
|
|
462
523
|
}
|
|
463
524
|
|
|
464
525
|
continue;
|
|
465
526
|
}
|
|
466
527
|
|
|
528
|
+
if (token.type === 'IDENTIFIER' && (token.value === 'imp' || token.value === 'inc')) {
|
|
529
|
+
straceLog('IMP() Detected');
|
|
530
|
+
let { token: t1 } = gnextToken(i, 1, tokens) || {};
|
|
531
|
+
let { token: t2 } = gnextToken(i, 2, tokens) || {};
|
|
532
|
+
let r = '';
|
|
533
|
+
|
|
534
|
+
if(t1?.value == '('){
|
|
535
|
+
if(t2?.type == 'STRING'){
|
|
536
|
+
r = useImp(t2, options);
|
|
537
|
+
}
|
|
538
|
+
} else if(t1?.type == 'STRING'){
|
|
539
|
+
r = useImp(t1, options);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
if(r) {
|
|
543
|
+
updateAliases(aliases);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
467
547
|
if (
|
|
468
548
|
token.type === 'IDENTIFIER' &&
|
|
469
549
|
token.value === 'pub' &&
|
|
@@ -516,16 +596,18 @@ function compileRewStuff(content, options) {
|
|
|
516
596
|
|
|
517
597
|
if (token.type === "COMMENT" && token.value.startsWith('#include')) {
|
|
518
598
|
const includeContent = token.value.split(' ')[1].trim() || '';
|
|
519
|
-
const
|
|
599
|
+
const _o = {...options};
|
|
600
|
+
const r = includeFile(includeContent, _o);
|
|
520
601
|
if(r){
|
|
521
602
|
result += r == 'intentional-nothing' ? '' : r;
|
|
522
|
-
aliases
|
|
523
|
-
...aliases,
|
|
524
|
-
...execOptions._syntaxAliases
|
|
525
|
-
}
|
|
603
|
+
updateAliases(aliases, _o.aliases);
|
|
526
604
|
}
|
|
527
605
|
}
|
|
528
606
|
}
|
|
607
|
+
|
|
608
|
+
if(options.included){
|
|
609
|
+
options.aliases = aliases;
|
|
610
|
+
}
|
|
529
611
|
// console.log(aliases);
|
|
530
612
|
// console.log(result);
|
|
531
613
|
return result;
|
|
@@ -540,6 +622,8 @@ const compileCivetStuff = (file, options) => {
|
|
|
540
622
|
straceLog('OPTION_PREPARE() for CURRENTFILE as', preCompileOptions);
|
|
541
623
|
const prepared = compileRewStuff(file.content, preCompileOptions);
|
|
542
624
|
|
|
625
|
+
// console.log(prepared);
|
|
626
|
+
|
|
543
627
|
const compileOptions = {
|
|
544
628
|
...preCompileOptions,
|
|
545
629
|
bare: true,
|
|
@@ -8,10 +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");
|
|
14
|
+
const reval = require("../functions/reval");
|
|
15
|
+
const STDNS = require("../const/stdns");
|
|
15
16
|
|
|
16
17
|
let mainFile = "";
|
|
17
18
|
const isMainFile = (filepath) => filepath == mainFile;
|
|
@@ -37,6 +38,7 @@ module.exports.prepareContext = function (
|
|
|
37
38
|
},
|
|
38
39
|
app: findAppInfo(filepath),
|
|
39
40
|
...fsLib(filepath),
|
|
41
|
+
...reval(filepath),
|
|
40
42
|
__using__: {}
|
|
41
43
|
};
|
|
42
44
|
if (options.useContext) {
|
|
@@ -45,14 +47,41 @@ module.exports.prepareContext = function (
|
|
|
45
47
|
...context,
|
|
46
48
|
};
|
|
47
49
|
} else {
|
|
50
|
+
const std = {...defaultContext};
|
|
48
51
|
context = {
|
|
49
52
|
...context,
|
|
50
|
-
...
|
|
53
|
+
...std,
|
|
51
54
|
...pathLib(filepath),
|
|
52
55
|
...execLib(filepath),
|
|
53
56
|
...custom_context,
|
|
54
57
|
Usage
|
|
55
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;
|
|
56
85
|
}
|
|
57
86
|
if (!context.process)
|
|
58
87
|
context.process = {
|
|
@@ -68,10 +97,19 @@ module.exports.prepareContext = function (
|
|
|
68
97
|
abort: () => process.abort(),
|
|
69
98
|
kill: () => process.kill(),
|
|
70
99
|
exit: (code) => process.exit(code),
|
|
100
|
+
chdir: (dir) => process.chdir(dir),
|
|
101
|
+
disconnect: () => process.disconnect(),
|
|
71
102
|
arch: process.arch,
|
|
72
103
|
pid: process.pid,
|
|
73
104
|
platform: process.platform,
|
|
74
|
-
|
|
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
|
+
}
|
|
75
113
|
};
|
|
76
114
|
|
|
77
115
|
context.global = context;
|
|
@@ -118,34 +156,7 @@ module.exports.prepareContext = function (
|
|
|
118
156
|
context.pub = pubFunction(context);
|
|
119
157
|
context.exports = exportsFunction(context);
|
|
120
158
|
|
|
121
|
-
context.using = (
|
|
122
|
-
if(name instanceof Usage.Group){
|
|
123
|
-
params.unshift(...name.g.slice(1));
|
|
124
|
-
name = name.g[0];
|
|
125
|
-
}
|
|
126
|
-
if(USING_DEFAULT[name]){
|
|
127
|
-
if(USING_DEFAULT[name].param) {
|
|
128
|
-
context.__using__[name] = USING_DEFAULT[name].param(...params);
|
|
129
|
-
}
|
|
130
|
-
} else if(name instanceof Namespace) {
|
|
131
|
-
const trigger = name.trigger;
|
|
132
|
-
const parentContext = name.parent || context;
|
|
133
|
-
const childContext = {...parentContext, ...name.namespace, trigger};
|
|
134
|
-
childContext.currentNamespace = name.namespace;
|
|
135
|
-
childContext.parentNamespace = parentContext;
|
|
136
|
-
const code = `(${trigger.toString()})()`;
|
|
137
|
-
if(name.onUse) name.onUse();
|
|
138
|
-
const r = runtime.exec(code, childContext, code, context.module.filepath);
|
|
139
|
-
if(name.onAfterUse) name.onAfterUse();
|
|
140
|
-
return r;
|
|
141
|
-
} else if(name instanceof Usage) {
|
|
142
|
-
const v = name.trigger(...params) || true;
|
|
143
|
-
if(name.save !== false) context.__using__[name.name] = v;
|
|
144
|
-
return v;
|
|
145
|
-
} else {
|
|
146
|
-
context.__using__[name] = params.length ? params.length > 1 ? [...params] : params : true;
|
|
147
|
-
}
|
|
148
|
-
};
|
|
159
|
+
context.using = usingFunction(context, runtime);
|
|
149
160
|
|
|
150
161
|
if(context.app?.config?.exec?.['auto import']){
|
|
151
162
|
const autoipath = path.join(context.app.path, context.app.config?.exec?.['auto import']);
|
|
@@ -36,7 +36,8 @@ module.exports.runPath = function runPath(filepath, options = {}, custom_context
|
|
|
36
36
|
|
|
37
37
|
if(context.app){
|
|
38
38
|
const p = path.join(CONFIG_PATH, context.app.config.manifest.package, 'app');
|
|
39
|
-
|
|
39
|
+
const p2 = path.join(CONFIG_PATH, context.app.config.manifest.package, 'app/.allow');
|
|
40
|
+
if(existsSync(p) && context.app.path !== p && !existsSync(p2)){
|
|
40
41
|
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.");
|
|
41
42
|
return {
|
|
42
43
|
context: { module: { exports: null } },
|
|
@@ -46,11 +47,21 @@ module.exports.runPath = function runPath(filepath, options = {}, custom_context
|
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
compiled_code = preScript+'\n'+compiled_code;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
|
|
51
|
+
let execd = exec(compiled_code, context, file.content);
|
|
52
|
+
|
|
53
|
+
if(context.module.main && (context.module.exports?.main || (typeof context.module.exports == "function" && context.module.exports.name == 'main'))){
|
|
54
|
+
const mainFn = context.module.exports.main ?? context.module.exports;
|
|
55
|
+
return {
|
|
56
|
+
context,
|
|
57
|
+
returns: mainFn.call(context, context.process.argv)
|
|
58
|
+
}
|
|
59
|
+
} else {
|
|
60
|
+
return {
|
|
61
|
+
context,
|
|
62
|
+
returns: execd,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
54
65
|
}
|
|
55
66
|
|
|
56
67
|
if(options.async){
|