quickjs 0.2.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 30027c93cb2dd5dbb85d43ab40700f7ee06679a824b503bee42786a42bc5dc26
4
- data.tar.gz: 51c60a962c82bbbbaa3a3fc4202255809751848d1474f9a4e9f6b7ebe4df0277
3
+ metadata.gz: 7afae8229fda495f4a4c40c5c3ec1527bbb5491f23cd46ac1cf7d94badaa6a8b
4
+ data.tar.gz: 62abbf8909cabf1e5d22b7228eda4fe3bd2193122573ad38b6491a7e60c142e2
5
5
  SHA512:
6
- metadata.gz: e1f248cbafcc56ceba481f658aae542660ac8de6036b7fc1e9425e5f214f4f51a918a3051b82e796a075ed83726f59ba6b8dcc85e8b1c38ee1369b089ebd410a
7
- data.tar.gz: 7c7346da3a318d3ed07bfd490561ced7deda800678bda0cb23c4f2b19b84b9720191a7999a7d9a5225d91d4c2140b7fffae03f16d75b791cd4d3b746bbab50a9
6
+ metadata.gz: 6fad5187a6672299187de72faf8ccb3cc5402858c65a12edb808ae5759c1665ec90c75cbc34194b9d81e28c4ca5b8616de9174cbac060ba74da4509a28b21d85
7
+ data.tar.gz: dd8505b9ac5459fa2a2859cb1108b27861efcd59f234290ec43c4e2dc80e8ee61ea1ae34dba2f013036b495bcf6e9013f0fad0822a5249a43f7eba7cd3864251
data/README.md CHANGED
@@ -36,7 +36,10 @@ Quickjs.eval_code('const obj = {}; obj.missingKey;') # => :undefined (Quickjs::V
36
36
  Quickjs.eval_code("Number('whatever')") #=> :NaN (Quickjs::Value::NAN)
37
37
  ```
38
38
 
39
- #### Limit resources
39
+ <details>
40
+ <summary>Options</summary>
41
+
42
+ #### Resources
40
43
 
41
44
  ```rb
42
45
  # 1GB memory limit
@@ -46,20 +49,21 @@ Quickjs.eval_code(code, { memory_limit: 1024 ** 3 })
46
49
  Quickjs.eval_code(code, { max_stack_size: 1024 ** 2 })
47
50
  ```
48
51
 
49
- #### Enable built-in modules
52
+ #### Built-in modules
53
+
54
+ To enable [std module](https://bellard.org/quickjs/quickjs.html#std-module) and [os module](https://bellard.org/quickjs/quickjs.html#os-module) selectively.
50
55
 
51
56
  ```rb
52
57
  # enable std module
53
- # https://bellard.org/quickjs/quickjs.html#std-module
54
58
  Quickjs.eval_code(code, { features: [Quickjs::MODULE_STD] })
55
59
 
56
60
  # enable os module
57
- # https://bellard.org/quickjs/quickjs.html#os-module
58
61
  Quickjs.eval_code(code, { features: [Quickjs::MODULE_OS] })
59
62
 
60
- # enable timeout features `setTimeout`, `clearTimeout`
63
+ # enable timeout features `setTimeout`, `clearTimeout` from os module specifically
61
64
  Quickjs.eval_code(code, { features: [Quickjs::FEATURES_TIMEOUT] })
62
65
  ```
66
+ </details>
63
67
 
64
68
  ### `Quickjs::VM`: Maintain a consistent VM/runtime
65
69
 
@@ -71,7 +75,10 @@ vm.eval_code('a.b = "d";')
71
75
  vm.eval_code('a.b;') #=> "d"
72
76
  ```
73
77
 
74
- #### Config VM
78
+ <details>
79
+ <summary>Config VM/runtime</summary>
80
+
81
+ #### Resources
75
82
 
76
83
  ```rb
77
84
  vm = Quickjs::VM.new(
@@ -80,31 +87,30 @@ vm = Quickjs::VM.new(
80
87
  )
81
88
  ```
82
89
 
