rubyjs-vite 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []