# frozen_string_literal: true module ShopifyCli module Resources class EnvFile include SmartProperties FILENAME = '.env' KEY_MAP = { 'SHOPIFY_API_KEY' => :api_key, 'SHOPIFY_API_SECRET' => :secret, 'SHOP' => :shop, 'SCOPES' => :scopes, 'HOST' => :host, } class << self def read(_directory = Dir.pwd) input = parse_external_env new(input) end def parse(directory) File.read(File.join(directory, FILENAME)) .gsub("\r\n", "\n").split("\n").each_with_object({}) do |line, output| match = /\A([A-Za-z_0-9]+)=(.*)\z/.match(line) if match key = match[1] output[key] = case match[2] # Remove single quotes when /\A'(.*)'\z/ then match[2] # Remove double quotes and unescape string preserving newline characters when /\A"(.*)"\z/ then match[2].gsub('\n', "\n").gsub(/\\(.)/, '\1') else match[2] end end output end end def parse_external_env(directory = Dir.pwd) env_details = {} extra = {} parse(directory).each do |key, value| if KEY_MAP[key] env_details[KEY_MAP[key]] = value else extra[key] = value end end env_details[:extra] = extra env_details end end property :api_key, required: true property :secret, required: true property :shop property :scopes property :host property :extra, default: {} def to_h out = {} KEY_MAP.each do |key, value| out[key] = send(value).to_s if send(value) end extra.each do |key, value| out[key] = value.to_s end out end def write(ctx) spin_group = CLI::UI::SpinGroup.new spin_group.add(ctx.message('core.env_file.saving_header', FILENAME)) do |spinner| output = [] KEY_MAP.each do |key, value| output << "#{key}=#{send(value)}" if send(value) end extra.each do |key, value| output << "#{key}=#{value}" end ctx.print_task(ctx.message('core.env_file.saving', FILENAME)) ctx.write(FILENAME, output.join("\n") + "\n") spinner.update_title(ctx.message('core.env_file.saved', FILENAME)) end spin_group.wait end def update(ctx, field, value) self[field] = value write(ctx) end end end end