opal 1.6.0.alpha1 → 1.6.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.
- checksums.yaml +4 -4
- data/.gitattributes +4 -0
- data/.github/workflows/build.yml +13 -2
- data/CHANGELOG.md +70 -0
- data/README.md +3 -3
- data/UNRELEASED.md +0 -41
- data/docs/async.md +5 -17
- data/docs/jquery.md +5 -5
- data/docs/releasing.md +3 -4
- data/lib/opal/builder_processors.rb +24 -0
- data/lib/opal/builder_scheduler/prefork.rb +3 -0
- data/lib/opal/cache/file_cache.rb +13 -7
- data/lib/opal/cli.rb +15 -2
- data/lib/opal/cli_runners/chrome.rb +6 -6
- data/lib/opal/cli_runners/system_runner.rb +2 -2
- data/lib/opal/eof_content.rb +5 -2
- data/lib/opal/nodes/call.rb +3 -2
- data/lib/opal/source_map/file.rb +3 -2
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/constants.rb +2 -2
- data/opal/corelib/error/errno.rb +1 -0
- data/opal/corelib/io.rb +1 -1
- data/opal.gemspec +2 -2
- data/spec/lib/cli_spec.rb +14 -0
- data/spec/opal/core/language/DATA/characters_support_crlf_spec.rb +9 -0
- data/spec/opal/core/language/DATA/multiple___END___crlf_spec.rb +10 -0
- data/spec/opal/core/language/safe_navigator_spec.rb +10 -0
- data/stdlib/await.rb +0 -7
- data/tasks/testing.rake +8 -7
- data/test/nodejs/test_file.rb +3 -2
- metadata +18 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 849fd3ee9a34f471ea70ff0069aedfc41b66471e846b81c59e6fd17370e881a6
|
4
|
+
data.tar.gz: 71220b09662aef06681fadb4e0841eb110afa4a3e15b14e77de9a6e0666f0564
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62c5c2f184630d3fc92ec3792e5022434668d33023b89c36a49e128991a7aeea26d61f7ed7559e57e9def93577a94d784f6308c65a78c3ac83726d50942e3435
|
7
|
+
data.tar.gz: b7ede6f69220d31c0b8dc0f8350b3699c428d50471ef8d9df47a1a6c9b197116994d1b682681ee37a83b2a0c8547b93e059295c555074a093403ebe9d6ccf84a
|
data/.gitattributes
CHANGED
@@ -1 +1,5 @@
|
|
1
1
|
UNRELEASED.md merge=union
|
2
|
+
spec/opal/core/language/DATA/characters_support_crlf_spec.rb text eol=crlf
|
3
|
+
spec/opal/core/language/DATA/characters_support_spec.rb text eol=lf
|
4
|
+
spec/opal/core/language/DATA/multiple___END___crlf_spec.rb text eol=crlf
|
5
|
+
spec/opal/core/language/DATA/multiple___END___spec.rb text eol=lf
|
data/.github/workflows/build.yml
CHANGED
@@ -45,9 +45,20 @@ jobs:
|
|
45
45
|
- name: smoke-test
|
46
46
|
ruby: '3.0'
|
47
47
|
command: bin/rake smoke_test
|
48
|
+
- name: windows-mspec-nodejs
|
49
|
+
command: bundle exec rake mspec_nodejs
|
50
|
+
ruby: '3.0'
|
51
|
+
os: windows-latest
|
52
|
+
- name: windows-mspec-chrome
|
53
|
+
command: bundle exec rake mspec_chrome
|
54
|
+
ruby: '3.0'
|
55
|
+
os: windows-latest
|
56
|
+
- name: windows-minitest
|
57
|
+
command: bundle exec rake minitest
|
58
|
+
ruby: '3.0'
|
59
|
+
os: windows-latest
|
48
60
|
- name: windows
|
49
|
-
|
50
|
-
command: bundle exec rake rspec minitest_nodejs
|
61
|
+
command: bundle exec rake rspec
|
51
62
|
ruby: '3.0'
|
52
63
|
os: windows-latest
|
53
64
|
- name: lint
|
data/CHANGELOG.md
CHANGED
@@ -10,11 +10,76 @@ Changes are grouped as follows:
|
|
10
10
|
- **Removed** for deprecated features removed in this release.
|
11
11
|
- **Fixed** for any bug fixes.
|
12
12
|
- **Security** to invite users to upgrade in case of vulnerabilities.
|
13
|
+
- **Performance** changes related to speed and efficiency.
|
13
14
|
|
14
15
|
|
15
16
|
|
16
17
|
|
17
18
|
|
19
|
+
## [1.6.0](https://github.com/opal/opal/compare/v1.5.1...v1.6.0) - 2022-11-24
|
20
|
+
|
21
|
+
|
22
|
+
<!--
|
23
|
+
### Internal
|
24
|
+
### Changed
|
25
|
+
### Added
|
26
|
+
### Removed
|
27
|
+
### Deprecated
|
28
|
+
### Performance
|
29
|
+
### Fixed
|
30
|
+
-->
|
31
|
+
|
32
|
+
### Changed
|
33
|
+
|
34
|
+
- No longer truncate stacktraces to 15 lines ([#2440](https://github.com/opal/opal/pull/2440))
|
35
|
+
- Mark async/await as non-experimental ([#2477](https://github.com/opal/opal/pull/2477))
|
36
|
+
|
37
|
+
### Performance
|
38
|
+
|
39
|
+
- Improve method block performance for runtime ([#2449](https://github.com/opal/opal/pull/2449))
|
40
|
+
- Uninline non-typical argument handling ([#2419](https://github.com/opal/opal/pull/2419))
|
41
|
+
- Logic optimization of runtime.js ([#2415](https://github.com/opal/opal/pull/2415))
|
42
|
+
- Windows support for `performance:compare` CI check ([#2450](https://github.com/opal/opal/pull/2450))
|
43
|
+
- Improve block performance for even more cases ([#2465](https://github.com/opal/opal/pull/2465))
|
44
|
+
|
45
|
+
### Added
|
46
|
+
|
47
|
+
- Added support for `#freeze` and `#frozen?` (#2444, #2468)
|
48
|
+
- Add CLI support for ESM, at least for Chrome, NodeJS, QuickJS and GJS ([#2435](https://github.com/opal/opal/pull/2435))
|
49
|
+
- Support exit in Chrome CLI Runner, both sync and async ([#2439](https://github.com/opal/opal/pull/2439))
|
50
|
+
- Make sure the Server CLI Runner can pick up changes in sources ([#2436](https://github.com/opal/opal/pull/2436))
|
51
|
+
- Delegate and ruby2_keywords ([#2446](https://github.com/opal/opal/pull/2446))
|
52
|
+
- Source code can now be embedded in the compiled file to improve development/debugging, e.g. RSpec reports, `Proc#source_location` ([#2440](https://github.com/opal/opal/pull/2440))
|
53
|
+
- Added `Kernel#caller_locations` ([#2440](https://github.com/opal/opal/pull/2440))
|
54
|
+
- `Opal::Builder::Prefork` for blazingly fast multicore compilation times (#2263, #2462, #2454, #2469, #2475)
|
55
|
+
- Add `Opal::BuilderProcessors::RubyERBProcessor` ([#2470](https://github.com/opal/opal/pull/2470))
|
56
|
+
|
57
|
+
### Fixed
|
58
|
+
|
59
|
+
- Closure tracking support fixes a whole array of bugs handling `break` / `next` / `retry` / … ([#2357](https://github.com/opal/opal/pull/2357))
|
60
|
+
- Fix an edge case of if in the most complex form not returning ([#2433](https://github.com/opal/opal/pull/2433))
|
61
|
+
- `String#length` is now available when using `opal/mini` ([#2438](https://github.com/opal/opal/pull/2438))
|
62
|
+
- Auto-await produced invalid code ([#2440](https://github.com/opal/opal/pull/2440))
|
63
|
+
- Fix `Enumerable#collect_concat` and `#flat_map` implementation ([#2440](https://github.com/opal/opal/pull/2440))
|
64
|
+
- Improved await support for PromiseV1 ([#2440](https://github.com/opal/opal/pull/2440))
|
65
|
+
- Compilation error occurs while compiling `being/end` returning a `case/when` ([#2459](https://github.com/opal/opal/pull/2459))
|
66
|
+
- Ensure UTF-8 encoding of `.sourcesContent` of source maps ([#2451](https://github.com/opal/opal/pull/2451))
|
67
|
+
- Benchmarks require string/unpack ([#2453](https://github.com/opal/opal/pull/2453))
|
68
|
+
- Fix compilation of a call: `gets&.chomp` ([#2473](https://github.com/opal/opal/pull/2473))
|
69
|
+
- Fix specs on Windows ([#2460](https://github.com/opal/opal/pull/2460))
|
70
|
+
- Make opal CLI tool work again with pipes ([#2474](https://github.com/opal/opal/pull/2474))
|
71
|
+
|
72
|
+
### Internal
|
73
|
+
|
74
|
+
- GitHub Workflows security hardening ([#2432](https://github.com/opal/opal/pull/2432))
|
75
|
+
- Retry if file cache write operation exits with Zlib::BufError ([#2463](https://github.com/opal/opal/pull/2463))
|
76
|
+
- Eliminate redundant `var constructor` in `allocate_class` ([#2452](https://github.com/opal/opal/pull/2452))
|
77
|
+
- Fix `performance:compare` asset size calculation ([#2457](https://github.com/opal/opal/pull/2457))
|
78
|
+
- Fix a few specs after the Opal RSpec 1.0 (alpha) release (#2471, #2472)
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
|
18
83
|
## [1.5.1](https://github.com/opal/opal/compare/v1.5.0...v1.5.1) - 2022-07-20
|
19
84
|
|
20
85
|
|
@@ -24,6 +89,11 @@ Changes are grouped as follows:
|
|
24
89
|
- Fix exception during `Hash#each_value` if keys get deleted during loop ([#2427](https://github.com/opal/opal/pull/2427))
|
25
90
|
- Fix scan_until and check_until implementation of StringScanner ([#2420](https://github.com/opal/opal/pull/2420))
|
26
91
|
|
92
|
+
## New Contributors
|
93
|
+
* @Leon0402 made their first contribution in https://github.com/opal/opal/pull/2420
|
94
|
+
|
95
|
+
**Full Changelog**: https://github.com/opal/opal/compare/v1.5.0...v1.5.1
|
96
|
+
|
27
97
|
|
28
98
|
|
29
99
|
|
data/README.md
CHANGED
@@ -18,14 +18,14 @@
|
|
18
18
|
<a href="#sponsors"><img src="https://opencollective.com/opal/sponsors/badge.svg" alt="Sponsors on Open Collective" title="" /></a>
|
19
19
|
<a href="https://slack.opalrb.com/"><img src="https://img.shields.io/badge/slack-join%20chat-46BC99?logo=slack&style=flat" alt="Slack" title="Join Chat" /></a>
|
20
20
|
<a href="https://opalrb.com/docs"><img src="https://img.shields.io/badge/docs-updated-blue.svg" alt="Documentation" title="" /></a>
|
21
|
-
|
21
|
+
|
22
22
|
<br>
|
23
23
|
<strong>Code:</strong><br>
|
24
24
|
<a href="https://badge.fury.io/rb/opal"><img src="https://img.shields.io/gem/v/opal.svg?style=flat" alt="Gem Version" title="" /></a>
|
25
25
|
<a href="https://github.com/opal/opal/actions?query=workflow%3Abuild"><img src="https://github.com/opal/opal/workflows/build/badge.svg" alt="Build Status" /></a>
|
26
26
|
<a href="https://codeclimate.com/github/opal/opal"><img src="https://img.shields.io/codeclimate/maintainability-percentage/opal/opal.svg" alt="Code Climate" title="" /></a>
|
27
27
|
<a href="https://coveralls.io/github/opal/opal?branch=master"><img src="https://coveralls.io/repos/opal/opal/badge.svg?branch=master&service=github" alt="Coverage Status" title="" /></a>
|
28
|
-
|
28
|
+
|
29
29
|
<br>
|
30
30
|
<strong>Sponsors:</strong>
|
31
31
|
<br/><a href="https://nebulab.it?utm_source=github&utm_medium=badge"><img src="https://img.shields.io/static/v1?label=Nebulab&message=Open+Source+Fridays&color=%235dbefd&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMQSURBVHgBrZZNTxNRFIbfczsgIMQiLBCRFDaGhUr9A9iiIa5EEneIwE/AlRsNv8KlIKwFl35RTUBX8rFBdiVKAgqmXSCY0M71nJl+zJTOdKh9k6Yzc8/cZ86555x7CQE0mji5hSyGlQoNaOgIPwrnhtIArWszu4EQFudjdR8rzUV+gw8/ZMZB9IwvIwimJJGafhmjWZwFOJ7QkYzWCwTdj+qUDJGKz8Rou3RAlT4YS+hHWW2u/QdM1MNzrI6+zwyXDrg8FANStIDaSXOIJ5whLgAljOIZiglRK6U4vDfz4S2ElGGJWsEaQkCTUbhtNbV+lb+xgFY2Bs9ET0h/GzBxlfAkqnCUKY5xKfVLbsi1/R126lcF6WgCYp2ES42EBp6tvQFY+alLTUlrUxizJEVNWiVwBkVagGg7oe+CDclLYOfrgMdfTBz8PfWa1lkzbsDEsH/5FyF9YUK0zQ1xwpoZtsm9pwxMRLyA9wyi0A2Jcjl1NNqeeEFEimxYPkmWd014ikIDnDTeBb53DOweaRxnvWGyhnmYfPZWGt487sNi6lsK67/lZ1oZGOtUaD3nhtU7etXXfe0VzrzCBgLKCR68rNDX6oaJlvd0xXnklbSfgSTL/QghXF8EP980cVKyVL/Ys9UDVFJa8Tdt+1lYmcmJM3Vd4UEvWeslRf32h9ubrVRl77gBrCto85OfUU+LXTMGx+JuN2Hoin3/Zkfjj6ObBAknV+KG4jpc9BqXMEpiCMz6Z9ZQ12kvJZxb6co4Zr1W83esY8F2OYsIe+eEyfTiVXczCl7uM2wliHfMEJaRc3Wa++mLUotrF4EW7h6f94Dvh6aVFM60Fy8Xkya+BfBOjh5yUWhqY0vmKi9q1GnVxZ7sHKIWSs7FQ71yUagkRTTCfymnVY1gsgHHC5z8hbUjaz0Fr8ZanXhX0pPOw5SrV8wNGjNscMrTKpXKaj05f9twVYHnMZGPHEuwTwEBNi+3NGiNt6GRcsfEIAfhp2cAV3cQLtXoOz7q8+ZJRLx3kmxn4dy7aas1SrfiBpKraV/9A+PSJLDAXLUvAAAAAElFTkSuQmCC" alt="Nebulab: Open Source Fridays" /></a>
|
@@ -99,7 +99,7 @@ or to build an entire app including dependencies declared with `require`:
|
|
99
99
|
```ruby
|
100
100
|
builder = Opal::Builder.new
|
101
101
|
builder.build_str('require "opal"; puts "wow"', '(inline)')
|
102
|
-
File.
|
102
|
+
File.binwrite 'app.js', builder.to_s # must use binary mode for writing
|
103
103
|
```
|
104
104
|
|
105
105
|
|
data/UNRELEASED.md
CHANGED
@@ -8,44 +8,3 @@
|
|
8
8
|
### Fixed
|
9
9
|
-->
|
10
10
|
|
11
|
-
### Changed
|
12
|
-
|
13
|
-
- No longer truncate stacktraces to 15 lines (#2440)
|
14
|
-
|
15
|
-
### Performance
|
16
|
-
|
17
|
-
- Improve method block performance for runtime (#2449)
|
18
|
-
- Uninline non-typical argument handling (#2419)
|
19
|
-
- Logic optimization of runtime.js (#2415)
|
20
|
-
- Windows support for `performance:compare` CI check (#2450)
|
21
|
-
- Improve block performance for even more cases (#2465)
|
22
|
-
|
23
|
-
### Added
|
24
|
-
|
25
|
-
- Added support for `#freeze` and `#frozen?` (#2444, #2468)
|
26
|
-
- Add CLI support for ESM, at least for Chrome, NodeJS, QuickJS and GJS (#2435)
|
27
|
-
- Support exit in Chrome CLI Runner, both sync and async (#2439)
|
28
|
-
- Make sure the Server CLI Runner can pick up changes in sources (#2436)
|
29
|
-
- Delegate and ruby2_keywords (#2446)
|
30
|
-
- Source code can now be embedded in the compiled file to improve development/debugging, e.g. RSpec reports, `Proc#source_location` (#2440)
|
31
|
-
- Added `Kernel#caller_locations` (#2440)
|
32
|
-
- `Opal::Builder::Prefork` for blazingly fast multicore compilation times (#2263, #2462, #2454)
|
33
|
-
|
34
|
-
### Fixed
|
35
|
-
|
36
|
-
- Closure tracking support fixes a whole array of bugs handling `break` / `next` / `retry` / … (#2357)
|
37
|
-
- Fix an edge case of if in the most complex form not returning (#2433)
|
38
|
-
- `String#length` is now available when using `opal/mini` (#2438)
|
39
|
-
- Auto-await produced invalid code (#2440)
|
40
|
-
- Fix `Enumerable#collect_concat` and `#flat_map` implementation (#2440)
|
41
|
-
- Improved await support for PromiseV1 (#2440)
|
42
|
-
- Compilation error occurs while compiling `being/end` returning a `case/when` (#2459)
|
43
|
-
- Ensure UTF-8 encoding of `.sourcesContent` of source maps (#2451)
|
44
|
-
- Benchmarks require string/unpack (#2453)
|
45
|
-
|
46
|
-
### Internal
|
47
|
-
|
48
|
-
- GitHub Workflows security hardening (#2432)
|
49
|
-
- Retry if file cache write operation exits with Zlib::BufError (#2463)
|
50
|
-
- Eliminate redundant `var constructor` in `allocate_class` (#2452)
|
51
|
-
- Fix `performance:compare` asset size calculation (#2457)
|
data/docs/async.md
CHANGED
@@ -1,16 +1,5 @@
|
|
1
1
|
# Asynchronous code (PromiseV2 / async / await)
|
2
2
|
|
3
|
-
Please be aware that this functionality is marked as experimental and may change
|
4
|
-
in the future.
|
5
|
-
|
6
|
-
In order to disable the warnings that will be shown if you use those experimental
|
7
|
-
features, add the following line before requiring `promise/v2` or `await` and after
|
8
|
-
requiring `opal`.
|
9
|
-
|
10
|
-
```ruby
|
11
|
-
`Opal.config.experimental_features_severity = 'ignore'`
|
12
|
-
```
|
13
|
-
|
14
3
|
## PromiseV2
|
15
4
|
|
16
5
|
In Opal 1.2 we introduced PromiseV2 which is to replace the default Promise in Opal 2.0
|
@@ -52,7 +41,7 @@ require "await"
|
|
52
41
|
|
53
42
|
def wait_5_seconds
|
54
43
|
puts "Let's wait 5 seconds..."
|
55
|
-
sleep(5).
|
44
|
+
sleep(5).__await__
|
56
45
|
puts "Done!"
|
57
46
|
end
|
58
47
|
|
@@ -60,14 +49,11 @@ wait_5_seconds.__await__
|
|
60
49
|
```
|
61
50
|
|
62
51
|
It's important to understand what happens under the hood: every scope in which `#__await__` is
|
63
|
-
encountered will become async, which means that it will return a
|
52
|
+
encountered will become async, which means that it will return a PromiseV2 that will resolve
|
64
53
|
to a value. This includes methods, blocks and the top scope. This means, that `#__await__` is
|
65
54
|
infectious and you need to remember to `#__await__` everything along the way, otherwise
|
66
55
|
a program will finish too early and the values may be incorrect.
|
67
56
|
|
68
|
-
[You can take a look at how we ported Minitest to support asynchronous tests.](https://github.com/opal/opal/pull/2221/commits/8383c7b45a94fe4628778f429508b9c08c8948b0) Take note, that
|
69
|
-
it was ported to use `#await` while the finally accepted version uses `#__await__`.
|
70
|
-
|
71
57
|
It is certainly correct to `#__await__` any value, including non-Promises, for instance
|
72
58
|
`5.__await__` will correctly resolve to `5` (except that it will make the scope an async
|
73
59
|
function, with all the limitations described above).
|
@@ -76,6 +62,8 @@ The `await` stdlib module includes a few useful functions, like async-aware `eac
|
|
76
62
|
function and `sleep` that doesn't block the thread. It also includes a method `#await`
|
77
63
|
which is an alias of `#itself` - it makes sense to auto-await that method.
|
78
64
|
|
65
|
+
[You can take a look at how we ported Minitest to support asynchronous tests.](https://github.com/opal/opal/pull/2221/files#diff-bdc8868ad4476bff7b25475f1b19059ac684d64c6531a645b3ba0aef0c466d0f).
|
66
|
+
|
79
67
|
This approach is certainly incompatible with what Ruby does, but due to a dynamic nature
|
80
68
|
of Ruby and a different model of JavaScript this was the least invasive way to catch up
|
81
69
|
with the latest JavaScript trends and support `Promise` heavy APIs and asynchronous code.
|
@@ -106,4 +94,4 @@ require "await"
|
|
106
94
|
p i
|
107
95
|
sleep i
|
108
96
|
end
|
109
|
-
```
|
97
|
+
```
|
data/docs/jquery.md
CHANGED
@@ -58,7 +58,7 @@ builder.build('opal')
|
|
58
58
|
builder.build('opal-jquery')
|
59
59
|
builder.build('./app/application.rb')
|
60
60
|
|
61
|
-
File.
|
61
|
+
File.binwrite('application.js', builder.to_s) # must use binary mode for writing
|
62
62
|
```
|
63
63
|
|
64
64
|
then simply load the compiled file in your html:
|
@@ -67,7 +67,7 @@ then simply load the compiled file in your html:
|
|
67
67
|
<!DOCTYPE html>
|
68
68
|
<html>
|
69
69
|
<head>
|
70
|
-
<script src='https://code.jquery.com/jquery-3.3.1.min.js' integrity='sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=' crossorigin='anonymous'></script>
|
70
|
+
<script src='https://code.jquery.com/jquery-3.3.1.min.js' integrity='sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=' crossorigin='anonymous'></script>
|
71
71
|
<script type='text/javascript' src='./application.js'></script>
|
72
72
|
</head>
|
73
73
|
<body></body>
|
@@ -75,11 +75,11 @@ then simply load the compiled file in your html:
|
|
75
75
|
```
|
76
76
|
|
77
77
|
NOTE: opal-jquery expects a jquery library to be loaded. This example loads it
|
78
|
-
remotely from jquery.com, but a locally downloaded copy works just as well, or-
|
78
|
+
remotely from jquery.com, but a locally downloaded copy works just as well, or-
|
79
79
|
if you're using rails- jquery may be included automatically.
|
80
80
|
|
81
|
-
This example builds opal, opal-jquery and the application into a single `.js` file,
|
82
|
-
but you may build them separately, if you so choose. Just remember to include
|
81
|
+
This example builds opal, opal-jquery and the application into a single `.js` file,
|
82
|
+
but you may build them separately, if you so choose. Just remember to include
|
83
83
|
each respective script in your html!
|
84
84
|
|
85
85
|
### How does opal-jquery work
|
data/docs/releasing.md
CHANGED
@@ -18,14 +18,14 @@ _This guide is a work-in-progress._
|
|
18
18
|
- Commit the updated changelog along with the version bump using this commit message:
|
19
19
|
"Release v1.2.3"
|
20
20
|
- Push the commit and run `bin/rake release` to release the new version to Rubygems
|
21
|
-
- Go to GitHub releases and create a new release from the latest tag pasting the contents from CHANGELOG.md
|
21
|
+
- Go to GitHub releases and create a new release from the latest tag pasting the contents from CHANGELOG.md (or UNRELEASED.md for pre-releases)
|
22
22
|
|
23
23
|
## Opal docs
|
24
24
|
|
25
25
|
- Open `opal-docs` and run `bin/build v1.2.3`
|
26
26
|
- Then run `bin/deploy`
|
27
27
|
|
28
|
-
## Opal site
|
28
|
+
## [skip for pre-releases] Opal site
|
29
29
|
|
30
30
|
- Open `opal.github.io` and update the opal version in the `Gemfile`
|
31
31
|
- run `bin/build`
|
@@ -35,9 +35,8 @@ _This guide is a work-in-progress._
|
|
35
35
|
|
36
36
|
- Run `bin/release v1.2.3`
|
37
37
|
|
38
|
-
## Prepare for the next release
|
38
|
+
## [skip for minor-releases] Prepare for the next release
|
39
39
|
|
40
|
-
- Skip this step if releasing a stable release
|
41
40
|
- Create a new pull request that:
|
42
41
|
- Updates a version to `v1.x.0.dev` in both `lib/opal/version.rb` and `opal/corelib/constants.rb`
|
43
42
|
- Remember to merge that PR before merging anything else next once we decide to not release any more point releases from `master`.
|
@@ -114,6 +114,12 @@ module Opal
|
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
|
+
# This handler is for files named ".opalerb", which ought to
|
118
|
+
# first get compiled to Ruby code using ERB, then with Opal.
|
119
|
+
# Unlike below processors, OpalERBProcessor can be used to
|
120
|
+
# compile templates, which will in turn output HTML. Take
|
121
|
+
# a look at docs/templates.md to understand this subsystem
|
122
|
+
# better.
|
117
123
|
class OpalERBProcessor < RubyProcessor
|
118
124
|
handles :opalerb
|
119
125
|
|
@@ -133,6 +139,24 @@ module Opal
|
|
133
139
|
end
|
134
140
|
end
|
135
141
|
|
142
|
+
# This handler is for files named ".rb.erb", which ought to
|
143
|
+
# first get preprocessed via ERB, then via Opal.
|
144
|
+
class RubyERBProcessor < RubyProcessor
|
145
|
+
handles :"rb.erb"
|
146
|
+
|
147
|
+
def compiled
|
148
|
+
@compiled ||= begin
|
149
|
+
@source = ::ERB.new(@source.to_s).result
|
150
|
+
|
151
|
+
compiler = compiler_for(@source, file: @filename)
|
152
|
+
compiler.compile
|
153
|
+
compiler
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# This handler is for files named ".js.erb", which ought to
|
159
|
+
# first get preprocessed via ERB, then served verbatim as JS.
|
136
160
|
class ERBProcessor < Processor
|
137
161
|
handles :erb
|
138
162
|
|
@@ -19,15 +19,21 @@ module Opal
|
|
19
19
|
|
20
20
|
def set(key, data)
|
21
21
|
file = cache_filename_for(key)
|
22
|
-
|
23
22
|
out = Marshal.dump(data)
|
24
|
-
|
23
|
+
|
24
|
+
# Sometimes `Zlib::BufError` gets raised, unsure why, makes no sense, possibly
|
25
|
+
# some race condition (see https://github.com/ruby/zlib/issues/49).
|
26
|
+
# Limit the number of retries to avoid infinite loops.
|
27
|
+
retries = 5
|
28
|
+
begin
|
29
|
+
out = Zlib.gzip(out, level: 9)
|
30
|
+
rescue Zlib::BufError
|
31
|
+
warn "\n[Opal]: Zlib::BufError; retrying (#{retries} retries left)"
|
32
|
+
retries -= 1
|
33
|
+
retry if retries > 0
|
34
|
+
end
|
35
|
+
|
25
36
|
File.binwrite(file, out)
|
26
|
-
rescue Zlib::BufError
|
27
|
-
# This sometimes happens, unsure why, makes no sense, possibly
|
28
|
-
# some race condition
|
29
|
-
warn '[Opal]: Zlib::BufError; retrying'
|
30
|
-
retry
|
31
37
|
end
|
32
38
|
|
33
39
|
def get(key)
|
data/lib/opal/cli.rb
CHANGED
@@ -184,8 +184,21 @@ module Opal
|
|
184
184
|
if evals.any?
|
185
185
|
yield evals.join("\n"), '-e'
|
186
186
|
elsif file && (filename != '-' || evals.empty?)
|
187
|
-
|
188
|
-
|
187
|
+
return @content if @content
|
188
|
+
|
189
|
+
if file.tty?
|
190
|
+
save = true
|
191
|
+
else
|
192
|
+
begin
|
193
|
+
file.rewind
|
194
|
+
rescue Errno::ESPIPE
|
195
|
+
save = true
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
content = yield(file.read, filename)
|
200
|
+
@content = content if save
|
201
|
+
content
|
189
202
|
end
|
190
203
|
end
|
191
204
|
end
|
@@ -66,7 +66,7 @@ module Opal
|
|
66
66
|
def prepare_files_in(dir)
|
67
67
|
js = builder.to_s
|
68
68
|
map = builder.source_map.to_json
|
69
|
-
stack = File.
|
69
|
+
stack = File.binread("#{__dir__}/source-map-support-browser.js")
|
70
70
|
|
71
71
|
ext = builder.output_extension
|
72
72
|
module_type = ' type="module"' if builder.esm?
|
@@ -74,9 +74,9 @@ module Opal
|
|
74
74
|
# Chrome can't handle huge data passed to `addScriptToEvaluateOnLoad`
|
75
75
|
# https://groups.google.com/a/chromium.org/forum/#!topic/chromium-discuss/U5qyeX_ydBo
|
76
76
|
# The only way is to create temporary files and pass them to chrome.
|
77
|
-
File.
|
78
|
-
File.
|
79
|
-
File.
|
77
|
+
File.binwrite("#{dir}/index.#{ext}", js)
|
78
|
+
File.binwrite("#{dir}/source-map-support.js", stack)
|
79
|
+
File.binwrite("#{dir}/index.html", <<~HTML)
|
80
80
|
<html><head>
|
81
81
|
<meta charset='utf-8'>
|
82
82
|
<script src='./source-map-support.js'></script>
|
@@ -124,7 +124,7 @@ module Opal
|
|
124
124
|
|
125
125
|
chrome_pid = Process.spawn(chrome_server_cmd)
|
126
126
|
|
127
|
-
Timeout.timeout(
|
127
|
+
Timeout.timeout(30) do
|
128
128
|
loop do
|
129
129
|
break if chrome_server_running?
|
130
130
|
sleep 0.5
|
@@ -137,7 +137,7 @@ module Opal
|
|
137
137
|
puts 'Make sure that you have it installed and that its version is > 59'
|
138
138
|
exit(1)
|
139
139
|
ensure
|
140
|
-
if windows? && chrome_pid
|
140
|
+
if OS.windows? && chrome_pid
|
141
141
|
Process.kill('KILL', chrome_pid) unless system("taskkill /f /t /pid #{chrome_pid} >NUL 2>NUL")
|
142
142
|
elsif chrome_pid
|
143
143
|
Process.kill('HUP', chrome_pid)
|
@@ -27,9 +27,9 @@ SystemRunner = ->(data, &block) {
|
|
27
27
|
|
28
28
|
tempfile =
|
29
29
|
if debug
|
30
|
-
File.new("opal-nodejs-runner.#{ext}", '
|
30
|
+
File.new("opal-nodejs-runner.#{ext}", 'wb')
|
31
31
|
else
|
32
|
-
Tempfile.new(['opal-system-runner', ".#{ext}"])
|
32
|
+
Tempfile.new(['opal-system-runner', ".#{ext}"], mode: File::BINARY)
|
33
33
|
end
|
34
34
|
|
35
35
|
tempfile.write code
|
data/lib/opal/eof_content.rb
CHANGED
@@ -15,9 +15,12 @@ module Opal
|
|
15
15
|
eof_content = @source[last_token_position..-1]
|
16
16
|
return nil unless eof_content
|
17
17
|
|
18
|
-
|
18
|
+
# On Windows token position is off a bit, because Parser does not seem to compensate for \r\n
|
19
|
+
# The first eof_content line on Windows may be for example "end\r\n"
|
20
|
+
# Must match for it and \r\n and \n
|
21
|
+
eof_content = eof_content.lines.drop_while { |line| /\A.*\r?\n?\z/.match?(line) && !line.start_with?('__END__') }
|
19
22
|
|
20
|
-
if eof_content[0]
|
23
|
+
if /\A__END__\r?\n?\z/.match?(eof_content[0])
|
21
24
|
eof_content = eof_content[1..-1] || []
|
22
25
|
eof_content.join
|
23
26
|
elsif eof_content == ['__END__']
|
data/lib/opal/nodes/call.rb
CHANGED
@@ -186,7 +186,8 @@ module Opal
|
|
186
186
|
end
|
187
187
|
|
188
188
|
def compile_simple_call_chain
|
189
|
-
|
189
|
+
compile_receiver
|
190
|
+
push method_jsid, '(', expr(arglist), ')'
|
190
191
|
end
|
191
192
|
|
192
193
|
def splat?
|
@@ -469,7 +470,7 @@ module Opal
|
|
469
470
|
def handle_conditional_send
|
470
471
|
# temporary variable that stores method receiver
|
471
472
|
receiver_temp = scope.new_temp
|
472
|
-
push "#{receiver_temp} = ", expr(
|
473
|
+
push "#{receiver_temp} = ", expr(receiver_sexp)
|
473
474
|
|
474
475
|
# execute the sexp only if the receiver isn't nil
|
475
476
|
push ", (#{receiver_temp} === nil || #{receiver_temp} == null) ? nil : "
|
data/lib/opal/source_map/file.rb
CHANGED
@@ -182,8 +182,9 @@ class Opal::SourceMap::File
|
|
182
182
|
def fragments_by_line
|
183
183
|
raw_mappings = [[]]
|
184
184
|
fragments.flat_map do |fragment|
|
185
|
-
fragment_code
|
186
|
-
|
185
|
+
fragment_code = fragment.code
|
186
|
+
splitter = /\r/.match?(fragment_code) ? /\r?\n/ : "\n"
|
187
|
+
fragment_lines = fragment_code.split(splitter, -1) # a negative limit won't suppress trailing null values
|
187
188
|
fragment_lines.each.with_index do |fragment_line, index|
|
188
189
|
raw_segment = [fragment_line, fragment]
|
189
190
|
if index.zero? && !fragment_line.size.zero?
|
data/lib/opal/version.rb
CHANGED
data/opal/corelib/constants.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
::RUBY_PLATFORM = 'opal'
|
2
2
|
::RUBY_ENGINE = 'opal'
|
3
3
|
::RUBY_VERSION = '3.1.0'
|
4
|
-
::RUBY_ENGINE_VERSION = '1.6.0
|
5
|
-
::RUBY_RELEASE_DATE = '2022-11-
|
4
|
+
::RUBY_ENGINE_VERSION = '1.6.0'
|
5
|
+
::RUBY_RELEASE_DATE = '2022-11-24'
|
6
6
|
::RUBY_PATCHLEVEL = 0
|
7
7
|
::RUBY_REVISION = '0'
|
8
8
|
::RUBY_COPYRIGHT = 'opal - Copyright (C) 2013-2022 Adam Beynon and the Opal contributors'
|
data/opal/corelib/error/errno.rb
CHANGED
@@ -4,6 +4,7 @@ module ::Errno
|
|
4
4
|
[:EEXIST, 'File exists', 17],
|
5
5
|
[:EISDIR, 'Is a directory', 21],
|
6
6
|
[:EMFILE, 'Too many open files', 24],
|
7
|
+
[:ESPIPE, 'Illegal seek', 29],
|
7
8
|
[:EACCES, 'Permission denied', 13],
|
8
9
|
[:EPERM, 'Operation not permitted', 1],
|
9
10
|
[:ENOENT, 'No such file or directory', 2],
|
data/opal/corelib/io.rb
CHANGED
data/opal.gemspec
CHANGED
@@ -44,9 +44,9 @@ Gem::Specification.new do |spec|
|
|
44
44
|
spec.add_development_dependency 'rack-test'
|
45
45
|
spec.add_development_dependency 'selenium-webdriver'
|
46
46
|
spec.add_development_dependency 'benchmark-ips', '< 2.8'
|
47
|
-
spec.add_development_dependency 'sinatra'
|
47
|
+
spec.add_development_dependency 'sinatra', '~> 3.0'
|
48
48
|
spec.add_development_dependency 'rubocop', '~> 0.67.0'
|
49
49
|
spec.add_development_dependency 'rubocop-performance', '~> 1.1.0'
|
50
|
-
spec.add_development_dependency 'rack'
|
50
|
+
spec.add_development_dependency 'rack', '~> 2.2'
|
51
51
|
spec.add_development_dependency 'webrick'
|
52
52
|
end
|
data/spec/lib/cli_spec.rb
CHANGED
@@ -236,6 +236,20 @@ RSpec.describe Opal::CLI do
|
|
236
236
|
end
|
237
237
|
end
|
238
238
|
|
239
|
+
context 'using pipes' do
|
240
|
+
it 'runs the provided source' do
|
241
|
+
# `echo` on windows will output double-quotes along with the contents, that's why we print with ruby
|
242
|
+
expect(`ruby -e"puts 'foo'" | ruby bin/opal -ropal/platform -e "puts gets.reverse"`.strip).to eq("oof")
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'compiles the provided source' do
|
246
|
+
# `echo` on windows will output double-quotes along with the contents, that's why we print with ruby
|
247
|
+
expect(`ruby -e"puts 'puts 123'" | ruby bin/opal -cEO`.strip).to include("self.$puts(123)")
|
248
|
+
end
|
249
|
+
|
250
|
+
# TODO: test refreshes with the server runner (only way to ensure we correctly rewind or cache the eval contents)
|
251
|
+
end
|
252
|
+
|
239
253
|
private
|
240
254
|
|
241
255
|
def expect_output_of
|
@@ -4,4 +4,14 @@ describe 'Safe navigator' do
|
|
4
4
|
value&.unknown.should == nil
|
5
5
|
end
|
6
6
|
end
|
7
|
+
|
8
|
+
it "calls a receiver exactly once" do
|
9
|
+
def receiver
|
10
|
+
@calls += 1
|
11
|
+
end
|
12
|
+
@calls = 0
|
13
|
+
receiver&.itself.should == 1
|
14
|
+
@calls = 0
|
15
|
+
receiver&.itself{}.should == 1
|
16
|
+
end
|
7
17
|
end
|
data/stdlib/await.rb
CHANGED
@@ -1,13 +1,6 @@
|
|
1
1
|
# helpers: coerce_to
|
2
2
|
# await: await
|
3
3
|
|
4
|
-
if `Opal.config.experimental_features_severity == 'warning'`
|
5
|
-
warn 'Await functionality is a technology preview, which means it may change its behavior ' \
|
6
|
-
'in the future unless this warning is removed. If you are interested in this part, ' \
|
7
|
-
'please make sure you track the async/await/promises tag on Opal issues: ' \
|
8
|
-
'https://github.com/opal/opal/issues?q=label%3Aasync%2Fawait%2Fpromises'
|
9
|
-
end
|
10
|
-
|
11
4
|
%x{
|
12
5
|
var AsyncFunction = Object.getPrototypeOf(async function() {}).constructor;
|
13
6
|
}
|
data/tasks/testing.rake
CHANGED
@@ -427,14 +427,15 @@ task :smoke_test do
|
|
427
427
|
extend RSpec::Matchers
|
428
428
|
expect(actual_output.lines[0]).to eq("[32m.[0m[32m.[0m\n")
|
429
429
|
expect(actual_output.lines[1]).to eq("\n")
|
430
|
-
expect(actual_output.lines[2]).to match(%r{
|
431
|
-
expect(actual_output.lines[
|
432
|
-
expect(actual_output.lines[
|
433
|
-
expect(actual_output.lines[
|
434
|
-
expect(actual_output.lines[
|
430
|
+
expect(actual_output.lines[2]).to match(%r{Top 2 slowest examples \(\d+\.\d+ seconds, \d+\.\d+% of total time\):\n})
|
431
|
+
expect(actual_output.lines[4]).to match(%r{ \[1m\d+\.\d+\[0m \[1mseconds\[0m .*deprecations_spec\.rb:7\n})
|
432
|
+
expect(actual_output.lines[6]).to match(%r{ \[1m\d+\.\d+\[0m \[1mseconds\[0m .*deprecations_spec\.rb:12\n})
|
433
|
+
expect(actual_output.lines[7]).to eq("\n")
|
434
|
+
expect(actual_output.lines[8]).to match(%r{^Finished in \d+\.\d+ seconds \(files took \d+\.\d+ seconds to load\)\n$})
|
435
|
+
expect(actual_output.lines[9]).to eq("[32m2 examples, 0 failures[0m\n")
|
435
436
|
expect([
|
436
|
-
actual_output.lines[
|
437
|
-
actual_output.lines[
|
437
|
+
actual_output.lines[3],
|
438
|
+
actual_output.lines[5],
|
438
439
|
]).to contain_exactly(
|
439
440
|
" Opal::Deprecations defaults to warn\n",
|
440
441
|
" Opal::Deprecations can be set to raise\n",
|
data/test/nodejs/test_file.rb
CHANGED
@@ -175,6 +175,7 @@ class TestNodejsFile < Test::Unit::TestCase
|
|
175
175
|
end if windows_platform?
|
176
176
|
|
177
177
|
def test_windows_file_expand_path
|
178
|
+
# do not use d: because its a symlink in github actions fs, leading to unexpected results
|
178
179
|
drive_letter = Dir.pwd.slice(0, 2)
|
179
180
|
assert_equal(Dir.pwd + '/foo/bar.js', File.expand_path('./foo/bar.js'))
|
180
181
|
assert_equal(drive_letter + '/foo/bar.js', File.expand_path('/foo/bar.js'))
|
@@ -186,8 +187,8 @@ class TestNodejsFile < Test::Unit::TestCase
|
|
186
187
|
assert_equal('c:/bar.js', File.expand_path('\\..\\bar.js', 'c:\\foo\\baz\\'))
|
187
188
|
assert_equal('c:/foo/baz/bar.js', File.expand_path('baz\\bar.js', 'c:\\foo'))
|
188
189
|
assert_equal('c:/baz/bar.js', File.expand_path('baz\\bar.js', 'c:\\foo\\..'))
|
189
|
-
assert_equal('
|
190
|
-
assert_equal('
|
190
|
+
assert_equal('f:/', File.expand_path('f:'), 'should add a trailing slash when the path is d:')
|
191
|
+
assert_equal('g:/', File.expand_path('g:/'), 'should preserve the trailing slash when the path d:/')
|
191
192
|
assert_equal(Dir.pwd, File.expand_path(drive_letter), 'should expand to the current directory when the path is c: (and the current directory is located in the c drive)')
|
192
193
|
assert_equal(drive_letter + '/', drive_letter + '/', 'should return c:/ when the path is c:/ because the path is absolute')
|
193
194
|
end if windows_platform?
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.0
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elia Schito
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-11-
|
13
|
+
date: 2022-11-24 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: ast
|
@@ -162,16 +162,16 @@ dependencies:
|
|
162
162
|
name: sinatra
|
163
163
|
requirement: !ruby/object:Gem::Requirement
|
164
164
|
requirements:
|
165
|
-
- - "
|
165
|
+
- - "~>"
|
166
166
|
- !ruby/object:Gem::Version
|
167
|
-
version: '0'
|
167
|
+
version: '3.0'
|
168
168
|
type: :development
|
169
169
|
prerelease: false
|
170
170
|
version_requirements: !ruby/object:Gem::Requirement
|
171
171
|
requirements:
|
172
|
-
- - "
|
172
|
+
- - "~>"
|
173
173
|
- !ruby/object:Gem::Version
|
174
|
-
version: '0'
|
174
|
+
version: '3.0'
|
175
175
|
- !ruby/object:Gem::Dependency
|
176
176
|
name: rubocop
|
177
177
|
requirement: !ruby/object:Gem::Requirement
|
@@ -204,16 +204,16 @@ dependencies:
|
|
204
204
|
name: rack
|
205
205
|
requirement: !ruby/object:Gem::Requirement
|
206
206
|
requirements:
|
207
|
-
- - "
|
207
|
+
- - "~>"
|
208
208
|
- !ruby/object:Gem::Version
|
209
|
-
version: '
|
209
|
+
version: '2.2'
|
210
210
|
type: :development
|
211
211
|
prerelease: false
|
212
212
|
version_requirements: !ruby/object:Gem::Requirement
|
213
213
|
requirements:
|
214
|
-
- - "
|
214
|
+
- - "~>"
|
215
215
|
- !ruby/object:Gem::Version
|
216
|
-
version: '
|
216
|
+
version: '2.2'
|
217
217
|
- !ruby/object:Gem::Dependency
|
218
218
|
name: webrick
|
219
219
|
requirement: !ruby/object:Gem::Requirement
|
@@ -856,8 +856,10 @@ files:
|
|
856
856
|
- spec/opal/core/kernel/puts_spec.rb
|
857
857
|
- spec/opal/core/kernel/require_tree_spec.rb
|
858
858
|
- spec/opal/core/kernel/respond_to_spec.rb
|
859
|
+
- spec/opal/core/language/DATA/characters_support_crlf_spec.rb
|
859
860
|
- spec/opal/core/language/DATA/characters_support_spec.rb
|
860
861
|
- spec/opal/core/language/DATA/empty___END___spec.rb
|
862
|
+
- spec/opal/core/language/DATA/multiple___END___crlf_spec.rb
|
861
863
|
- spec/opal/core/language/DATA/multiple___END___spec.rb
|
862
864
|
- spec/opal/core/language/arguments/mlhs_arg_spec.rb
|
863
865
|
- spec/opal/core/language/forward_args_spec.rb
|
@@ -1167,10 +1169,10 @@ licenses:
|
|
1167
1169
|
metadata:
|
1168
1170
|
homepage_uri: https://opalrb.com/
|
1169
1171
|
bug_tracker_uri: https://github.com/opal/opal/issues
|
1170
|
-
changelog_uri: https://github.com/opal/opal/blob/v1.6.0
|
1171
|
-
readme_uri: https://github.com/opal/opal/blob/v1.6.0
|
1172
|
-
api_documentation_uri: http://opalrb.com/docs/api/v1.6.0
|
1173
|
-
guides_uri: http://opalrb.com/docs/guides/v1.6.0
|
1172
|
+
changelog_uri: https://github.com/opal/opal/blob/v1.6.0/CHANGELOG.md
|
1173
|
+
readme_uri: https://github.com/opal/opal/blob/v1.6.0/README.md
|
1174
|
+
api_documentation_uri: http://opalrb.com/docs/api/v1.6.0/index.html
|
1175
|
+
guides_uri: http://opalrb.com/docs/guides/v1.6.0/index.html
|
1174
1176
|
chat_uri: https://gitter.im/opal/opal
|
1175
1177
|
source_code_uri: https://github.com/opal/opal
|
1176
1178
|
post_install_message:
|
@@ -1184,9 +1186,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
1184
1186
|
version: '2.3'
|
1185
1187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1186
1188
|
requirements:
|
1187
|
-
- - "
|
1189
|
+
- - ">="
|
1188
1190
|
- !ruby/object:Gem::Version
|
1189
|
-
version:
|
1191
|
+
version: '0'
|
1190
1192
|
requirements: []
|
1191
1193
|
rubygems_version: 3.3.22
|
1192
1194
|
signing_key:
|