rapydscript-ns 0.8.4 → 0.9.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 (132) hide show
  1. package/.agignore +1 -1
  2. package/.github/workflows/ci.yml +38 -38
  3. package/=template.pyj +5 -5
  4. package/CHANGELOG.md +18 -0
  5. package/HACKING.md +103 -103
  6. package/LICENSE +24 -24
  7. package/README.md +715 -169
  8. package/TODO.md +9 -2
  9. package/add-toc-to-readme +2 -2
  10. package/bin/export +75 -75
  11. package/bin/rapydscript +70 -70
  12. package/bin/web-repl-export +102 -102
  13. package/build +2 -2
  14. package/language-service/index.js +36 -27
  15. package/package.json +1 -1
  16. package/publish.py +37 -37
  17. package/release/baselib-plain-pretty.js +2358 -168
  18. package/release/baselib-plain-ugly.js +73 -3
  19. package/release/compiler.js +6282 -3092
  20. package/release/signatures.json +31 -30
  21. package/session.vim +4 -4
  22. package/setup.cfg +2 -2
  23. package/src/ast.pyj +1 -0
  24. package/src/baselib-builtins.pyj +340 -2
  25. package/src/baselib-bytes.pyj +664 -0
  26. package/src/baselib-errors.pyj +1 -1
  27. package/src/baselib-internal.pyj +267 -60
  28. package/src/baselib-itertools.pyj +110 -97
  29. package/src/baselib-str.pyj +22 -4
  30. package/src/compiler.pyj +36 -36
  31. package/src/errors.pyj +30 -30
  32. package/src/lib/abc.pyj +317 -0
  33. package/src/lib/aes.pyj +646 -646
  34. package/src/lib/copy.pyj +120 -120
  35. package/src/lib/dataclasses.pyj +532 -0
  36. package/src/lib/elementmaker.pyj +83 -83
  37. package/src/lib/encodings.pyj +126 -126
  38. package/src/lib/enum.pyj +125 -0
  39. package/src/lib/gettext.pyj +569 -569
  40. package/src/lib/itertools.pyj +580 -580
  41. package/src/lib/math.pyj +193 -193
  42. package/src/lib/operator.pyj +11 -11
  43. package/src/lib/pythonize.pyj +20 -20
  44. package/src/lib/random.pyj +118 -118
  45. package/src/lib/re.pyj +504 -470
  46. package/src/lib/react.pyj +74 -74
  47. package/src/lib/traceback.pyj +63 -63
  48. package/src/lib/typing.pyj +577 -0
  49. package/src/lib/uuid.pyj +77 -77
  50. package/src/monaco-language-service/builtins.js +14 -4
  51. package/src/monaco-language-service/diagnostics.js +19 -20
  52. package/src/monaco-language-service/dts.js +550 -550
  53. package/src/output/classes.pyj +62 -26
  54. package/src/output/comments.pyj +45 -45
  55. package/src/output/exceptions.pyj +201 -201
  56. package/src/output/functions.pyj +78 -5
  57. package/src/output/jsx.pyj +164 -164
  58. package/src/output/loops.pyj +5 -2
  59. package/src/output/operators.pyj +100 -34
  60. package/src/output/treeshake.pyj +182 -182
  61. package/src/output/utils.pyj +72 -72
  62. package/src/parse.pyj +80 -16
  63. package/src/string_interpolation.pyj +72 -72
  64. package/src/tokenizer.pyj +9 -4
  65. package/src/unicode_aliases.pyj +576 -576
  66. package/src/utils.pyj +192 -192
  67. package/test/_import_one.pyj +37 -37
  68. package/test/_import_two/__init__.pyj +11 -11
  69. package/test/_import_two/level2/deep.pyj +4 -4
  70. package/test/_import_two/other.pyj +6 -6
  71. package/test/_import_two/sub.pyj +13 -13
  72. package/test/abc.pyj +291 -0
  73. package/test/aes_vectors.pyj +421 -421
  74. package/test/annotations.pyj +80 -80
  75. package/test/arithmetic_nostrict.pyj +88 -0
  76. package/test/arithmetic_types.pyj +169 -0
  77. package/test/baselib.pyj +91 -0
  78. package/test/bytes.pyj +467 -0
  79. package/test/classes.pyj +1 -0
  80. package/test/comparison_ops.pyj +173 -0
  81. package/test/dataclasses.pyj +253 -0
  82. package/test/decorators.pyj +77 -77
  83. package/test/docstrings.pyj +39 -39
  84. package/test/elementmaker_test.pyj +45 -45
  85. package/test/enum.pyj +134 -0
  86. package/test/eval_exec.pyj +56 -0
  87. package/test/format.pyj +148 -0
  88. package/test/functions.pyj +151 -151
  89. package/test/generators.pyj +41 -41
  90. package/test/generic.pyj +370 -370
  91. package/test/imports.pyj +72 -72
  92. package/test/internationalization.pyj +73 -73
  93. package/test/lint.pyj +164 -164
  94. package/test/loops.pyj +85 -85
  95. package/test/numpy.pyj +734 -734
  96. package/test/object.pyj +64 -0
  97. package/test/omit_function_metadata.pyj +20 -20
  98. package/test/python_compat.pyj +17 -15
  99. package/test/python_features.pyj +70 -15
  100. package/test/regexp.pyj +83 -55
  101. package/test/repl.pyj +121 -121
  102. package/test/scoped_flags.pyj +76 -76
  103. package/test/tuples.pyj +96 -0
  104. package/test/typing.pyj +469 -0
  105. package/test/unit/index.js +116 -7
  106. package/test/unit/language-service-dts.js +543 -543
  107. package/test/unit/language-service-hover.js +455 -455
  108. package/test/unit/language-service.js +84 -0
  109. package/test/unit/web-repl.js +804 -1
  110. package/test/vars_locals_globals.pyj +94 -0
  111. package/tools/cli.js +558 -547
  112. package/tools/compile.js +224 -219
  113. package/tools/completer.js +131 -131
  114. package/tools/embedded_compiler.js +262 -251
  115. package/tools/gettext.js +185 -185
  116. package/tools/ini.js +65 -65
  117. package/tools/lint.js +16 -19
  118. package/tools/msgfmt.js +187 -187
  119. package/tools/repl.js +223 -223
  120. package/tools/test.js +118 -118
  121. package/tools/utils.js +128 -128
  122. package/tools/web_repl.js +95 -95
  123. package/try +41 -41
  124. package/web-repl/env.js +196 -196
  125. package/web-repl/index.html +163 -163
  126. package/web-repl/main.js +252 -252
  127. package/web-repl/prism.css +139 -139
  128. package/web-repl/prism.js +113 -113
  129. package/web-repl/rapydscript.js +224 -224
  130. package/web-repl/sha1.js +25 -25
  131. package/PYTHON_DIFFERENCES_REPORT.md +0 -291
  132. package/PYTHON_FEATURE_COVERAGE.md +0 -200
