rapydscript-ns 0.8.4 → 0.9.1

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 (141) 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 +26 -0
  5. package/HACKING.md +103 -103
  6. package/LICENSE +24 -24
  7. package/README.md +716 -169
  8. package/TODO.md +7 -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 +6283 -3093
  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/contextlib.pyj +379 -0
  35. package/src/lib/copy.pyj +120 -120
  36. package/src/lib/dataclasses.pyj +532 -0
  37. package/src/lib/datetime.pyj +712 -0
  38. package/src/lib/elementmaker.pyj +83 -83
  39. package/src/lib/encodings.pyj +126 -126
  40. package/src/lib/enum.pyj +125 -0
  41. package/src/lib/gettext.pyj +569 -569
  42. package/src/lib/io.pyj +500 -0
  43. package/src/lib/itertools.pyj +580 -580
  44. package/src/lib/json.pyj +227 -0
  45. package/src/lib/math.pyj +193 -193
  46. package/src/lib/operator.pyj +11 -11
  47. package/src/lib/pythonize.pyj +20 -20
  48. package/src/lib/random.pyj +118 -118
  49. package/src/lib/re.pyj +504 -470
  50. package/src/lib/react.pyj +74 -74
  51. package/src/lib/traceback.pyj +63 -63
  52. package/src/lib/typing.pyj +577 -0
  53. package/src/lib/uuid.pyj +77 -77
  54. package/src/monaco-language-service/builtins.js +14 -4
  55. package/src/monaco-language-service/diagnostics.js +19 -20
  56. package/src/monaco-language-service/dts.js +550 -550
  57. package/src/output/classes.pyj +62 -26
  58. package/src/output/comments.pyj +45 -45
  59. package/src/output/exceptions.pyj +201 -201
  60. package/src/output/functions.pyj +78 -5
  61. package/src/output/jsx.pyj +164 -164
  62. package/src/output/loops.pyj +5 -2
  63. package/src/output/operators.pyj +100 -34
  64. package/src/output/treeshake.pyj +182 -182
  65. package/src/output/utils.pyj +72 -72
  66. package/src/parse.pyj +80 -16
  67. package/src/string_interpolation.pyj +72 -72
  68. package/src/tokenizer.pyj +10 -5
  69. package/src/unicode_aliases.pyj +576 -576
  70. package/src/utils.pyj +192 -192
  71. package/test/_import_one.pyj +37 -37
  72. package/test/_import_two/__init__.pyj +11 -11
  73. package/test/_import_two/level2/deep.pyj +4 -4
  74. package/test/_import_two/other.pyj +6 -6
  75. package/test/_import_two/sub.pyj +13 -13
  76. package/test/abc.pyj +291 -0
  77. package/test/aes_vectors.pyj +421 -421
  78. package/test/annotations.pyj +80 -80
  79. package/test/arithmetic_nostrict.pyj +88 -0
  80. package/test/arithmetic_types.pyj +169 -0
  81. package/test/baselib.pyj +91 -0
  82. package/test/bytes.pyj +467 -0
  83. package/test/classes.pyj +1 -0
  84. package/test/comparison_ops.pyj +173 -0
  85. package/test/contextlib.pyj +362 -0
  86. package/test/dataclasses.pyj +253 -0
  87. package/test/datetime.pyj +500 -0
  88. package/test/debugger_stmt.pyj +41 -0
  89. package/test/decorators.pyj +77 -77
  90. package/test/docstrings.pyj +39 -39
  91. package/test/elementmaker_test.pyj +45 -45
  92. package/test/enum.pyj +134 -0
  93. package/test/eval_exec.pyj +56 -0
  94. package/test/format.pyj +148 -0
  95. package/test/functions.pyj +151 -151
  96. package/test/generators.pyj +41 -41
  97. package/test/generic.pyj +370 -370
  98. package/test/imports.pyj +72 -72
  99. package/test/internationalization.pyj +73 -73
  100. package/test/io.pyj +316 -0
  101. package/test/json.pyj +196 -0
  102. package/test/lint.pyj +164 -164
  103. package/test/loops.pyj +85 -85
  104. package/test/numpy.pyj +734 -734
  105. package/test/object.pyj +64 -0
  106. package/test/omit_function_metadata.pyj +20 -20
  107. package/test/python_compat.pyj +17 -15
  108. package/test/python_features.pyj +70 -15
  109. package/test/regexp.pyj +83 -55
  110. package/test/repl.pyj +121 -121
  111. package/test/scoped_flags.pyj +76 -76
  112. package/test/tuples.pyj +96 -0
  113. package/test/typing.pyj +469 -0
  114. package/test/unit/index.js +116 -7
  115. package/test/unit/language-service-dts.js +543 -543
  116. package/test/unit/language-service-hover.js +455 -455
  117. package/test/unit/language-service.js +84 -0
  118. package/test/unit/web-repl.js +1337 -1
  119. package/test/vars_locals_globals.pyj +94 -0
  120. package/tools/cli.js +558 -547
  121. package/tools/compile.js +224 -219
  122. package/tools/completer.js +131 -131
  123. package/tools/embedded_compiler.js +262 -251
  124. package/tools/gettext.js +185 -185
  125. package/tools/ini.js +65 -65
  126. package/tools/lint.js +16 -19
  127. package/tools/msgfmt.js +187 -187
  128. package/tools/repl.js +223 -223
  129. package/tools/test.js +118 -118
  130. package/tools/utils.js +128 -128
  131. package/tools/web_repl.js +95 -95
  132. package/try +41 -41
  133. package/web-repl/env.js +196 -196
  134. package/web-repl/index.html +163 -163
  135. package/web-repl/main.js +252 -252
  136. package/web-repl/prism.css +139 -139
  137. package/web-repl/prism.js +113 -113
  138. package/web-repl/rapydscript.js +224 -224
  139. package/web-repl/sha1.js +25 -25
  140. package/PYTHON_DIFFERENCES_REPORT.md +0 -291
  141. 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,5 @@
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 [the python io.stringIO and io.bytesio library ] 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).
14
19
 
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