proscenium 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/LICENSE.txt +21 -0
- data/README.md +908 -0
- data/lib/proscenium/builder.rb +189 -0
- data/lib/proscenium/core_ext/object/css_module_ivars.rb +19 -0
- data/lib/proscenium/css_module/path.rb +31 -0
- data/lib/proscenium/css_module/rewriter.rb +44 -0
- data/lib/proscenium/css_module/transformer.rb +84 -0
- data/lib/proscenium/css_module.rb +57 -0
- data/lib/proscenium/ensure_loaded.rb +27 -0
- data/lib/proscenium/ext/proscenium +0 -0
- data/lib/proscenium/ext/proscenium.h +131 -0
- data/lib/proscenium/helper.rb +70 -0
- data/lib/proscenium/importer.rb +134 -0
- data/lib/proscenium/libs/custom_element.js +54 -0
- data/lib/proscenium/libs/react-manager/index.jsx +121 -0
- data/lib/proscenium/libs/react-manager/react.js +2 -0
- data/lib/proscenium/libs/stimulus-loading.js +65 -0
- data/lib/proscenium/libs/test.js +1 -0
- data/lib/proscenium/libs/ujs/class.js +15 -0
- data/lib/proscenium/libs/ujs/data_confirm.js +23 -0
- data/lib/proscenium/libs/ujs/data_disable_with.js +68 -0
- data/lib/proscenium/libs/ujs/index.js +9 -0
- data/lib/proscenium/log_subscriber.rb +37 -0
- data/lib/proscenium/middleware/base.rb +103 -0
- data/lib/proscenium/middleware/engines.rb +45 -0
- data/lib/proscenium/middleware/esbuild.rb +30 -0
- data/lib/proscenium/middleware/runtime.rb +18 -0
- data/lib/proscenium/middleware/url.rb +16 -0
- data/lib/proscenium/middleware.rb +76 -0
- data/lib/proscenium/monkey.rb +95 -0
- data/lib/proscenium/phlex/asset_inclusions.rb +17 -0
- data/lib/proscenium/phlex/css_modules.rb +79 -0
- data/lib/proscenium/phlex/react_component.rb +32 -0
- data/lib/proscenium/phlex.rb +42 -0
- data/lib/proscenium/railtie.rb +106 -0
- data/lib/proscenium/react_componentable.rb +95 -0
- data/lib/proscenium/resolver.rb +39 -0
- data/lib/proscenium/side_load.rb +155 -0
- data/lib/proscenium/source_path.rb +15 -0
- data/lib/proscenium/templates/rescues/build_error.html.erb +30 -0
- data/lib/proscenium/ui/breadcrumbs/component.module.css +14 -0
- data/lib/proscenium/ui/breadcrumbs/component.rb +79 -0
- data/lib/proscenium/ui/breadcrumbs/computed_element.rb +69 -0
- data/lib/proscenium/ui/breadcrumbs/control.rb +95 -0
- data/lib/proscenium/ui/breadcrumbs/mixins.css +83 -0
- data/lib/proscenium/ui/breadcrumbs.rb +72 -0
- data/lib/proscenium/ui/component.rb +11 -0
- data/lib/proscenium/ui/test.js +1 -0
- data/lib/proscenium/ui.rb +14 -0
- data/lib/proscenium/utils.rb +13 -0
- data/lib/proscenium/version.rb +5 -0
- data/lib/proscenium/view_component/css_modules.rb +11 -0
- data/lib/proscenium/view_component/react_component.rb +22 -0
- data/lib/proscenium/view_component/sideload.rb +4 -0
- data/lib/proscenium/view_component.rb +38 -0
- data/lib/proscenium.rb +70 -0
- metadata +228 -0
@@ -0,0 +1,189 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ffi'
|
4
|
+
require 'oj'
|
5
|
+
|
6
|
+
module Proscenium
|
7
|
+
class Builder
|
8
|
+
class CompileError < StandardError; end
|
9
|
+
|
10
|
+
class Result < FFI::Struct
|
11
|
+
layout :success, :bool,
|
12
|
+
:response, :string
|
13
|
+
end
|
14
|
+
|
15
|
+
module Request
|
16
|
+
extend FFI::Library
|
17
|
+
ffi_lib Pathname.new(__dir__).join('ext/proscenium').to_s
|
18
|
+
|
19
|
+
enum :environment, [:development, 1, :test, :production]
|
20
|
+
|
21
|
+
attach_function :build_to_string, [
|
22
|
+
:string, # Path or entry point.
|
23
|
+
:string, # Base URL of the Rails app. eg. https://example.com
|
24
|
+
:string, # Path to import map, relative to root
|
25
|
+
:string, # ENV variables as a JSON string
|
26
|
+
|
27
|
+
# Config
|
28
|
+
:string, # Rails application root
|
29
|
+
:string, # Proscenium gem root
|
30
|
+
:environment, # Rails environment as a Symbol
|
31
|
+
:bool, # Code splitting enabled?
|
32
|
+
:string, # Engine names and paths as a JSON string
|
33
|
+
:bool # Debugging enabled?
|
34
|
+
], Result.by_value
|
35
|
+
|
36
|
+
attach_function :build_to_path, [
|
37
|
+
:string, # Path or entry point. Multiple can be given by separating with a semi-colon
|
38
|
+
:string, # Base URL of the Rails app. eg. https://example.com
|
39
|
+
:string, # Path to import map, relative to root
|
40
|
+
:string, # ENV variables as a JSON string
|
41
|
+
|
42
|
+
# Config
|
43
|
+
:string, # Rails application root
|
44
|
+
:string, # Proscenium gem root
|
45
|
+
:environment, # Rails environment as a Symbol
|
46
|
+
:bool, # Code splitting enabled?
|
47
|
+
:string, # Engine names and paths as a JSON string
|
48
|
+
:bool # Debugging enabled?
|
49
|
+
], Result.by_value
|
50
|
+
|
51
|
+
attach_function :resolve, [
|
52
|
+
:string, # path or entry point
|
53
|
+
:string, # path to import map, relative to root
|
54
|
+
|
55
|
+
# Config
|
56
|
+
:string, # Rails application root
|
57
|
+
:string, # Proscenium gem root
|
58
|
+
:environment, # Rails environment as a Symbol
|
59
|
+
:bool # debugging enabled?
|
60
|
+
], Result.by_value
|
61
|
+
end
|
62
|
+
|
63
|
+
class BuildError < StandardError
|
64
|
+
attr_reader :error
|
65
|
+
|
66
|
+
def initialize(error)
|
67
|
+
@error = Oj.load(error, mode: :strict).deep_transform_keys(&:underscore)
|
68
|
+
|
69
|
+
msg = @error['text']
|
70
|
+
if (location = @error['location'])
|
71
|
+
msg << " at #{location['file']}:#{location['line']}:#{location['column']}"
|
72
|
+
end
|
73
|
+
|
74
|
+
super(msg)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class ResolveError < StandardError
|
79
|
+
attr_reader :error_msg, :path
|
80
|
+
|
81
|
+
def initialize(path, error_msg)
|
82
|
+
super("Failed to resolve '#{path}' -- #{error_msg}")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.build_to_path(path, root: nil, base_url: nil)
|
87
|
+
new(root:, base_url:).build_to_path(path)
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.build_to_string(path, root: nil, base_url: nil)
|
91
|
+
new(root:, base_url:).build_to_string(path)
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.resolve(path, root: nil)
|
95
|
+
new(root:).resolve(path)
|
96
|
+
end
|
97
|
+
|
98
|
+
def initialize(root: nil, base_url: nil)
|
99
|
+
@root = root || Rails.root
|
100
|
+
@base_url = base_url
|
101
|
+
end
|
102
|
+
|
103
|
+
def build_to_path(path)
|
104
|
+
ActiveSupport::Notifications.instrument('build_to_path.proscenium',
|
105
|
+
identifier: path,
|
106
|
+
cached: Proscenium.cache.exist?(path)) do
|
107
|
+
Proscenium.cache.fetch path do
|
108
|
+
result = Request.build_to_path(path, @base_url, import_map, env_vars.to_json,
|
109
|
+
@root.to_s,
|
110
|
+
gem_root,
|
111
|
+
Rails.env.to_sym,
|
112
|
+
Proscenium.config.code_splitting,
|
113
|
+
engines.to_json,
|
114
|
+
Proscenium.config.debug)
|
115
|
+
|
116
|
+
raise BuildError, result[:response] unless result[:success]
|
117
|
+
|
118
|
+
result[:response]
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def build_to_string(path)
|
124
|
+
ActiveSupport::Notifications.instrument('build_to_string.proscenium', identifier: path) do
|
125
|
+
result = Request.build_to_string(path, @base_url, import_map, env_vars.to_json,
|
126
|
+
@root.to_s,
|
127
|
+
gem_root,
|
128
|
+
Rails.env.to_sym,
|
129
|
+
Proscenium.config.code_splitting,
|
130
|
+
engines.to_json,
|
131
|
+
Proscenium.config.debug)
|
132
|
+
|
133
|
+
raise BuildError, result[:response] unless result[:success]
|
134
|
+
|
135
|
+
result[:response]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def resolve(path)
|
140
|
+
ActiveSupport::Notifications.instrument('resolve.proscenium', identifier: path) do
|
141
|
+
result = Request.resolve(path, import_map, @root.to_s,
|
142
|
+
gem_root,
|
143
|
+
Rails.env.to_sym,
|
144
|
+
Proscenium.config.debug)
|
145
|
+
raise ResolveError.new(path, result[:response]) unless result[:success]
|
146
|
+
|
147
|
+
result[:response]
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
# Build the ENV variables as determined by `Proscenium.config.env_vars` and
|
154
|
+
# `Proscenium::DEFAULT_ENV_VARS` to pass to esbuild.
|
155
|
+
def env_vars
|
156
|
+
ENV['NODE_ENV'] = ENV.fetch('RAILS_ENV', nil)
|
157
|
+
ENV.slice(*Proscenium.config.env_vars + Proscenium::DEFAULT_ENV_VARS)
|
158
|
+
end
|
159
|
+
|
160
|
+
def cache_query_string
|
161
|
+
q = Proscenium.config.cache_query_string
|
162
|
+
q ? "--cache-query-string #{q}" : nil
|
163
|
+
end
|
164
|
+
|
165
|
+
def engines
|
166
|
+
Proscenium.config.engines.to_h { |e| [e.engine_name, e.root.to_s] }.tap do |x|
|
167
|
+
x['proscenium/ui'] = Proscenium.ui_path.to_s
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def import_map
|
172
|
+
return unless (path = Rails.root&.join('config'))
|
173
|
+
|
174
|
+
if (json = path.join('import_map.json')).exist?
|
175
|
+
return json.relative_path_from(@root).to_s
|
176
|
+
end
|
177
|
+
|
178
|
+
if (js = path.join('import_map.js')).exist?
|
179
|
+
return js.relative_path_from(@root).to_s
|
180
|
+
end
|
181
|
+
|
182
|
+
nil
|
183
|
+
end
|
184
|
+
|
185
|
+
def gem_root
|
186
|
+
Pathname.new(__dir__).join('..', '..').to_s
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Object
|
4
|
+
def instance_variable_get(name)
|
5
|
+
name.is_a?(::Proscenium::CssModule::Name) ? super(name.to_sym) : super
|
6
|
+
end
|
7
|
+
|
8
|
+
def instance_variable_set(name, obj)
|
9
|
+
name.is_a?(::Proscenium::CssModule::Name) ? super(name.to_sym, obj) : super
|
10
|
+
end
|
11
|
+
|
12
|
+
def instance_variable_defined?(name)
|
13
|
+
name.is_a?(::Proscenium::CssModule::Name) ? super(name.to_sym) : super
|
14
|
+
end
|
15
|
+
|
16
|
+
def remove_instance_variable(name)
|
17
|
+
name.is_a?(::Proscenium::CssModule::Name) ? super(name.to_sym) : super
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Proscenium
|
4
|
+
module CssModule::Path
|
5
|
+
# Returns the path to the CSS module file for this class, where the file is located alongside
|
6
|
+
# the class file, and has the same name as the class file, but with a `.module.css` extension.
|
7
|
+
#
|
8
|
+
# If the CSS module file does not exist, it's ancestry is checked, returning the first that
|
9
|
+
# exists. Then finally `nil` is returned if never found.
|
10
|
+
#
|
11
|
+
# @return [Pathname]
|
12
|
+
def css_module_path
|
13
|
+
return @css_module_path if instance_variable_defined?(:@css_module_path)
|
14
|
+
|
15
|
+
path = source_path.sub_ext('.module.css')
|
16
|
+
@css_module_path = path.exist? ? path : nil
|
17
|
+
|
18
|
+
unless @css_module_path
|
19
|
+
klass = superclass
|
20
|
+
|
21
|
+
while klass.respond_to?(:css_module_path) && !klass.abstract_class
|
22
|
+
break if (@css_module_path = klass.css_module_path)
|
23
|
+
|
24
|
+
klass = klass.superclass
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
@css_module_path
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ruby-next/language'
|
4
|
+
require 'proscenium/core_ext/object/css_module_ivars'
|
5
|
+
|
6
|
+
module Proscenium
|
7
|
+
module CssModule
|
8
|
+
class Rewriter < RubyNext::Language::Rewriters::Text
|
9
|
+
NAME = 'proscenium-css-module'
|
10
|
+
|
11
|
+
def rewrite(source)
|
12
|
+
source = source.gsub(/%i\[((@[\w@ ]+)|([\w@ ]+ @[\w@ ]+))\]/) do |_|
|
13
|
+
arr = ::Regexp.last_match(1).split.map do |x|
|
14
|
+
x.start_with?('@') ? css_module_string(x[1..]) : ":#{x}"
|
15
|
+
end
|
16
|
+
"[#{arr.join(',')}]"
|
17
|
+
end
|
18
|
+
|
19
|
+
source.gsub(/:@([\w]+)/) do |_|
|
20
|
+
context.track!(self)
|
21
|
+
css_module_string(::Regexp.last_match(1))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def css_module_string(name)
|
28
|
+
if (path = Pathname.new(context.path).sub_ext('.module.css')).exist?
|
29
|
+
tname = Transformer.new(path).class_name!(name, name.dup).first
|
30
|
+
"Proscenium::CssModule::Name.new(:@#{name}, '#{tname}')"
|
31
|
+
else
|
32
|
+
"Proscenium::CssModule::Name.new(:@#{name}, css_module(:#{name}))"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
RubyNext::Language.send :include_patterns=, []
|
40
|
+
RubyNext::Language.include_patterns << "#{Rails.root.join('app', 'components')}/*.rb"
|
41
|
+
RubyNext::Language.include_patterns << "#{Rails.root.join('app', 'views')}/*.rb"
|
42
|
+
RubyNext::Language.rewriters = [Proscenium::CssModule::Rewriter]
|
43
|
+
|
44
|
+
require 'ruby-next/language/runtime'
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Proscenium
|
4
|
+
class CssModule::Transformer
|
5
|
+
FILE_EXT = '.module.css'
|
6
|
+
|
7
|
+
def self.class_names(path, *names)
|
8
|
+
new(path).class_names(*names)
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(source_path)
|
12
|
+
return unless (@source_path = source_path)
|
13
|
+
|
14
|
+
@source_path = Pathname.new(@source_path) unless @source_path.is_a?(Pathname)
|
15
|
+
@source_path = @source_path.sub_ext(FILE_EXT) unless @source_path.to_s.end_with?(FILE_EXT)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Transform each of the given class `names` to their respective CSS module name, which consist
|
19
|
+
# of the name, and suffixed with the digest of the resolved source path.
|
20
|
+
#
|
21
|
+
# Any name beginning with '@' will be transformed to a CSS module name. If `require_prefix` is
|
22
|
+
# false, then all names will be transformed to a CSS module name regardless of whether or not
|
23
|
+
# they begin with '@'.
|
24
|
+
#
|
25
|
+
# class_names :@my_module_name, :my_class_name
|
26
|
+
#
|
27
|
+
# Note that the generated digest is based on the resolved (URL) path, not the original path.
|
28
|
+
#
|
29
|
+
# You can also provide a path specifier and class name. The path will be the URL path to a
|
30
|
+
# stylesheet. The class name will be the name of the class to transform.
|
31
|
+
#
|
32
|
+
# class_names "/lib/button@default"
|
33
|
+
# class_names "mypackage/button@large"
|
34
|
+
# class_names "@scoped/package/button@small"
|
35
|
+
#
|
36
|
+
# @param names [String,Symbol,Array<String,Symbol>]
|
37
|
+
# @param require_prefix: [Boolean] whether or not to require the `@` prefix.
|
38
|
+
# @return [Array<String>] the transformed CSS module names.
|
39
|
+
def class_names(*names, require_prefix: true)
|
40
|
+
names.map do |name|
|
41
|
+
original_name = name.dup
|
42
|
+
name = name.to_s if name.is_a?(Symbol)
|
43
|
+
|
44
|
+
if name.include?('/')
|
45
|
+
if name.start_with?('@')
|
46
|
+
# Scoped bare specifier (eg. "@scoped/package/lib/button@default").
|
47
|
+
_, path, name = name.split('@')
|
48
|
+
path = "@#{path}"
|
49
|
+
else
|
50
|
+
# Local path (eg. /some/path/to/button@default") or bare specifier (eg.
|
51
|
+
# "mypackage/lib/button@default").
|
52
|
+
path, name = name.split('@')
|
53
|
+
end
|
54
|
+
|
55
|
+
class_name! name, original_name, path: "#{path}#{FILE_EXT}"
|
56
|
+
elsif name.start_with?('@')
|
57
|
+
class_name! name[1..], original_name
|
58
|
+
else
|
59
|
+
require_prefix ? name : class_name!(name, original_name)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def class_name!(name, original_name, path: @source_path)
|
65
|
+
unless path
|
66
|
+
raise Proscenium::CssModule::TransformError.new(original_name, 'CSS module path not given')
|
67
|
+
end
|
68
|
+
|
69
|
+
resolved_path = Resolver.resolve(path.to_s)
|
70
|
+
digest = Importer.import(resolved_path)
|
71
|
+
|
72
|
+
transformed_path = ''
|
73
|
+
transformed_path = "__#{resolved_path[1..].gsub(%r{[/\.]}, '-')}" if Rails.env.development?
|
74
|
+
transformed_name = name.to_s
|
75
|
+
transformed_name = if transformed_name.start_with?('_')
|
76
|
+
"_#{transformed_name[1..]}-#{digest}#{transformed_path}"
|
77
|
+
else
|
78
|
+
"#{transformed_name}-#{digest}#{transformed_path}"
|
79
|
+
end
|
80
|
+
|
81
|
+
[transformed_name, resolved_path]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Proscenium::CssModule
|
4
|
+
extend ActiveSupport::Autoload
|
5
|
+
|
6
|
+
autoload :Path
|
7
|
+
autoload :Transformer
|
8
|
+
|
9
|
+
class TransformError < StandardError
|
10
|
+
def initialize(name, additional_msg = nil)
|
11
|
+
msg = "Failed to transform CSS module `#{name}`"
|
12
|
+
msg << ' - ' << additional_msg if additional_msg
|
13
|
+
|
14
|
+
super(msg)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Name
|
19
|
+
def initialize(name, transform)
|
20
|
+
@name = name
|
21
|
+
@transform = transform
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
@transform
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_sym
|
29
|
+
@name
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Accepts one or more CSS class names, and transforms them into CSS module names.
|
34
|
+
#
|
35
|
+
# @param name [String,Symbol,Array<String,Symbol>]
|
36
|
+
# @param path [Pathname] the path to the CSS module file to use for the transformation.
|
37
|
+
# @return [String] the transformed CSS module names concatenated as a string.
|
38
|
+
def css_module(*names, path: nil)
|
39
|
+
transformer = path.nil? ? cssm : Transformer.new(path)
|
40
|
+
transformer.class_names(*names, require_prefix: false).map { |name, _| name }.join(' ')
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param name [String,Symbol,Array<String,Symbol>]
|
44
|
+
# @param path [Pathname] the path to the CSS file to use for the transformation.
|
45
|
+
# @return [String] the transformed CSS module names concatenated as a string.
|
46
|
+
def class_names(*names, path: nil)
|
47
|
+
names = names.flatten.compact
|
48
|
+
transformer = path.nil? ? cssm : Transformer.new(path)
|
49
|
+
transformer.class_names(*names).map { |name, _| name }.join(' ') unless names.empty?
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def cssm
|
55
|
+
@cssm ||= Transformer.new(self.class.css_module_path)
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Proscenium
|
4
|
+
NotIncludedError = Class.new(StandardError)
|
5
|
+
|
6
|
+
module EnsureLoaded
|
7
|
+
def self.included(child)
|
8
|
+
child.class_eval do
|
9
|
+
append_after_action do
|
10
|
+
if request.format.html? && Importer.imported?
|
11
|
+
if Importer.js_imported?
|
12
|
+
raise NotIncludedError, 'There are side loaded javascripts to be included, but ' \
|
13
|
+
'they have not been included in the page. Did you forget ' \
|
14
|
+
'to add the `#include_assets` helper in your views?'
|
15
|
+
end
|
16
|
+
|
17
|
+
if Importer.css_imported?
|
18
|
+
raise NotIncludedError, 'There are side loaded stylesheets to be included, but ' \
|
19
|
+
'they have not been included in the page. Did you forget ' \
|
20
|
+
'to add the `#include_assets` helper in your views?'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
Binary file
|
@@ -0,0 +1,131 @@
|
|
1
|
+
/* Code generated by cmd/cgo; DO NOT EDIT. */
|
2
|
+
|
3
|
+
/* package joelmoss/proscenium */
|
4
|
+
|
5
|
+
|
6
|
+
#line 1 "cgo-builtin-export-prolog"
|
7
|
+
|
8
|
+
#include <stddef.h>
|
9
|
+
|
10
|
+
#ifndef GO_CGO_EXPORT_PROLOGUE_H
|
11
|
+
#define GO_CGO_EXPORT_PROLOGUE_H
|
12
|
+
|
13
|
+
#ifndef GO_CGO_GOSTRING_TYPEDEF
|
14
|
+
typedef struct { const char *p; ptrdiff_t n; } _GoString_;
|
15
|
+
#endif
|
16
|
+
|
17
|
+
#endif
|
18
|
+
|
19
|
+
/* Start of preamble from import "C" comments. */
|
20
|
+
|
21
|
+
|
22
|
+
#line 3 "main.go"
|
23
|
+
|
24
|
+
struct Result {
|
25
|
+
int success;
|
26
|
+
char* response;
|
27
|
+
};
|
28
|
+
|
29
|
+
#line 1 "cgo-generated-wrapper"
|
30
|
+
|
31
|
+
|
32
|
+
/* End of preamble from import "C" comments. */
|
33
|
+
|
34
|
+
|
35
|
+
/* Start of boilerplate cgo prologue. */
|
36
|
+
#line 1 "cgo-gcc-export-header-prolog"
|
37
|
+
|
38
|
+
#ifndef GO_CGO_PROLOGUE_H
|
39
|
+
#define GO_CGO_PROLOGUE_H
|
40
|
+
|
41
|
+
typedef signed char GoInt8;
|
42
|
+
typedef unsigned char GoUint8;
|
43
|
+
typedef short GoInt16;
|
44
|
+
typedef unsigned short GoUint16;
|
45
|
+
typedef int GoInt32;
|
46
|
+
typedef unsigned int GoUint32;
|
47
|
+
typedef long long GoInt64;
|
48
|
+
typedef unsigned long long GoUint64;
|
49
|
+
typedef GoInt64 GoInt;
|
50
|
+
typedef GoUint64 GoUint;
|
51
|
+
typedef size_t GoUintptr;
|
52
|
+
typedef float GoFloat32;
|
53
|
+
typedef double GoFloat64;
|
54
|
+
#ifdef _MSC_VER
|
55
|
+
#include <complex.h>
|
56
|
+
typedef _Fcomplex GoComplex64;
|
57
|
+
typedef _Dcomplex GoComplex128;
|
58
|
+
#else
|
59
|
+
typedef float _Complex GoComplex64;
|
60
|
+
typedef double _Complex GoComplex128;
|
61
|
+
#endif
|
62
|
+
|
63
|
+
/*
|
64
|
+
static assertion to make sure the file is being used on architecture
|
65
|
+
at least with matching size of GoInt.
|
66
|
+
*/
|
67
|
+
typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];
|
68
|
+
|
69
|
+
#ifndef GO_CGO_GOSTRING_TYPEDEF
|
70
|
+
typedef _GoString_ GoString;
|
71
|
+
#endif
|
72
|
+
typedef void *GoMap;
|
73
|
+
typedef void *GoChan;
|
74
|
+
typedef struct { void *t; void *v; } GoInterface;
|
75
|
+
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
|
76
|
+
|
77
|
+
#endif
|
78
|
+
|
79
|
+
/* End of boilerplate cgo prologue. */
|
80
|
+
|
81
|
+
#ifdef __cplusplus
|
82
|
+
extern "C" {
|
83
|
+
#endif
|
84
|
+
|
85
|
+
|
86
|
+
// Build the given `path` in the `root`.
|
87
|
+
//
|
88
|
+
// BuildOptions
|
89
|
+
// - path - The path to build relative to `root`.
|
90
|
+
// - baseUrl - base URL of the Rails app. eg. https://example.com
|
91
|
+
// - importMap - Path to the import map relative to `root`.
|
92
|
+
// - envVars - JSON string of environment variables.
|
93
|
+
// Config:
|
94
|
+
// - root - The working directory.
|
95
|
+
// - env - The environment (1 = development, 2 = test, 3 = production)
|
96
|
+
// - codeSpitting?
|
97
|
+
// - debug?
|
98
|
+
//
|
99
|
+
extern struct Result build_to_string(char* filepath, char* baseUrl, char* importMap, char* envVars, char* appRoot, char* gemPath, unsigned int env, GoUint8 codeSplitting, char* engines, GoUint8 debug);
|
100
|
+
|
101
|
+
// Build the given `path` in the `root`.
|
102
|
+
//
|
103
|
+
// BuildOptions
|
104
|
+
// - path - The path to build relative to `root`. Multiple paths can be given by separating them
|
105
|
+
// with a semi-colon.
|
106
|
+
// - baseUrl - base URL of the Rails app. eg. https://example.com
|
107
|
+
// - importMap - Path to the import map relative to `root`.
|
108
|
+
// - envVars - JSON string of environment variables.
|
109
|
+
// Config:
|
110
|
+
// - root - The working directory.
|
111
|
+
// - env - The environment (1 = development, 2 = test, 3 = production)
|
112
|
+
// - codeSpitting?
|
113
|
+
// - debug?
|
114
|
+
//
|
115
|
+
extern struct Result build_to_path(char* filepath, char* baseUrl, char* importMap, char* envVars, char* appRoot, char* gemPath, unsigned int env, GoUint8 codeSplitting, char* engines, GoUint8 debug);
|
116
|
+
|
117
|
+
// Resolve the given `path` relative to the `root`.
|
118
|
+
//
|
119
|
+
// ResolveOptions
|
120
|
+
// - path - The path to build relative to `root`.
|
121
|
+
// - importMap - Path to the import map relative to `root`.
|
122
|
+
// Config
|
123
|
+
// - root - The working directory.
|
124
|
+
// - env - The environment (1 = development, 2 = test, 3 = production)
|
125
|
+
// - debug?
|
126
|
+
//
|
127
|
+
extern struct Result resolve(char* path, char* importMap, char* appRoot, char* gemPath, unsigned int env, GoUint8 debug);
|
128
|
+
|
129
|
+
#ifdef __cplusplus
|
130
|
+
}
|
131
|
+
#endif
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Proscenium
|
4
|
+
module Helper
|
5
|
+
def sideload_assets(value)
|
6
|
+
if value.nil?
|
7
|
+
@current_template.instance_variable_defined?(:@sideload_assets_options) &&
|
8
|
+
@current_template.remove_instance_variable(:@sideload_assets_options)
|
9
|
+
else
|
10
|
+
@current_template.instance_variable_set :@sideload_assets_options, value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Overriden to allow regular use of javascript_include_tag and stylesheet_link_tag, while still
|
15
|
+
# building with Proscenium. It's important to note that `include_assets` will not call this, as
|
16
|
+
# those asset paths all begin with a slash, which the Rails asset helpers do not pass through to
|
17
|
+
# here.
|
18
|
+
def compute_asset_path(path, options = {})
|
19
|
+
if %i[javascript stylesheet].include?(options[:type])
|
20
|
+
result = Proscenium::Builder.build_to_path(path, base_url: request.base_url)
|
21
|
+
return result.split('::').last.delete_prefix 'public'
|
22
|
+
end
|
23
|
+
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
# Accepts one or more CSS class names, and transforms them into CSS module names.
|
28
|
+
#
|
29
|
+
# @see CssModule::Transformer#class_names
|
30
|
+
# @param name [String,Symbol,Array<String,Symbol>]
|
31
|
+
# @param path [Pathname] the path to the CSS module file to use for the transformation.
|
32
|
+
# @return [String] the transformed CSS module names concatenated as a string.
|
33
|
+
def css_module(*names, path: nil)
|
34
|
+
path ||= Pathname.new(@lookup_context.find(@virtual_path).identifier).sub_ext('')
|
35
|
+
CssModule::Transformer.new(path).class_names(*names, require_prefix: false)
|
36
|
+
.map { |name, _| name }.join(' ')
|
37
|
+
end
|
38
|
+
|
39
|
+
# @param name [String,Symbol,Array<String,Symbol>]
|
40
|
+
# @param path [Pathname] the path to the CSS file to use for the transformation.
|
41
|
+
# @return [String] the transformed CSS module names concatenated as a string.
|
42
|
+
def class_names(*names, path: nil)
|
43
|
+
names = names.flatten.compact
|
44
|
+
|
45
|
+
return if names.empty?
|
46
|
+
|
47
|
+
path ||= Pathname.new(@lookup_context.find(@virtual_path).identifier).sub_ext('')
|
48
|
+
CssModule::Transformer.new(path).class_names(*names).map { |name, _| name }.join(' ')
|
49
|
+
end
|
50
|
+
|
51
|
+
def include_assets
|
52
|
+
include_stylesheets + include_javascripts
|
53
|
+
end
|
54
|
+
|
55
|
+
def include_stylesheets
|
56
|
+
'<!-- [PROSCENIUM_STYLESHEETS] -->'.html_safe
|
57
|
+
end
|
58
|
+
alias side_load_stylesheets include_stylesheets
|
59
|
+
deprecate side_load_stylesheets: 'Use `include_stylesheets` instead', deprecator: Deprecator.new
|
60
|
+
|
61
|
+
# Includes all javascripts that have been imported and side loaded.
|
62
|
+
#
|
63
|
+
# @return [String] the HTML tags for the javascripts.
|
64
|
+
def include_javascripts
|
65
|
+
'<!-- [PROSCENIUM_LAZY_SCRIPTS] --><!-- [PROSCENIUM_JAVASCRIPTS] -->'.html_safe
|
66
|
+
end
|
67
|
+
alias side_load_javascripts include_javascripts
|
68
|
+
deprecate side_load_javascripts: 'Use `include_javascripts` instead', deprecator: Deprecator.new
|
69
|
+
end
|
70
|
+
end
|