bridgetown-core 1.0.0.alpha3 → 1.0.0.alpha7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/bridgetown-core.gemspec +1 -2
  3. data/lib/bridgetown-core/cache.rb +1 -1
  4. data/lib/bridgetown-core/collection.rb +1 -1
  5. data/lib/bridgetown-core/commands/configure.rb +7 -0
  6. data/lib/bridgetown-core/commands/new.rb +3 -2
  7. data/lib/bridgetown-core/commands/start.rb +10 -8
  8. data/lib/bridgetown-core/component.rb +2 -2
  9. data/lib/bridgetown-core/concerns/front_matter_importer.rb +1 -1
  10. data/lib/bridgetown-core/concerns/site/configurable.rb +6 -8
  11. data/lib/bridgetown-core/concerns/site/extensible.rb +2 -1
  12. data/lib/bridgetown-core/concerns/site/ssr.rb +38 -16
  13. data/lib/bridgetown-core/configuration.rb +77 -47
  14. data/lib/bridgetown-core/configurations/bt-postcss.rb +1 -3
  15. data/lib/bridgetown-core/configurations/cypress/cypress.json +4 -0
  16. data/lib/bridgetown-core/configurations/cypress/cypress_dir/fixtures/example.json +5 -0
  17. data/lib/bridgetown-core/configurations/cypress/cypress_dir/integration/navbar.spec.js +17 -0
  18. data/lib/bridgetown-core/configurations/cypress/cypress_dir/plugins/index.js +21 -0
  19. data/lib/bridgetown-core/configurations/cypress/cypress_dir/support/commands.js +25 -0
  20. data/lib/bridgetown-core/configurations/cypress/cypress_dir/support/index.js +20 -0
  21. data/lib/bridgetown-core/configurations/cypress/cypress_tasks +33 -0
  22. data/lib/bridgetown-core/configurations/cypress.rb +13 -0
  23. data/lib/bridgetown-core/configurations/minitesting.rb +19 -15
  24. data/lib/bridgetown-core/configurations/netlify/netlify.toml +2 -2
  25. data/lib/bridgetown-core/configurations/netlify.rb +2 -4
  26. data/lib/bridgetown-core/configurations/purgecss.rb +2 -2
  27. data/lib/bridgetown-core/configurations/render/render.yaml.erb +26 -0
  28. data/lib/bridgetown-core/configurations/render.rb +6 -0
  29. data/lib/bridgetown-core/configurations/tailwindcss.rb +3 -5
  30. data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +1 -1
  31. data/lib/bridgetown-core/core_ext/psych.rb +1 -5
  32. data/lib/bridgetown-core/frontmatter_defaults.rb +2 -2
  33. data/lib/bridgetown-core/liquid_renderer.rb +1 -1
  34. data/lib/bridgetown-core/model/base.rb +23 -26
  35. data/lib/bridgetown-core/model/builder_origin.rb +8 -6
  36. data/lib/bridgetown-core/model/origin.rb +10 -1
  37. data/lib/bridgetown-core/model/plugin_origin.rb +1 -1
  38. data/lib/bridgetown-core/plugin_manager.rb +7 -34
  39. data/lib/bridgetown-core/rack/boot.rb +54 -23
  40. data/lib/bridgetown-core/rack/roda.rb +2 -1
  41. data/lib/bridgetown-core/rack/routes.rb +2 -2
  42. data/lib/bridgetown-core/readers/layout_reader.rb +1 -1
  43. data/lib/bridgetown-core/readers/plugin_content_reader.rb +1 -1
  44. data/lib/bridgetown-core/renderer.rb +2 -2
  45. data/lib/bridgetown-core/resource/base.rb +3 -3
  46. data/lib/bridgetown-core/resource/relations.rb +1 -1
  47. data/lib/bridgetown-core/resource/taxonomy_term.rb +2 -2
  48. data/lib/bridgetown-core/resource/taxonomy_type.rb +2 -2
  49. data/lib/bridgetown-core/ruby_template_view.rb +2 -2
  50. data/lib/bridgetown-core/site.rb +15 -5
  51. data/lib/bridgetown-core/tasks/bridgetown_tasks.rake +6 -0
  52. data/lib/bridgetown-core/utils/loaders_manager.rb +72 -0
  53. data/lib/bridgetown-core/utils.rb +13 -14
  54. data/lib/bridgetown-core/version.rb +1 -1
  55. data/lib/bridgetown-core/watcher.rb +16 -7
  56. data/lib/bridgetown-core/yaml_parser.rb +1 -5
  57. data/lib/site_template/README.md +1 -1
  58. data/lib/site_template/Rakefile +3 -3
  59. data/lib/site_template/src/_layouts/default.liquid +1 -1
  60. metadata +16 -6
  61. data/lib/bridgetown-core/tags/include.rb +0 -216
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c5f6a5f0fc27c9e3f7d45161e91317fd42e7dbeb789d8c38a103a610efb9d46
4
- data.tar.gz: 68431d8ead8cdb11107db03aa57ae3d4607d0809e60f3fd30d7045d58e1c67f0
3
+ metadata.gz: 7e8dceaa24615a3a0de23c469444c2d22b36ce1f2c171177a9d20646f7b31446
4
+ data.tar.gz: 10c6c7e5c3bfc2a1f591d8953d098dae8d0d90942bb1ad6ef7871834cf658434
5
5
  SHA512:
6
- metadata.gz: 57daec3a249941fc6303a22e470cd8fc8e1641be8527a6533c7c73527a93fc04321b774407865a07fb99df95566902d035cfdf84fd68f8aa6e440fac6860d266
7
- data.tar.gz: f42ce24666c948ad8616ef25cb36a766392279e216716a397d27308ae5b06acb58305887264f04c83faedf3ed6a68fcdbbf716e648935bb92de8c019997c1c03
6
+ metadata.gz: 254a0d29eca611c8642acf2f664ace0dc8de883cf38dd00f56597dfc273625460089743e5ebc8e81df231035a8a1365393a5e890c1c4b1447d94fba48e310a2f
7
+ data.tar.gz: 48c9518b97fc1e890d8b04b908a117296def616657831c7d0572e9e611a58d3381870f9257f17303db965fa40d47b2280b3e2b814f02652b0b374e6ab4ab0f0d
@@ -28,8 +28,7 @@ Gem::Specification.new do |s|
28
28
 
29
29
  s.rdoc_options = ["--charset=UTF-8"]
30
30
 
31
- s.required_ruby_version = ">= 2.5.0"
32
- s.required_rubygems_version = ">= 2.7.0"
31
+ s.required_ruby_version = ">= 2.7.0"
33
32
 
34
33
  s.add_runtime_dependency("activemodel", "~> 6.0")
35
34
  s.add_runtime_dependency("activesupport", "~> 6.0")
@@ -144,7 +144,7 @@ module Bridgetown
144
144
  @base_dir ||= File.join(Bridgetown::Cache.cache_dir, @name)
145
145
  return @base_dir if hash.nil?
146
146
 
147
- File.join(@base_dir, hash[0..1], hash[2..-1]).freeze
147
+ File.join(@base_dir, hash[0..1], hash[2..]).freeze
148
148
  end
149
149
 
150
150
  # Given a key, return a SHA2 hash that can be used for caching this item to disk.
@@ -234,7 +234,7 @@ module Bridgetown
234
234
  end
235
235
 
236
236
  resources.each do |data_resource|
237
- segments = data_resource.relative_path.each_filename.to_a[1..-1]
237
+ segments = data_resource.relative_path.each_filename.to_a[1..]
238
238
  nested = []
239
239
  segments.each_with_index do |segment, index|
240
240
  sanitized_segment = sanitize_filename.(File.basename(segment, ".*"))
@@ -41,6 +41,7 @@ module Bridgetown
41
41
  configuration_file = find_in_source_paths("#{configuration}.rb")
42
42
 
43
43
  inside(New.created_site_dir || Dir.pwd) do
44
+ @templates_dir = File.expand_path("../configurations/#{configuration}", __dir__)
44
45
  apply configuration_file, verbose: false
45
46
  end
46
47
  end
@@ -62,6 +63,12 @@ module Bridgetown
62
63
  return Dir.glob("*.rb").map { |file| file.sub(".rb", "") }
63
64
  end
64
65
  end
66
+
67
+ def in_templates_dir(*paths)
68
+ paths.reduce(@templates_dir) do |base, path|
69
+ Bridgetown.sanitized_path(base, path.to_s)
70
+ end
71
+ end
65
72
  end
66
73
  end
67
74
  end
@@ -138,7 +138,7 @@ module Bridgetown
138
138
 
139
139
  if @skipped_bundle
140
140
  logger.info "Bundle install skipped.".yellow
141
- logger.info "You will need to run #{"bundle binstub bridgetown-core".cyan} manually."
141
+ logger.info "You will need to run #{"bundle binstubs bridgetown-core".cyan} manually."
142
142
  end
143
143
 
144
144
  logger.info "Yarn install skipped.".yellow if @skipped_yarn
@@ -152,7 +152,8 @@ module Bridgetown
152
152
  Bridgetown.with_unbundled_env do
153
153
  inside(path) do
154
154
  run "bundle install", abort_on_failure: true
155
- run "bundle binstub bridgetown-core"
155
+ run "bundle binstubs bridgetown-core"
156
+ run "cp bin/bridgetown bin/bt"
156
157
  end
157
158
  end
158
159
  end
@@ -30,8 +30,10 @@ module Bridgetown
30
30
  Bridgetown::Commands::Build.print_startup_message
31
31
  sleep 0.25
32
32
 
33
- unless Bundler.definition.specs.find { |s| s.name == "puma" }
34
- raise "** No Rack-compatible server found **"
33
+ begin
34
+ require("puma/detect")
35
+ rescue LoadError
36
+ raise "** Puma server gem not found. Check your Gemfile and Bundler env? **"
35
37
  end
36
38
 
37
39
  options = Thor::CoreExt::HashWithIndifferentAccess.new(self.options)
@@ -40,6 +42,12 @@ module Bridgetown
40
42
  # Load Bridgetown configuration into thread memory
41
43
  bt_options = configuration_with_overrides(options)
42
44
 
45
+ if Bridgetown.env.development? && !options["url"]
46
+ scheme = bt_options.bind&.split("://")&.first == "ssl" ? "https" : "http"
47
+ port = bt_options.bind&.split(":")&.last || ENV["BRIDGETOWN_PORT"] || 4000
48
+ bt_options.url = "#{scheme}://localhost:#{port}"
49
+ end
50
+
43
51
  puma_pid =
44
52
  Process.fork do
45
53
  require "puma/cli"
@@ -83,12 +91,6 @@ module Bridgetown
83
91
  Process.setproctitle("bridgetown #{Bridgetown::VERSION} [#{File.basename(Dir.pwd)}]")
84
92
 
85
93
  build_args = ["-w"] + ARGV.reject { |arg| arg == "start" }
86
- if Bridgetown.env.development? && !options["url"]
87
- scheme = bt_options.bind&.split("://")&.first == "ssl" ? "https" : "http"
88
- port = bt_options.bind&.split(":")&.last || ENV["BRIDGETOWN_PORT"] || 4000
89
- build_args << "--url"
90
- build_args << "#{scheme}://localhost:#{port}"
91
- end
92
94
  Bridgetown::Commands::Build.start(build_args)
93
95
  rescue StandardError => e
94
96
  Process.kill "SIGINT", puma_pid