package/TODO.md CHANGED
@@ -1,7 +1,12 @@
1
1
 
2
2
  ### libraries
3
3
 
4
- - simple way to turn on all python opt-in options
4
+
5
+ - remove repl_mode and make repl make a new context for each "run" press
6
+ - `.replace(str, str)` replaces only the first occurrence.
7
+ - eval is js
8
+
9
+ - rework tests to use jest
5
10
 
6
11
  - omit_function_metadata breaks imports - it needs to be changed to only affect imported modules, maybe?
7
12
 
@@ -10,5 +15,7 @@
10
15
  - examples of using js libraries in rapydscript in readme?
11
16
 
12
17
 
13
- I would like you to add support for [`str.expandtabs(tabsize)` ] to rapydscript. It should have the same syntax as the Python implementation, and be transpiled into equivalent javascript. Please ensure with unit tests that it transpiles and the output JS runs correctly, and that the language service correctly handles it in parsed code. Please make sure it works in the web-repl too. Please also update the README if it has any outdated info about this, and the PYTHON_FEATURE_COVERAGE report. Please also add a simple example to the bottom of the TODO document using this feature (make no other changes to that file).
18
+ I would like you to add support for [`vars()` / `locals()` / `globals()` ] to rapydscript. It should have the same syntax as the Python implementation, and be transpiled into equivalent javascript. Please ensure with unit tests that it transpiles and the output JS runs correctly, and that the language service correctly handles it in parsed code. Please make sure it works in the web-repl too. Please also update the README if it has any outdated info about this, and the PYTHON_FEATURE_COVERAGE report. Please also add a simple example to the bottom of the TODO document using this feature (make no other changes to that file).
19
+
20
+
14
21
 
