embedded_js 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d602e1be0a18713a73864169b04f97bb63b7a270b5daf38f42f78ba263e50e51
4
+ data.tar.gz: fe41d9e37a3d6cbec78e79611b7824cc4af69b9bfdaec47f3f9f76976de876c4
5
+ SHA512:
6
+ metadata.gz: 401906b148300ce29681569c042f587cf4fa49b40d968cc79dbb05d35846d4158c22494963b2398732918987917b7e6c10fcee5a1ece3dd12cfc26f491836e85
7
+ data.tar.gz: fb6adc8d3deb68f3567313909aa144e4cb6cd6c348d63d57099eb7d62dda114e0734d9f838f75808e6e65c9533d35c100dee9c4c15fda294a667c6d37ff62200
data/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # EmbeddedJs
2
+
3
+ `EmbeddedJs` is a gem to support including JavaScript packages in your Rails Engines.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'embedded_js'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle install
16
+
17
+ Finally, run the generator:
18
+
19
+ $ rails generate embedded_js:install
20
+
21
+ ## Usage
22
+
23
+ It works by hooking into the JavaScript package managers preinstall hook via a Rake task. The Rake task copies the `files` specified in the `package.json` to a temporary directory and then install that directory as a local package.
24
+
25
+ ### Configuration
26
+
27
+ ```ruby
28
+ require 'embedded_js'
29
+
30
+ EmbeddedJs.configure do |config|
31
+ config.package_manager = :npm
32
+ config.engines = %w[
33
+ engine1
34
+ engine2
35
+ ]
36
+ end
37
+
38
+ ```
39
+
40
+ #### Configuration Options
41
+
42
+ Option/Method | Description
43
+ --- | ---
44
+ `package_manager` | The package manager you are using with your application. Currently supports `:npm` and `:yarn`. (default: `:npm`)
45
+ `engine` | An array of the names of the gems/engines to include.
46
+
47
+ ### Preinstall Hook
48
+
49
+ You'll need to add the `preinstall` script to your applications `package.json` in the `scripts` property.
50
+
51
+ ```json
52
+ {
53
+ "scripts": {
54
+ "preinstall": "bundle exec rails embedded_js:preinstall"
55
+ }
56
+ }
57
+ ```
58
+
59
+ ## Development
60
+
61
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
62
+
63
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
64
+
65
+ ## Contributing
66
+
67
+ Bug reports and pull requests are welcome on GitHub at https://github.com/aaricpittman/embedded-js. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/aaricpittman/embedded-js/blob/master/CODE_OF_CONDUCT.md).
68
+
69
+
70
+ ## License
71
+
72
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
73
+
74
+ ## Code of Conduct
75
+
76
+ Everyone interacting in the Webpacker::Engine project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/aaricpittman/embedded-js/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
data/exe/embeddedjs ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'embedded_js'
5
+
6
+ EmbeddedJs::Cli.start(ARGV)
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'embedded_js/version'
4
+ require 'embedded_js/config'
5
+ require 'embedded_js/cli'
6
+
7
+ module EmbeddedJs
8
+ def self.config
9
+ @config ||= Config.load
10
+ end
11
+
12
+ def self.gem_specs
13
+ @gem_specs ||= Bundler.load.specs
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+
5
+ module EmbeddedJs
6
+ module Adaptors
7
+ class CommandRunner
8
+ def initialize(io: Open3)
9
+ @io = io
10
+ end
11
+
12
+ def run(cmd, environment_variables = {})
13
+ io.popen3(
14
+ environment_variables,
15
+ "#{cmd} 2>&1"
16
+ ) do |stdin, stdout, _stderr, wait_thread|
17
+ stdin.close_write
18
+
19
+ while line = stdout.gets
20
+ puts line
21
+ end
22
+
23
+ puts wait_thread.value
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :io
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require 'tmpdir'
5
+
6
+ module EmbeddedJs
7
+ module Adaptors
8
+ class IO
9
+ def copy_files(files:, to:)
10
+ FileUtils.cp_r(
11
+ files,
12
+ to,
13
+ preserve: true
14
+ )
15
+ end
16
+
17
+ def exists?(path:)
18
+ File.exist?(path)
19
+ end
20
+
21
+ def mkdir(path:)
22
+ FileUtils.mkdir_p(path)
23
+ end
24
+
25
+ def tmpdir
26
+ Dir.tmpdir
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+
5
+ require_relative 'commands/init'
6
+ require_relative 'commands/preinstall'
7
+
8
+ module EmbeddedJs
9
+ class Cli < Thor
10
+ desc 'init', 'Generates EmbeddedJs configuration.'
11
+ option :package_manager,
12
+ desc: 'Specify the JavaScript package manager to configure. (yarn, npm)',
13
+ type: :string,
14
+ default: 'npm'
15
+ def init
16
+ Commands::Init.call(package_manager: options[:package_manager])
17
+ end
18
+
19
+ desc 'preisntall', 'Installs configured js packages embedded in gems.'
20
+ def preinstall
21
+ Commands::Preinstall.call(gems: EmbeddedJs.config.gems)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+
5
+ module EmbeddedJs
6
+ module Commands
7
+ class Init
8
+ TEMPLATES_DIR = File.expand_path('../../templates', __dir__)
9
+ CONFIG_OUTPUT_PATH = './.embeddedjs'
10
+
11
+ class << self
12
+ def call(package_manager: 'npm')
13
+ new.call(package_manager: package_manager)
14
+ end
15
+ end
16
+
17
+ def call(package_manager: 'npm')
18
+ @package_manager = package_manager
19
+
20
+ generate_config_file
21
+ instructions
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :package_manager
27
+
28
+ def generate_config_file
29
+ File.write(CONFIG_OUTPUT_PATH, render_config)
30
+ end
31
+
32
+ def instructions
33
+ post_install_msg = File.read("#{TEMPLATES_DIR}/post_install.txt")
34
+
35
+ puts post_install_msg
36
+ end
37
+
38
+ def config_template
39
+ File.read(config_template_path)
40
+ end
41
+
42
+ def config_template_path
43
+ "#{TEMPLATES_DIR}/.embeddedjs.erb"
44
+ end
45
+
46
+ def render_config
47
+ ERB.new(config_template).result(binding)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../adaptors/command_runner'
4
+ require_relative '../gem_package'
5
+ require_relative '../package_managers/factory'
6
+
7
+ module EmbeddedJs
8
+ module Commands
9
+ class Preinstall
10
+ ENV_VARIABLE_NAME = 'EP_PREINSTALL'
11
+
12
+ class << self
13
+ def call(gems:)
14
+ new.call(gems: gems)
15
+ end
16
+ end
17
+
18
+ def initialize(
19
+ command_runner: Adaptors::CommandRunner.new,
20
+ package_manager: PackageManagers::Factory.build(EmbeddedJs.config.package_manager)
21
+ )
22
+ @command_runner = command_runner
23
+ @package_manager = package_manager
24
+ end
25
+
26
+ def call(gems:)
27
+ return if ENV.fetch(ENV_VARIABLE_NAME, nil)
28
+
29
+ gems.each(&method(:install_embedded_package))
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :command_runner, :package_manager
35
+
36
+ def install_embedded_package(gem)
37
+ embedded_jsage = GemPackage.new(gem)
38
+
39
+ embedded_jsage.with_path do |path|
40
+ command_runner.run(
41
+ package_manager.install_command(path),
42
+ { ENV_VARIABLE_NAME => '1' }
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module EmbeddedJs
6
+ class Config
7
+ DEFAULT_CONFIG_PATH = './.embeddedjs'
8
+
9
+ class << self
10
+ def load(config_path: DEFAULT_CONFIG_PATH)
11
+ new(**JSON.parse(File.read(config_path), symbolize_names: true))
12
+ end
13
+ end
14
+
15
+ attr_accessor :package_manager, :gems
16
+
17
+ def initialize(package_manager: :npm, gems: [])
18
+ @gems = gems
19
+ @package_manager = package_manager.to_sym
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'adaptors/io'
4
+ require_relative 'package_config'
5
+
6
+ module EmbeddedJs
7
+ class GemPackage
8
+ def initialize(
9
+ engine,
10
+ io: Adaptors::IO.new,
11
+ package_config: PackageConfig.new(EmbeddedJs.gem_specs.find { |s| s.name == engine }&.full_gem_path)
12
+ )
13
+ @engine = engine
14
+ @io = io
15
+ @package_config = package_config
16
+ end
17
+
18
+ def with_path
19
+ io.mkdir(path: tmp_path)
20
+ copy_specified_files(tmp_path)
21
+
22
+ yield tmp_path
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :engine, :gem_specs, :io, :package_config
28
+
29
+ def copy_specified_files(dir)
30
+ io.copy_files(
31
+ files: package_config.package_files_paths,
32
+ to: dir
33
+ )
34
+ end
35
+
36
+ def package_json?
37
+ io.exist?(path: "#{engine_path}/package.json")
38
+ end
39
+
40
+ def tmp_path
41
+ "#{io.tmpdir}/EmbeddedJs/#{engine}"
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module EmbeddedJs
6
+ class PackageConfig
7
+ attr_reader :path
8
+
9
+ def initialize(package_path)
10
+ @path = package_path
11
+
12
+ raise ArgumentError, "#{package_path} does not have a package.json file." unless File.exist?(config_path)
13
+
14
+ @config = JSON.parse(File.read(config_path))
15
+ end
16
+
17
+ def package_files_paths
18
+ specified_files.map { |f| "#{path}/#{f}" }.tap do |paths|
19
+ paths << config_path unless paths.include?(config_path)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :config
26
+
27
+ def config_path
28
+ "#{path}/package.json"
29
+ end
30
+
31
+ def specified_files
32
+ config.fetch('files', [])
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'npm'
4
+ require_relative 'yarn'
5
+
6
+ module EmbeddedJs
7
+ module PackageManagers
8
+ class Factory
9
+ class << self
10
+ def build(name)
11
+ case name
12
+ when :npm then PackageManagers::Npm.new
13
+ when :yarn then PackageManagers::Yarn.new
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EmbeddedJs
4
+ module PackageManagers
5
+ class Npm
6
+ INSTALL_COMMAND = 'npm install %<engine_path>s'
7
+
8
+ def install_command(engine_path)
9
+ format(INSTALL_COMMAND, engine_path: engine_path)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EmbeddedJs
4
+ module PackageManagers
5
+ class Yarn
6
+ INSTALL_COMMAND = 'yarn add file:%<engine_path>s'
7
+
8
+ def install_command(engine_path)
9
+ format(INSTALL_COMMAND, engine_path: engine_path)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EmbeddedJs
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,9 @@
1
+
2
+ ===============================================================================
3
+
4
+ Add the following to your package.json scripts:
5
+
6
+ "preinstall": "bundle exec embeddedjs preinstall"
7
+
8
+ ===============================================================================
9
+
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: embedded_js
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Aaric Pittman
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-05-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: pry
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rubocop
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: solargraph
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description:
104
+ email:
105
+ - aaricpittman@gmail.com
106
+ executables:
107
+ - embeddedjs
108
+ extensions: []
109
+ extra_rdoc_files: []
110
+ files:
111
+ - README.md
112
+ - Rakefile
113
+ - exe/embeddedjs
114
+ - lib/embedded_js.rb
115
+ - lib/embedded_js/adaptors/command_runner.rb
116
+ - lib/embedded_js/adaptors/io.rb
117
+ - lib/embedded_js/cli.rb
118
+ - lib/embedded_js/commands/init.rb
119
+ - lib/embedded_js/commands/preinstall.rb
120
+ - lib/embedded_js/config.rb
121
+ - lib/embedded_js/gem_package.rb
122
+ - lib/embedded_js/package_config.rb
123
+ - lib/embedded_js/package_managers/factory.rb
124
+ - lib/embedded_js/package_managers/npm.rb
125
+ - lib/embedded_js/package_managers/yarn.rb
126
+ - lib/embedded_js/version.rb
127
+ - lib/templates/post_install.txt
128
+ homepage: https://github.com/aaricpittman/embedded-js
129
+ licenses:
130
+ - MIT
131
+ metadata:
132
+ homepage_uri: https://github.com/aaricpittman/embedded-js
133
+ source_code_uri: https://github.com/aaricpittman/embedded-js
134
+ changelog_uri: https://github.com/aaricpittman/embedded-js/blob/main/CHANGELOG.md
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: 2.5.0
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubyforge_project:
151
+ rubygems_version: 2.7.6.2
152
+ signing_key:
153
+ specification_version: 4
154
+ summary: Simplifies including JavaScript packages in your Rails Engines.
155
+ test_files: []