@@ -164,9 +164,9 @@ module Bridgetown
164
164
  end
165
165
  end
166
166
 
167
- ruby2_keywords def method_missing(method, *args, &block)
167
+ def method_missing(method, *args, **kwargs, &block)
168
168
  if helpers.respond_to?(method.to_sym)
169
- helpers.send method.to_sym, *args, &block
169
+ helpers.send method.to_sym, *args, **kwargs, &block
170
170
  else
171
171
  super
172
172
  end
@@ -32,7 +32,7 @@ module Bridgetown
32
32
  self.front_matter_line_count = ruby_content[1].lines.size
33
33
  process_ruby_data(ruby_content[1], file_path, 2)
34
34
  elsif Bridgetown::Utils.has_rbfm_header?(file_path)
35
- process_ruby_data(File.read(file_path).lines[1..-1].join("\n"), file_path, 2)
35
+ process_ruby_data(File.read(file_path).lines[1..].join("\n"), file_path, 2)
36
36
  elsif is_a?(Layout)
37
37
  self.content = file_contents
38
38
  {}
@@ -21,7 +21,6 @@ class Bridgetown::Site
21
21
 
22
22
  configure_cache
23
23
  configure_component_paths
24
- configure_include_paths
25
24
  configure_file_read_opts
26
25
 
27
26
  self.permalink_style = (config["permalink"] || "pretty").to_sym
@@ -156,10 +155,10 @@ class Bridgetown::Site
156
155
  Bridgetown::Cache.disable_disk_cache! if config["disable_disk_cache"]
157
156
  end
158
157
 
159
- def configure_component_paths
158
+ def configure_component_paths # rubocop:todo Metrics/AbcSize
160
159
  # Loop through plugins paths first
161
160
  plugin_components_load_paths = Bridgetown::PluginManager.source_manifests
162
- .map(&:components).compact
161
+ .filter_map(&:components)
163
162
 
164
163
  local_components_load_paths = config["components_dir"].yield_self do |dir|
165
164
  dir.is_a?(Array) ? dir : [dir]
@@ -173,11 +172,10 @@ class Bridgetown::Site
173
172
  end
174
173
  end
175
174
 
176
- @components_load_paths = plugin_components_load_paths + local_components_load_paths
177
- end
178
-
179
- def configure_include_paths
180
- @includes_load_paths = Array(in_source_dir(config["includes_dir"].to_s))
175
+ config.components_load_paths = plugin_components_load_paths + local_components_load_paths
176
+ # Because "first constant wins" in Zeitwerk, we need to load the local
177
+ # source components _before_ we load any from plugins
178
+ config.autoload_paths += config.components_load_paths.reverse
181
179
  end
182
180
 
183
181
  def configure_file_read_opts
@@ -3,13 +3,14 @@
3
3
  class Bridgetown::Site
4
4
  module Extensible
5
5
  # Load necessary libraries, plugins, converters, and generators.
6
+ # This is only ever run once for the lifecycle of the site object.
6
7
  # @see Converter
7
8
  # @see Generator
8
9
  # @see PluginManager
9
10
  # @return [void]
10
11
  def setup
11
12
  plugin_manager.require_plugin_files
12
- plugin_manager.setup_component_loaders
13
+ loaders_manager.setup_loaders
13
14
  self.converters = instantiate_subclasses(Bridgetown::Converter)
14
15
  self.generators = instantiate_subclasses(Bridgetown::Generator)
15
16
  end
@@ -8,29 +8,16 @@ class Bridgetown::Site
8
8
 
9
9
  module ClassMethods
10
10
  # Establish an SSR pipeline for a persistent backend process
11
- def start_ssr! # rubocop:todo Metrics/AbcSize
11
+ def start_ssr!(loaders_manager: nil, &block)
12
12
  if Bridgetown::Current.site
13
13
  raise Bridgetown::Errors::FatalException, "Bridgetown SSR already started! " \
14
14
  "Check your Rack app for threading issues"