package/add-toc-to-readme CHANGED
@@ -1,2 +1,2 @@
1
- #!/bin/sh
2
- exec node_modules/doctoc/doctoc.js --title '**Contents**' README.md
1
+ #!/bin/sh
2
+ exec node_modules/doctoc/doctoc.js --title '**Contents**' README.md
package/bin/export CHANGED
@@ -1,75 +1,75 @@
1
- #!/usr/bin/env node
2
- // vim:ft=javascript:ts=4:et
3
-
4
- "use strict";
5
-
6
- var fs = require('fs');
7
- var path = require('path');
8
- var crypto = require('crypto');
9
-
10
- var base = path.join(path.dirname(__dirname));
11
- var meta = JSON.parse(fs.readFileSync(path.join(base, 'package.json'), {'encoding':'utf-8'}));
12
- var compiler_dir = path.join(base, 'dev');
13
- if (!path_exists(path.join(compiler_dir, 'compiler.js'))) compiler_dir = path.join(base, 'release');
14
-
15
- var manifest = {}, total = 0;
16
- ['compiler.js', 'baselib-plain-pretty.js', 'baselib-plain-ugly.js'].forEach(function(x) {
17
- manifest[x] = fs.readFileSync(path.join(compiler_dir, x), {'encoding':'utf-8'});
18
- total += manifest[x].length;
19
- });
20
-
21
- ['web_repl.js', 'repl.js', 'completer.js', 'utils.js', 'gettext.js', 'msgfmt.js'].forEach(function(x) {
22
- x = 'tools/' + x;
23
- manifest[x] = fs.readFileSync(path.join(base, x), {'encoding':'utf-8'});
24
- total += manifest[x].length;
25
- });
26
-
27
-
28
- var dedup = {};
29
-
30
- function path_exists(path) {
31
- try {
32
- fs.statSync(path);
33
- return true;
34
- } catch(e) {
35
- if (e.code != 'ENOENT') throw e;
36
- }
37
- }
38
-
39
- function sha1sum(data) {
40
- var h = crypto.createHash('sha1');
41
- h.update(data);
42
- return h.digest('hex');
43
- }
44
-
45
- function process_dir(name) {
46
- var dpath = path.join(base, name);
47
- var items = fs.readdirSync(dpath);
48
- items.forEach(function (x) {
49
- var iname = name + '/' + x;
50
- var ipath = path.join(dpath, x);
51
- var s = fs.statSync(ipath);
52
- if (s.isDirectory()) return process_dir(iname);
53
- var raw = fs.readFileSync(ipath, {'encoding':'utf-8'});
54
- var sig = sha1sum(raw);
55
- if (dedup.hasOwnProperty(sig)) {
56
- manifest[iname] = [dedup[sig]];
57
- } else {
58
- manifest[iname] = raw;
59
- dedup[sig] = iname;
60
- total += s.size;
61
- }
62
- });
63
- }
64
-
65
- Object.keys(meta.dependencies).forEach(function (x) {
66
- process_dir('node_modules/' + x);
67
- });
68
- console.log('// vim:fileencoding=utf-8');
69
- console.log('(function() {');
70
- console.log('var rs_version = ' + JSON.stringify(meta.version) + ';');
71
- console.log('var data = ' + JSON.stringify(manifest) + ';');
72
- console.log();
73
- console.log(fs.readFileSync(path.join(base, 'tools', 'export.js'), {'encoding':'utf-8'}));
74
- console.log('})()');
75
- console.error('RapydScript compiler (uncompressed) size: ' + (total/(1024 * 1024)).toFixed(1) + ' MB');
1
+ #!/usr/bin/env node
2
+ // vim:ft=javascript:ts=4:et
3
+
4
+ "use strict";
5
+
6
+ var fs = require('fs');
7
+ var path = require('path');
8
+ var crypto = require('crypto');
9
+
10
+ var base = path.join(path.dirname(__dirname));
11
+ var meta = JSON.parse(fs.readFileSync(path.join(base, 'package.json'), {'encoding':'utf-8'}));
12
+ var compiler_dir = path.join(base, 'dev');
13
+ if (!path_exists(path.join(compiler_dir, 'compiler.js'))) compiler_dir = path.join(base, 'release');
14
+
15
+ var manifest = {}, total = 0;
16
+ ['compiler.js', 'baselib-plain-pretty.js', 'baselib-plain-ugly.js'].forEach(function(x) {
17
+ manifest[x] = fs.readFileSync(path.join(compiler_dir, x), {'encoding':'utf-8'});
18
+ total += manifest[x].length;
19
+ });
20
+
21
+ ['web_repl.js', 'repl.js', 'completer.js', 'utils.js', 'gettext.js', 'msgfmt.js'].forEach(function(x) {
22
+ x = 'tools/' + x;
23
+ manifest[x] = fs.readFileSync(path.join(base, x), {'encoding':'utf-8'});
24
+ total += manifest[x].length;
25
+ });
26
+
27
+
28
+ var dedup = {};
29
+
30
+ function path_exists(path) {
31
+ try {
32
+ fs.statSync(path);
33
+ return true;
34
+ } catch(e) {
35
+ if (e.code != 'ENOENT') throw e;
36
+ }
37
+ }
38
+
39
+ function sha1sum(data) {
40
+ var h = crypto.createHash('sha1');
41
+ h.update(data);
42
+ return h.digest('hex');
43
+ }
44
+
45
+ function process_dir(name) {
46
+ var dpath = path.join(base, name);
47
+ var items = fs.readdirSync(dpath);
48
+ items.forEach(function (x) {
49
+ var iname = name + '/' + x;
50
+ var ipath = path.join(dpath, x);
51
+ var s = fs.statSync(ipath);
52
+ if (s.isDirectory()) return process_dir(iname);
53
+ var raw = fs.readFileSync(ipath, {'encoding':'utf-8'});
54
+ var sig = sha1sum(raw);
55
+ if (dedup.hasOwnProperty(sig)) {
56
+ manifest[iname] = [dedup[sig]];
57
+ } else {
58
+ manifest[iname] = raw;
59
+ dedup[sig] = iname;
60
+ total += s.size;
61
+ }
62
+ });
63
+ }
64
+
65
+ Object.keys(meta.dependencies).forEach(function (x) {
66
+ process_dir('node_modules/' + x);
67
+ });
68
+ console.log('// vim:fileencoding=utf-8');
69
+ console.log('(function() {');
70
+ console.log('var rs_version = ' + JSON.stringify(meta.version) + ';');
71
+ console.log('var data = ' + JSON.stringify(manifest) + ';');
72
+ console.log();
73
+ console.log(fs.readFileSync(path.join(base, 'tools', 'export.js'), {'encoding':'utf-8'}));
74
+ console.log('})()');
75
+ console.error('RapydScript compiler (uncompressed) size: ' + (total/(1024 * 1024)).toFixed(1) + ' MB');
package/bin/rapydscript CHANGED
@@ -1,70 +1,70 @@
1
- #!/usr/bin/env node
2
- // vim:ft=javascript:ts=4:et
3
-
4
- "use strict";
5
-
6
- function load(mod) {
7
- return require('../tools/' + mod);
8
- }
9
-
10
- var utils = load('utils');
11
-
12
- // We need ES 6 generators so relaunch with the --harmony flag
13
- if (!utils.generators_available()) {
14
- if (process.execArgv.indexOf('--harmony') != -1) {
15
- console.error('RapydScript needs ES 6 generators, update your version of nodejs');
16
- process.exit(1);
17
- }
18
- var args = ['--harmony', module.filename].concat(process.argv.slice(2));
19
- require('child_process').spawn(process.execPath, args, {stdio:'inherit'}).on('exit', function(code, signal) {
20
- process.exit(code);
21
- });
22
- } else {
23
-
24
- var start_time = new Date().getTime();
25
- var path = require('path');
26
-
27
- var argv = load('cli').argv;
28
-
29
- var base_path = path.normalize(path.join(path.dirname(module.filename), ".."));
30
- var src_path = path.join(base_path, 'src');
31
- var lib_path = path.join(base_path, 'dev');
32
- if (!utils.path_exists(path.join(lib_path, 'compiler.js'))) lib_path = path.join(base_path, 'release');
33
-
34
- if (argv.mode === 'self') {
35
- if (argv.files.length > 0) {
36
- console.error("WARN: Ignoring input files since --self was passed");
37
- }
38
- load('self')(base_path, src_path, lib_path, argv.complete, argv.profile);
39
- if (argv.test) {
40
- console.log('\nRunning test suite...\n');
41
- argv.files = []; // Ensure all tests are run
42
- load('test')(argv, base_path, src_path, path.join(base_path, 'dev'));
43
- }
44
- process.exit(0);
45
- } else
46
-
47
- if (argv.mode === 'test') {
48
- load('test')(argv, base_path, src_path, lib_path);
49
- } else
50
-
51
- if (argv.mode === 'lint') {
52
- load('lint').cli(argv, base_path, src_path, lib_path);
53
- } else
54
-
55
- if (argv.mode === 'repl') {
56
- load('repl')({'lib_path':lib_path, 'imp_path':path.join(src_path, 'lib'), show_js:!argv.no_js});
57
- } else
58
-
59
- if (argv.mode === 'gettext') {
60
- load('gettext').cli(argv, base_path, src_path, lib_path);
61
- } else
62
-
63
- if (argv.mode === 'msgfmt') {
64
- load('msgfmt').cli(argv, base_path, src_path, lib_path);
65
- } else
66
-
67
- {
68
- load('compile')(start_time, argv, base_path, src_path, lib_path);
69
- }
70
- }
1
+ #!/usr/bin/env node
2
+ // vim:ft=javascript:ts=4:et
3
+
4
+ "use strict";
5
+
6
+ function load(mod) {
7
+ return require('../tools/' + mod);
8
+ }
9
+
10
+ var utils = load('utils');
11
+
12
+ // We need ES 6 generators so relaunch with the --harmony flag
13
+ if (!utils.generators_available()) {
14
+ if (process.execArgv.indexOf('--harmony') != -1) {
15
+ console.error('RapydScript needs ES 6 generators, update your version of nodejs');
16
+ process.exit(1);
17
+ }
18
+ var args = ['--harmony', module.filename].concat(process.argv.slice(2));
19
+ require('child_process').spawn(process.execPath, args, {stdio:'inherit'}).on('exit', function(code, signal) {
20
+ process.exit(code);
21
+ });
22
+ } else {
23
+
24
+ var start_time = new Date().getTime();
25
+ var path = require('path');
26
+
27
+ var argv = load('cli').argv;
28
+
29
+ var base_path = path.normalize(path.join(path.dirname(module.filename), ".."));
30
+ var src_path = path.join(base_path, 'src');
31
+ var lib_path = path.join(base_path, 'dev');
32
+ if (!utils.path_exists(path.join(lib_path, 'compiler.js'))) lib_path = path.join(base_path, 'release');
33
+
34
+ if (argv.mode === 'self') {
35
+ if (argv.files.length > 0) {
36
+ console.error("WARN: Ignoring input files since --self was passed");
37
+ }
38
+ load('self')(base_path, src_path, lib_path, argv.complete, argv.profile);
39
+ if (argv.test) {
40
+ console.log('\nRunning test suite...\n');
41
+ argv.files = []; // Ensure all tests are run
42
+ load('test')(argv, base_path, src_path, path.join(base_path, 'dev'));
43
+ }
44
+ process.exit(0);
45
+ } else
46
+
47
+ if (argv.mode === 'test') {
48
+ load('test')(argv, base_path, src_path, lib_path);
49
+ } else
50
+
51
+ if (argv.mode === 'lint') {
52
+ load('lint').cli(argv, base_path, src_path, lib_path);
53
+ } else
54
+
55
+ if (argv.mode === 'repl') {
56
+ load('repl')({'lib_path':lib_path, 'imp_path':path.join(src_path, 'lib'), show_js:!argv.no_js});
57
+ } else
58
+
59
+ if (argv.mode === 'gettext') {
60
+ load('gettext').cli(argv, base_path, src_path, lib_path);
61
+ } else
62
+
63
+ if (argv.mode === 'msgfmt') {
64
+ load('msgfmt').cli(argv, base_path, src_path, lib_path);
65
+ } else
66
+
67
+ {
68
+ load('compile')(start_time, argv, base_path, src_path, lib_path);
69
+ }
70
+ }
@@ -1,102 +1,102 @@
1
- #!/usr/bin/env node
2
- // vim:ft=javascript:ts=4:et
3
-
4
- "use strict";
5
-
6
- var fs = require('fs');
7
- var path = require('path');
8
-
9
- var base = path.normalize(path.resolve(path.join(path.dirname(__dirname))));
10
- var meta = JSON.parse(fs.readFileSync(path.join(base, 'package.json'), {'encoding':'utf-8'}));
11
- var commit_sha = fs.readFileSync(path.join(base, '.git', 'refs', 'heads', 'master'), {'encoding':'utf-8'}).trim();
12
- var compiler_dir = path.join(base, 'dev');
13
- if (!path_exists(path.join(compiler_dir, 'compiler.js'))) compiler_dir = path.join(base, 'release');
14
-
15
- var manifest = {}, total = 0;
16
- ['compiler.js', 'baselib-plain-pretty.js'].forEach(function(x) {
17
- manifest[x] = fs.readFileSync(path.join(compiler_dir, x), {'encoding':'utf-8'});
18
- total += manifest[x].length;
19
- });
20
-
21
- ['web_repl.js', 'embedded_compiler.js', 'utils.js', 'completer.js', 'msgfmt.js', 'gettext.js'].forEach(function(x) {
22
- x = 'tools/' + x;
23
- manifest[x] = fs.readFileSync(path.join(base, x), {'encoding':'utf-8'});
24
- total += manifest[x].length;
25
- });
26
-
27
- var stdlib = path.join(base, 'src', 'lib');
28
-
29
- function path_exists(path) {
30
- try {
31
- fs.statSync(path);
32
- return true;
33
- } catch(e) {
34
- if (e.code != 'ENOENT') throw e;
35
- }
36
- }
37
-
38
- function process_dir(relpath) {
39
- var fullpath = (relpath) ? path.join(stdlib, relpath) : stdlib;
40
- fs.readdirSync(fullpath).forEach(function (x) {
41
- var q = path.join(fullpath, x);
42
- var s = fs.statSync(q);
43
- if (s.isDirectory()) return process_dir(relpath + '/' + x);
44
- if (!x.endsWith('.pyj')) return;
45
- var iname = ('__stdlib__' + '/' + relpath + '/' + x).replace(/\\/g, '/').replace(/\/+/g, '/');
46
- var raw = fs.readFileSync(q, {'encoding':'utf-8'});
47
- manifest[iname] = raw;
48
- total += s.size;
49
- });
50
- }
51
- process_dir('');
52
-
53
-
54
- var rs = '// vim:fileencoding=utf-8\n';
55
- rs += '(function(external_namespace) {\n';
56
- rs += '"use strict;"\n';
57
- rs += 'var rs_version = ' + JSON.stringify(meta.version) + ';\n';
58
- rs += 'var rs_commit_sha = ' + JSON.stringify(commit_sha) + ';\n';
59
- rs += '\n// Embedded modules {{{\n';
60
- rs += 'var data = ' + JSON.stringify(manifest) + ';\n\n';
61
- rs += '// End embedded modules }}}\n\n';
62
- rs += fs.readFileSync(path.join(base, 'web-repl', 'env.js'));
63
- rs += '\n// Embedded sha1 implementation {{{\n';
64
- rs += '(function() {\n';
65
- rs += fs.readFileSync(path.join(base, 'web-repl', 'sha1.js'));
66
- rs += '}).call(jsSHA);\n';
67
- rs += '// End embedded sha1 implementation }}}\n\n';
68
- rs += 'var exports = namespace;\n';
69
- rs += fs.readFileSync(path.join(base, 'tools', 'export.js'), {'encoding':'utf-8'});
70
- rs += 'external_namespace.RapydScript = namespace;\n';
71
- rs += '})(this);\n';
72
-
73
-
74
- var base_dir = process.argv.slice(-1)[0];
75
- if (process.argv.length !== 3) {
76
- console.error('Usage: web-repl-export /path/to/export/directory');
77
- process.exit(1);
78
- }
79
-
80
- base_dir = path.normalize(path.resolve(base_dir));
81
-
82
- try {
83
- fs.mkdirSync(base_dir);
84
- } catch(e) {
85
- if (e.code !== 'EEXIST') throw e;
86
- }
87
-
88
- try {
89
- process.chdir(base_dir);
90
- } catch(e) {
91
- if (e.code === 'ENOTDIR') { console.error(base_dir + ' is not a directory'); process.exit(1); }
92
- throw e;
93
- }
94
- fs.writeFileSync('rapydscript.js', rs, {'encoding':'utf-8'});
95
- var web_repl = path.join(base, 'web-repl');
96
- fs.readdirSync(web_repl).forEach(function(x) {
97
- if (['sha1.js', 'env.js'].indexOf(x) !== -1) return;
98
- var data = fs.readFileSync(path.join(web_repl, x), {'encoding':'utf-8'});
99
- fs.writeFileSync(x, data, {'encoding':'utf-8'});
100
- });
101
- console.log('RapydScript compiler (uncompressed) size: ' + (total/(1024)).toFixed(1) + ' KB');
102
- console.log('web-repl exported to: ' + base_dir);
1
+ #!/usr/bin/env node
2
+ // vim:ft=javascript:ts=4:et
3
+
4
+ "use strict";
5
+
6
+ var fs = require('fs');
7
+ var path = require('path');
8
+
9
+ var base = path.normalize(path.resolve(path.join(path.dirname(__dirname))));
10
+ var meta = JSON.parse(fs.readFileSync(path.join(base, 'package.json'), {'encoding':'utf-8'}));
11
+ var commit_sha = fs.readFileSync(path.join(base, '.git', 'refs', 'heads', 'master'), {'encoding':'utf-8'}).trim();
12
+ var compiler_dir = path.join(base, 'dev');
13
+ if (!path_exists(path.join(compiler_dir, 'compiler.js'))) compiler_dir = path.join(base, 'release');
14
+
15
+ var manifest = {}, total = 0;
16
+ ['compiler.js', 'baselib-plain-pretty.js'].forEach(function(x) {
17
+ manifest[x] = fs.readFileSync(path.join(compiler_dir, x), {'encoding':'utf-8'});
18
+ total += manifest[x].length;
19
+ });
20
+
21
+ ['web_repl.js', 'embedded_compiler.js', 'utils.js', 'completer.js', 'msgfmt.js', 'gettext.js'].forEach(function(x) {
22
+ x = 'tools/' + x;
23
+ manifest[x] = fs.readFileSync(path.join(base, x), {'encoding':'utf-8'});
24
+ total += manifest[x].length;
25
+ });
26
+
27
+ var stdlib = path.join(base, 'src', 'lib');
28
+
29
+ function path_exists(path) {
30
+ try {
31
+ fs.statSync(path);
32
+ return true;
33
+ } catch(e) {
34
+ if (e.code != 'ENOENT') throw e;
35
+ }
36
+ }
37
+
38
+ function process_dir(relpath) {
39
+ var fullpath = (relpath) ? path.join(stdlib, relpath) : stdlib;
40
+ fs.readdirSync(fullpath).forEach(function (x) {
41
+ var q = path.join(fullpath, x);
42
+ var s = fs.statSync(q);
43
+ if (s.isDirectory()) return process_dir(relpath + '/' + x);
44
+ if (!x.endsWith('.pyj')) return;
45
+ var iname = ('__stdlib__' + '/' + relpath + '/' + x).replace(/\\/g, '/').replace(/\/+/g, '/');
46
+ var raw = fs.readFileSync(q, {'encoding':'utf-8'});
47
+ manifest[iname] = raw;
48
+ total += s.size;
49
+ });
50
+ }
51
+ process_dir('');
52
+
53
+
54
+ var rs = '// vim:fileencoding=utf-8\n';
55
+ rs += '(function(external_namespace) {\n';
56
+ rs += '"use strict;"\n';
57
+ rs += 'var rs_version = ' + JSON.stringify(meta.version) + ';\n';
58
+ rs += 'var rs_commit_sha = ' + JSON.stringify(commit_sha) + ';\n';
59
+ rs += '\n// Embedded modules {{{\n';
60
+ rs += 'var data = ' + JSON.stringify(manifest) + ';\n\n';
61
+ rs += '// End embedded modules }}}\n\n';
62
+ rs += fs.readFileSync(path.join(base, 'web-repl', 'env.js'));
63
+ rs += '\n// Embedded sha1 implementation {{{\n';
64
+ rs += '(function() {\n';
65
+ rs += fs.readFileSync(path.join(base, 'web-repl', 'sha1.js'));
66
+ rs += '}).call(jsSHA);\n';
67
+ rs += '// End embedded sha1 implementation }}}\n\n';
68
+ rs += 'var exports = namespace;\n';
69
+ rs += fs.readFileSync(path.join(base, 'tools', 'export.js'), {'encoding':'utf-8'});
70
+ rs += 'external_namespace.RapydScript = namespace;\n';
71
+ rs += '})(this);\n';
72
+
73
+
74
+ var base_dir = process.argv.slice(-1)[0];
75
+ if (process.argv.length !== 3) {
76
+ console.error('Usage: web-repl-export /path/to/export/directory');
77
+ process.exit(1);
78
+ }
79
+
80
+ base_dir = path.normalize(path.resolve(base_dir));
81
+
82
+ try {
83
+ fs.mkdirSync(base_dir);
84
+ } catch(e) {
85
+ if (e.code !== 'EEXIST') throw e;
86
+ }
87
+
88
+ try {
89
+ process.chdir(base_dir);
90
+ } catch(e) {
91
+ if (e.code === 'ENOTDIR') { console.error(base_dir + ' is not a directory'); process.exit(1); }
92
+ throw e;
93
+ }
94
+ fs.writeFileSync('rapydscript.js', rs, {'encoding':'utf-8'});
95
+ var web_repl = path.join(base, 'web-repl');
96
+ fs.readdirSync(web_repl).forEach(function(x) {
97
+ if (['sha1.js', 'env.js'].indexOf(x) !== -1) return;
98
+ var data = fs.readFileSync(path.join(web_repl, x), {'encoding':'utf-8'});
99
+ fs.writeFileSync(x, data, {'encoding':'utf-8'});
100
+ });
101
+ console.log('RapydScript compiler (uncompressed) size: ' + (total/(1024)).toFixed(1) + ' KB');
102
+ console.log('web-repl exported to: ' + base_dir);
package/build CHANGED
@@ -1,3 +1,3 @@
1
- #!/bin/sh
2
- exec bin/rapydscript self --complete --test
1
+ #!/bin/sh
2
+ exec bin/rapydscript self --complete --test
3
3
  exec bin/web-repl-export web-repl