@makano/rew 1.1.73 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. package/lib/coffeescript/browser.js +144 -139
  2. package/lib/coffeescript/cake.js +132 -133
  3. package/lib/coffeescript/coffeescript.js +437 -381
  4. package/lib/coffeescript/command.js +806 -724
  5. package/lib/coffeescript/grammar.js +1908 -2474
  6. package/lib/coffeescript/helpers.js +509 -473
  7. package/lib/coffeescript/index.js +228 -215
  8. package/lib/coffeescript/lexer.js +2282 -1909
  9. package/lib/coffeescript/nodes.js +9782 -9202
  10. package/lib/coffeescript/optparse.js +255 -227
  11. package/lib/coffeescript/parser.js +20305 -1265
  12. package/lib/coffeescript/register.js +107 -87
  13. package/lib/coffeescript/repl.js +307 -284
  14. package/lib/coffeescript/rewriter.js +1389 -1079
  15. package/lib/coffeescript/scope.js +176 -172
  16. package/lib/coffeescript/sourcemap.js +242 -227
  17. package/lib/rew/cli/cli.js +288 -186
  18. package/lib/rew/cli/log.js +31 -32
  19. package/lib/rew/cli/run.js +10 -12
  20. package/lib/rew/cli/utils.js +344 -176
  21. package/lib/rew/const/config_path.js +4 -0
  22. package/lib/rew/const/default.js +38 -35
  23. package/lib/rew/const/files.js +9 -9
  24. package/lib/rew/const/opt.js +8 -8
  25. package/lib/rew/css/theme.css +2 -2
  26. package/lib/rew/functions/core.js +55 -57
  27. package/lib/rew/functions/curl.js +23 -0
  28. package/lib/rew/functions/emitter.js +52 -55
  29. package/lib/rew/functions/exec.js +25 -21
  30. package/lib/rew/functions/export.js +18 -20
  31. package/lib/rew/functions/fs.js +55 -54
  32. package/lib/rew/functions/future.js +29 -21
  33. package/lib/rew/functions/id.js +8 -9
  34. package/lib/rew/functions/import.js +107 -93
  35. package/lib/rew/functions/map.js +13 -16
  36. package/lib/rew/functions/match.js +35 -26
  37. package/lib/rew/functions/path.js +8 -8
  38. package/lib/rew/functions/require.js +32 -33
  39. package/lib/rew/functions/sleep.js +2 -2
  40. package/lib/rew/functions/stdout.js +20 -20
  41. package/lib/rew/functions/types.js +96 -95
  42. package/lib/rew/html/ui.html +12 -13
  43. package/lib/rew/html/ui.js +205 -168
  44. package/lib/rew/main.js +14 -14
  45. package/lib/rew/misc/bin.js +37 -0
  46. package/lib/rew/misc/findAppInfo.js +16 -0
  47. package/lib/rew/misc/findAppPath.js +21 -0
  48. package/lib/rew/misc/req.js +7 -0
  49. package/lib/rew/misc/seededid.js +13 -0
  50. package/lib/rew/models/enum.js +12 -12
  51. package/lib/rew/models/struct.js +30 -32
  52. package/lib/rew/modules/compiler.js +237 -177
  53. package/lib/rew/modules/context.js +35 -22
  54. package/lib/rew/modules/fs.js +10 -10
  55. package/lib/rew/modules/runtime.js +17 -21
  56. package/lib/rew/modules/yaml.js +27 -30
  57. package/lib/rew/pkgs/conf.js +82 -75
  58. package/lib/rew/pkgs/data.js +12 -7
  59. package/lib/rew/pkgs/date.js +27 -28
  60. package/lib/rew/pkgs/env.js +6 -8
  61. package/lib/rew/pkgs/modules/data/bintree.js +52 -52
  62. package/lib/rew/pkgs/modules/data/doublylinked.js +85 -85
  63. package/lib/rew/pkgs/modules/data/linkedList.js +73 -73
  64. package/lib/rew/pkgs/modules/data/queue.js +19 -20
  65. package/lib/rew/pkgs/modules/data/stack.js +19 -19
  66. package/lib/rew/pkgs/modules/threads/worker.js +36 -26
  67. package/lib/rew/pkgs/modules/ui/classes.js +182 -178
  68. package/lib/rew/pkgs/pkgs.js +9 -10
  69. package/lib/rew/pkgs/rune.js +400 -0
  70. package/lib/rew/pkgs/threads.js +57 -53
  71. package/lib/rew/pkgs/ui.js +148 -136
  72. package/lib/rew/qrew/compile.js +12 -0
  73. package/package.json +11 -4