15
15
  end
16
16
 
17
17
  Bridgetown::PluginManager.require_from_bundler
18
- site = new(Bridgetown::Current.preloaded_configuration)
18
+ site = new(Bridgetown::Current.preloaded_configuration, loaders_manager: loaders_manager)
19
19
  site.enable_ssr
20
-
21
- Bridgetown::Hooks.trigger :site, :pre_read, site
22
- site.defaults_reader.tap do |d|
23
- d.path_defaults.clear
24
- d.read
25
- end
26
- site.layouts = Bridgetown::LayoutReader.new(site).read
27
- site.collections.data.tap do |coll|
28
- coll.read
29
- site.data = coll.merge_data_resources
30
- end
31
- Bridgetown::Hooks.trigger :site, :post_read, site
32
-
33
- yield(site) if block_given? # provide additional setup hook
20
+ site.ssr_setup(&block)
34
21
 
35
22
  site
36
23
  end
@@ -45,6 +32,41 @@ class Bridgetown::Site
45
32
  @ssr_enabled = true
46
33
  end
47
34
 
35
+ def ssr_setup(&block) # rubocop:disable Metrics/AbcSize
36
+ config.serving = true
37
+ Bridgetown::Hooks.trigger :site, :pre_read, self
38
+ defaults_reader.tap do |d|
39
+ d.path_defaults.clear
40
+ d.read
41
+ end
42
+ reader.read_layouts
43
+ collections.data.tap do |coll|
44
+ coll.read
45
+ self.data = coll.merge_data_resources
46
+ end
47
+ Bridgetown::Hooks.trigger :site, :post_read, self
48
+
49
+ hook = block&.(self) # provide additional setup hook
50
+ return if Bridgetown.env.production?
51
+
52
+ @ssr_reload_hook = hook if hook.is_a?(Proc) && hook.lambda?
53
+ Bridgetown::Watcher.watch(self, config)
54
+ end
55
+
56
+ def ssr_reload
57
+ reset soft: true
58
+ reader.read_layouts
59
+
60
+ collections.data.tap do |coll|
61
+ coll.resources.clear
62
+ coll.read
63
+ coll.merge_data_resources.each do |k, v|
64
+ data[k] = v
65
+ end
66
+ end
67
+ @ssr_reload_hook.() if @ssr_reload_hook.is_a?(Proc)
68
+ end
69
+
48
70
  def disable_ssr
49
71
  Bridgetown.logger.info "SSR:", "now disabled."
50
72
  @ssr_enabled = false
@@ -11,65 +11,68 @@ module Bridgetown
11
11
  # Strings rather than symbols are used for compatibility with YAML.