90
+ #### Built-in modules
91
+
92
+ To enable [std module](https://bellard.org/quickjs/quickjs.html#std-module) and [os module](https://bellard.org/quickjs/quickjs.html#os-module) selectively.
93
+
83
94
  ```rb
84
95
  # enable std module
85
- # https://bellard.org/quickjs/quickjs.html#std-module
86
- vm = Quickjs::VM.new(
87
- features: [::Quickjs::MODULE_STD],
88
- )
96
+ vm = Quickjs::VM.new(features: [::Quickjs::MODULE_STD])
89
97
 
90
98
  # enable os module
91
- # https://bellard.org/quickjs/quickjs.html#os-module
92
- vm = Quickjs::VM.new(
93
- features: [::Quickjs::MODULE_OS],
94
- )
95
-
96
- # `eval_code` will be interrupted after 1 sec (default: 100 msec)
97
- vm = Quickjs::VM.new(
98
- timeout_msec: 1_000,
99
- )
99
+ vm = Quickjs::VM.new(features: [::Quickjs::MODULE_OS])
100
100
 
101
101
  # enable timeout features `setTimeout`, `clearTimeout`
102
- vm = Quickjs::VM.new(
103
- features: [::Quickjs::FEATURES_TIMEOUT],
104
- )
102
+ vm = Quickjs::VM.new(features: [::Quickjs::FEATURES_TIMEOUT])
103
+ ```
104
+
105
+ #### VM timeout
106
+
107
+ ```rb
108
+ # `eval_code` will be interrupted after 1 sec (default: 100 msec)
109
+ vm = Quickjs::VM.new(timeout_msec: 1_000)
105
110
  ```
111
+ </details>
106
112
 
107
- #### ⚡️ Import ESM from source
113
+ #### `Quickjs::VM#import`: 🔌 Import ESM from a source code
108
114
 
109
115
  ```rb
110
116
  vm = Quickjs::VM.new
@@ -114,7 +120,7 @@ vm.eval_code("aliasedDefault()") #=> Exported `default` of the ESM is called
114
120
  vm.eval_code("member()") #=> Exported `member` of the ESM is called
115
121
  ```
116
122
 
117
- #### ⚡️ Define a global function for JS by Ruby
123
+ #### `Quickjs::VM#define_function`: 💎 Define a global function for JS by Ruby
118
124
 
119
125
  ```rb
120
126
  vm = Quickjs::VM.new
@@ -531,7 +531,7 @@ static VALUE vm_m_import(int argc, VALUE *argv, VALUE r_self)
531
531
  rb_scan_args(argc, argv, "10:", &r_import_string, &r_opts);
532
532
  if (NIL_P(r_opts))
533
533
  r_opts = rb_hash_new();
534
- VALUE r_from = rb_hash_aref(r_opts, ID2SYM(rb_intern("from")));
534
+ VALUE r_from = rb_hash_aref(r_opts, ID2SYM(rb_intern("from"))); // TODO: Use kwargs instead
535
535
  if (NIL_P(r_from))
536
536
  {
537
537
  VALUE r_error_message = rb_str_new2("missing import source");
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quickjs
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.1"
5
5
  end
data/lib/quickjs.rb CHANGED
@@ -23,15 +23,30 @@ module Quickjs
23
23
  end
24
24
  module_function :_with_timeout
25
25
 
26
- def _build_import(mappings)
27
- imports, aliases = mappings.to_a.map do |imp|
28
- ["#{imp[0]} as #{imp[1]}", imp[1].to_s]
29
- end.transpose
26
+ def _build_import(imported)
27
+ code_define_global = ->(name) { "globalThis['#{name}'] = #{name};" }
28
+ case imported
29
+ in String if matched = imported.match(/\* as (.+)/)
30
+ [imported, code_define_global.call(matched[1])]
31
+ in String
32
+ [imported, code_define_global.call(imported)]
33
+ in [*all] if all.all? {|e| e.is_a? String }
34
+ [
35
+ imported.join(', ').yield_self{|s| '{ %s }' % s },
36
+ imported.map(&code_define_global).join("\n")
37
+ ]
38
+ in { ** }
39
+ imports, aliases = imported.to_a.map do |imp|
40
+ ["#{imp[0]} as #{imp[1]}", imp[1].to_s]
41
+ end.transpose
30
42
 
31
- [
32
- imports.join(", ").yield_self{|s| '{ %s }' % s },
33
- aliases.map {|name| "globalThis['#{name}'] = #{name};"}.join("\n")
34
- ]
43
+ [
44
+ imports.join(', ').yield_self{|s| '{ %s }' % s },
45
+ aliases.map(&code_define_global).join("\n")
46
+ ]
47
+ else
48
+ raise 'Unsupported importing style'
49
+ end
35
50
  end
36
51
  module_function :_build_import
37
52
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quickjs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - hmsk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-14 00:00:00.000000000 Z
11
+ date: 2024-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json