@makano/rew 1.1.73 → 1.2.0

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.
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);