12
12
  DEFAULTS = {
13
13
  # Where things are
14
- "root_dir" => Dir.pwd,
15
- "plugins_dir" => "plugins",
16
- "source" => File.join(Dir.pwd, "src"),
17
- "destination" => File.join(Dir.pwd, "output"),
18
- "collections_dir" => "",
19
- "cache_dir" => ".bridgetown-cache",
20
- "layouts_dir" => "_layouts",
21
- "data_dir" => "_data",
22
- "components_dir" => "_components",
23
- "includes_dir" => "_includes",
24
- "partials_dir" => "_partials",
25
- "collections" => {},
26
- "taxonomies" => {
14
+ "root_dir" => Dir.pwd,
15
+ "plugins_dir" => "plugins",
16
+ "source" => File.join(Dir.pwd, "src"),
17
+ "destination" => File.join(Dir.pwd, "output"),
18
+ "collections_dir" => "",
19
+ "cache_dir" => ".bridgetown-cache",
20
+ "layouts_dir" => "_layouts",
21
+ "data_dir" => "_data",
22
+ "components_dir" => "_components",
23
+ "partials_dir" => "_partials",
24
+ "collections" => {},
25
+ "taxonomies" => {
27
26
  category: { key: "categories", title: "Category" }, tag: { key: "tags", title: "Tag" },
28
27
  },
28
+ "autoload_paths" => [],
29
+ "eager_load_paths" => [],
30
+ "autoloader_collapsed_paths" => [],
31
+ "plugins_use_zeitwerk" => true,
29
32
 
30
33
  # Handling Reading
31
- "include" => [".htaccess", "_redirects", ".well-known"],
32
- "exclude" => [],
33
- "keep_files" => [".git", ".svn", "_bridgetown"],
34
- "encoding" => "utf-8",
35
- "markdown_ext" => "markdown,mkdown,mkdn,mkd,md",
36
- "strict_front_matter" => false,
37
- "slugify_mode" => "pretty",
34
+ "include" => [".htaccess", "_redirects", ".well-known"],
35
+ "exclude" => [],
36
+ "keep_files" => [".git", ".svn", "_bridgetown"],
37
+ "encoding" => "utf-8",
38
+ "markdown_ext" => "markdown,mkdown,mkdn,mkd,md",
39
+ "strict_front_matter" => false,
40
+ "slugify_mode" => "pretty",
38
41
 
39
42
  # Filtering Content
40
- "future" => false,
41
- "unpublished" => false,
42
- "ruby_in_front_matter" => true,
43
+ "future" => false,
44
+ "unpublished" => false,
45
+ "ruby_in_front_matter" => true,
43
46
 
44
47
  # Conversion
45
- "content_engine" => "resource",
46
- "markdown" => "kramdown",
47
- "highlighter" => "rouge",
48
- "excerpt_separator" => "\n\n",
48
+ "content_engine" => "resource",
49
+ "markdown" => "kramdown",
50
+ "highlighter" => "rouge",
51
+ "excerpt_separator" => "\n\n",
49
52
 
50
53
  # Serving
51
- "port" => "4000",
52
- "host" => "127.0.0.1",
53
- "base_path" => "/",
54
- "show_dir_listing" => false,
54
+ "port" => "4000",
55
+ "host" => "127.0.0.1",
56
+ "base_path" => "/",
57
+ "show_dir_listing" => false,
55
58
 
56
59
  # Output Configuration
57
- "available_locales" => [:en],
58
- "default_locale" => :en,
59
- "permalink" => nil, # default is set according to content engine
60
- "timezone" => nil, # use the local timezone
60
+ "available_locales" => [:en],
61
+ "default_locale" => :en,
62
+ "permalink" => nil, # default is set according to content engine
63
+ "timezone" => nil, # use the local timezone
61
64
 
62
- "quiet" => false,
63
- "verbose" => false,
64
- "defaults" => [],
65
+ "quiet" => false,
66
+ "verbose" => false,
67
+ "defaults" => [],
65
68
 
66
- "liquid" => {
69
+ "liquid" => {
67
70
  "error_mode" => "warn",
68
71
  "strict_filters" => false,
69
72
  "strict_variables" => false,
70
73
  },
71
74
 
72
- "kramdown" => {
75
+ "kramdown" => {
73
76
  "auto_ids" => true,
74
77
  "toc_levels" => (1..6).to_a,
75
78
  "entity_output" => "as_char",
@@ -99,6 +102,7 @@ module Bridgetown
99
102
  def from(user_config, starting_defaults = DEFAULTS)
100
103
  Utils.deep_merge_hashes(starting_defaults.deep_dup, Configuration[user_config])
101
104
  .merge_environment_specific_options!
105
+ .setup_load_paths!
102
106
  .setup_locales
103
107
  .add_default_collections
104
108
  .add_default_excludes
@@ -110,21 +114,21 @@ module Bridgetown
110
114
  override[config_key] || self[config_key] || DEFAULTS[config_key]
111
115
  end
112
116
 
113
- # Public: Directory of the top-level root where config files are located
117
+ # Directory of the top-level root where config files are located
114
118
  #
115
- # override - the command-line options hash
119
+ # @param override [Hash] options hash which will override value if key is present
116
120
  #
117
- # Returns the path to the Bridgetown root directory
118
- def root_dir(override = "")
121
+ # @return [String] path to the Bridgetown root directory
122
+ def root_dir(override = {})
119
123
  get_config_value_with_override("root_dir", override)
120
124
  end
121
125
 
122
126
  # Public: Directory of the Bridgetown source folder
123
127
  #
124
- # override - the command-line options hash
128
+ # @param override [Hash] options hash which will override value if key is present
125
129
  #
126
- # Returns the path to the Bridgetown source directory
127
- def source(override = "")
130
+ # @return [String] path to the Bridgetown source directory
131
+ def source(override = {})
128
132
  get_config_value_with_override("source", override)
129
133
  end
130
134
 
@@ -241,6 +245,32 @@ module Bridgetown
241
245
  self[k] = self[Bridgetown.environment][k]
242
246
  end
243
247
  delete(Bridgetown.environment)
248
+
249
+ self
250
+ end
251
+
252
+ def setup_load_paths!
253
+ if self[:plugins_use_zeitwerk]
254
+ autoload_paths.unshift({
255
+ path: self[:plugins_dir],
256
+ eager: true,
257
+ })
258
+ end
259
+
260
+ autoload_paths.map! do |load_path|
261
+ if load_path.is_a?(Hash)
262
+ expanded = File.expand_path(load_path[:path], root_dir)
263
+ self[:eager_load_paths] << expanded if load_path[:eager]
264
+ next expanded
265
+ end
266
+
267
+ File.expand_path(load_path, root_dir)
268
+ end
269
+
270
+ autoloader_collapsed_paths.map! do |collapsed_path|
271
+ File.expand_path(collapsed_path, root_dir)
272
+ end
273
+
244
274
  self
245
275
  end
246
276
 
@@ -2,8 +2,6 @@
2
2
 
3
3
  # rubocop:disable all
4
4
 
5
- TEMPLATE_PATH = File.expand_path("./bt-postcss", __dir__)
6
-
7
5
  unless File.exist?("postcss.config.js")
8
6
  error_message = "#{"postcss.config.js".bold} not found. Please configure postcss in your project."
9
7
 
@@ -21,6 +19,6 @@ plugins = %w(postcss-easy-import postcss-mixins postcss-color-function cssnano)
21
19
  say "Adding the following PostCSS plugins: #{plugins.join(' | ')}", :green
22
20
  run "yarn add -D #{plugins.join(' ')}"
23
21
 
24
- copy_file "#{TEMPLATE_PATH}/postcss.config.js", "postcss.config.js", force: true
22
+ copy_file in_templates_dir("postcss.config.js"), "postcss.config.js", force: true
25
23
 
26
24
  # rubocop:enable all
@@ -0,0 +1,4 @@
1
+ {
2
+ "baseUrl": "http://localhost:4000"
3
+ }
4
+
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "Using fixtures to represent data",
3
+ "email": "hello@cypress.io",
4
+ "body": "Fixtures are a great way to mock data for responses to routes"
5
+ }
@@ -0,0 +1,17 @@
1
+ describe("Testing that links exist in the navbar", () => {
2
+ beforeEach(() => {
3
+ cy.visit("/");
4
+ });
5
+ it("navbar links appear on all pages", () => {
6
+ const baseUrl = Cypress.config("baseUrl");
7
+
8
+ cy.get('[href="/"]').click();
9
+ cy.url().should("eq", baseUrl + "/");
10
+
11
+ cy.get('[href="/posts"]').click();
12
+ cy.url().should("eq", baseUrl + "/posts");
13
+
14
+ cy.get('[href="/about"]').click();
15
+ cy.url().should("eq", baseUrl + "/about");
16
+ });
17
+ });
@@ -0,0 +1,21 @@
1
+ /// <reference types="cypress" />
2
+ // ***********************************************************
3
+ // This example plugins/index.js can be used to load plugins
4
+ //
5
+ // You can change the location of this file or turn off loading
6
+ // the plugins file with the 'pluginsFile' configuration option.
7
+ //
8
+ // You can read more here:
9
+ // https://on.cypress.io/plugins-guide
10
+ // ***********************************************************
11
+
12
+ // This function is called when a project is opened or re-opened (e.g. due to
13
+ // the project's config changing)
14
+
15
+ /**
16
+ * @type {Cypress.PluginConfig}
17
+ */
18
+ module.exports = (on, config) => {
19
+ // `on` is used to hook into various events Cypress emits
20
+ // `config` is the resolved Cypress config
21
+ }
@@ -0,0 +1,25 @@
1
+ // ***********************************************
2
+ // This example commands.js shows you how to
3
+ // create various custom commands and overwrite
4
+ // existing commands.
5
+ //
6
+ // For more comprehensive examples of custom
7
+ // commands please read more here:
8
+ // https://on.cypress.io/custom-commands
9
+ // ***********************************************
10
+ //
11
+ //
12
+ // -- This is a parent command --
13
+ // Cypress.Commands.add("login", (email, password) => { ... })
14
+ //
15
+ //
16
+ // -- This is a child command --
17
+ // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
18
+ //
19
+ //
20
+ // -- This is a dual command --
21
+ // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
22
+ //
23
+ //
24
+ // -- This will overwrite an existing command --
25
+ // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
@@ -0,0 +1,20 @@
1
+ // ***********************************************************
2
+ // This example support/index.js is processed and
3
+ // loaded automatically before your test files.
4
+ //
5
+ // This is a great place to put global configuration and
6
+ // behavior that modifies Cypress.
7
+ //
8
+ // You can change the location of this file or turn off
9
+ // automatically serving support files with the
10
+ // 'supportFile' configuration option.
11
+ //
12
+ // You can read more here:
13
+ // https://on.cypress.io/configuration
14
+ // ***********************************************************
15
+
16
+ // Import commands.js using ES2015 syntax:
17
+ import './commands'
18
+
19
+ // Alternatively you can use CommonJS syntax:
20
+ // require('./commands')
@@ -0,0 +1,33 @@
1
+ namespace :cy do
2
+ desc "Open Cypress test runner"
3
+ task :open do
4
+ system "yarn run cypress open"
5
+ end
6
+
7
+ desc "Run Cypress tests headless"
8
+ task :run do
9
+ system "yarn run cypress run"
10
+ end
11
+
12
+ desc "Start server and open Cypress test runner"
13
+ task :test do
14
+ ENV["BRIDGETOWN_ENV"] = "test"
15
+ server_pid = fork { Bridgetown::Commands::Start.start }
16
+ Rake::Task["cy:open"].execute
17
+ Process.kill "SIGTERM", server_pid
18
+ sleep 1 # give processes time to clean up
19
+ puts
20
+ end
21
+
22
+ namespace :test do
23
+ desc "Start server and run Cypress tests headless"
24
+ task :ci do
25
+ ENV["BRIDGETOWN_ENV"] = "test"
26
+ server_pid = fork { Bridgetown::Commands::Start.start }
27
+ Rake::Task["cy:run"].execute
28
+ Process.kill "SIGTERM", server_pid
29
+ sleep 1 # give processes time to clean up
30
+ puts
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Install packages
4
+
5
+ say "Installing Cypress...", :green
6
+ run "yarn add -D cypress"
7
+
8
+ # Copy cypress files and tasks into place
9
+ cypress_tasks = File.read(in_templates_dir("cypress_tasks"))
10
+
11
+ copy_file in_templates_dir("cypress.json"), "cypress.json"
12
+ inject_into_file("Rakefile", "\n#{cypress_tasks}")
13
+ directory in_templates_dir("cypress_dir"), "cypress"