# frozen_string_literal: true require 'generators/ember/generator_helpers' module Ember module Generators class BootstrapGenerator < ::Rails::Generators::Base include Ember::Generators::GeneratorHelpers source_root File.expand_path('../templates', __dir__) desc 'Creates a default Ember.js folder layout in app/assets/javascripts' class_option :ember_path, type: :string, aliases: '-d', desc: 'Custom ember app path' class_option :skip_git, type: :boolean, aliases: '-g', default: false, desc: 'Skip Git keeps' class_option :javascript_engine, desc: 'Engine for JavaScripts (js for JavaScript, coffee for CoffeeScript, etc)' class_option :app_name, type: :string, aliases: '-n', desc: 'Custom ember app name' def inject_ember if javascript_engine == 'es6' inject_into_application_file('es6') # Don't use `.module.es6`. else inject_into_application_file(engine_extension) end rescue Exception inject_into_application_file('js') end def create_dir_layout ember_prefix_dirs.each do |dir| empty_directory "#{ember_path}/#{dir}" create_file "#{ember_path}/#{dir}/.gitkeep" unless options[:skip_git] end end def create_app_file template "app.#{engine_extension}", "#{ember_path}/#{application_name.underscore.dasherize}.#{engine_extension}" end def create_router_file template "router.#{engine_extension}", "#{ember_path}/router.#{engine_extension}" end def create_adapter_file template "application_adapter.#{engine_extension}", "#{ember_path}/adapters/application.#{engine_extension}" end def create_env_file template "environment.#{engine_extension}", "#{ember_path}/environment.#{engine_extension}" end private def inject_into_application_file(safe_extension) application_file = "application.#{safe_extension}" full_path = Pathname.new(destination_root).join(ember_path, application_file) if full_path.exist? injection_options = get_options_from_contents(full_path.read) inject_into_file(full_path.to_s, injection_options) do context = instance_eval('binding', __FILE__, __LINE__) source = File.expand_path(find_in_source_paths(application_file)) ERB.new(::File.binread(source), trim_mode: '-', eoutvar: '@output_buffer').result(context) end else template application_file, full_path end end def get_options_from_contents(contents) regex = /^.*require_tree.*$/ return { before: regex } if contents =~ regex regex = /^\s*$/ return { before: regex } if contents =~ regex regex = /\z/ { after: regex } end def ember_prefix_dirs dirs = if configuration Array(configuration.prefix_dirs) else %w[models controllers views routes components helpers mixins serializers adapters transforms] end dirs + %w[templates templates/components] end end end end