@@ -8,198 +8,300 @@ const { watch } = require('chokidar');
8
8
  const utils = require('./utils');
9
9
  const { existsSync, readFileSync, writeFileSync, mkdirSync } = require('fs');
10
10
  const { log } = require('./log');
11
- const { compileFile, compile } = require('../modules/compiler');
11
+ const os = require('os');
12
+ const crypto = require('crypto');
13
+ const { CONFIG_PATH } = require('../const/config_path');
14
+ const rune = require('../pkgs/rune');
15
+ const { to_qrew, from_qrew } = require('../qrew/compile');
16
+ const { findAppInfo } = require('../misc/findAppInfo');
17
+ const { print, input } = require('../functions/stdout');
18
+ const colors = require('colors');
19
+
20
+ if (!existsSync(CONFIG_PATH)) {
21
+ mkdirSync(CONFIG_PATH, { recursive: true });
22
+ utils.initFirst();
23
+ }
12
24
 
13
25
  yargs(hideBin(process.argv))
14
- .command(
15
- '$0 <file>',
16
- 'Run the specified file',
17
- (yargs) => {
18
- yargs
19
- .positional('file', {
20
- describe: 'File to run',
21
- type: 'string',
22
- })
23
- .option('watch', {
24
- alias: 'w',
25
- describe: 'Watch the file for changes',
26
- type: 'boolean',
27
- });
28
- },
29
- (argv) => {
30
- const filePath = path.resolve(process.cwd(), argv.file);
31
- if(!existsSync(filePath)){
32
- log('File not found:', argv.file, ':end');
33
- return;
34
- }
35
- const watching = [];
36
- const watchIt = (file) => {
37
- if(watching.includes(file)) return;
38
- watch(file).on('change', () => runIt());
39
- watching.push(file);
40
- }
41
- let prevFork;
42
- const runIt = () => {
43
- if(argv.watch) console.clear();
44
- if(prevFork && !prevFork.killed) prevFork.kill?.();
45
- prevFork = fork(path.resolve(__dirname, './run.js'))
46
- .on('message', (data) => {
47
- if(argv.watch){
48
- data.forEach(file => {
49
- watchIt(file);
50
- });
51
- }
52
- }).send({ filePath, watch: argv.watch });
53
- if(argv.watch) watchIt(filePath);
54
- }
55
- runIt();
56
- }
57
- )
58
- .command(
59
- 'conf <command> [path] [key] [value]',
60
- 'Configuration management',
61
- (yargs) => {
62
- yargs
63
- .positional('command', {
64
- describe: 'Configuration command (get, set, remove)',
65
- type: 'string',
66
- choices: ['get', 'set', 'remove'],
67
- })
68
- .positional('path', {
69
- describe: 'Configuration path',
70
- type: 'string',
71
- default: '',
72
- })
73
- .positional('key', {
74
- describe: 'Key to get/set/remove',
75
- type: 'string',
76
- default: '',
77
- })
78
- .positional('value', {
79
- describe: 'Value to set (only used with "set" command)',
80
- type: 'string',
81
- default: '',
82
- });
83
- },
84
- (argv) => {
85
- const { command, path, key, value } = argv;
86
- const result = utils.conf(command, path, key, value);
87
- if(result) console.log(result);
88
- }
89
- )
90
- .command('create <path>', 'Create a new project', (yargs) => {
91
- yargs
92
- .positional('path', {
93
- describe: 'Path of the project to create',
94
- type: 'string',
95
- });
96
- },
97
- (argv) => {
98
- utils.createProject(argv.path);
99
- }
100
- )
101
- .command('ui-bin <path>', 'Build the UI bin for your own app', (yargs) => {
102
- yargs
103
- .positional('path', {
104
- describe: 'Path of the output bin',
105
- type: 'string',
106
- });
107
- },
108
- (argv) => {
109
- execSync('sh '+path.resolve(__dirname, '../../../build.sh')+' '+argv.path);
110
- }
111
- )
112
- .command('run <path | package>', 'Run an app', (yargs) => {
113
- yargs
114
- .positional('path', {
115
- describe: 'Path of the app to run',
116
- type: 'string',
117
- });
118
- },
119
- (argv) => {
120
- utils.runApp(argv.path);
121
- }
122
- )
123
- .command('install <path>', 'Install an app', (yargs) => {
124
- yargs
125
- .positional('path', {
126
- describe: 'Path of the app to install',
127
- type: 'string',
128
- });
129
- },
130
- async (argv) => {
131
- if(argv.path.startsWith('github:')) utils.installApp(await utils.cloneGit(argv.path), true, true);
132
- else utils.installApp(argv.path);
133
- }
134
- )
135
- .command('build <file>', 'Build the specified file', (yargs) => {
136
- yargs
137
- .positional('file', {
138
- describe: 'File to build',
139
- type: 'string',
140
- })
141
- .option('output', {
142
- alias: 'o',
143
- describe: 'Output directory',
144
- type: 'string',
145
- });
146
- }, (argv) => {
26
+ .command(
27
+ '$0 <file>',
28
+ 'Run the specified file',
29
+ (yargs) => {
30
+ yargs
31
+ .positional('file', {
32
+ describe: 'File to run',
33
+ type: 'string',
34
+ })
35
+ .option('watch', {
36
+ alias: 'w',
37
+ describe: 'Watch the file for changes',
38
+ type: 'boolean',
39
+ });
40
+ },
41
+ (argv) => {
42
+ const filePath = path.resolve(process.cwd(), argv.file);
43
+ if (!existsSync(filePath)) {
44
+ log('File not found:', argv.file, ':end');
45
+ return;
46
+ }
47
+ const watching = [];
48
+ const watchIt = (file) => {
49
+ if (watching.includes(file)) return;
50
+ watch(file).on('change', () => runIt());
51
+ watching.push(file);
52
+ };
53
+ let prevFork;
54
+ const runIt = () => {
55
+ if (argv.watch) console.clear();
56
+ if (prevFork && !prevFork.killed) prevFork.kill?.();
57
+ prevFork = fork(path.resolve(__dirname, './run.js'))
58
+ .on('message', (data) => {
59
+ if (argv.watch) {
60
+ data.forEach((file) => {
61
+ watchIt(file);
62
+ });
63
+ }
64
+ })
65
+ .send({ filePath, watch: argv.watch });
66
+ if (argv.watch) watchIt(filePath);
67
+ };
68
+ runIt();
69
+ },
70
+ )
71
+ .command(
72
+ 'conf <command> [path] [key] [value]',
73
+ 'Configuration management',
74
+ (yargs) => {
75
+ yargs
76
+ .positional('command', {
77
+ describe: 'Configuration command (get, set, remove)',
78
+ type: 'string',
79
+ choices: ['get', 'set', 'remove'],
80
+ })
81
+ .positional('path', {
82
+ describe: 'Configuration path',
83
+ type: 'string',
84
+ default: '',
85
+ })
86
+ .positional('key', {
87
+ describe: 'Key to get/set/remove',
88
+ type: 'string',
89
+ default: '',
90
+ })
91
+ .positional('value', {
92
+ describe: 'Value to set (only used with "set" command)',
93
+ type: 'string',
94
+ default: '',
95
+ });
96
+ },
97
+ (argv) => {
98
+ const { command, path, key, value } = argv;
99
+ const result = utils.conf(command, path, key, value);
100
+ if (result) console.log(result);
101
+ },
102
+ )
103
+ .command(
104
+ 'create <path>',
105
+ 'Create a new project',
106
+ (yargs) => {
107
+ yargs.positional('path', {
108
+ describe: 'Path of the project to create',
109
+ type: 'string',
110
+ });
111
+ },
112
+ (argv) => {
113
+ utils.createProject(argv.path);
114
+ },
115
+ )
116
+ .command(
117
+ 'rune-keygen',
118
+ 'Generate a rune encryption key',
119
+ (yargs) => {
120
+ },
121
+ (argv) => {
122
+ console.log('Encryption Key:', rune({}).genKey(input('Secret Value: ') || null));
123
+ },
124
+ )
125
+ .command(
126
+ 'ui-bin <path>',
127
+ 'Build the UI bin for your own app',
128
+ (yargs) => {
129
+ yargs.positional('path', {
130
+ describe: 'Path of the output bin',
131
+ type: 'string',
132
+ });
133
+ },
134
+ (argv) => {
135
+ execSync('sh ' + path.resolve(__dirname, '../../../build.sh') + ' ' + argv.path);
136
+ },
137
+ )
138
+ .command(
139
+ 'run <path | package>',
140
+ 'Run an app',
141
+ (yargs) => {
142
+ yargs.positional('path', {
143
+ describe: 'Path of the app to run',
144
+ type: 'string',
145
+ })
146
+ .option('dev', {
147
+ describe: 'If your entry file is a .qrew, then just use the .coffee instead',
148
+ type: 'boolean',
149
+ })
150
+ .option('build', {
151
+ alias: 'b',
152
+ describe: 'Builds to a .qrew before running',
153
+ type: 'boolean',
154
+ })
155
+ .option('translate', {
156
+ alias: 't',
157
+ describe: 'Builds to a .js before running, only used when --build is passed',
158
+ type: 'boolean',
159
+ });
160
+ },
161
+ (argv) => {
162
+ utils.runApp(argv.path, argv);
163
+ },
164
+ )
165
+ .command(
166
+ 'secret <command> [key]',
167
+ 'Add secrets to the current path',
168
+ (yargs) => {
169
+ yargs.positional('command', {
170
+ describe: 'Path of the app to run',
171
+ type: 'string',
172
+ });
173
+ },
174
+ (argv) => {
175
+ const appPath = findAppInfo(path.join(process.cwd(), 'app.yaml'));
176
+
177
+ if (!appPath) return log(''.red.bold, 'Secrets only available in apps'.red.bold, ':end');
178
+
179
+ const qrewPath = path.join(appPath.path, 'secrets.qrew');
180
+
181
+ const getHost = () => `${process.env.USER}@${os.platform()}.${os.hostname()}`;
182
+
183
+ const verifyUser = (content) => {
184
+ const owner = content.match(/^owner = "(.*)" # end$/m)?.[1];
185
+ if (owner == getHost()) return true;
186
+ return false;
187
+ };
147
188
 
148
- function readFile(filePath) {
149
- return readFileSync(filePath, { encoding: 'utf-8' });
150
- }
189
+ if (argv.command == 'init') {
190
+ writeFileSync(qrewPath, to_qrew(`secrets = {} # end\n\nowner = "${getHost()}" # end\n \nexports { ...secrets }`, appPath.config.package))
191
+ } else {
192
+ const currentFileContent = from_qrew(readFileSync(qrewPath), appPath.config.package).toString();
193
+ if (!verifyUser(currentFileContent)) return log(''.red.bold, 'You are not allowed to change this data'.red.bold, ':end');
151
194
 
152
- function extractImports(content) {
153
- const importRegex = /(\w+)\s*=\s*imp\s*['"](.+?)['"]/g;
154
- const imports = [];
155
- let match;
156
- while ((match = importRegex.exec(content)) !== null) {
157
- imports.push({ variable: match[1], url: match[2] });
158
- }
159
- return imports;
160
- }
195
+ const secrets = currentFileContent.match(/^secrets = (.*) # end$/m)?.[1];
161
196
 
162
- function writeCompiledFile(filePath, compiledCode) {
163
- const dirName = outputDir ? outputDir : path.dirname(filePath);
164
- if(!existsSync(dirName)) mkdirSync(dirName, { recursive: true });
165
- const baseName = path.basename(filePath, path.extname(filePath));
166
- const newFilePath = path.join(dirName, `${baseName}.js`);
167
- writeFileSync(newFilePath, compiledCode, { encoding: 'utf-8' });
168
- log(`Compiled: ${newFilePath}`);
169
- }
197
+ let secretsJson = JSON.parse(secrets);
170
198
 
171
- function processFile(filePath, importsArray) {
172
- const content = readFile(filePath);
173
- const imports = extractImports(content);
174
-
175
- imports.forEach(importStatement => {
176
- const importedFilePath = path.resolve(path.dirname(filePath), importStatement.url);
177
- if (!importsArray.some(importObj => importObj.url === importStatement.url)) {
178
-
179
- if(existsSync(importedFilePath)){
180
- importsArray.push(importStatement);
181
- processFile(importedFilePath, importsArray);
182
- } else if(existsSync(importedFilePath+'.coffee')){
183
- importsArray.push(importStatement);
184
- processFile(importedFilePath+'.coffee', importsArray);
185
- } else if(existsSync(importedFilePath+'.js')){
186
- importsArray.push(importStatement);
187
- processFile(importedFilePath+'.js', importsArray);
188
- }
199
+ if (argv.command == 'set' || argv.command == 'remove') {
200
+ if (argv.command == 'set') {
201
+ let val = input('Secret Value: ');
189
202
 
190
- }
191
- });
203
+ secretsJson[argv.key] = val;
204
+ } else {
205
+ delete secretsJson[argv.key];
206
+ }
192
207
 
193
- const compiled = compile({ content }, {});
194
- writeCompiledFile(filePath, compiled);
195
- }
208
+ const newSecrets = `secrets = ${JSON.stringify(secretsJson)} # end`;
209
+ const newFileContent = currentFileContent.replace(/^secrets = .* # end$/m, newSecrets);
196
210
 
197
- const filePath = path.resolve(process.cwd(), argv.file);
198
- const importsArray = [];
199
- const outputDir = argv.output ? path.resolve(process.cwd(), argv.output) : null;
200
- log('Start compile at', outputDir || 'default path');
201
- processFile(filePath, importsArray);
202
- log('Compiled', importsArray.length + 1, 'files.', ':end');
203
- })
204
- .help()
205
- .argv;
211
+ writeFileSync(qrewPath, to_qrew(newFileContent, appPath.config.package))
212
+ } else if (argv.command == 'get') {
213
+ if (argv.key) {
214
+ console.log(argv.key.yellow, '=', secretsJson[argv.key].green);
215
+ }
216
+ else {
217
+ for (let key in secretsJson) {
218
+ console.log(key.yellow, '=', secretsJson[key].green);
219
+ }
220
+ }
221
+ }
222
+ }
223
+ },
224
+ )
225
+ .command(
226
+ 'install <path>',
227
+ 'Install an app',
228
+ (yargs) => {
229
+ yargs.positional('path', {
230
+ describe: 'Path of the app to install',
231
+ type: 'string',
232
+ });
233
+ },
234
+ async (argv) => {
235
+ utils.installAppFrom(argv.path);
236
+ },
237
+ )
238
+ .command(
239
+ 'version',
240
+ 'Rew Version',
241
+ (yargs) => {
242
+ },
243
+ async (argv) => {
244
+ const pkg = JSON.parse(readFileSync(path.resolve(__dirname, '../../../package.json'), { encoding: 'utf-8' }));
245
+ const getLatest = async () => {
246
+ try{
247
+ return (await (await fetch(`https://registry.npmjs.org/${pkg.name}`)).json()).dist_tags.latest.yellow.bold
248
+ } catch(e) {
249
+ return `(${'!err'.blue.bgRed}, see ${`https://npmjs.com/package/${pkg.name}`.blue.underline})`;
250
+ }
251
+ }
252
+ log(`${'Rew'.red.bold} ${'RUNTIME'.yellow}`);
253
+ log(`Version: ${pkg.name.green}@${pkg.version.yellow.bold}`);
254
+ log(`Latest: ${pkg.name}@${await getLatest()}`, ':end');
255
+ },
256
+ )
257
+ .command(
258
+ 'repo <command> [name] [url]',
259
+ 'Manage install repositories',
260
+ (yargs) => {
261
+ yargs.positional('command', {
262
+ describe: 'Command to add/remove/set/get/view',
263
+ type: 'string',
264
+ });
265
+ yargs.positional('name', {
266
+ describe: 'name of the repo',
267
+ type: 'string',
268
+ });
269
+ yargs.positional('url', {
270
+ describe: 'url of the repo',
271
+ type: 'string',
272
+ });
273
+ },
274
+ async (argv) => {
275
+ utils.repo(argv.command, argv.name, argv.url);
276
+ },
277
+ )
278
+ .command(
279
+ 'build <file>',
280
+ 'Build the specified file',
281
+ (yargs) => {
282
+ yargs
283
+ .positional('file', {
284
+ describe: 'File to build',
285
+ type: 'string',
286
+ })
287
+ .option('output', {
288
+ alias: 'o',
289
+ describe: 'Output directory',
290
+ type: 'string',
291
+ })
292
+ .option('translate', {
293
+ alias: 't',
294
+ describe: 'Translate to js',
295
+ type: 'boolean',
296
+ })
297
+ .option('remove', {
298
+ alias: 'r',
299
+ describe: 'Remove all coffee',
300
+ type: 'boolean',
301
+ });
302
+ },
303
+ (argv) => {
304
+ utils.build(argv);
305
+ },
306
+ )
307
+ .help().argv;
@@ -1,40 +1,39 @@
1
-
2
1
  let start = true;
3
- const startPrefix = '╭';
2
+ const startPrefix = '╭';
4
3
  const middlePrefix = '├';
5
- const separator = '│';
6
- const endPrefix = '╰';
4
+ const separator = '│';
5
+ const endPrefix = '╰';
7
6
 
8
- const log = module.exports.log = function(...toPrint){
9
- let prefix = start ? startPrefix : middlePrefix;
10
- let returns = false;
11
- if(toPrint[toPrint.length-1] == ':end') {
12
- prefix = endPrefix;
13
- toPrint.pop();
14
- }
15
- if(toPrint[toPrint.length-1] == ':returns') {
16
- returns = true;
17
- toPrint.pop();
18
- }
19
- if(prefix == endPrefix && start) prefix = separator;
20
- if(!start) console.log(separator);
21
- if(start) start = false;
22
- if(returns) return [prefix, ...toPrint].join(' ');
23
- else console.log(prefix, ...toPrint);
24
- }
7
+ const log = (module.exports.log = function (...toPrint) {
8
+ let prefix = start ? startPrefix : middlePrefix;
9
+ let returns = false;
10
+ if (toPrint[toPrint.length - 1] == ':end') {
11
+ prefix = endPrefix;
12
+ toPrint.pop();
13
+ }
14
+ if (toPrint[toPrint.length - 1] == ':returns') {
15
+ returns = true;
16
+ toPrint.pop();
17
+ }
18
+ if (prefix == endPrefix && start) prefix = separator;
19
+ if (!start) console.log(separator);
20
+ if (start) start = false;
21
+ if (returns) return [prefix, ...toPrint].join(' ');
22
+ else console.log(prefix, ...toPrint);
23
+ });
25
24
 
26
- module.exports.logget = function(...toPrint){
27
- let args = [...toPrint];
28
- if(toPrint[toPrint.length-1] == ':end') {
29
- let l = args.pop();
30
- args.push(':returns', l);
31
- } else {
32
- args.push(':returns');
33
- }
34
- return log(...args);
35
- }
25
+ module.exports.logget = function (...toPrint) {
26
+ let args = [...toPrint];
27
+ if (toPrint[toPrint.length - 1] == ':end') {
28
+ let l = args.pop();
29
+ args.push(':returns', l);
30
+ } else {
31
+ args.push(':returns');
32
+ }
33
+ return log(...args);
34
+ };
36
35
 
37
36
  log.startPrefix = startPrefix;
38
37
  log.middlePrefix = middlePrefix;
39
38
  log.separator = separator;
40
- log.endPrefix = endPrefix;
39
+ log.endPrefix = endPrefix;
@@ -1,17 +1,15 @@
1
1
  const { run } = require('../main');
2
2
 
3
-
4
- function exec(filePath){
5
- return run(filePath)
6
- .context.module.imports;
3
+ function exec(filePath) {
4
+ return run(filePath).context.module.imports;
7
5
  }
8
6
 
9
7
  const onmsg = ({ filePath, watch }) => {
10
- const imports = exec(filePath);
11
- if(watch){
12
- process.send(imports);
13
- }
14
- process.off('message', onmsg);
15
- }
16
-
17
- process.on('message', onmsg);
8
+ const imports = exec(filePath);
9
+ if (watch) {
10
+ process.send(imports);
11
+ }
12
+ process.off('message', onmsg);
13
+ };
14
+
15
+ process.on('message', onmsg);