Module: Shakapacker
- Extended by:
- Shakapacker
- Included in:
- Shakapacker
- Defined in:
- lib/shakapacker.rb,
lib/shakapacker/doctor.rb,
lib/shakapacker/runner.rb,
lib/shakapacker/version.rb,
lib/shakapacker/utils/misc.rb,
lib/shakapacker/install/env.rb,
lib/shakapacker/swc_migrator.rb,
lib/shakapacker/base_strategy.rb,
lib/shakapacker/rspack_runner.rb,
lib/shakapacker/utils/manager.rb,
lib/shakapacker/mtime_strategy.rb,
lib/shakapacker/webpack_runner.rb,
lib/shakapacker/digest_strategy.rb,
lib/shakapacker/version_checker.rb,
lib/shakapacker/bundler_switcher.rb,
lib/shakapacker/compiler_strategy.rb,
lib/shakapacker/dev_server_runner.rb,
lib/shakapacker/deprecation_helper.rb,
lib/shakapacker/build_config_loader.rb,
lib/shakapacker/utils/version_syntax_converter.rb,
sig/shakapacker.rbs,
sig/shakapacker/helper.rbs,
sig/shakapacker/version.rbs,
sig/shakapacker/compiler_strategy.rbs
Overview
Compiler strategy for determining staleness
Defined Under Namespace
Modules: Helper, Install, Utils Classes: BaseStrategy, BuildConfigLoader, BundlerSwitcher, Commands, Compiler, CompilerStrategy, Configuration, DevServer, DevServerProxy, DevServerRunner, DigestStrategy, Doctor, Engine, Env, Instance, Manifest, MtimeStrategy, RspackRunner, Runner, SwcMigrator, VersionChecker, WebpackRunner
Constant Summary collapse
- DEFAULT_ENV =
Default environment when RAILS_ENV is not set
"development".freeze
- DEV_ENVS =
Environments that use "development" for NODE_ENV All other environments (production, staging, etc.) use "production" for webpack optimizations Note: Both development and test RAILS_ENV use NODE_ENV=development because webpack/rspack only recognize "development" and "production" values for NODE_ENV. Using "test" causes DefinePlugin conflicts with optimization.nodeEnv.
%w[development test].freeze
- VERSION =
The current version of Shakapacker
"10.3.1".freeze
- SHELL =
Thor::Shell::Color.new
- DEV_TEST_ENVS =
Environments that use their RAILS_ENV value for NODE_ENV
Class Method Summary collapse
-
.bootstrap ⇒ void
Creates the default configuration files and directory structure.
-
.clean ⇒ Boolean
Removes old compiled packs, keeping the most recent versions.
-
.clobber ⇒ void
Removes all compiled packs.
-
.commands ⇒ Commands
Returns the commands instance for build operations.
-
.compile ⇒ Boolean
Compiles all webpack/rspack packs.
-
.compiler ⇒ Compiler
Returns the compiler instance for compiling assets.
-
.config ⇒ Configuration
Returns the Shakapacker configuration object.
-
.dev_server ⇒ DevServer
Returns the dev server instance for querying server status.
-
.ensure_log_goes_to_stdout ⇒ void
Temporarily redirects Shakapacker logging to STDOUT.
-
.ensure_node_env! ⇒ String
Sets NODE_ENV based on RAILS_ENV if not already set.
-
.env ⇒ ActiveSupport::StringInquirer
Returns the current Rails environment as an ActiveSupport::StringInquirer.
-
.inlining_css? ⇒ Boolean
Returns whether CSS inlining is enabled.
-
.instance ⇒ Instance
Returns the shared Shakapacker instance.
-
.instance= ⇒ Instance
Sets the shared Shakapacker instance.
-
.logger ⇒ ActiveSupport::TaggedLogging
Returns the logger instance used by Shakapacker.
-
.logger= ⇒ ActiveSupport::TaggedLogging
Sets the logger instance used by Shakapacker.
-
.manifest ⇒ Manifest
Returns the manifest instance for looking up compiled assets.
-
.with_node_env ⇒ void
Temporarily overrides NODE_ENV for the duration of the block.
Instance Method Summary collapse
-
#append_javascript_pack_tag ⇒ nil
Appends javascript pack names to the queue.
-
#append_stylesheet_pack_tag ⇒ nil
Appends stylesheet pack names to the queue.
-
#asset_pack_path ⇒ String
Computes the relative path for a given Shakapacker asset.
-
#asset_pack_url ⇒ String
Computes the absolute path for a given Shakapacker asset.
- #available_sources_from_manifest_entrypoints ⇒ Array[String]
-
#bootstrap ⇒ void
Creates the default configuration files and directory structure.
- #build_link_header ⇒ String
-
#clean(count = nil, age = nil) ⇒ void
Removes old compiled packs, keeping the most recent versions.
-
#clobber ⇒ void
Removes all compiled packs.
-
#commands ⇒ Shakapacker::Commands
Returns the commands instance for build operations.
-
#compile ⇒ Boolean
Compiles all webpack/rspack packs.
-
#compiler ⇒ Shakapacker::Compiler
Returns the compiler instance for compiling assets.
-
#config ⇒ Shakapacker::Configuration
Returns the Shakapacker configuration object.
-
#current_shakapacker_instance ⇒ Instance
Returns the current Shakapacker instance.
-
#dev_server ⇒ Shakapacker::DevServer
Returns the dev server instance for querying server status.
- #early_hints_debug_enabled? ⇒ Boolean
- #early_hints_enabled? ⇒ Boolean
- #early_hints_skip_reason ⇒ String
- #early_hints_store ⇒ Hash[String, untyped]
- #early_hints_supported? ⇒ Boolean
-
#ensure_log_goes_to_stdout { ... } ⇒ Object
Temporarily redirects Shakapacker logging to STDOUT.
-
#ensure_node_env! ⇒ String
private
Sets NODE_ENV based on RAILS_ENV if not already set.
-
#env ⇒ ActiveSupport::StringInquirer
Returns the current Rails environment as an ActiveSupport::StringInquirer.
-
#favicon_pack_tag ⇒ ActiveSupport::SafeBuffer
Creates a link tag for a favicon that references the named pack file.
- #flush_early_hints ⇒ void
-
#image_pack_path ⇒ String
Computes the relative path for a given Shakapacker image.
-
#image_pack_tag ⇒ ActiveSupport::SafeBuffer
Creates an image tag that references the named pack file.
-
#image_pack_url ⇒ String
Computes the absolute path for a given Shakapacker image.
-
#inlining_css? ⇒ Boolean
Returns whether CSS inlining is enabled.
-
#instance ⇒ Shakapacker::Instance
Returns the shared Shakapacker instance.
-
#instance=(instance) ⇒ Shakapacker::Instance
Sets the shared Shakapacker instance.
-
#javascript_pack_tag ⇒ Object
Creates script tags that reference the js chunks from entrypoints.
- #javascript_pack_tag_queue ⇒ Hash[Symbol, Array[String]]
-
#logger ⇒ Logger
Returns the logger instance used by Shakapacker.
-
#logger=(logger) ⇒ Logger
Sets the logger instance used by Shakapacker.
- #lookup_integrity ⇒ String?
- #lookup_source ⇒ String
-
#manifest ⇒ Shakapacker::Manifest
Returns the manifest instance for looking up compiled assets.
- #normalize_hint_value ⇒ String
- #normalize_pack_hints ⇒ Hash[String, String]
-
#preload_pack_asset ⇒ ActiveSupport::SafeBuffer
Creates a link tag for preloading that references a given Shakapacker asset.
-
#prepend_javascript_pack_tag ⇒ nil
Prepends javascript pack names to the queue.
- #puts_deprecation_message(message) ⇒ Object
- #render_tags ⇒ nil
- #resolve_early_hints_value ⇒ String
- #resolve_path_to_image ⇒ String
- #send_early_hints_internal ⇒ void
- #send_javascript_early_hints_internal ⇒ void
-
#send_pack_early_hints ⇒ nil
Sends HTTP 103 Early Hints for specified packs.
- #send_stylesheet_early_hints_internal ⇒ void
- #sources_from_manifest_entrypoints ⇒ Array[String]
-
#stylesheet_pack_tag ⇒ Object
Creates link tags that reference the css chunks from entrypoints.
- #update_javascript_pack_tag_queue {|arg0| ... } ⇒ nil
-
#with_node_env(env) { ... } ⇒ Object
Temporarily overrides NODE_ENV for the duration of the block.
Class Method Details
.bootstrap ⇒ void
This method returns an undefined value.
Creates the default configuration files and directory structure
56 |
# File 'sig/shakapacker.rbs', line 56
def self.bootstrap: () -> void
|
.clean ⇒ Boolean
Removes old compiled packs, keeping the most recent versions
59 |
# File 'sig/shakapacker.rbs', line 59
def self.clean: (?Integer, ?Integer) -> bool
|
.clobber ⇒ void
This method returns an undefined value.
Removes all compiled packs
62 |
# File 'sig/shakapacker.rbs', line 62
def self.clobber: () -> void
|
.commands ⇒ Commands
Returns the commands instance for build operations
50 |
# File 'sig/shakapacker.rbs', line 50
def self.commands: () -> Commands
|
.compile ⇒ Boolean
Compiles all webpack/rspack packs
65 |
# File 'sig/shakapacker.rbs', line 65
def self.compile: () -> bool
|
.compiler ⇒ Compiler
Returns the compiler instance for compiling assets
44 |
# File 'sig/shakapacker.rbs', line 44
def self.compiler: () -> Compiler
|
.config ⇒ Configuration
Returns the Shakapacker configuration object
41 |
# File 'sig/shakapacker.rbs', line 41
def self.config: () -> Configuration
|
.dev_server ⇒ DevServer
Returns the dev server instance for querying server status
53 |
# File 'sig/shakapacker.rbs', line 53
def self.dev_server: () -> DevServer
|
.ensure_log_goes_to_stdout ⇒ void
This method returns an undefined value.
Temporarily redirects Shakapacker logging to STDOUT
26 |
# File 'sig/shakapacker.rbs', line 26
def self.ensure_log_goes_to_stdout: [T] () { () -> T } -> T
|
.ensure_node_env! ⇒ String
Sets NODE_ENV based on RAILS_ENV if not already set
23 |
# File 'sig/shakapacker.rbs', line 23
def self.ensure_node_env!: () -> String
|
.env ⇒ ActiveSupport::StringInquirer
Returns the current Rails environment as an ActiveSupport::StringInquirer
35 |
# File 'sig/shakapacker.rbs', line 35
def self.env: () -> ActiveSupport::StringInquirer
|
.inlining_css? ⇒ Boolean
Returns whether CSS inlining is enabled
38 |
# File 'sig/shakapacker.rbs', line 38
def self.inlining_css?: () -> bool
|
.instance ⇒ Instance
Returns the shared Shakapacker instance
14 |
# File 'sig/shakapacker.rbs', line 14
def self.instance: () -> Instance
|
.instance= ⇒ Instance
Sets the shared Shakapacker instance
17 |
# File 'sig/shakapacker.rbs', line 17
def self.instance=: (Instance instance) -> Instance
|
.logger ⇒ ActiveSupport::TaggedLogging
Returns the logger instance used by Shakapacker
29 |
# File 'sig/shakapacker.rbs', line 29
def self.logger: () -> ActiveSupport::TaggedLogging
|
.logger= ⇒ ActiveSupport::TaggedLogging
Sets the logger instance used by Shakapacker
32 |
# File 'sig/shakapacker.rbs', line 32
def self.logger=: (ActiveSupport::TaggedLogging logger) -> ActiveSupport::TaggedLogging
|
.manifest ⇒ Manifest
Returns the manifest instance for looking up compiled assets
47 |
# File 'sig/shakapacker.rbs', line 47
def self.manifest: () -> Manifest
|
.with_node_env ⇒ void
This method returns an undefined value.
Temporarily overrides NODE_ENV for the duration of the block
20 |
# File 'sig/shakapacker.rbs', line 20
def self.with_node_env: [T] (String env) { () -> T } -> T
|
Instance Method Details
#append_javascript_pack_tag ⇒ nil
Appends javascript pack names to the queue
50 |
# File 'sig/shakapacker/helper.rbs', line 50
def append_javascript_pack_tag: (*String names, ?defer: bool, ?async: bool) -> nil
|
#append_stylesheet_pack_tag ⇒ nil
Appends stylesheet pack names to the queue
47 |
# File 'sig/shakapacker/helper.rbs', line 47
def append_stylesheet_pack_tag: (*String names) -> nil
|
#asset_pack_path ⇒ String
Computes the relative path for a given Shakapacker asset
7 |
# File 'sig/shakapacker/helper.rbs', line 7
def asset_pack_path: (String name, **untyped options) -> String
|
#asset_pack_url ⇒ String
Computes the absolute path for a given Shakapacker asset
10 |
# File 'sig/shakapacker/helper.rbs', line 10
def asset_pack_url: (String name, **untyped options) -> String
|
#available_sources_from_manifest_entrypoints ⇒ Array[String]
63 |
# File 'sig/shakapacker/helper.rbs', line 63
def available_sources_from_manifest_entrypoints: (Array[String | Symbol] names, type: Symbol) -> Array[String]
|
#bootstrap ⇒ void
This method returns an undefined value.
Creates the default configuration files and directory structure
194 |
# File 'lib/shakapacker.rb', line 194 delegate :bootstrap, :clean, :clobber, :compile, to: :commands |
#build_link_header ⇒ String
87 |
# File 'sig/shakapacker/helper.rbs', line 87
def build_link_header: (String source_path, String | Hash[String, untyped] source, as: String, ?rel: String) -> String
|
#clean(count = nil, age = nil) ⇒ void
This method returns an undefined value.
Removes old compiled packs, keeping the most recent versions
194 |
# File 'lib/shakapacker.rb', line 194 delegate :bootstrap, :clean, :clobber, :compile, to: :commands |
#clobber ⇒ void
This method returns an undefined value.
Removes all compiled packs
194 |
# File 'lib/shakapacker.rb', line 194 delegate :bootstrap, :clean, :clobber, :compile, to: :commands |
#commands ⇒ Shakapacker::Commands
Returns the commands instance for build operations
174 |
# File 'lib/shakapacker.rb', line 174 delegate :config, :compiler, :manifest, :commands, :dev_server, to: :instance |
#compile ⇒ Boolean
Compiles all webpack/rspack packs
194 |
# File 'lib/shakapacker.rb', line 194 delegate :bootstrap, :clean, :clobber, :compile, to: :commands |
#compiler ⇒ Shakapacker::Compiler
Returns the compiler instance for compiling assets
174 |
# File 'lib/shakapacker.rb', line 174 delegate :config, :compiler, :manifest, :commands, :dev_server, to: :instance |
#config ⇒ Shakapacker::Configuration
Returns the Shakapacker configuration object
174 |
# File 'lib/shakapacker.rb', line 174 delegate :config, :compiler, :manifest, :commands, :dev_server, to: :instance |
#current_shakapacker_instance ⇒ Instance
Returns the current Shakapacker instance
4 |
# File 'sig/shakapacker/helper.rbs', line 4
def current_shakapacker_instance: () -> Instance
|
#dev_server ⇒ Shakapacker::DevServer
Returns the dev server instance for querying server status
174 |
# File 'lib/shakapacker.rb', line 174 delegate :config, :compiler, :manifest, :commands, :dev_server, to: :instance |
#early_hints_debug_enabled? ⇒ Boolean
77 |
# File 'sig/shakapacker/helper.rbs', line 77
def early_hints_debug_enabled?: () -> bool
|
#early_hints_enabled? ⇒ Boolean
75 |
# File 'sig/shakapacker/helper.rbs', line 75
def early_hints_enabled?: () -> bool
|
#early_hints_skip_reason ⇒ String
85 |
# File 'sig/shakapacker/helper.rbs', line 85
def early_hints_skip_reason: () -> String
|
#early_hints_store ⇒ Hash[String, untyped]
89 |
# File 'sig/shakapacker/helper.rbs', line 89
def early_hints_store: () -> Hash[String, untyped]
|
#early_hints_supported? ⇒ Boolean
73 |
# File 'sig/shakapacker/helper.rbs', line 73
def early_hints_supported?: () -> bool
|
#ensure_log_goes_to_stdout { ... } ⇒ Object
Temporarily redirects Shakapacker logging to STDOUT
This is useful for debugging or when you want to see compilation output in the console instead of the Rails log.
127 128 129 130 131 132 133 |
# File 'lib/shakapacker.rb', line 127 def ensure_log_goes_to_stdout old_logger = Shakapacker.logger Shakapacker.logger = Logger.new(STDOUT) yield ensure Shakapacker.logger = old_logger end |
#ensure_node_env! ⇒ String
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Sets NODE_ENV based on RAILS_ENV if not already set
Environment mapping:
developmentandtestenvironments use "development" for NODE_ENV- All other environments (+production+,
staging, etc.) use "production" for webpack optimizations
Note: We always use "development" (not "test") for test environments because webpack/rspack only recognize "development" and "production" as valid NODE_ENV values. Using "test" causes DefinePlugin conflicts with optimization.nodeEnv.
This method is typically called automatically during Rails initialization.
111 112 113 |
# File 'lib/shakapacker.rb', line 111 def ensure_node_env! ENV["NODE_ENV"] ||= DEV_ENVS.include?(ENV["RAILS_ENV"]) ? "development" : "production" end |
#env ⇒ ActiveSupport::StringInquirer
Returns the current Rails environment as an ActiveSupport::StringInquirer
152 |
# File 'lib/shakapacker.rb', line 152 delegate :logger, :logger=, :env, :inlining_css?, to: :instance |
#favicon_pack_tag ⇒ ActiveSupport::SafeBuffer
Creates a link tag for a favicon that references the named pack file
22 |
# File 'sig/shakapacker/helper.rbs', line 22
def favicon_pack_tag: (String name, **untyped options) -> ActiveSupport::SafeBuffer
|
#flush_early_hints ⇒ void
This method returns an undefined value.
93 |
# File 'sig/shakapacker/helper.rbs', line 93
def flush_early_hints: () -> void
|
#image_pack_path ⇒ String
Computes the relative path for a given Shakapacker image
13 |
# File 'sig/shakapacker/helper.rbs', line 13
def image_pack_path: (String name, **untyped options) -> String
|
#image_pack_tag ⇒ ActiveSupport::SafeBuffer
Creates an image tag that references the named pack file
19 |
# File 'sig/shakapacker/helper.rbs', line 19
def image_pack_tag: (String name, **untyped options) -> ActiveSupport::SafeBuffer
|
#image_pack_url ⇒ String
Computes the absolute path for a given Shakapacker image
16 |
# File 'sig/shakapacker/helper.rbs', line 16
def image_pack_url: (String name, **untyped options) -> String
|
#inlining_css? ⇒ Boolean
Returns whether CSS inlining is enabled
152 |
# File 'lib/shakapacker.rb', line 152 delegate :logger, :logger=, :env, :inlining_css?, to: :instance |
#instance ⇒ Shakapacker::Instance
Returns the shared Shakapacker instance
This instance is used by all module-level delegate methods. It provides access to configuration, compilation, manifest lookup, and more.
71 72 73 |
# File 'lib/shakapacker.rb', line 71 def instance @instance ||= Shakapacker::Instance.new end |
#instance=(instance) ⇒ Shakapacker::Instance
Sets the shared Shakapacker instance
This is primarily used for testing or advanced customization scenarios. In most applications, the default instance is sufficient.
60 61 62 |
# File 'lib/shakapacker.rb', line 60 def instance=(instance) @instance = instance end |
#javascript_pack_tag ⇒ Object
Creates script tags that reference the js chunks from entrypoints
25 |
# File 'sig/shakapacker/helper.rbs', line 25
def javascript_pack_tag: (
|
#javascript_pack_tag_queue ⇒ Hash[Symbol, Array[String]]
59 |
# File 'sig/shakapacker/helper.rbs', line 59
def javascript_pack_tag_queue: () -> Hash[Symbol, Array[String]]
|
#logger ⇒ Logger
Returns the logger instance used by Shakapacker
152 |
# File 'lib/shakapacker.rb', line 152 delegate :logger, :logger=, :env, :inlining_css?, to: :instance |
#logger=(logger) ⇒ Logger
Sets the logger instance used by Shakapacker
152 |
# File 'lib/shakapacker.rb', line 152 delegate :logger, :logger=, :env, :inlining_css?, to: :instance |
#lookup_integrity ⇒ String?
67 |
# File 'sig/shakapacker/helper.rbs', line 67
def lookup_integrity: (String | Hash[String, untyped] source) -> String?
|
#lookup_source ⇒ String
69 |
# File 'sig/shakapacker/helper.rbs', line 69
def lookup_source: (String | Hash[String, untyped] source) -> String
|
#manifest ⇒ Shakapacker::Manifest
Returns the manifest instance for looking up compiled assets
174 |
# File 'lib/shakapacker.rb', line 174 delegate :config, :compiler, :manifest, :commands, :dev_server, to: :instance |
#normalize_hint_value ⇒ String
83 |
# File 'sig/shakapacker/helper.rbs', line 83
def normalize_hint_value: (String | bool | nil value) -> String
|
#normalize_pack_hints ⇒ Hash[String, String]
81 |
# File 'sig/shakapacker/helper.rbs', line 81
def normalize_pack_hints: (Array[String] packs, Hash[String | Symbol, String] | String | bool early_hints) -> Hash[String, String]
|
#preload_pack_asset ⇒ ActiveSupport::SafeBuffer
Creates a link tag for preloading that references a given Shakapacker asset
34 |
# File 'sig/shakapacker/helper.rbs', line 34
def preload_pack_asset: (String name, **untyped options) -> ActiveSupport::SafeBuffer
|
#prepend_javascript_pack_tag ⇒ nil
Prepends javascript pack names to the queue
53 |
# File 'sig/shakapacker/helper.rbs', line 53
def prepend_javascript_pack_tag: (*String names, ?defer: bool, ?async: bool) -> nil
|
#puts_deprecation_message(message) ⇒ Object
6 7 8 |
# File 'lib/shakapacker/deprecation_helper.rb', line 6 def () SHELL.say "\n#{}\n", :yellow end |
#render_tags ⇒ nil
71 |
# File 'sig/shakapacker/helper.rbs', line 71
def render_tags: (Array[String] sources, Symbol type, Hash[Symbol, untyped] options) -> nil
|
#resolve_early_hints_value ⇒ String
79 |
# File 'sig/shakapacker/helper.rbs', line 79
def resolve_early_hints_value: ((Hash[String | Symbol, String] | String | bool)? early_hints, Symbol asset_type) -> String
|
#resolve_path_to_image ⇒ String
65 |
# File 'sig/shakapacker/helper.rbs', line 65
def resolve_path_to_image: (String name, **untyped options) -> String
|
#send_early_hints_internal ⇒ void
This method returns an undefined value.
91 |
# File 'sig/shakapacker/helper.rbs', line 91
def send_early_hints_internal: (Hash[String, String] config, type: Symbol) -> void
|
#send_javascript_early_hints_internal ⇒ void
This method returns an undefined value.
95 |
# File 'sig/shakapacker/helper.rbs', line 95
def send_javascript_early_hints_internal: (Hash[String, String] config) -> void
|
#send_pack_early_hints ⇒ nil
Sends HTTP 103 Early Hints for specified packs
37 |
# File 'sig/shakapacker/helper.rbs', line 37
def send_pack_early_hints: (Hash[String | Symbol, Hash[String | Symbol, String | bool]] config) -> nil
|
#send_stylesheet_early_hints_internal ⇒ void
This method returns an undefined value.
97 |
# File 'sig/shakapacker/helper.rbs', line 97
def send_stylesheet_early_hints_internal: (Hash[String, String] config) -> void
|
#sources_from_manifest_entrypoints ⇒ Array[String]
61 |
# File 'sig/shakapacker/helper.rbs', line 61
def sources_from_manifest_entrypoints: (Array[String | Symbol] names, type: Symbol) -> Array[String]
|
#stylesheet_pack_tag ⇒ Object
Creates link tags that reference the css chunks from entrypoints
40 |
# File 'sig/shakapacker/helper.rbs', line 40
def stylesheet_pack_tag: (
|
#update_javascript_pack_tag_queue {|arg0| ... } ⇒ nil
57 |
# File 'sig/shakapacker/helper.rbs', line 57
def update_javascript_pack_tag_queue: (defer: bool, async: bool) { (Symbol) -> void } -> nil
|
#with_node_env(env) { ... } ⇒ Object
Temporarily overrides NODE_ENV for the duration of the block
This is useful when you need to perform operations with a specific NODE_ENV value without permanently changing the environment.
89 90 91 92 93 94 95 |
# File 'lib/shakapacker.rb', line 89 def with_node_env(env) original = ENV["NODE_ENV"] ENV["NODE_ENV"] = env yield ensure ENV["NODE_ENV"] = original end |