catalyst-rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/catalyst-rails.rb +111 -0
- data/lib/catalyst/builder.rb +102 -0
- data/lib/catalyst/config.rb +44 -0
- data/lib/catalyst/errors.rb +7 -0
- data/lib/catalyst/helpers.rb +53 -0
- data/lib/catalyst/manifest.rb +60 -0
- data/lib/catalyst/railtie.rb +15 -0
- data/lib/catalyst/tasks/build.rake +22 -0
- metadata +85 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5f4062e6e325a8a191e435eb75e272cb7746c863ad9d75f1b6d274f5d41a5433
|
4
|
+
data.tar.gz: 34c8cd4232f14da1d9c06af6c70e6cc363f7c5d20b3a1b151766156a9b18f15e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a5f6edf6124e90a195fcb36e08548b3c5e04d368ea4f9550a0671903eec576e0011cac87275c392b7a85049fd9f722bdcbb370e56ae7306030dc98c378fa2cca
|
7
|
+
data.tar.gz: 9a75fb0d529bdeb052f7eabf7ac9d17fbceb2d83ba5c1a41d30a3d4b98eb6724e8bc6fb354e00b344b7a17e16cac4710bf26201728ca33a0a93c9f000c79660c
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'dry-configurable'
|
4
|
+
require 'open3'
|
5
|
+
|
6
|
+
module Catalyst
|
7
|
+
extend Dry::Configurable
|
8
|
+
|
9
|
+
default_environment = if ENV['NODE_ENV']
|
10
|
+
ENV['NODE_ENV'].to_sym
|
11
|
+
elsif defined? Rails
|
12
|
+
Rails.env.to_sym
|
13
|
+
end
|
14
|
+
|
15
|
+
default_manifest_path = if defined? Rails
|
16
|
+
File.expand_path('./public/assets/manifest.json', Dir.pwd)
|
17
|
+
end
|
18
|
+
|
19
|
+
setting :environment, default_environment
|
20
|
+
setting :manifest_path, default_manifest_path
|
21
|
+
setting :assets_base_path, '/assets'
|
22
|
+
setting :dev_server_host, ENV.fetch('DEV_SERVER_HOST') { 'localhost' }
|
23
|
+
setting :dev_server_port, ENV.fetch('DEV_SERVER_PORT') { 8080 }.to_i
|
24
|
+
setting :running_feature_tests, -> {
|
25
|
+
!defined?(RSpec) || RSpec.world.all_example_groups.any? do |group|
|
26
|
+
group.metadata[:type] == :system
|
27
|
+
end
|
28
|
+
}
|
29
|
+
|
30
|
+
def self.log(message, level = :info)
|
31
|
+
message = message.split("\n").reduce('') do |reduction, line|
|
32
|
+
reduction + "\e[31m[Catalyst]\e[0m #{line}\n"
|
33
|
+
end
|
34
|
+
|
35
|
+
puts message
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.development?
|
39
|
+
config.environment == :development
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.test?
|
43
|
+
config.environment == :test
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.production?
|
47
|
+
config.environment == :production
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.build!(environment = nil)
|
51
|
+
::Catalyst::Builder.build!(environment)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.serve!
|
55
|
+
unless $catalyst_server_pid.nil?
|
56
|
+
log(
|
57
|
+
"A Catalyst server is already running (#{$catalyst_server_pid}).",
|
58
|
+
:warn
|
59
|
+
)
|
60
|
+
|
61
|
+
return
|
62
|
+
end
|
63
|
+
|
64
|
+
check_for_catalyst!
|
65
|
+
|
66
|
+
stdin, stdout, stderr, wait_thr = Open3.popen3('yarn start')
|
67
|
+
|
68
|
+
$catalyst_server_pid = wait_thr.pid
|
69
|
+
|
70
|
+
Thread.new do
|
71
|
+
while line = stdout.gets
|
72
|
+
puts line
|
73
|
+
end
|
74
|
+
rescue IOError
|
75
|
+
end
|
76
|
+
|
77
|
+
at_exit do
|
78
|
+
stdin.close
|
79
|
+
stdout.close
|
80
|
+
stderr.close
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.check_for_yarn!
|
85
|
+
unless system 'which yarn > /dev/null 2>&1'
|
86
|
+
raise NotInstalled, <<~MESSAGE
|
87
|
+
The yarn binary is not available in this directory.
|
88
|
+
Please follow the instructions here to install it:
|
89
|
+
https://yarnpkg.com/lang/en/docs/install
|
90
|
+
MESSAGE
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.check_for_catalyst!
|
95
|
+
check_for_yarn!
|
96
|
+
|
97
|
+
unless system 'yarn run which catalyst > /dev/null 2>&1'
|
98
|
+
raise NotInstalled, <<~MESSAGE
|
99
|
+
The catalyst binary is not available in this directory.
|
100
|
+
Please follow the instructions here to intall it:
|
101
|
+
https://github.com/friendsoftheweb/catalyst
|
102
|
+
MESSAGE
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
require_relative './catalyst/errors'
|
108
|
+
require_relative './catalyst/builder'
|
109
|
+
require_relative './catalyst/helpers'
|
110
|
+
require_relative './catalyst/manifest'
|
111
|
+
require_relative './catalyst/railtie' if defined? Rails
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'singleton'
|
4
|
+
require 'forwardable'
|
5
|
+
require_relative './config'
|
6
|
+
|
7
|
+
module Catalyst
|
8
|
+
class Builder
|
9
|
+
BUILD_COMMAND = 'yarn run catalyst build'
|
10
|
+
|
11
|
+
include Singleton
|
12
|
+
|
13
|
+
class << self
|
14
|
+
extend Forwardable
|
15
|
+
def_delegator :instance, :build!
|
16
|
+
end
|
17
|
+
|
18
|
+
def build!(environment = nil)
|
19
|
+
Catalyst.check_for_catalyst!
|
20
|
+
|
21
|
+
environment ||= Catalyst.config.environment
|
22
|
+
|
23
|
+
case environment
|
24
|
+
when :test
|
25
|
+
test_build!
|
26
|
+
when :production
|
27
|
+
production_build!
|
28
|
+
else
|
29
|
+
raise ArgumentError,
|
30
|
+
'Invalid environment. Must be one of: :test, :production.'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def test_build!
|
37
|
+
unless Catalyst.config.running_feature_tests.call
|
38
|
+
Catalyst.log('Not running feature tests -- skipping build')
|
39
|
+
return
|
40
|
+
end
|
41
|
+
|
42
|
+
# Only rebuild the assets if they've been modified since the last time
|
43
|
+
# they were built successfully.
|
44
|
+
if assets_last_built >= assets_last_modified
|
45
|
+
Catalyst.log('Assets have not been modified -- skipping build')
|
46
|
+
return
|
47
|
+
end
|
48
|
+
|
49
|
+
if system("NODE_ENV=test #{BUILD_COMMAND}")
|
50
|
+
unless assets_last_built_file_path.nil?
|
51
|
+
FileUtils.touch(assets_last_built_file_path)
|
52
|
+
end
|
53
|
+
else
|
54
|
+
puts <<~MESSAGE
|
55
|
+
\e[31m
|
56
|
+
***************************************************************
|
57
|
+
* *
|
58
|
+
* Failed to compile assets with Catalyst! *
|
59
|
+
* Make sure 'yarn run catalyst build' runs without failing. *
|
60
|
+
* *
|
61
|
+
***************************************************************\e[0m
|
62
|
+
MESSAGE
|
63
|
+
|
64
|
+
exit 1
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def production_build!
|
69
|
+
unless system("NODE_ENV=production #{BUILD_COMMAND}")
|
70
|
+
Catalyst.log('Failed to compile assets!')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def assets_last_modified
|
75
|
+
asset_paths.lazy.map { |path| File.ctime(path) }.max || Time.now
|
76
|
+
end
|
77
|
+
|
78
|
+
def asset_paths
|
79
|
+
if ::Catalyst::Config.root_path
|
80
|
+
Dir.glob(File.join(::Catalyst::Config.root_path, '**/*.{js,scss}')) + [
|
81
|
+
File.join(Dir.pwd, 'yarn.lock')
|
82
|
+
]
|
83
|
+
else
|
84
|
+
[]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def assets_last_built_file_path
|
89
|
+
if defined?(Rails)
|
90
|
+
Rails.root.join('tmp/assets-last-built')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def assets_last_built
|
95
|
+
if assets_last_built_file_path.nil?
|
96
|
+
Time.at(0)
|
97
|
+
else
|
98
|
+
File.mtime(assets_last_built_file_path) rescue Time.at(0)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'singleton'
|
4
|
+
require 'forwardable'
|
5
|
+
require 'json'
|
6
|
+
require_relative './errors'
|
7
|
+
|
8
|
+
module Catalyst
|
9
|
+
class Config
|
10
|
+
PACKAGE_PATH = File.expand_path('./package.json', Dir.pwd)
|
11
|
+
|
12
|
+
include Singleton
|
13
|
+
|
14
|
+
class << self
|
15
|
+
extend Forwardable
|
16
|
+
def_delegators :instance, :root_path, :build_path
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
unless File.exists?(PACKAGE_PATH)
|
21
|
+
raise ::Catalyst::MissingConfig,
|
22
|
+
"Missing package.json file in: #{Dir.pwd}"
|
23
|
+
end
|
24
|
+
|
25
|
+
@values = JSON.parse(File.read(PACKAGE_PATH))['catalyst']
|
26
|
+
|
27
|
+
if @values.nil?
|
28
|
+
raise ::Catalyst::MissingConfig, <<~MESSAGE
|
29
|
+
Missing "catalyst" config in package.json file.
|
30
|
+
Please follow the instructions here to set up Catalyst:
|
31
|
+
https://github.com/friendsoftheweb/catalyst
|
32
|
+
MESSAGE
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def root_path
|
37
|
+
File.join(Dir.pwd, @values['rootPath'])
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_path
|
41
|
+
File.join(Dir.pwd, @values['buildPath'])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'action_view'
|
4
|
+
require_relative './manifest'
|
5
|
+
|
6
|
+
module Catalyst
|
7
|
+
module Helpers
|
8
|
+
include ActionView::Helpers::TagHelper
|
9
|
+
|
10
|
+
def catalyst_javascript_vendor_include_tag
|
11
|
+
if Catalyst.development?
|
12
|
+
content_tag(:script, nil, src: ::Catalyst::Manifest['vendor-dll.js'])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def catalyst_javascript_include_tag(path)
|
17
|
+
path = path.to_s.gsub(/\.js\z/, '')
|
18
|
+
|
19
|
+
content_tag(
|
20
|
+
:script,
|
21
|
+
nil,
|
22
|
+
src: ::Catalyst::Manifest["#{path}.js"],
|
23
|
+
type: 'text/javascript'
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def catalyst_stylesheet_link_tag(path)
|
28
|
+
path = path.to_s.gsub(/\.css\z/, '')
|
29
|
+
|
30
|
+
unless Catalyst.development?
|
31
|
+
content_tag(
|
32
|
+
:link,
|
33
|
+
nil,
|
34
|
+
href: ::Catalyst::Manifest["#{path}.css"],
|
35
|
+
media: 'screen',
|
36
|
+
rel: 'stylesheet'
|
37
|
+
)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def catalyst_asset_path(path)
|
42
|
+
::Catalyst::Manifest[path]
|
43
|
+
end
|
44
|
+
|
45
|
+
def catalyst_asset_url(path)
|
46
|
+
if Catalyst.development? || ENV['HOST'].blank?
|
47
|
+
webpack_asset_path(path)
|
48
|
+
else
|
49
|
+
"https://#{ENV['HOST']}#{webpack_asset_path(path)}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'singleton'
|
4
|
+
require 'forwardable'
|
5
|
+
|
6
|
+
module Catalyst
|
7
|
+
class Manifest
|
8
|
+
AssetMissing = Class.new(StandardError)
|
9
|
+
|
10
|
+
include Singleton
|
11
|
+
|
12
|
+
class << self
|
13
|
+
extend Forwardable
|
14
|
+
def_delegator :instance, :[]
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
if Catalyst.development?
|
19
|
+
@manifest = {}
|
20
|
+
else
|
21
|
+
if Catalyst.config.manifest_path.nil?
|
22
|
+
raise 'Missing "manifest_path" configuration.'
|
23
|
+
end
|
24
|
+
|
25
|
+
@manifest = JSON.parse(File.read(Catalyst.config.manifest_path))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def [](path)
|
30
|
+
path = path.to_s.gsub(/\A\/+/, '')
|
31
|
+
|
32
|
+
if Catalyst.development?
|
33
|
+
dev_server_host = Catalyst.config.dev_server_host
|
34
|
+
dev_server_port = Catalyst.config.dev_server_port
|
35
|
+
|
36
|
+
if dev_server_host.nil?
|
37
|
+
raise 'Missing "dev_server_host" configuration.'
|
38
|
+
end
|
39
|
+
|
40
|
+
if dev_server_port.nil?
|
41
|
+
raise 'Missing "dev_server_port" configuration.'
|
42
|
+
end
|
43
|
+
|
44
|
+
return "http://#{dev_server_host}:#{dev_server_port}/#{path}"
|
45
|
+
else
|
46
|
+
if @manifest.key?(path)
|
47
|
+
assets_base_path = Catalyst.config.assets_base_path
|
48
|
+
|
49
|
+
if assets_base_path.nil?
|
50
|
+
raise 'Missing "assets_base_path" configuration.'
|
51
|
+
end
|
52
|
+
|
53
|
+
return "#{assets_base_path}/#{@manifest[path]}"
|
54
|
+
else
|
55
|
+
raise AssetMissing, "Couldn't find an asset for path: #{path}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './helpers'
|
4
|
+
|
5
|
+
module Catalyst
|
6
|
+
class Railtie < Rails::Railtie
|
7
|
+
initializer 'catalyst_rails.view_helpers' do
|
8
|
+
ActionView::Base.include(::Catalyst::Helpers)
|
9
|
+
end
|
10
|
+
|
11
|
+
rake_tasks do
|
12
|
+
load File.expand_path('./tasks/build.rake', __dir__)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
namespace :catalyst do
|
2
|
+
desc 'Build assets with Catalyst'
|
3
|
+
task :build do
|
4
|
+
if File.exists?('./public/assets/manifest.json')
|
5
|
+
puts "[Catalyst] Removing previous assets..."
|
6
|
+
|
7
|
+
manifest = JSON.parse(File.read('./public/assets/manifest.json'))
|
8
|
+
|
9
|
+
manifest.values.each do |asset_path|
|
10
|
+
system "rm -f ./public/assets/#{asset_path}*"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
puts "[Catalyst] Compiling assets..."
|
15
|
+
Catalyst.build!
|
16
|
+
|
17
|
+
if Catalyst.production?
|
18
|
+
puts "[Catalyst] Removing 'node_modules' directory..."
|
19
|
+
system 'rm -rf ./node_modules'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: catalyst-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dan Martens
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-03-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dry-configurable
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.7'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: actionview
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
- - "<="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '6.0'
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '3.0'
|
44
|
+
- - "<="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '6.0'
|
47
|
+
description:
|
48
|
+
email: dan@friendsoftheweb.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- lib/catalyst-rails.rb
|
54
|
+
- lib/catalyst/builder.rb
|
55
|
+
- lib/catalyst/config.rb
|
56
|
+
- lib/catalyst/errors.rb
|
57
|
+
- lib/catalyst/helpers.rb
|
58
|
+
- lib/catalyst/manifest.rb
|
59
|
+
- lib/catalyst/railtie.rb
|
60
|
+
- lib/catalyst/tasks/build.rake
|
61
|
+
homepage: http://rubygems.org/gems/catalyst-rails
|
62
|
+
licenses:
|
63
|
+
- MIT
|
64
|
+
metadata: {}
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options: []
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
requirements: []
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 2.7.3
|
82
|
+
signing_key:
|
83
|
+
specification_version: 4
|
84
|
+
summary: Ruby helpers for the "catalyst" node package
|
85
|
+
test_files: []
|