Shopify / liquid

Liquid markup language. Safe, customer facing template language for flexible web apps.
https://shopify.github.io/liquid/
MIT License
11.13k stars 1.39k forks source link

Liquid::Template options are not propagated on new isolated subcontext #1853

Open narnd opened 4 days ago

narnd commented 4 days ago

Liquid::Context#new_isolated_subcontext should also set the render options strict_variables and strict_filters for the subcontext.

Maybe im missing something but I cant figure out how to raise undefined variable or undefined filter in partials using the render tag.

Please advise, happy to write a pr.

Example:

class PatchedContext < Liquid::Context
  def new_isolated_subcontext
    super.tap do |subcontext|
      subcontext.strict_variables = strict_variables
      subcontext.strict_filters = strict_filters
    end
  end
end

class FileSystem
  def read_template_file(_template_path)
    "{{ undefined_var }}{{ 'test' | undefined_filter }}"
  end
end

# normal example, no errors
liquid_context = Liquid::Context.build(registers: {file_system: FileSystem.new})
template = Liquid::Template.parse("{% render 'partial' %}")
template.render(liquid_context, strict_variables: true, strict_filters: true)
template.errors
# => []

# expected behavior, errors in partial
patched_context = PatchedContext.build(registers: {file_system: FileSystem.new})
template = Liquid::Template.parse("{% render 'partial' %}")
template.render(patched_context, strict_variables: true, strict_filters: true)
template.errors
# =>
# [#<Liquid::UndefinedVariable: Liquid error: undefined variable undefined_var>,
#  #<Liquid::UndefinedFilter: Liquid error: undefined filter undefined_filter>]