vueapp 0.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.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +43 -0
  4. data/bin/console +14 -0
  5. data/bin/setup +8 -0
  6. data/bin/vueapp +7 -0
  7. data/lib/vueapp.rb +32 -0
  8. data/lib/vueapp/cli.rb +44 -0
  9. data/lib/vueapp/core/builder.rb +37 -0
  10. data/lib/vueapp/core/builders/js_builder.rb +140 -0
  11. data/lib/vueapp/core/builders/scss_builder.rb +114 -0
  12. data/lib/vueapp/core/builders/slim_builder.rb +94 -0
  13. data/lib/vueapp/core/cli/build_helper.rb +20 -0
  14. data/lib/vueapp/core/cli/generator_helper.rb +23 -0
  15. data/lib/vueapp/core/cli/init_helper.rb +81 -0
  16. data/lib/vueapp/core/helpers/build.rb +22 -0
  17. data/lib/vueapp/core/helpers/env.rb +47 -0
  18. data/lib/vueapp/core/helpers/log.rb +16 -0
  19. data/lib/vueapp/core/helpers/path.rb +49 -0
  20. data/lib/vueapp/core/helpers/timer.rb +19 -0
  21. data/lib/vueapp/core/listener.rb +64 -0
  22. data/lib/vueapp/errors.rb +8 -0
  23. data/lib/vueapp/templates/_core/vendor/vue.dev.js +11965 -0
  24. data/lib/vueapp/templates/_core/vendor/vue.js +6 -0
  25. data/lib/vueapp/templates/_core/vendor/vue_router.js +3061 -0
  26. data/lib/vueapp/templates/api/api.js +3 -0
  27. data/lib/vueapp/templates/api/api_client.js +131 -0
  28. data/lib/vueapp/templates/api/base_api.js +27 -0
  29. data/lib/vueapp/templates/config/app.js +17 -0
  30. data/lib/vueapp/templates/config/router.js +7 -0
  31. data/lib/vueapp/templates/config/routes.js +10 -0
  32. data/lib/vueapp/templates/filters/percentage.js +7 -0
  33. data/lib/vueapp/templates/generators/component/new.js +3 -0
  34. data/lib/vueapp/templates/generators/component/new.scss +0 -0
  35. data/lib/vueapp/templates/generators/component/new.slim +2 -0
  36. data/lib/vueapp/templates/index.slim +24 -0
  37. data/lib/vueapp/templates/mixins/base.js +10 -0
  38. data/lib/vueapp/templates/pages/about_us/about_us.js +3 -0
  39. data/lib/vueapp/templates/pages/about_us/about_us.scss +0 -0
  40. data/lib/vueapp/templates/pages/about_us/about_us.slim +2 -0
  41. data/lib/vueapp/templates/pages/home/home.js +3 -0
  42. data/lib/vueapp/templates/pages/home/home.scss +0 -0
  43. data/lib/vueapp/templates/pages/home/home.slim +2 -0
  44. data/lib/vueapp/templates/styles.scss +1 -0
  45. data/lib/vueapp/version.rb +5 -0
  46. metadata +228 -0
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VueApp
4
+ module Core
5
+ module Builders
6
+ # Slim builder
7
+ class SlimBuilder < VueApp::Core::Builder
8
+ include VueApp::Core::Helpers::Env
9
+ include VueApp::Core::Helpers::Timer
10
+ include VueApp::Core::Helpers::Path
11
+ include VueApp::Core::Helpers::Build
12
+
13
+ # Create a Slim builder for a specific environment
14
+ # @param [Symbol] env
15
+ # @raise [VueApp::Errors::InvalidENV]
16
+ def initialize(env = :development)
17
+ init_env(env)
18
+ end
19
+
20
+ # Render components slim template
21
+ # @return [String]
22
+ def render_components
23
+ components = ''
24
+ slim_files.each do |slim_file|
25
+ components += if development?
26
+ Slim::Template.new(slim_file, pretty: true).render
27
+ else
28
+ Slim::Template.new(slim_file).render
29
+ end
30
+ end
31
+ components
32
+ end
33
+
34
+ private
35
+
36
+ def build_dev
37
+ timer_block(
38
+ 'Start [development] build for *.slim files',
39
+ 'SLIM time: '
40
+ ) do
41
+ File.open(index_file, 'w') do |file|
42
+ file.write(
43
+ Slim::Template.new(base_layout, pretty: true).render(self)
44
+ )
45
+ end
46
+ end
47
+ end
48
+
49
+ def build_production
50
+ timer_block(
51
+ 'Start [production] build for *.slim files',
52
+ 'SLIM time: '
53
+ ) do
54
+ File.open(index_file, 'w') do |file|
55
+ file.write(
56
+ Slim::Template.new(base_layout).render(self)
57
+ )
58
+ end
59
+ end
60
+ end
61
+
62
+ # Base layout filepath
63
+ # @return [Pathname]
64
+ def base_layout
65
+ src_path.join('index.slim')
66
+ end
67
+
68
+ # Index html filename
69
+ # @return [Pathname]
70
+ def index_file
71
+ build_path.join('index.html')
72
+ end
73
+
74
+ # All *.slim files from [components] folder
75
+ # @return [Array<String>] all [*.slim] files
76
+ def components_slim
77
+ Dir[src_path.join('components', '**', '*.slim').to_s]
78
+ end
79
+
80
+ # All *.slim files from [pages] folder
81
+ # @return [Array<String>] all [*.slim] files
82
+ def pages_slim
83
+ Dir[src_path.join('pages', '**', '*.slim').to_s]
84
+ end
85
+
86
+ # Get all [*.slim] file in the app path
87
+ # @return [Array<String>] all [*.slim] files
88
+ def slim_files
89
+ components_slim + pages_slim
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VueApp
4
+ module Core
5
+ module CLI
6
+ # Helper for CLI [vueapp build]
7
+ module BuildHelper
8
+ # Run builders
9
+ # @param [Symbol] env
10
+ def run_build(env)
11
+ ask_text = "Do you want to build [VUEAPP] in ["
12
+ ask_text += env.to_s + '] mode?(yes/no):'
13
+ return unless yes?(ask_text, :green)
14
+
15
+ VueApp::Core::Builder.build(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VueApp
4
+ module Core
5
+ # Base Vue app builder
6
+ module CLI
7
+ # Helper for CLI
8
+ module GeneratorHelper
9
+ def component_name
10
+ args.last
11
+ end
12
+
13
+ def generate_component(name)
14
+ component_path = src_path('components/' + name)
15
+ VueApp.logger('Generate component: ' + name)
16
+ template('generators/component/new.js', "#{component_path}/#{name}.js")
17
+ template('generators/component/new.slim', "#{component_path}/#{name}.slim")
18
+ template('generators/component/new.scss', "#{component_path}/#{name}.scss")
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VueApp
4
+ module Core
5
+ module CLI
6
+ # Helper for CLI [vueapp init]
7
+ module InitHelper
8
+ # Run initialization
9
+ def run_init
10
+ ask_text = "Do you want to initialize [VUEAPP]\n"
11
+ ask_text += 'in folder: [' + app_path('') + ']?(yes/no):'
12
+ return unless yes?(ask_text, :green)
13
+
14
+ empty_directory(app_path('build/development'))
15
+ empty_directory(app_path('build/production'))
16
+ empty_directory(app_path('build/test'))
17
+ init_core_folder
18
+ init_src_folder
19
+ init_config_folder
20
+ init_pages_folder
21
+ end
22
+
23
+ # Get VUEAPP root path
24
+ # @param [String] path
25
+ # @return [String]
26
+ def app_path(path)
27
+ File.expand_path(path, Dir.pwd)
28
+ end
29
+
30
+ # Get VUEAPP src path
31
+ # @param [String] path
32
+ # @return [String]
33
+ def src_path(path)
34
+ app_path('src/' + path)
35
+ end
36
+
37
+ # Get VUEAPP src/_core/vendor path
38
+ # @param [String] path
39
+ # @return [String]
40
+ def src_vendor_path(path)
41
+ app_path('src/_core/vendor/' + path)
42
+ end
43
+
44
+ # Copy all core files
45
+ def init_core_folder
46
+ copy_file('_core/vendor/vue.js', src_vendor_path('vue.js'))
47
+ copy_file('_core/vendor/vue.dev.js', src_vendor_path('vue.dev.js'))
48
+ copy_file(
49
+ '_core/vendor/vue_router.js',
50
+ src_vendor_path('vue_router.js')
51
+ )
52
+ end
53
+
54
+ # Create src folders
55
+ def init_src_folder
56
+ copy_file('index.slim', src_path('index.slim'))
57
+ copy_file('styles.scss', src_path('styles.scss'))
58
+ empty_directory(src_path('mixins'))
59
+ empty_directory(src_path('filters'))
60
+ empty_directory(src_path('components'))
61
+ end
62
+
63
+ def init_pages_folder
64
+ copy_file('pages/home/home.js', src_path('pages/home/home.js'))
65
+ copy_file('pages/home/home.scss', src_path('pages/home/home.scss'))
66
+ copy_file('pages/home/home.slim', src_path('pages/home/home.slim'))
67
+ copy_file('pages/about_us/about_us.js', src_path('pages/about_us/about_us.js'))
68
+ copy_file('pages/about_us/about_us.scss', src_path('pages/about_us/about_us.scss'))
69
+ copy_file('pages/about_us/about_us.slim', src_path('pages/about_us/about_us.slim'))
70
+ end
71
+
72
+ # Copy config folder files
73
+ def init_config_folder
74
+ copy_file('config/app.js', src_path('config/app.js'))
75
+ copy_file('config/routes.js', src_path('config/routes.js'))
76
+ copy_file('config/router.js', src_path('config/router.js'))
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VueApp
4
+ module Core
5
+ module Helpers
6
+ # Add build method related to @env
7
+ module Build
8
+ # Build method
9
+ # @param [String] str
10
+ def build
11
+ case @env
12
+ when :production then build_production
13
+ when :development then build_dev
14
+ when :test then build_test
15
+ else
16
+ build_dev
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VueApp
4
+ module Core
5
+ module Helpers
6
+ # Add @env to obj
7
+ module Env
8
+ ENV_LIST = %I[development production test].freeze
9
+
10
+ # Initialize @env
11
+ # @param [Symbol] env
12
+ def init_env(env)
13
+ raise VueApp::Errors::InvalidENV unless ENV_LIST.include?(env)
14
+
15
+ @env = env
16
+ end
17
+
18
+ # True if @env == :development
19
+ # @return [TrueClass,FalseClass]
20
+ def development?
21
+ env_is_a?(:development)
22
+ end
23
+
24
+ # True if @env == :production
25
+ # @return [TrueClass,FalseClass]
26
+ def production?
27
+ env_is_a?(:production)
28
+ end
29
+
30
+ # True if @env == :test
31
+ # @return [TrueClass,FalseClass]
32
+ def test?
33
+ env_is_a?(:test)
34
+ end
35
+
36
+ private
37
+
38
+ # Detect env
39
+ # @param [Symbol] env
40
+ # @return [TrueClass,FalseClass]
41
+ def env_is_a?(env)
42
+ @env.eql?(env)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VueApp
4
+ module Core
5
+ module Helpers
6
+ # Add log method
7
+ module Log
8
+ # Logger method: puts string with timestamp
9
+ # @param [String] str
10
+ def log(str)
11
+ puts Time.now.strftime('%-d %b %Y [%H:%M:%S]: ').style(:green) + str
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VueApp
4
+ module Core
5
+ module Helpers
6
+ # Add path helper
7
+ module Path
8
+ VUEAPP_SRC = 'src'
9
+ VUEAPP_BUILD = 'build'
10
+
11
+ # Vue app folder path
12
+ # @return [Pathname]
13
+ def app_path
14
+ Pathname.new(Dir.pwd)
15
+ end
16
+
17
+ # Vue app build folder path
18
+ # @return [Pathname]
19
+ def build_path
20
+ if development?
21
+ app_path.join(VUEAPP_BUILD, 'development')
22
+ elsif test?
23
+ app_path.join(VUEAPP_BUILD, 'test')
24
+ else
25
+ app_path.join(VUEAPP_BUILD, 'production')
26
+ end
27
+ end
28
+
29
+ # Vue app source code path
30
+ # @return [Pathname]
31
+ def src_path
32
+ app_path.join(VUEAPP_SRC)
33
+ end
34
+
35
+ # Vue app source vendor path
36
+ # @return [Pathname]
37
+ def src_vendor_path
38
+ src_path.join('_core', 'vendor')
39
+ end
40
+
41
+ # Vue app source vendor path
42
+ # @return [Pathname]
43
+ def src_config_path
44
+ src_path.join('config')
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VueApp
4
+ module Core
5
+ module Helpers
6
+ # Add timer_block method
7
+ module Timer
8
+ # Time counter
9
+ def timer_block(start_text, end_text, &block)
10
+ start_time = Time.now
11
+ log(start_text)
12
+ block.call(self)
13
+ end_time = (Time.now - start_time).round(2)
14
+ log(end_text + end_time.to_s + 's')
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VueApp
4
+ module Core
5
+ # Listen file modification
6
+ class Listener
7
+ include VueApp::Core::Helpers::Log
8
+
9
+ # Base class method
10
+ def self.call
11
+ new.run
12
+ end
13
+
14
+ # Listener main method
15
+ def run
16
+ log('Run Listener: ' + vueapp_path)
17
+ slim_listener
18
+ js_listener
19
+ scss_listener
20
+ sleep
21
+ end
22
+
23
+ private
24
+
25
+ # Listener for .slim files
26
+ def slim_listener
27
+ listener = Listen.to(vueapp_path, only: /.slim$/) do |modified, added, removed|
28
+ log("Modified: #{modified}") if modified
29
+ log("Added: #{added}") if added
30
+ log("Removed: #{removed}") if removed
31
+ VueApp::Core::Builders::SlimBuilder.new(:development).build
32
+ end
33
+ listener.start
34
+ end
35
+
36
+ # Listener for .js files
37
+ def js_listener
38
+ listener = Listen.to(vueapp_path, only: /.js$/) do |modified, added, removed|
39
+ log("Modified: #{modified}") if modified
40
+ log("Added: #{added}") if added
41
+ log("Removed: #{removed}") if removed
42
+ VueApp::Core::Builders::JsBuilder.new(:development).build
43
+ end
44
+ listener.start
45
+ end
46
+
47
+ # Listener for .scss files
48
+ def scss_listener
49
+ listener = Listen.to(vueapp_path, only: /.scss$/) do |modified, added, removed|
50
+ log("Modified: #{modified}") if modified
51
+ log("Added: #{added}") if added
52
+ log("Removed: #{removed}") if removed
53
+ VueApp::Core::Builders::ScssBuilder.new(:development).build
54
+ end
55
+ listener.start
56
+ end
57
+
58
+ # Path for listener
59
+ def vueapp_path
60
+ Pathname.new(Dir.pwd).join('src').to_s
61
+ end
62
+ end
63
+ end
64
+ end