embedded_js 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []