nodo 1.7.1 → 1.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0c0c3cef7af9cd8352a7470125eda15d01a56f795a5ce3fd2b1474b47f77f171
4
- data.tar.gz: 759f66869c24cc8511fae1adf0a633fc73dd45d340ff9f16186570c5aefccbab
3
+ metadata.gz: e7c1002efcf0b7ba146dde5e10af7ddcdfdfeb450824dfaf5cce56c115630303
4
+ data.tar.gz: 3dc41a17980258b0ef634bb6a05319cc98501495ebb7a4688007cd0546f32fb3
5
5
  SHA512:
6
- metadata.gz: 010242af2332f9eb6ac1b136ae13ab570ae63212f61fb4b056a20407cc4209d52774dec9bcb87c44c9b9f87d13f3145bc468b0e96bd4b3fd7635815035381288
7
- data.tar.gz: 0363c67c93b8015f45028625d3c3e76a5be084f087f5f34286a47fa9bbd5227d27267cbbbfaf133fe46bc325a4e46de4178946cdfe84c9d401950e30e2bc6897
6
+ metadata.gz: 877eac53f4eb526c8fc8ef7cc7b10437232a9b50effffd894dda29c36129b33c7a2c9e9edb47964ad2b566ce98c25f38d2866ce0cd0fc52062efbe0084105f31
7
+ data.tar.gz: 5aaf9f8097c8a3b7335e1a67b23dc388a194b2dfe395b8b8e0faeca324b194615d1b946fd3a6bf117b0c0d2567c71cae622b00611d772e95f8f35e1e1f519f4a
data/README.md CHANGED
@@ -99,6 +99,23 @@ bar = Bar.new
99
99
  bar.v4 => "b305f5c4-db9a-4504-b0c3-4e097a5ec8b9"
100
100
  ```
101
101
 
102
+ `import` is also supported for loading ESM packages:
103
+
104
+ ```ruby
105
+ class Bar < Nodo::Core
106
+ import :uuid
107
+
108
+ function :v4, <<~JS
109
+ () => {
110
+ return uuid.v4();
111
+ }
112
+ JS
113
+ end
114
+
115
+ bar = Bar.new
116
+ bar.v4 => "b305f5c4-db9a-4504-b0c3-4e097a5ec8b9"
117
+ ```
118
+
102
119
  ### Aliasing requires
103
120
 
104
121
  If the library name cannot be used as name of the constant, the `const` name
data/lib/nodo/core.rb CHANGED
@@ -82,7 +82,7 @@ module Nodo
82
82
 
83
83
  def generate_class_code
84
84
  <<~JS
85
- (() => {
85
+ (async () => {
86
86
  const __nodo_klass__ = { nodo: global.nodo };
87
87
  #{dependencies.map(&:to_js).join}
88
88
  #{constants.map(&:to_js).join}
@@ -106,10 +106,13 @@ module Nodo
106
106
 
107
107
  private
108
108
 
109
- def require(*mods)
110
- deps = mods.last.is_a?(Hash) ? mods.pop : {}
111
- mods = mods.map { |m| [m, m] }.to_h
112
- self.dependencies = dependencies + mods.merge(deps).map { |name, package| Dependency.new(name, package) }
109
+ { require: :cjs, import: :esm }.each do |method, type|
110
+ define_method method do |*mods|
111
+ deps = mods.last.is_a?(Hash) ? mods.pop : {}
112
+ mods = mods.map { |m| [m, m] }.to_h
113
+ self.dependencies = dependencies + mods.merge(deps).map { |name, package| Dependency.new(name, package, type: type) }
114
+ end
115
+ private method
113
116
  end
114
117
 
115
118
  def function(name, _code = nil, timeout: Nodo.timeout, code: nil, &block)
@@ -1,12 +1,22 @@
1
1
  module Nodo
2
2
  class Dependency
3
- attr_reader :name, :package
4
-
5
- def initialize(name, package)
6
- @name, @package = name, package
3
+ attr_reader :name, :package, :type
4
+
5
+ def initialize(name, package, type:)
6
+ @name, @package, @type = name, package, type
7
7
  end
8
-
8
+
9
9
  def to_js
10
+ case type
11
+ when :cjs then to_cjs
12
+ when :esm then to_esm
13
+ else raise "Unknown dependency type: #{type}"
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def to_cjs
10
20
  <<~JS
11
21
  const #{name} = __nodo_klass__.#{name} = (() => {
12
22
  try {
@@ -18,5 +28,18 @@ module Nodo
18
28
  })();
19
29
  JS
20
30
  end
31
+
32
+ def to_esm
33
+ <<~JS
34
+ const #{name} = __nodo_klass__.#{name} = await (async () => {
35
+ try {
36
+ return await nodo.import(#{package.to_json});
37
+ } catch(e) {
38
+ e.nodo_dependency = #{package.to_json};
39
+ throw e;
40
+ }
41
+ })();
42
+ JS
43
+ end
21
44
  end
22
45
  end
data/lib/nodo/nodo.cjs CHANGED
@@ -99,8 +99,12 @@ module.exports = (function() {
99
99
 
100
100
  try {
101
101
  if (DEFINE_METHOD == method) {
102
- classes[class_name] = vm.runInThisContext(input, class_name);
103
- respond_with_data(res, class_name, start);
102
+ Promise.resolve(vm.runInThisContext(input, class_name)).then((result) => {
103
+ classes[class_name] = result;
104
+ respond_with_data(res, class_name, start);
105
+ }).catch((error) => {
106
+ respond_with_error(res, 500, error);
107
+ })
104
108
  } else if (EVALUATE_METHOD == method) {
105
109
  Promise.resolve(vm.runInNewContext(input, context)).then((result) => {
106
110
  respond_with_data(res, result, start);
data/lib/nodo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nodo
2
- VERSION = '1.7.1'
2
+ VERSION = '1.8.0'
3
3
  end
metadata CHANGED
@@ -1,15 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nodo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.1
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthias Grosser
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-10-02 00:00:00.000000000 Z
12
- dependencies: []
10
+ date: 2025-02-05 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: logger
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
13
26
  description: Fast Ruby bridge to run JavaScript inside a Node process
14
27
  email:
15
28
  - mtgrosser@gmx.net
@@ -34,7 +47,6 @@ homepage: https://github.com/mtgrosser/nodo
34
47
  licenses:
35
48
  - MIT
36
49
  metadata: {}
37
- post_install_message:
38
50
  rdoc_options: []
39
51
  require_paths:
40
52
  - lib
@@ -42,15 +54,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
42
54
  requirements:
43
55
  - - ">="
44
56
  - !ruby/object:Gem::Version
45
- version: 2.7.0
57
+ version: 3.0.0
46
58
  required_rubygems_version: !ruby/object:Gem::Requirement
47
59
  requirements:
48
60
  - - ">="
49
61
  - !ruby/object:Gem::Version
50
62
  version: '0'
51
63
  requirements: []
52
- rubygems_version: 3.5.11
53
- signing_key:
64
+ rubygems_version: 3.6.2
54
65
  specification_version: 4
55
66
  summary: Call Node.js from Ruby
56
67
  test_files: []