bridgetown-core 1.0.0.alpha3 → 1.0.0.alpha7

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 (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"