ruby2js 4.0.2 → 4.1.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.
@@ -15,17 +15,19 @@ module Ruby2JS
15
15
 
16
16
  tagged_methods = @options[:template_literal_tags] || [:html, :css]
17
17
 
18
- if tagged_methods.include?(method) && !args.empty?
18
+ if tagged_methods.include?(method) && args.length == 1
19
19
  strnode = process args.first
20
20
  if strnode.type == :str
21
21
  # convert regular strings to literal strings
22
22
  strnode = strnode.updated(:dstr, [s(:str, strnode.children.first.chomp("\n"))])
23
- else
23
+ elsif strnode.type == :dstr
24
24
  # for literal strings, chomp a newline off the end
25
25
  if strnode.children.last.type == :str && strnode.children.last.children[0].end_with?("\n")
26
26
  children = [*strnode.children.take(strnode.children.length - 1), s(:str, strnode.children.last.children[0].chomp)]
27
27
  strnode = s(:dstr, *children)
28
28
  end
29
+ else
30
+ return super
29
31
  end
30
32
 
31
33
  S(:taglit, s(:sym, method), strnode)
@@ -0,0 +1,10 @@
1
+ require 'rails'
2
+ require_relative './sprockets'
3
+
4
+ class Ruby2JSRailtie < Rails::Railtie
5
+ rake_tasks do
6
+ Dir[File.expand_path('../tasks/*.rake', __dir__)].each do |file|
7
+ load file
8
+ end
9
+ end
10
+ end
@@ -1,8 +1,8 @@
1
1
  module Ruby2JS
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 4
4
- MINOR = 0
5
- TINY = 2
4
+ MINOR = 1
5
+ TINY = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -0,0 +1,4 @@
1
+ This directory contains rails install tasks and a test program which will run
2
+ the rails examples from the docs/src/_examples/rails directory.
3
+
4
+ run `./testrails.rb` for usage instructions.
@@ -0,0 +1,2 @@
1
+ function importAll(r) { r.keys().forEach(r) }
2
+ importAll(require.context("elements", true, /_elements?\.js(\.rb)?$/))
@@ -0,0 +1,20 @@
1
+ const { environment } = require('@rails/webpacker')
2
+
3
+ module.exports = {
4
+ test: /\.js\.rb$/,
5
+ use: [
6
+ {
7
+ loader: "babel-loader",
8
+ options: environment.loaders.get('babel').use[0].options
9
+ },
10
+
11
+ {
12
+ loader: "@ruby2js/webpack-loader",
13
+ options: {
14
+ autoexports: "default",
15
+ eslevel: 2021,
16
+ filters: ["esm", "functions"]
17
+ }
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,9 @@
1
+ @ruby2js_options = {filters: ['lit-element']}
2
+ @yarn_add='lit-element'
3
+ eval IO.read "#{__dir__}/webpacker.rb"
4
+
5
+ directory File.expand_path("app/javascript/elements", __dir__),
6
+ Rails.root.join('app/javascript/elements').to_s
7
+
8
+ append_to_file Rails.root.join('app/javascript/packs/application.js').to_s,
9
+ "\nimport 'elements'\n"
@@ -0,0 +1,3 @@
1
+ @ruby2js_options = {filters: ['react']}
2
+ @yarn_add='preact'
3
+ eval IO.read "#{__dir__}/webpacker.rb"
@@ -0,0 +1,2 @@
1
+ @ruby2js_options = {filters: ['react']}
2
+ eval IO.read "#{__dir__}/webpacker.rb"
@@ -0,0 +1,32 @@
1
+ create_file Rails.root.join('config/initializers/ruby2js.rb').to_s,
2
+ <<~CONFIG
3
+ require 'ruby2js/filter/esm'
4
+ require 'ruby2js/filter/functions'
5
+ require 'ruby2js/filter/stimulus'
6
+
7
+ Ruby2JS::SprocketsTransformer.options = {
8
+ autoexports: :default,
9
+ eslevel: 2020
10
+ }
11
+
12
+ require 'stimulus/importmap_helper'
13
+
14
+ module Stimulus::ImportmapHelper
15
+ def find_javascript_files_in_tree(path)
16
+ exts = {'.js' => '.js', '.jsm' => '.jsm'}.merge(
17
+ Sprockets.mime_exts.map {|key, value|
18
+ next unless Sprockets.transformers[value]["application/javascript"]
19
+ [key, '.js']
20
+ }.compact.to_h)
21
+
22
+ Dir[path.join('**/*')].map {|file|
23
+ file_ext, web_ext = Sprockets::PathUtils.match_path_extname(file, exts)
24
+ next unless file_ext
25
+
26
+ next unless File.file? file
27
+
28
+ Pathname.new(file.chomp(file_ext) + web_ext)
29
+ }.compact
30
+ end
31
+ end
32
+ CONFIG
@@ -0,0 +1,5 @@
1
+ @ruby2js_options = {filters: ['stimulus'], eslevel: 2022}
2
+ eval IO.read "#{__dir__}/webpacker.rb"
3
+
4
+ insert_into_file Rails.root.join("app/javascript/controllers/index.js").to_s,
5
+ '(\\.rb)?', after: '_controller\\.js'
@@ -0,0 +1,80 @@
1
+ #
2
+ # These instructions can be used standalone or in combination with other
3
+ # instructions.
4
+ #
5
+ # If used standalone on a repository which did not previously have the Ruby2JS
6
+ # webpack loader configured, it will add the '.js.rb' extension to
7
+ # `config/webpacker.yml`, install the Ruby2JS webpack-loader and add a minimal
8
+ # configuration which runs the Ruby2JS webpack loader then the babel loader to
9
+ # `config/webpacker.yml`.
10
+ #
11
+ # Other instructions can require these instructions. If they set the
12
+ # @ruby2js_options instance variable before they do so, the options provided
13
+ # will be merged and/or override the ones in the base configuration.
14
+ #
15
+ # If these instructions are run against a Rails application that was
16
+ # previously configured, the @ruby2js_options provided, if any, will be merged
17
+ # with the options found in the configuration.
18
+ #
19
+
20
+ # default options
21
+ options = @ruby2js_options || {}
22
+
23
+ # define .js.rb as a extension to webpacker
24
+ insert_into_file Rails.root.join("config/webpacker.yml").to_s,
25
+ " - .js.rb\n", after: "\n - .js\n"
26
+
27
+ # install webpack loader
28
+ run "yarn add @ruby2js/webpack-loader #{@yarn_add}"
29
+
30
+ target = Rails.root.join("config/webpack/loaders/ruby2js.js").to_s
31
+
32
+ # default config
33
+ if not File.exist? target
34
+ # may be called via eval, or directly. Resolve source either way.
35
+ source_paths.unshift __dir__
36
+ source_paths.unshift File.dirname(caller.first)
37
+ directory "config/webpack/loaders", File.dirname(target)
38
+ end
39
+
40
+ # load config
41
+ insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
42
+ "environment.loaders.prepend('ruby2js', require('./loaders/ruby2js'))\n"
43
+
44
+ # read current configuration
45
+ before = IO.read(target)
46
+
47
+ # extract indentation and options
48
+ match = /^(\s*)options: (\{.*?\n\1\})/m.match(before)
49
+
50
+ # evaluate base options. Here it is handy that Ruby's syntax for hashes is
51
+ # fairly close to JavaScript's object literals. May run into problems in the
52
+ # future if there ever is a need for {"x": y} as that would need to be
53
+ # {"x" => y} in Ruby.
54
+ base = eval(match[2])
55
+
56
+ # Merge the options, initially having the new options override the original
57
+ # options.
58
+ merged = base.merge(options)
59
+
60
+ # Intelligently combine options if they are the same type.
61
+ options.keys.each do |key|
62
+ next unless base[key]
63
+
64
+ if options[key].is_a? Array and base[key].is_a? Array
65
+ merged[key] = (base[key] + options[key]).uniq
66
+ elsif options[key].is_a? Numeric and base[key].is_a? Numeric
67
+ merged[key] = [base[key], options[key]].max
68
+ elsif options[key].is_a? Hash and base[key].is_a? Hash
69
+ merged[key] = base[key].merge(options[key])
70
+ end
71
+ end
72
+
73
+ # Serialize options as JavaScript, matching original indentation.
74
+ replacement = Ruby2JS.convert(merged.inspect + "\n").to_s.
75
+ gsub(/^/, match[1]).strip
76
+
77
+ # Update configuration
78
+ unless before.include? replacement
79
+ gsub_file target, match[2].to_s, replacement
80
+ end
@@ -0,0 +1,47 @@
1
+ // minimal sanity test to verify usage of Ruby2JS under Node
2
+
3
+ const assert = require('assert');
4
+
5
+ const Ruby2JS = require('@ruby2js/ruby2js');
6
+ // const Ruby2JS =
7
+ // require('/home/rubys/git/ruby2js/docs/src/demo/ruby2js.js');
8
+
9
+ function to_js(string, options={}) {
10
+ return Ruby2JS.convert(string, options).toString()
11
+ }
12
+
13
+ assert.strictEqual(
14
+ to_js('foo = 1'),
15
+ 'var foo = 1');
16
+
17
+ assert.strictEqual(
18
+ to_js('foo = 1', {eslevel: 2015}),
19
+ 'let foo = 1');
20
+
21
+ assert.strictEqual(
22
+ to_js('foo.empty?', {filters: ['functions']}),
23
+ 'foo.length == 0');
24
+
25
+ let ast = Ruby2JS.convert('String', {file: 'a.rb'}).ast
26
+ assert.strictEqual(ast.constructor, Ruby2JS.AST.Node)
27
+ assert.strictEqual(ast.type, "const")
28
+ assert.strictEqual(ast.children.length, 2)
29
+ assert.strictEqual(ast.children[0], Ruby2JS.nil)
30
+ assert.strictEqual(ast.children[1], "String")
31
+
32
+ let sourcemap = Ruby2JS.convert('a=1', {file: 'a.rb'}).sourcemap
33
+ assert.strictEqual(sourcemap.version, 3)
34
+ assert.strictEqual(sourcemap.file, 'a.rb')
35
+ assert.strictEqual(sourcemap.sources.length, 1)
36
+ assert.strictEqual(sourcemap.sources[0], 'a.rb')
37
+ assert.strictEqual(sourcemap.mappings, 'QAAE')
38
+
39
+ console.log(to_js(`
40
+ class C < LitElement
41
+ def render
42
+ x.empty?
43
+ '<h1>title</h1>'
44
+ end
45
+ end
46
+
47
+ `, {eslevel: 2020, filters: ['lit-element', 'esm', 'functions']}))
@@ -0,0 +1,47 @@
1
+ Thor::Actions::WARNINGS[:unchanged_no_flag] = 'unchanged'
2
+
3
+ def template(location)
4
+ system "#{RbConfig.ruby} #{Rails.root.join("bin")}/rails app:template " +
5
+ "LOCATION=#{File.expand_path(location, __dir__)}"
6
+ end
7
+
8
+ namespace :ruby2js do
9
+ namespace :install do
10
+ desc "Install Ruby2JS with LitElement support"
11
+ task :litelement do
12
+ template 'install/litelement.rb'
13
+ end
14
+
15
+ desc "Install Ruby2JS with Preact support"
16
+ task :preact do
17
+ template 'install/preact.rb'
18
+ end
19
+
20
+ desc "Install Ruby2JS with React support"
21
+ task :react do
22
+ template 'install/react.rb'
23
+ Rake::Task['webpacker:install:react'].invoke
24
+ end
25
+
26
+ namespace :stimulus do
27
+ desc "Install Ruby2JS with Stimulus Sprockets support"
28
+ task :sprockets => :"stimulus:install:asset_pipeline" do
29
+ template 'install/stimulus-sprockets.rb'
30
+ end
31
+
32
+ desc "Install Ruby2JS with Stimulus Webpacker support"
33
+ task :webpacker => :"stimulus:install" do
34
+ template 'install/stimulus-webpacker.rb'
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ namespace :webpacker do
41
+ namespace :install do
42
+ desc "Install everything needed for Ruby2JS"
43
+ task :ruby2js do
44
+ template 'install/webpacker.rb'
45
+ end
46
+ end
47
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby2js
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.2
4
+ version: 4.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Ruby
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-03-03 00:00:00.000000000 Z
12
+ date: 2021-03-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: parser
@@ -135,6 +135,7 @@ files:
135
135
  - lib/ruby2js/filter/functions.rb
136
136
  - lib/ruby2js/filter/jquery.rb
137
137
  - lib/ruby2js/filter/jsx.rb
138
+ - lib/ruby2js/filter/lit-element.rb
138
139
  - lib/ruby2js/filter/matchAll.rb
139
140
  - lib/ruby2js/filter/minitest-jasmine.rb
140
141
  - lib/ruby2js/filter/node.rb
@@ -150,11 +151,23 @@ files:
150
151
  - lib/ruby2js/haml.rb
151
152
  - lib/ruby2js/jsx.rb
152
153
  - lib/ruby2js/namespace.rb
154
+ - lib/ruby2js/rails.rb
153
155
  - lib/ruby2js/serializer.rb
154
156
  - lib/ruby2js/sinatra.rb
155
157
  - lib/ruby2js/sprockets.rb
156
158
  - lib/ruby2js/strict.rb
157
159
  - lib/ruby2js/version.rb
160
+ - lib/tasks/README.md
161
+ - lib/tasks/install/app/javascript/elements/index.js
162
+ - lib/tasks/install/config/webpack/loaders/ruby2js.js
163
+ - lib/tasks/install/litelement.rb
164
+ - lib/tasks/install/preact.rb
165
+ - lib/tasks/install/react.rb
166
+ - lib/tasks/install/stimulus-sprockets.rb
167
+ - lib/tasks/install/stimulus-webpacker.rb
168
+ - lib/tasks/install/webpacker.rb
169
+ - lib/tasks/nodetest.js
170
+ - lib/tasks/ruby2js_tasks.rake
158
171
  - ruby2js.gemspec
159
172
  homepage: http://github.com/rubys/ruby2js
160
173
  licenses: