rubyjs-vite 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f15333a2010c7a42765b915656d0040c0d120408eb3f7ce6ea0c498ac39cc000
4
+ data.tar.gz: 07dd8234ee0d93c7f6fd6f1fa40d5e29eb2ef7097b29ad6e483472e5db680fd9
5
+ SHA512:
6
+ metadata.gz: 62f535fbaa1312c1e81e695e8ec7a638b0e8e65ce1da78a908d4530697cf86345034af65da8f1ac25dad9cb8994365c84c29405331925147f61e272292cbc797
7
+ data.tar.gz: 31e34aee73407d887d66f2fe7667e72f1b22be80f1d1b25a363eed4b44ed6683cb527e0225ee04d02a02330bbd84e50bae080c51583b6469fdacd9bfa8998b56
data/app/arguments.rb ADDED
@@ -0,0 +1,49 @@
1
+ require "option_parser"
2
+
3
+ @options = {
4
+ compile: false,
5
+ watch: false,
6
+ output: Dir.pwd,
7
+ source: Dir.pwd,
8
+ eslevel: "2021".to_i
9
+ }
10
+
11
+ OptionParser.parse do |parser|
12
+ parser.banner(
13
+ "Converts the syntax of ruby into javascript.\n" +
14
+ "Usage: #{RubyJS::Constants::APP_NAME} [options]\n" +
15
+ "\nOptions:"
16
+ )
17
+ parser.on( "-h", "--help", "Show help" ) do
18
+ puts parser
19
+ exit
20
+ end
21
+ parser.on( "-v", "--version", "Show version" ) do
22
+ puts "Version is #{RubyJS::VERSION}"
23
+ exit
24
+ end
25
+ parser.on( "-c", "--compile", "Compile to JavaScript and save as .js files." ) do
26
+ @options[:compile] = true
27
+ end
28
+ parser.on( "-w", "--watch", "Watch scripts for changes and rerun commands." ) do
29
+ @options[:watch] = true
30
+ end
31
+ parser.on("-o DIR", "--output DIR", "Set the output path or path/filename\n" +
32
+ "for compiled JavaScript." ) do |dir|
33
+ @options[:output] = dir
34
+ end
35
+ parser.on("-s DIR", "--source DIR", "Set the source path or path/filename\n" +
36
+ "for RubyJS." ) do |dir|
37
+ @options[:source] = dir
38
+ end
39
+ parser.on("-es LEVEL", "--eslevel LEVEL", "ECMAScript versions for compilation.\n" +
40
+ "The default: #{@options[:eslevel]}\n" +
41
+ "(Accepted level ranges 2015...2022.)") do |level|
42
+
43
+ @options[:eslevel] = level.to_i
44
+ end
45
+ parser.on("--create PROJECT", nil, "Creates a new project using scaffolding." ) do |project|
46
+ RubyJS::Scaffold.create project
47
+ exit
48
+ end
49
+ end
data/app/main.rb ADDED
@@ -0,0 +1,48 @@
1
+ require "ruby_js"
2
+ require_relative "arguments"
3
+ require_relative "signals"
4
+
5
+ def compile_fun path_f
6
+ RubyJS.compile path_f, {
7
+ eslevel: @options[:eslevel],
8
+ path_s: @options[:source],
9
+ path_o: @options[:output]
10
+ }
11
+ end
12
+
13
+ def compile path_f
14
+ if @options[:compile]
15
+ compile_fun(path_f)
16
+ else
17
+ puts "This '#{path_f}' file was edited, but it wasn't made into a js file."
18
+ end
19
+ end
20
+
21
+ if @options[:compile]
22
+ RubyJS.get_files(@options[:source]).each do |path_f|
23
+ compile_fun(path_f)
24
+ end
25
+ end
26
+
27
+ if @options[:watch]
28
+ puts "There is now a watch for edited files."
29
+ path_s = @options[:source]
30
+
31
+ RubyJS::Helper.create_dir(path_s)
32
+ RubyJS.watch path_s do |modified, added, removed|
33
+ unless added.empty?
34
+ compile(added.last)
35
+ end
36
+
37
+ unless modified.empty?
38
+ compile(modified.last)
39
+ end
40
+
41
+ unless removed.empty?
42
+ RubyJS.free removed.last, {
43
+ path_s: @options[:source],
44
+ path_o: @options[:output]
45
+ }
46
+ end
47
+ end
48
+ end
data/app/signals.rb ADDED
@@ -0,0 +1,4 @@
1
+ Signal.trap("INT") do
2
+ puts "\nExiting"
3
+ exit
4
+ end
data/bin/rjsv ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.expand_path("../lib", __dir__)
3
+
4
+ ROOT = File.expand_path("..", __dir__)
5
+ require_relative "../app/main"
@@ -0,0 +1,96 @@
1
+ require "json"
2
+ require 'fileutils'
3
+
4
+ class JsonParser
5
+ attr_reader :db
6
+
7
+ def initialize path, auto_write = true
8
+ @path = path
9
+ @db = open @path
10
+ @auto_write = auto_write
11
+ end
12
+
13
+ def on symbol, value
14
+ if exist?
15
+ parse symbol, value
16
+ end
17
+ end
18
+
19
+ def parse symbols, value = nil, delete = nil
20
+ symbols_join = ""
21
+ if symbols.class.name == "Array"
22
+ symbols_join = symbols.join("\"][\"")
23
+ else
24
+ symbols_join = symbols.to_s
25
+ end
26
+ symbols_join = "[\"#{symbols_join}\"]"
27
+
28
+ unless delete
29
+ unless value
30
+ eval "@db#{ symbols_join }"
31
+ else
32
+ eval "@db#{ symbols_join } = value"
33
+
34
+ if @auto_write
35
+ write @path, @db
36
+ end
37
+ end
38
+ else
39
+ if symbols
40
+ eval "@db#{ symbols_join }.delete('#{delete}')"
41
+ else
42
+ eval "@db.delete('#{delete}')"
43
+ end
44
+
45
+ if @auto_write
46
+ write @path, @db
47
+ end
48
+ end
49
+ end
50
+
51
+ def exist?
52
+ @db.empty?
53
+ end
54
+
55
+ def delete key, symbols = nil
56
+ parse(symbols, nil, key)
57
+ end
58
+
59
+ private
60
+ def open path
61
+ begin
62
+ result = String.new
63
+ File.open path do |f|
64
+ result = JSON.parse f.read
65
+ end
66
+
67
+ return result
68
+ rescue
69
+ return Hash.new
70
+ end
71
+ end
72
+
73
+ def write path, db
74
+ begin
75
+ create_dir path do
76
+
77
+ f = File.new path, "w"
78
+ f.write JSON.pretty_generate db
79
+ f.close
80
+ end
81
+ end
82
+ end
83
+
84
+ def create_dir path, &callback
85
+ begin
86
+ dir_path = File.dirname path
87
+ unless Dir.exist? dir_path
88
+ FileUtils.mkpath dir_path
89
+ end
90
+
91
+ callback.call
92
+ rescue
93
+
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,91 @@
1
+ class OptionParser
2
+
3
+ LEFT = 2
4
+ MIDDLE = 28
5
+
6
+ attr_reader :args
7
+
8
+ def self.parse(args = ARGV)
9
+ parser = OptionParser.new
10
+ yield parser
11
+ parser.process args
12
+ parser
13
+ end
14
+
15
+ def self.last_arg(args = ARGV)
16
+ args.length >= 1 ? args[args.length - 1] : nil
17
+ end
18
+
19
+ def initialize(args = ARGV)
20
+ @args = args
21
+ @banner = nil
22
+ @flags = Array.new
23
+ end
24
+
25
+ def banner(banner)
26
+ @banner = banner
27
+ end
28
+
29
+ def on(short_flag, long_flag, description, &block)
30
+ @flags << { short_flag: short_flag || '', long_flag: long_flag || '',
31
+ description: description || '', block: block }
32
+ end
33
+
34
+ def process( args = ARGV )
35
+ unless args.length == 0
36
+ args.each_with_index do |arg, i|
37
+ @flags.each do |flag|
38
+ name = -> (type_flag) do
39
+ flag[type_flag].gsub( /[a-z -]/, '' )
40
+ end
41
+
42
+ flag_strip = -> (type_flag) do
43
+ flag[type_flag].sub( name.(type_flag), '' ).strip()
44
+ end
45
+ has_flag = -> (type_flag) { arg == flag_strip.(type_flag) }
46
+
47
+ if has_flag.(:short_flag) or
48
+ has_flag.(:long_flag)
49
+
50
+ has_name = -> (type_flag) do
51
+ name.(type_flag) != ""
52
+ end
53
+ value = nil
54
+
55
+ if has_name.(:short_flag) or
56
+ has_name.(:long_flag)
57
+ value = args[i + 1]
58
+ end
59
+
60
+ flag[:block].call( value )
61
+ end
62
+ end
63
+ end
64
+ else
65
+ flag = @flags[0]
66
+ flag[:block].call
67
+ end
68
+ end
69
+
70
+ def self.get_empty_spaces
71
+ " " * (MIDDLE + LEFT)
72
+ end
73
+
74
+ def to_s()
75
+ io = Array.new
76
+ if banner = @banner
77
+ io << banner
78
+ io << "\n"
79
+ end
80
+
81
+ @flags.each do |flag|
82
+ l_flag = !flag[:long_flag].empty? ? ", #{flag[:long_flag]}" : ""
83
+ flags = "#{flag[:short_flag]}#{l_flag}".ljust(MIDDLE)
84
+ desc = flag[:description].gsub("\n", "\n#{OptionParser.get_empty_spaces}")
85
+ io << "".ljust(LEFT) + flags + desc
86
+ io << "\n"
87
+ end
88
+
89
+ io.join
90
+ end
91
+ end
@@ -0,0 +1,6 @@
1
+ module RubyJS
2
+ module Constants
3
+ FILE_TYPE = 'rjs'
4
+ APP_NAME = 'rjsv'
5
+ end
6
+ end
@@ -0,0 +1,46 @@
1
+ module RubyJS
2
+ module Helper
3
+ require 'fileutils'
4
+
5
+ def self.open path
6
+ result = ""
7
+
8
+ if File.exist? path
9
+ File.open path do |f|
10
+ result = f.read
11
+ end
12
+ end
13
+
14
+ result
15
+ end
16
+
17
+ def self.write path_o, content
18
+ path_od = File.dirname(path_o)
19
+ create_dir(path_od)
20
+
21
+ file = File.new(path_o, "w+")
22
+ file.write content
23
+ file.close
24
+ end
25
+
26
+ def self.free path_o
27
+ File.delete(path_o) if File.exists? path_o
28
+ end
29
+
30
+ def self.event_p event, path_f
31
+ "#{Time.now.strftime("%l:%M:%S %p").lstrip} [#{Constants::APP_NAME}] #{event} #{path_f}"
32
+ end
33
+
34
+ def self.absolute_path path_f, path_options, prefix = "js"
35
+ path_ffr = path_f.sub("#{Dir.pwd}/", '').sub(path_options[:path_s], '').sub(Constants::FILE_TYPE, prefix)
36
+ path_ffa = File.join(path_options[:path_o], path_ffr)
37
+ path_ffa
38
+ end
39
+
40
+ def self.create_dir path
41
+ unless Dir.exist? path
42
+ FileUtils.mkdir_p path
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,31 @@
1
+ module RubyJS
2
+ module Scaffold
3
+ require "json_parser"
4
+
5
+ def self.create project
6
+ path_as = File.expand_path("./share/template", ROOT)
7
+ path_ao = File.join(Dir.pwd, project)
8
+
9
+ puts "Scaffolding project in #{path_ao}..."
10
+ FileUtils.copy_entry path_as, path_ao
11
+
12
+ json_oc = JsonParser.new File.join(path_ao, "package.json")
13
+ json_oc.parse :name, project.downcase
14
+
15
+ change_server_f(path_ao)
16
+ install_vite(project, path_ao)
17
+ end
18
+
19
+ def self.change_server_f path_ao
20
+ path_bin_ao = "#{path_ao}/bin/server"
21
+ content = Helper.open(path_bin_ao)
22
+ content_ch = content.sub("APP_NAME", Constants::APP_NAME)
23
+ Helper.write(path_bin_ao, content_ch)
24
+ end
25
+
26
+ def self.install_vite project, path_ao
27
+ %x(cd #{path_ao} && npm install -D vite)
28
+ puts "\nDone. Now run:\n\n cd #{project}\n bin/server\n\n"
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module RubyJS
2
+ VERSION = "1.0.0"
3
+ end
data/lib/ruby_js.rb ADDED
@@ -0,0 +1,46 @@
1
+ require 'ruby2js'
2
+ require "ruby2js/filter/esm"
3
+ require "listen"
4
+ require "option_parser"
5
+
6
+ module RubyJS
7
+ require "ruby_js/version"
8
+ require "ruby_js/helper"
9
+ require "ruby_js/constants"
10
+ require "ruby_js/scaffold"
11
+
12
+ def self.watch path
13
+ listener = Listen.to(path, only: /\.#{Constants::FILE_TYPE}$/) do |modified, added, removed|
14
+ yield modified, added, removed
15
+ end
16
+ listener.start
17
+ sleep
18
+ end
19
+
20
+ def self.compile path_f, options
21
+ path_o = Helper.absolute_path path_f, { path_s: options[:path_s], path_o: options[:path_o] }
22
+
23
+ begin
24
+ content_rb = Helper.open(path_f)
25
+ content_js = Ruby2JS.convert(content_rb, eslevel: options[:eslevel]) unless content_rb.empty?
26
+
27
+ path_write = Helper.write(path_o, content_js)
28
+ puts Helper.event_p("compiled", path_o)
29
+ rescue => exception
30
+ # p exception.inspect
31
+ puts Helper.event_p("error", "#{path_o} #{exception}")
32
+ end
33
+ end
34
+
35
+ def self.free path_f, options
36
+ path_o = Helper.absolute_path path_f, options
37
+ Helper.free path_o
38
+
39
+ puts Helper.event_p("deleted", path_o)
40
+ end
41
+
42
+ def self.get_files(path_s)
43
+ path = "#{path_s}/**/*.#{Constants::FILE_TYPE}"
44
+ Dir.glob(path)
45
+ end
46
+ end
@@ -0,0 +1,4 @@
1
+ #!/bin/bash
2
+
3
+ APP_NAME -c -w -s src/rjs -o src/.js &
4
+ npm run dev
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Vite App</title>
8
+ </head>
9
+ <body>
10
+ <div id="app"></div>
11
+ <script type="module" src="/src/.js/main.js"></script>
12
+ </body>
13
+ </html>
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "template",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview"
10
+ }
11
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
File without changes
@@ -0,0 +1,3 @@
1
+ import '../css/style.css'
2
+
3
+ document.querySelector('#app').innerHTML = "<h1>Hello RubyJS</h1>"
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubyjs-vite
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Filip Vrba
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-11-02 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: ''
14
+ email: filipvrbaxi@gmail.com
15
+ executables:
16
+ - rjsv
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - app/arguments.rb
21
+ - app/main.rb
22
+ - app/signals.rb
23
+ - bin/rjsv
24
+ - lib/json_parser.rb
25
+ - lib/option_parser.rb
26
+ - lib/ruby_js.rb
27
+ - lib/ruby_js/constants.rb
28
+ - lib/ruby_js/helper.rb
29
+ - lib/ruby_js/scaffold.rb
30
+ - lib/ruby_js/version.rb
31
+ - share/template/bin/server
32
+ - share/template/index.html
33
+ - share/template/package.json
34
+ - share/template/public/vite.svg
35
+ - share/template/src/css/style.css
36
+ - share/template/src/rjs/main.rjs
37
+ homepage: https://rubygems.org/gems/rubyjs-vite
38
+ licenses:
39
+ - MIT
40
+ metadata:
41
+ source_code_uri: https://github.com/filipvrba/ruby-js
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubygems_version: 3.3.7
58
+ signing_key:
59
+ specification_version: 4
60
+ summary: Converts the syntax of ruby into javascript.
61
+ test_files: []