@makano/rew 1.2.4 → 1.2.5

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/jsconfig.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "checkJs": true,
4
+ "lib": ["ESNext"],
5
+ "module": "Node16"
6
+ },
7
+ "include": [
8
+ "./runtime.d.ts"
9
+ ],
10
+ "typeAcquisition": {
11
+ "include": ["./runtime.d.ts"]
12
+ }
13
+ }
@@ -48,6 +48,11 @@ yargs(hideBin(process.argv))
48
48
  alias: 'w',
49
49
  describe: 'Watch the file for changes',
50
50
  type: 'boolean',
51
+ })
52
+ .option('compile', {
53
+ alias: 'c',
54
+ describe: 'Compile and output the javascript',
55
+ type: 'boolean',
51
56
  });
52
57
  },
53
58
  (argv) => {
@@ -56,7 +61,7 @@ yargs(hideBin(process.argv))
56
61
  log('File not found:'.red.bold, argv.file, ':end');
57
62
  return;
58
63
  }
59
- utils.runFileWithArgv(filePath, { watch: argv.watch });
64
+ utils.runFileWithArgv(filePath, { onlyCompile: argv.compile, watch: argv.watch });
60
65
  },
61
66
  )
62
67
  .command(
@@ -223,6 +228,10 @@ yargs(hideBin(process.argv))
223
228
  alias: 'r',
224
229
  describe: 'Install requirements of the app',
225
230
  type: 'boolean',
231
+ }).option('verbose', {
232
+ alias: 'v',
233
+ describe: 'Verbose',
234
+ type: 'boolean',
226
235
  }).option('update', {
227
236
  alias: 'u',
228
237
  describe: 'Update the app',
@@ -280,6 +289,20 @@ yargs(hideBin(process.argv))
280
289
  }
281
290
  },
282
291
  )
292
+
293
+ .command(
294
+ 'cache <command>',
295
+ 'Manage cache',
296
+ (yargs) => {
297
+ yargs.positional('command', {
298
+ describe: 'Command to clear/list',
299
+ type: 'string',
300
+ });
301
+ },
302
+ async (argv) => {
303
+ utils.cache(argv.command)
304
+ },
305
+ )
283
306
  .command(
284
307
  'repo <command> [name] [url]',
285
308
  'Manage install repositories',
@@ -4,6 +4,8 @@ const middlePrefix = '├';
4
4
  const separator = '│';
5
5
  const endPrefix = '╰';
6
6
 
7
+ let last = '';
8
+
7
9
  const log = (module.exports.log = function (...toPrint) {
8
10
  let prefix = start ? startPrefix : middlePrefix;
9
11
  let returns = false;
@@ -16,8 +18,10 @@ const log = (module.exports.log = function (...toPrint) {
16
18
  toPrint.pop();
17
19
  }
18
20
  if (prefix == endPrefix && start) prefix = separator;
19
- if (!start) console.log(separator);
21
+ // if(last == endPrefix && prefix == separator) prefix = startPrefix;
22
+ if (!start) console.log(last == endPrefix ? startPrefix : separator);
20
23
  if (start) start = false;
24
+ last = prefix;
21
25
  if (returns) return [prefix, ...toPrint].join(' ');
22
26
  else console.log(prefix, ...toPrint);
23
27
  });
@@ -1,8 +1,8 @@
1
1
  // run.js
2
2
  const { run } = require('../main');
3
3
 
4
- function exec(filePath, argv) {
5
- return run(filePath, { argv })?.context?.module?.imports || [];
4
+ function exec(filePath, argv, options = {}) {
5
+ return run(filePath, { argv, ...options })?.context?.module?.imports || [];
6
6
  }
7
7
 
8
8
  module.exports = { execRewFile: exec };
@@ -14,9 +14,14 @@ const { req } = require('../misc/req');
14
14
  const { CONFIG_PATH } = require('../const/config_path');
15
15
  const { watch } = require('chokidar');
16
16
  const { execRewFile } = require('./run');
17
+ const { seededID } = require('../misc/seededid');
18
+ const loading = require('loading-cli');
19
+ const sleep = require('../functions/sleep');
20
+ const { gen_key } = require('../misc/bin');
17
21
 
18
22
  const binpath = path.join(conf({}).create('').root, '.bin');
19
23
  const logspath = path.join(conf({}).create('').root, '.logs');
24
+ const cachepath = path.join(conf({}).create('').root, '.cache');
20
25
  const localBinPath = path.join(binpath, '../../../', 'bin');
21
26
 
22
27
  module.exports = {
@@ -30,7 +35,7 @@ module.exports = {
30
35
 
31
36
  const runIt = () => {
32
37
  if (options.watch) console.clear();
33
- const imports = execRewFile(filePath, [filePath, ...(argv || [])]);
38
+ const imports = execRewFile(filePath, [filePath, ...(argv || [])], { onlyCompile: options?.onlyCompile });
34
39
  if (options.watch) {
35
40
  imports.forEach((file) => {
36
41
  watchIt(file);
@@ -59,15 +64,19 @@ module.exports = {
59
64
  if (!fullPath || fullPath == 'list') {
60
65
  return fs.readdirSync(con.CONFIG_PATH).join('\n');
61
66
  } else {
62
- const name = fullPath.indexOf('/') ? fullPath.split('/')[0] : fullPath;
63
- const dpath = fullPath.indexOf('/') ? fullPath.split('/').slice(1).join('/') : '';
67
+ let name = fullPath.indexOf('/') ? fullPath.split('/')[0] : fullPath;
68
+ let dpath = fullPath.indexOf('/') ? fullPath.split('/').slice(1).join('/') : '';
69
+ if(fullPath.startsWith('/')){
70
+ dpath = name;
71
+ name = '';
72
+ }
64
73
  const root = con.create(name);
65
74
  if (dpath) {
66
75
  const fp = path.join(root.root, dpath);
67
- if (fs.existsSync(fp) && fs.statSync(fp).isDirectory()) {
76
+ if (!fullPath.startsWith('/') && fs.existsSync(fp) && fs.statSync(fp).isDirectory()) {
68
77
  return fs.readdirSync(fp).join('\n');
69
78
  } else {
70
- const o = con.create(name).optionCenter(dpath);
79
+ const o = dpath && dpath !== '/' ? root.optionCenter(dpath) : root.optionCenter('_default');
71
80
  return key ? o.get(key) : o.getAll(true);
72
81
  }
73
82
  } else {
@@ -75,14 +84,18 @@ module.exports = {
75
84
  }
76
85
  }
77
86
  } else {
78
- const name = fullPath.indexOf('/') ? fullPath.split('/')[0] : fullPath;
79
- const dpath = fullPath.indexOf('/') ? fullPath.split('/')[1] : '';
80
- if (name && key) {
87
+ let name = fullPath.indexOf('/') ? fullPath.split('/')[0] : fullPath;
88
+ let dpath = fullPath.indexOf('/') ? fullPath.split('/')[1] : '';
89
+ if(fullPath.startsWith('/')){
90
+ dpath = name == '/' ? '_default' : name;
91
+ name = '';
92
+ }
93
+ if (key) {
81
94
  const root = con.create(name);
82
95
  const o = dpath ? root.optionCenter(dpath) : root;
83
96
  if (command == 'set') {
84
97
  if (value) {
85
- o.set(key, value);
98
+ o.set(key, value == 'false' || value == 'true' ? (value == 'true' ? true : false) : !isNaN(parseFloat(value)) ? parseFloat(value) : value);
86
99
  } else {
87
100
  log('Value not specified', ':end');
88
101
  }
@@ -90,7 +103,7 @@ module.exports = {
90
103
  o.remove(key);
91
104
  }
92
105
  } else {
93
- log(!name ? 'Path not specified' : 'Key not specified', ':end');
106
+ log('Key not specified', ':end');
94
107
  }
95
108
  }
96
109
  },
@@ -113,6 +126,10 @@ module.exports = {
113
126
  fs.writeFileSync(path.join(projectPath, '.gitignore'), `node_modules/\npackage-lock.json`);
114
127
  execSync('cd ' + projectPath + ' && git init . && git branch -m main', { stdio: 'ignore' });
115
128
  }
129
+ if(project.intellisense){
130
+ fs.copyFileSync(path.join(__dirname, '../../../jsconfig.json'), path.join(projectPath, 'jsconfig.json'));
131
+ fs.copyFileSync(path.join(__dirname, '../../../runtime.d.ts'), path.join(projectPath, 'runtime.d.ts'));
132
+ }
116
133
  execSync('cd ' + projectPath + ' && npm init -y', { stdio: 'ignore' });
117
134
  // log('Installing '+npm_package_name);
118
135
  // exec('cd '+projectPath+' && npm i '+npm_package_name, (err) => {
@@ -130,9 +147,12 @@ module.exports = {
130
147
  rl.question(logget(' Package Name: '.blue), (pkg) => {
131
148
  if (pkg.trim()) {
132
149
  project.package = pkg.trim();
133
- rl.question(logget('󰊢 Use git(y/N): '.yellow.bold), (use_git) => {
134
- project.git = use_git.toLowerCase() == 'y' || use_git.toLowerCase() == 'yes';
135
- create();
150
+ rl.question(logget(' Use intellisense declarations ? (y/N): '.magenta.bold), (inteli) => {
151
+ project.intellisense = inteli.toLowerCase() == 'y' || inteli.toLowerCase() == 'yes';
152
+ rl.question(logget('󰊢 Use git ? (y/N): '.yellow.bold), (use_git) => {
153
+ project.git = use_git.toLowerCase() == 'y' || use_git.toLowerCase() == 'yes';
154
+ create();
155
+ });
136
156
  });
137
157
  } else {
138
158
  rl.close();
@@ -195,28 +215,29 @@ module.exports = {
195
215
  });
196
216
  log(' Installing '.blue + pname.green.bold);
197
217
  log(' Package'.blue + ': ' + p.name.green + '@' + p.version.yellow);
198
- if (p.descriptiondescription) {
199
- log(' Description'.blue + ': ' + p.description);
218
+ if (p.description) {
219
+ log(' Description'.blue + '\n' + p.description.split('\n').map((i, ind, a) => ' '+(ind == 0 && a.length > 1 ? log.startPrefix : (a.length-1 == ind ? log.endPrefix : log.middlePrefix))+' '+i).join('\n'), ':end');
220
+ }
221
+ if (p.keywords && p.keywords.length) {
222
+ log(' Tags'.blue + '\n ' + log.endPrefix + p.keywords.map(i => '#'+i).join(' '), ':end')
200
223
  }
201
224
  const done = (f) => {
202
225
  if (f.toLowerCase() == 'y' || f.toLowerCase() == 'yes') {
203
226
  if (fs.existsSync(installPath)) {
204
227
  execSync(`rm -r ${installPath}`);
205
228
  }
206
- execSync(`cp -r ${apppath} ${installPath}`);
207
- execSync(`chmod 444 ${installPath}/app.yaml`);
208
- if (rmidir) {
209
- execSync(`rm -r ${apppath}`);
210
- }
211
- log(' Installed '.green + pname.cyan.bold, c.install ? '' : ':end');
212
- if (c.install) {
213
- if (c.install.build) {
214
- log(' Building'.blue);
229
+ if (c.install?.build) {
230
+ log(' Building'.blue);
231
+ try{
215
232
  this.build({
216
233
  ...c.install.build,
217
- file: path.join(installPath, c.install.build.file)
234
+ file: path.join(apppath, c.exec[c.install.build.file] || c.install.build.file)
218
235
  });
219
- }
236
+ } catch(e){}
237
+ }
238
+ execSync(`cp -r ${apppath} ${installPath}`);
239
+ execSync(`chmod 444 ${installPath}/app.yaml`);
240
+ if (c.install) {
220
241
  if (c.install.commands) {
221
242
  for (let command of c.install.commands) {
222
243
  try{
@@ -224,7 +245,7 @@ module.exports = {
224
245
  } catch(e){
225
246
  const logFile = path.join(logspath, 'logs-'+Date.now()+'.log');
226
247
  fs.writeFileSync(logFile, e.toString() +'\n'+ e.stack);
227
- log(` Command Failed: ${command}, check logs at ${logFile}`, ':end');
248
+ log(` Command Failed: ${command}, check logs at ${logFile}`);
228
249
  }
229
250
  }
230
251
  }
@@ -232,28 +253,32 @@ module.exports = {
232
253
  this.runFileWithArgv(path.join(installPath, c.exec[c.install.file] || c.install.file), {}, []);
233
254
  }
234
255
  if (c.install.requirements) {
235
- this.installReq(c);
256
+ this.installReq(c, opts);
236
257
  }
237
258
  if (c.install.exec) {
238
259
  // this.installReq(c);
239
- for (let i in c.install.exec) {
240
- let iff = c.install.exec[i];
241
- if (iff in c.exec) iff = c.exec[iff];
242
- const file = path.join(installPath, iff);
243
- const filepath = path.join(binpath, i);
244
- const binfp = path.join(localBinPath, i);
245
- if (!fs.existsSync(localBinPath)) fs.mkdirSync(localBinPath, { recursive: true });
246
- fs.writeFileSync(filepath, `#!/usr/bin/env bash\n#@app.${pname}\nrew ${file} $*`);
247
- fs.chmodSync(filepath, '755');
248
- fs.linkSync(filepath, binfp);
260
+ if(conf({}).create('').get('executables') == false){
261
+ log(' Ignoring executables'.blue);
262
+ } else {
263
+ for (let i in c.install.exec) {
264
+ let iff = c.install.exec[i];
265
+ if (iff in c.exec) iff = c.exec[iff];
266
+ const file = path.join(installPath, iff);
267
+ const filepath = path.join(binpath, i);
268
+ const binfp = path.join(localBinPath, i);
269
+ if (!fs.existsSync(localBinPath)) fs.mkdirSync(localBinPath, { recursive: true });
270
+ fs.writeFileSync(filepath, `#!/usr/bin/env bash\n#@app.${pname}\nrew ${file} $*`);
271
+ fs.chmodSync(filepath, '755');
272
+ if(fs.existsSync(binfp)) fs.unlinkSync(binfp);
273
+ fs.linkSync(filepath, binfp);
274
+ }
249
275
  }
250
276
  }
277
+
278
+ log(' Installed '.green + pname.cyan.bold, ':end');
251
279
  }
252
280
  rl.close();
253
281
  } else {
254
- if (rmidiri) {
255
- execSync(`rm -rf ${apppath}`);
256
- }
257
282
  log(' Canceled install'.red.bold, ':end');
258
283
  rl.close();
259
284
  }
@@ -355,21 +380,51 @@ module.exports = {
355
380
  processFile(filePath, importsArray);
356
381
  log('󰈔 Compiled'.yellow, (importsArray.length + 1 + '').blue, `file${importsArray.length ? 's' : ''}.`.yellow, ':end');
357
382
  },
358
- async cloneGit(gitpath) {
383
+ cache(command){
384
+ if(command == 'list'){
385
+ console.log(fs.readdirSync(cachepath).join('\n').trim());
386
+ } else {
387
+ fs.readdirSync(cachepath).forEach(file => fs.rmSync(path.join(cachepath, file), { recursive: true }));
388
+ }
389
+ },
390
+ async cloneGit(gitpath, opts) {
359
391
  const p = gitpath.split('github:')[1];
392
+ const clonePath = path.join(cachepath, 'rew-git-clone-'+gen_key(gitpath).substring(0, 12));
360
393
  const url = `https://github.com/${p}`;
361
- const apiurl = `https://api.github.com/repos/${p}`;
394
+ const apiurl = `https://api.github.com/repos/${p}/commits`;
395
+ const load = loading("Finding Repo...".yellow).start();
362
396
  try {
363
397
  const response = await req(apiurl);
364
- if (response.status !== 200) return log(' Repo not found'.red.bold, ':end');
365
- log(''.blue, 'Cloning from github'.yellow);
366
- const tempPath = '/tmp/rew-git-clone-' + p.replace(/\//g, '_') + '-' + generateRandomID();
367
- execSync(`git clone ${url} ${tempPath}`, { stdio: 'ignore' });
368
- log(''.blue, 'Installing deps...'.yellow);
369
- execSync(`cd ${tempPath} && npm i`);
370
- return tempPath;
398
+ if (response.status !== 200) {
399
+ load.stop();
400
+ return log(' Package not found in github'.red.bold, ':end');
401
+ }
402
+ let pull = false;
403
+ if(fs.existsSync(clonePath)){
404
+ if(fs.existsSync(path.join(clonePath, response.data[0].sha))){
405
+ load.stop();
406
+ log('Found Cache'.yellow);
407
+ return clonePath+'/clone';
408
+ } else {
409
+ pull = true;
410
+ }
411
+ }
412
+ fs.mkdirSync(clonePath, { recursive: true });
413
+ fs.writeFileSync(path.join(clonePath, response.data[0].sha), '');
414
+ load.text = 'Cloning from github'.blue.bold;
415
+ await sleep(100)
416
+ if(pull) execSync(`cd ${clonePath}/clone && git pull`, { stdio: opts.verbose ? 'inherit' : 'ignore' });
417
+ else execSync(`git clone ${url} ${clonePath}/clone`, { stdio: opts.verbose ? 'pipe' : 'ignore' });
418
+ load.text = 'Installing npm packages'.green.bold;
419
+ await sleep(100)
420
+ execSync(`cd ${clonePath}/clone && npm i`, { stdio: opts.verbose ? 'inherit' : 'ignore' });
421
+ load.stop();
422
+ return clonePath+'/clone';
371
423
  } catch (e) {
372
- log(' Repo not found'.red.bold, ':end');
424
+ const logFile = path.join(logspath, 'logs-'+Date.now()+'.log');
425
+ fs.writeFileSync(logFile, e.toString() +'\n'+ e.stack);
426
+ load.stop();
427
+ log(' Something went wrong, check logs at'.red.bold, logFile.green, ':end');
373
428
  }
374
429
  },
375
430
  findRepo(repo) {
@@ -377,7 +432,7 @@ module.exports = {
377
432
  return repos.get(repo);
378
433
  },
379
434
  async installAppFrom(path, opts) {
380
- if (path.startsWith('github:')) this.installApp(await this.cloneGit(path), opts, true, true);
435
+ if (path.startsWith('github:')) this.installApp(await this.cloneGit(path, opts), opts, true);
381
436
  else if (path.startsWith('@')) this.fromRepo(path, opts);
382
437
  else this.installApp(path, opts, null, null);
383
438
  },
@@ -465,7 +520,7 @@ module.exports = {
465
520
  console.log(Object.keys(confInstance.getAll()).join('\n'));
466
521
  }
467
522
  } else if (command === 'delete') {
468
- confInstance.remove('repos');
523
+ confInstance.remove(key);
469
524
  } else {
470
525
  log(' Invalid command'.red.bold, ':end');
471
526
  }
@@ -474,6 +529,7 @@ module.exports = {
474
529
  log('First time init')
475
530
  conf({}).create('').optionCenter('repos').set('rewpkgs', '//raw.githubusercontent.com/kevinJ045/rewpkgs/main/main.yaml');
476
531
  fs.mkdirSync(binpath, { recursive: true });
532
+ fs.mkdirSync(cachepath, { recursive: true });
477
533
  fs.mkdirSync(logspath, { recursive: true });
478
534
  }
479
535
  };
@@ -12,6 +12,7 @@ const { curl } = require('../functions/curl');
12
12
  const { wait } = require('../functions/wait');
13
13
  const { scheduleFrame } = require('../functions/misc');
14
14
  const { jsons, yaml, json, yamls } = require('../functions/json');
15
+ const { generateRandomID } = require('../functions/id');
15
16
 
16
17
  module.exports = {
17
18
  cenum,
@@ -49,6 +50,8 @@ module.exports = {
49
50
  yaml,
50
51
  yamls,
51
52
 
53
+ genID: generateRandomID,
54
+
52
55
  curl,
53
56
 
54
57
  print,
@@ -1,6 +1,6 @@
1
1
  const execOptions = {
2
2
  sharedContext: true,
3
- resolveExtensions: [{ ext: '.js', options: { type: 'js' } }, { ext: '.qrew', options: { qrew: true } }, '.coffee'],
3
+ resolveExtensions: ['.coffee', { ext: '.js', options: { type: 'js' } }, { ext: '.qrew', options: { qrew: true } }],
4
4
  nativeRequire: false,
5
5
  cwdAlias: '$',
6
6
  jsxPragma: 'createElement',
@@ -23,8 +23,8 @@ module.exports = (currentFile) => {
23
23
  );
24
24
  };
25
25
 
26
- function spawn(command, options) {
27
- return shell.spawn(command, options);
26
+ function spawn(command, ...args) {
27
+ return shell.spawn(command, ...args);
28
28
  }
29
29
 
30
30
  return { exec, spawn };
@@ -1,5 +1,5 @@
1
- module.exports.generateRandomID = function generateRandomID(length = 12) {
2
- const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
1
+ module.exports.generateRandomID = function generateRandomID(length = 12, _characters) {
2
+ const characters = _characters || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
3
3
  const charactersLength = characters.length;
4
4
  let randomID = '';
5
5
 
@@ -57,7 +57,7 @@ module.exports.imp = function (runPath, context) {
57
57
  exports = foundCache.exports;
58
58
  }
59
59
 
60
- if (!ispkg && !existsSync(filepath)) {
60
+ if (!ispkg && !existsSync(filepath) && !foundCache) {
61
61
  if (Array.isArray(execOptions.resolveExtensions) && execOptions.resolveExtensions.length) {
62
62
  const resolve = execOptions.resolveExtensions.find((ext) =>
63
63
  typeof ext == 'string' ? existsSync(filepath + ext) : existsSync(filepath + (ext.ext || '')),
@@ -119,8 +119,24 @@ module.exports.imp = function (runPath, context) {
119
119
  }
120
120
  }
121
121
 
122
- if (!ispkg) context.module.imports.push(filepath);
123
- if (!ispkg) cachedFiles.push({ filepath, exports });
122
+ // Hehe, i just had an idea for a
123
+ // descriptive code
124
+ // you put them in comment blocks
125
+ // and name it something
126
+ // then you can simple see
127
+ // which part of a code contains a certain
128
+ // task. cool right?
129
+
130
+ //** If is not package, post exec section
131
+ /**/ if (!ispkg) context.module.imports.push(filepath);
132
+ /**/ if (!ispkg) cachedFiles.push({ filepath, exports });
133
+ //**
134
+
135
+ //** Mock imports section
136
+ /**/ if(!exports) exports = options.mock;
137
+ /**/ if(options.mock == null) return null;
138
+ /**/ if(!exports) throw new Error('Import '+filename+' does not export anything. Use the "mock" option to mock a value.');
139
+ //**
124
140
 
125
141
  return exports;
126
142
  };
@@ -145,6 +145,19 @@ function compileRewStuff(content, options) {
145
145
  continue;
146
146
  }
147
147
 
148
+
149
+ if (token.type === 'IDENTIFIER' && token.value === 'let') {
150
+ result += '`'
151
+ hooks.push({
152
+ index: fnextToken(i, tokens, 'OTHER', ';').ti,
153
+ value: `\``,
154
+ });
155
+ }
156
+
157
+ if (token.type === 'IDENTIFIER' && token.value === 'export') {
158
+ token.value = 'pub';
159
+ }
160
+
148
161
  if (token.type === 'IDENTIFIER' && token.value === 'import') {
149
162
  // console.log(nextToken.type);
150
163
  let ind = i + n + 2;
@@ -213,9 +226,16 @@ function compileRewStuff(content, options) {
213
226
  nextToken.value &&
214
227
  nextToken.value !== 'undefined'
215
228
  ) {
229
+ let next = {...nextToken};
230
+ if(next.value == 'default'){
231
+ i += 2;
232
+ }
233
+ if(next.value == 'class'){
234
+ next.value = gnextToken(i, n + 1, tokens)?.token.value || "default";
235
+ }
216
236
  hooks.push({
217
237
  index: i + 1,
218
- value: `"${nextToken.value}", `,
238
+ value: `"${next.value}", `,
219
239
  });
220
240
  }
221
241
 
@@ -254,13 +274,20 @@ const cpl = (module.exports.compile = function (file, options = {}) {
254
274
 
255
275
  module.exports.compileFile = function (filepath, options = {}) {
256
276
  const f = getFile(filepath);
277
+ let qrew = false;
257
278
 
258
279
  if(options.qrew || path.extname(filepath) == '.qrew') {
280
+ qrew = true
259
281
  f.content = from_qrew(readFileSync(f.path), options.package || findAppInfo(filepath)?.config.manifest.package || path.basename(filepath).split('.').slice(0, -1).join('.')).toString();
260
- }
282
+ }
261
283
 
262
284
  let compiled_code = cpl(f, { ...options });
263
285
 
286
+ if(options.onlyCompile && !qrew){
287
+ console.log(compiled_code);
288
+ process.exit();
289
+ }
290
+
264
291
  return {
265
292
  compiled_code,
266
293
  file: f,
@@ -82,7 +82,7 @@ module.exports = (context) => ({
82
82
  };
83
83
 
84
84
  return {
85
- get: (key, defaultValue) => getData(optionCenter, key) || defaultValue,
85
+ get: (key, defaultValue) => getData(optionCenter, key) ?? defaultValue,
86
86
  set: (key, value) => setData(optionCenter, key, value),
87
87
  remove: (key) => removeData(optionCenter, key),
88
88
  reset: () => fs.writeFileSync(optionCenter.root, dumpYaml(defaults)) && (conf[name] = defaults),
@@ -169,6 +169,7 @@ const createDB = (dbName, dirname, dbData = {}, encryptionKey) => {
169
169
  };
170
170
 
171
171
  const update = (caseRecord, newRecord) => {
172
+
172
173
  let id;
173
174
  if (typeof caseRecord === 'string') {
174
175
  id = caseRecord;
@@ -224,6 +225,9 @@ const createDB = (dbName, dirname, dbData = {}, encryptionKey) => {
224
225
  if (typeof criteria == 'string') return read(criteria);
225
226
  if (!criteria || typeof criteria !== 'object') return null;
226
227
 
228
+
229
+ if (!fs.existsSync(collectionFilePath)) writeDataFile(collectionFilePath, []);
230
+
227
231
  const data = readDataFile(collectionFilePath);
228
232
  const record =
229
233
  data.find((record) => {
@@ -240,7 +244,6 @@ const createDB = (dbName, dirname, dbData = {}, encryptionKey) => {
240
244
 
241
245
  const remove = (id) => {
242
246
  if ('@rune.id' in id) id = id['@rune.id'];
243
- if (!fs.existsSync(collectionFilePath)) return false;
244
247
  let data = readDataFile(collectionFilePath);
245
248
  const index = data.findIndex((record) => record['@rune.id'] === id);
246
249
  if (index !== -1) {
@@ -293,6 +296,8 @@ const createDB = (dbName, dirname, dbData = {}, encryptionKey) => {
293
296
  return sortedData;
294
297
  };
295
298
 
299
+ if (!fs.existsSync(collectionFilePath)) writeDataFile(collectionFilePath, []);
300
+
296
301
  return {
297
302
  insert,
298
303
  read,
@@ -377,6 +382,8 @@ const createDB = (dbName, dirname, dbData = {}, encryptionKey) => {
377
382
  return data;
378
383
  };
379
384
 
385
+ if (!fs.existsSync(mapFilePath)) writeDataFile(mapFilePath, {});
386
+
380
387
  return { set, get, remove, list, transform };
381
388
  };
382
389
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@makano/rew",
3
- "version": "1.2.4",
3
+ "version": "1.2.5",
4
4
  "description": "A simple coffescript runtime and app manager",
5
5
  "main": "main.js",
6
6
  "directories": {
@@ -11,6 +11,8 @@
11
11
  },
12
12
  "files": [
13
13
  "lib/",
14
+ "runtime.d.ts",
15
+ "jsconfig.json",
14
16
  "main.js",
15
17
  "README.md"
16
18
  ],
@@ -38,6 +40,7 @@
38
40
  "colors": "^1.4.0",
39
41
  "deasync": "^0.1.30",
40
42
  "js-yaml": "^4.1.0",
43
+ "loading-cli": "^1.1.2",
41
44
  "tiny-msgpack": "^2.2.0",
42
45
  "uuid": "^9.0.1",
43
46
  "vm": "^0.1.0",
package/runtime.d.ts ADDED
@@ -0,0 +1,371 @@
1
+
2
+ interface ImportOptions {
3
+ /**
4
+ * Determines how to import the given module
5
+ */
6
+ type: 'js' | 'coffee' | 'yaml' | 'json' | 'qrew';
7
+ [key: string]: any;
8
+ }
9
+
10
+ interface ModuleConfOptionCenter {
11
+ /**
12
+ * Get a config key
13
+ * @param key The key of the config to get
14
+ * @param defaultValue The default value ig null
15
+ * @returns The value of the key or the defaultValue if it's null.
16
+ */
17
+ get: <T = any>(key: string, defaultValue?: T) => T
18
+ /**
19
+ * Set a config key
20
+ * @param key The key of the config to set
21
+ * @param value The value to set it to
22
+ * @returns true if it was a success
23
+ */
24
+ set: <T = any>(key: string, value: T) => boolean
25
+ /**
26
+ * Removes a key from the config
27
+ * @param key The key of the config to remove
28
+ * @returns true if it was a success
29
+ */
30
+ remove: (key: string) => boolean
31
+ /**
32
+ * Resets the entire config option center to it's default value
33
+ */
34
+ reset: () => boolean
35
+ /**
36
+ * Get all values in an option center
37
+ * @param str
38
+ * @returns
39
+ */
40
+ getAll: (() => string) | ((str?: false) => Record<string, any>)
41
+ }
42
+
43
+ interface ModuleConf extends ModuleConfOptionCenter {
44
+ /**
45
+ * A separate options file for a related set of options
46
+ * @param name The option center full path
47
+ * @param defaults The default values
48
+ *
49
+ * @example
50
+ * conf = imp 'conf'
51
+ *
52
+ * animations = conf.optionCenter 'animations', enable: false, speed: '1x'
53
+ *
54
+ * if animations.get 'enable'
55
+ * animate animations.get 'speed'
56
+ */
57
+ optionCenter: (name: string, defaults?: any) => ModuleConfOptionCenter;
58
+ /**
59
+ * Manage Static files
60
+ */
61
+ staticFile: (name: string, defaults?: any) => {
62
+ write: (value: any, ifExists?: boolean) => this,
63
+ read: (to?: string | object) => string | object | Buffer,
64
+ fileRoot: string,
65
+ exists: boolean
66
+ }
67
+ }
68
+
69
+ interface ModuleEnv {
70
+ has: (key: string) => boolean,
71
+ get: (key: string) => string,
72
+ set: (key: string, value: string) => boolean,
73
+ rm: (key: string) => boolean,
74
+ is: (key: string, value: string) => boolean,
75
+ }
76
+
77
+ interface ModuleRuneDBCollcetion {
78
+ insert(record: object): any;
79
+ read(id: string | object, evaluate?: boolean): any;
80
+ update(caseRecord: string | object, newRecord: object): any;
81
+ remove(id: string | object): boolean;
82
+ find(criteria: string | object): any;
83
+ map(cb: (data: any[]) => any[], mutate?: boolean): any[];
84
+ transform(cb: (data: any[]) => any[], mutate?: boolean): any[];
85
+ filter(cb: (data: any[]) => boolean, mutate?: boolean): any[];
86
+ sort(cb: (a: any, b: any) => number, mutate?: boolean): any[];
87
+ list(): any[];
88
+ }
89
+
90
+ interface ModuleRuneDBMap {
91
+ set(key: string, value: any): void;
92
+ get(key: string): any | null;
93
+ remove(key: string): boolean;
94
+ transform(cb: (data: any) => any, mutate?: boolean): any;
95
+ list(): { [key: string]: any };
96
+ }
97
+
98
+ interface ModuleRuneDB {
99
+ collection: (name: string) => ModuleRuneDBCollcetion
100
+ map: (name: string) => ModuleRuneDBMap
101
+ findRef: (ref: string) => any
102
+ setData: (data: Record<string, any>) => void
103
+ getData: () => Record<string, any>
104
+ makeRef(value: object, props?: string): string | null;
105
+ }
106
+
107
+ interface ModuleRune {
108
+ db(dbname: string, data?: object, encryptionKey?: string): ModuleRuneDB;
109
+ genKey(secret: string): string;
110
+ push(...values: any[]): PushChange;
111
+ pop(...values: any[]): PopChange;
112
+ }
113
+
114
+ interface ModuleThreads {
115
+ thread: (cb: Function) => {
116
+ stopAll: () => void
117
+ start: (context: Record<string, any>) => {
118
+ on: (event: string, callback: (data) => void) => void;
119
+ off: (event: string, callback: (data) => void) => void;
120
+ emit: (event: string, data: any) => void;
121
+ get: () => Promise,
122
+ stop: () => void
123
+ }
124
+ }
125
+ }
126
+
127
+ declare function imp(path: "conf", options?: ImportOptions): ModuleConf;
128
+ declare function imp(path: "env", options?: ImportOptions): ModuleEnv;
129
+ declare function imp(path: "rune", options?: ImportOptions): ModuleRune;
130
+ declare function imp(path: "threads", options?: ImportOptions): ModuleThreads;
131
+ declare function imp(path: string, options?: ImportOptions): any;
132
+
133
+ declare const inc = imp;
134
+
135
+ declare function require(moduleName: string): any;
136
+
137
+ interface Module {
138
+ exports: any;
139
+ filepath: string;
140
+ main: boolean;
141
+ impots: string[];
142
+ compiled: string
143
+ }
144
+
145
+ declare const module: Module;
146
+
147
+ interface Imports {
148
+ meta: {},
149
+ assets: any
150
+ }
151
+
152
+ declare const imports: Imports;
153
+
154
+ declare const process: {
155
+ argv: string[],
156
+ target: ReturnType<typeof emitter>,
157
+ __execFile: string,
158
+ env: Record<string, any>,
159
+ cwd: () => string,
160
+ arch: string,
161
+ exit: () => void
162
+ };
163
+
164
+ interface AppConfig {
165
+ manifest: {
166
+ package: string
167
+ }
168
+ }
169
+
170
+ declare const app: {
171
+ path: string,
172
+ config: AppConfig
173
+ }
174
+
175
+
176
+ declare function read(filepath: string, options?: { encoding: string }): string;
177
+
178
+ declare function realpath(filepath: string, options?: { encoding: string }): string;
179
+
180
+ declare function write(filepath: string, content: any, options?: any): void;
181
+
182
+ declare function exists(filepath: string, options?: any): boolean;
183
+
184
+ declare function fstat(filepath: string, options?: any): any;
185
+
186
+ declare function rm(filepath: string, options?: any): void;
187
+
188
+ declare function chmod(filepath: string, mode: any, options?: any): void;
189
+
190
+ declare function mkdir(filepath: string, options?: any): void;
191
+
192
+ declare function ls(filepath: string, options?: any): string[];
193
+
194
+ declare function struct(template: { [key: string]: any }): (...args: any[]) => any;
195
+
196
+ declare function future(callback: (resolve: (data: any) => void, reject: (data: any) => void) => void, timeout?: number, defData?: any): {
197
+ pipe(callback: (data: any) => any): Promise<any>;
198
+ last(callback: (data: any) => any): Promise<any>;
199
+ catch(callback: (data: any) => any): Promise<any>;
200
+ resolve(data: any): void;
201
+ reject(data: any): void;
202
+ wait(): Promise<any>;
203
+ };
204
+ declare namespace future {
205
+ function promise(promse: Promise<any>, timeout?: number, defData?: any): ReturnType<typeof future>;
206
+ }
207
+
208
+ declare function emitter(): {
209
+ on(event: string | string[], callback: (...args: any[]) => void, props?: {}): ReturnType<typeof emitter>;
210
+ off(event: string | string[], callback: (...args: any[]) => void, removable?: (event: any) => void): ReturnType<typeof emitter>;
211
+ emit(event: string | string[], ...data: any[]): ReturnType<typeof emitter>;
212
+ };
213
+ declare function exec(command: string, options?: { output?: boolean }): any;
214
+ declare namespace exec {
215
+ function background(command: string, options?: any, callback?: (...args: any[]) => void): any;
216
+ }
217
+ declare function spawn(command: string, ...args: any[]): any;
218
+
219
+ declare function typedef(value: any, strict?: boolean): { strict: boolean; defaultValue: any; class: Function; type: string; isConstucted: boolean; isEmpty: boolean };
220
+
221
+ declare function typeis(obj: any, typeDef: any): boolean;
222
+
223
+ declare function typex(child: any, parent: any): boolean;
224
+
225
+ declare function typei(child: any, parent: any): boolean;
226
+
227
+ declare function int(str: string): number;
228
+
229
+ declare namespace int {
230
+ const type: { strict: boolean; defaultValue: number; class: Function; type: string; isConstucted: boolean; isEmpty: boolean };
231
+ }
232
+ declare function float(str: string): number;
233
+ declare namespace float {
234
+ const type: { strict: boolean; defaultValue: number; class: Function; type: string; isConstucted: boolean; isEmpty: boolean };
235
+ }
236
+ declare function num(str: string): number;
237
+ declare namespace num {
238
+ const type: { strict: boolean; defaultValue: number; class: Function; type: string; isConstucted: boolean; isEmpty: boolean };
239
+ }
240
+ declare function str(str: any): string;
241
+ declare namespace str {
242
+ const type: { strict: boolean; defaultValue: string; class: Function; type: string; isConstucted: boolean; isEmpty: boolean };
243
+ }
244
+ declare function bool(value: any): boolean;
245
+ declare namespace bool {
246
+ const type: { strict: boolean; defaultValue: boolean; class: Function; type: string; isConstucted: boolean; isEmpty: boolean };
247
+ }
248
+ declare function isEmpty(value: any): boolean;
249
+ declare function clone(value: any): any;
250
+ declare function deepClone(value: any): any;
251
+ declare function merge(obj1: any, obj2: any): any;
252
+ declare const uniqueId: () => string;
253
+ declare function filter(arr: any[], fn: (value: any) => boolean): any[];
254
+ declare function reduce(arr: any[], fn: (acc: any, value: any) => any, initial: any): any;
255
+ declare function compose(...fns: Function[]): (initialValue: any) => any;
256
+ declare function curry(fn: Function): (...args: any[]) => any;
257
+ declare function json(thing: string): any;
258
+ declare function jsons(thing: any): string;
259
+ declare function yaml(thing: any): any;
260
+ declare function yamls(thing: any): string;
261
+
262
+
263
+ /**
264
+ * Makes a HTTP request to the specified URL.
265
+ * @param url The URL to request.
266
+ * @param options The options for the request.
267
+ * @returns A promise resolving to the response or other specified output based on the options.
268
+ */
269
+ declare function curl(url: string, options: {
270
+ /**
271
+ * Indicates whether to return a promise.
272
+ */
273
+ a: true,
274
+ /**
275
+ * Indicates whether to return the response as plain text.
276
+ */
277
+ text: true,
278
+ o?: string
279
+ }): Promise<string>;
280
+ /**
281
+ * Makes a HTTP request to the specified URL.
282
+ * @param url The URL to request.
283
+ * @param options The options for the request.
284
+ * @returns A promise resolving to the response or other specified output based on the options.
285
+ */
286
+ declare function curl(url: string, options: {
287
+ /**
288
+ * Indicates whether to return a promise.
289
+ */
290
+ a: true,
291
+ /**
292
+ * Indicates whether to return the response as JSON.
293
+ */
294
+ json: true,
295
+ /**
296
+ * The file path to output the response.
297
+ */
298
+ o?: string
299
+ }): Promise<object>;
300
+ /**
301
+ * Makes a HTTP request to the specified URL.
302
+ * @param url The URL to request.
303
+ * @param options The options for the request.
304
+ * @returns A promise resolving to the response or other specified output based on the options.
305
+ */
306
+ declare function curl(url: string, options: {
307
+ /**
308
+ * Indicates whether to return a promise.
309
+ */
310
+ a: true,
311
+ /**
312
+ * The file path to output the response.
313
+ */
314
+ o?: string
315
+ }): Promise<Response>;
316
+
317
+ /**
318
+ * Makes a HTTP request to the specified URL.
319
+ * @param url The URL to request.
320
+ * @param options The options for the request.
321
+ * @returns A promise resolving to the response or other specified output based on the options.
322
+ */
323
+ declare function curl(url: string, options?: {
324
+ /**
325
+ * Indicates whether to return a promise.
326
+ */
327
+ a?: boolean,
328
+ /**
329
+ * The file path to output the response.
330
+ */
331
+ o?: string,
332
+ /**
333
+ * Indicates whether to return the response as JSON.
334
+ */
335
+ json?: boolean,
336
+ /**
337
+ * Indicates whether to return the response as plain text.
338
+ */
339
+ text?: boolean
340
+ }): ReturnType<typeof future>;
341
+
342
+
343
+
344
+
345
+ declare function print(...args: any[]): void;
346
+ declare namespace print {
347
+ const stdout: WriteStream;
348
+ const stdin: ReadStream;
349
+ };
350
+
351
+ declare function input(prompt: string): string;
352
+
353
+
354
+ declare const basename: (path: string) => string;
355
+ declare const dirname: (path: string) => string;
356
+ declare const extname: (path: string) => string;
357
+ declare const pjoin: (...paths: string[]) => string;
358
+ declare const presolve: (...paths: string[]) => string;
359
+
360
+ declare function exports(value: any) : any;
361
+
362
+ declare function pub(value: any) : any;
363
+ declare function pub(name: string, value: any) : any;
364
+
365
+ declare const opt: {
366
+ set: (key: string, value: any) => void;
367
+ get: (key: string) => any,
368
+ push: (key: string, value: any) => any,
369
+ pop: (key: string) => any,
370
+ }
371
+