isomorfeus 1.0.0.zeta6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/bin/isomorfeus +33 -0
  4. data/bin/yandle +9 -0
  5. data/lib/isomorfeus/cli.rb +33 -0
  6. data/lib/isomorfeus/console.rb +21 -0
  7. data/lib/isomorfeus/installer/databases/arangodb.rb +13 -0
  8. data/lib/isomorfeus/installer/new_project.rb +56 -0
  9. data/lib/isomorfeus/installer/options_mangler.rb +16 -0
  10. data/lib/isomorfeus/installer/rack_servers.rb +11 -0
  11. data/lib/isomorfeus/installer/templates/.gitignore.erb +25 -0
  12. data/lib/isomorfeus/installer/templates/.gitkeep.erb +0 -0
  13. data/lib/isomorfeus/installer/templates/Gemfile.erb +28 -0
  14. data/lib/isomorfeus/installer/templates/Procfile.erb +3 -0
  15. data/lib/isomorfeus/installer/templates/ProcfileDebug.erb +3 -0
  16. data/lib/isomorfeus/installer/templates/anonymous_policy.rb.erb +4 -0
  17. data/lib/isomorfeus/installer/templates/app.rb.erb +57 -0
  18. data/lib/isomorfeus/installer/templates/app_loader.rb.erb +8 -0
  19. data/lib/isomorfeus/installer/templates/application.css.erb +0 -0
  20. data/lib/isomorfeus/installer/templates/application.js.erb +25 -0
  21. data/lib/isomorfeus/installer/templates/application_common.js.erb +13 -0
  22. data/lib/isomorfeus/installer/templates/application_ssr.js.erb +23 -0
  23. data/lib/isomorfeus/installer/templates/application_web_worker.js.erb +6 -0
  24. data/lib/isomorfeus/installer/templates/arango_config.rb.erb +19 -0
  25. data/lib/isomorfeus/installer/templates/config.ru.erb +23 -0
  26. data/lib/isomorfeus/installer/templates/debug.js.erb +131 -0
  27. data/lib/isomorfeus/installer/templates/development.js.erb +110 -0
  28. data/lib/isomorfeus/installer/templates/development_ssr.js.erb +111 -0
  29. data/lib/isomorfeus/installer/templates/hello_component.rb.erb +6 -0
  30. data/lib/isomorfeus/installer/templates/iodine_config.rb.erb +14 -0
  31. data/lib/isomorfeus/installer/templates/isomorfeus_loader.rb.erb +16 -0
  32. data/lib/isomorfeus/installer/templates/isomorfeus_web_worker_loader.rb.erb +2 -0
  33. data/lib/isomorfeus/installer/templates/my_app.rb.erb +11 -0
  34. data/lib/isomorfeus/installer/templates/navigation_links.rb.erb +9 -0
  35. data/lib/isomorfeus/installer/templates/not_found_404_component.rb.erb +7 -0
  36. data/lib/isomorfeus/installer/templates/package.json.erb +42 -0
  37. data/lib/isomorfeus/installer/templates/production.js.erb +91 -0
  38. data/lib/isomorfeus/installer/templates/spec_helper.rb.erb +22 -0
  39. data/lib/isomorfeus/installer/templates/test_spec.rb.erb +13 -0
  40. data/lib/isomorfeus/installer/templates/welcome_component.rb.erb +6 -0
  41. data/lib/isomorfeus/installer.rb +257 -0
  42. data/lib/isomorfeus/version.rb +3 -0
  43. metadata +211 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b7a30b79b8586ebe435462fdee09c274f84fd1b2c6878bcb52f5349ba3ecda09
4
+ data.tar.gz: 956825ef7b526af2d508b16ee4bcf20b890d110c4156c9885f128fbf0270b62a
5
+ SHA512:
6
+ metadata.gz: 03acc9c28ac94f97faf43ecc16981994a770d625208d486c0d3748c5766d9cc5bce7b267695ab467f0294c294526fbd98204724ec943ac6bb5ef4e47ac105cc5
7
+ data.tar.gz: f161426747e384537f4afc5a84f768058e7d5fdd28620ed10b205155d9183e80803364421d55ef39155b26eb93bf04d3a32ffa65169bf7ac687e33cb9da78869
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018, 2019 Jan Biedermann
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/bin/isomorfeus ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ require 'thor'
3
+ require_relative '../lib/isomorfeus/installer'
4
+ require_relative '../lib/isomorfeus/installer/rack_servers'
5
+
6
+ if %w[c con console].include?(ARGV[0])
7
+ require 'pry'
8
+ require_relative '../lib/isomorfeus/console'
9
+ require_relative '../lib/isomorfeus/cli'
10
+
11
+ Isomorfeus::Installer::CLI.start(ARGV)
12
+ else
13
+ require 'bundler'
14
+ require 'fileutils'
15
+ require 'erb'
16
+ require 'active_support/core_ext/string'
17
+ require 'opal-webpack-loader/installer_cli'
18
+ require_relative '../lib/isomorfeus/version'
19
+ require_relative '../lib/isomorfeus/installer/options_mangler'
20
+ require_relative '../lib/isomorfeus/installer/new_project'
21
+
22
+ Isomorfeus::Installer.module_directories.each do |mod_dir|
23
+ mod_path = File.realpath(File.join(Isomorfeus::Installer.base_path, mod_dir))
24
+ modules = Dir.glob('*.rb', base: mod_path)
25
+ modules.each do |mod|
26
+ require_relative File.join(mod_path, mod)
27
+ end
28
+ end
29
+
30
+ require_relative '../lib/isomorfeus/cli'
31
+
32
+ Isomorfeus::Installer::CLI.start(ARGV)
33
+ end
data/bin/yandle ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ if %w[update upgrade].include?(ARGV[0])
4
+ system('yarn upgrade')
5
+ system('bundle update')
6
+ else
7
+ system('yarn install')
8
+ system('bundle install')
9
+ end
@@ -0,0 +1,33 @@
1
+ module Isomorfeus
2
+ module Installer
3
+ class CLI < Thor
4
+
5
+ desc "new project_name", "Create a new isomorfeus project with project_name."
6
+ option :rack_server, default: 'iodine', aliases: '-r',
7
+ desc: "Select rack server, one of: #{Isomorfeus::Installer.sorted_rack_servers.join(', ')}. (optional)"
8
+ option :yarn_and_bundle, default: true, required: false, type: :boolean, aliases: '-y', desc: "Execute yarn install and bundle install. (optional)"
9
+ def new(project_name)
10
+ Isomorfeus::Installer.set_project_names(project_name)
11
+ Isomorfeus::Installer.options = options
12
+ Isomorfeus::Installer::NewProject.execute(yarn_and_bundle: options[:yarn_and_bundle])
13
+ end
14
+
15
+ desc "console", "Open console for current project."
16
+ def console
17
+ Isomorfeus::Console.new.run
18
+ end
19
+
20
+ desc "test_app", "Create a test_app for internal framework tests."
21
+ option :module, required: true, type: :string, aliases: '-m', desc: "Isomorfeus module name for which to generate the test app, eg: 'i18n'. (required)"
22
+ option :source_dir, required: false, type: :string, aliases: '-s', desc: "Recursively copy files from source dir into app. (optional)"
23
+ option :rack_server, default: 'iodine', aliases: '-r',
24
+ desc: "Select rack server, one of: #{Isomorfeus::Installer.sorted_rack_servers.join(', ')}. (optional)"
25
+ option :yarn_and_bundle, default: true, required: false, type: :boolean, aliases: '-y', desc: "Execute yarn install and bundle install. (optional)"
26
+ def test_app
27
+ Isomorfeus::Installer.set_project_names('test_app')
28
+ Isomorfeus::Installer.options = options
29
+ Isomorfeus::Installer::NewProject.execute(yarn_and_bundle: options[:yarn_and_bundle])
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ module Isomorfeus
2
+ class Console
3
+ def initialize
4
+ config_ru = File.read('config.ru')
5
+ config_ru.each_line do |line|
6
+ if line.start_with?('require_relative')
7
+ file = line[17..-1].rstrip.tr('"','').tr("'",'')
8
+ file = file + '.rb' unless file.end_with?('.rb')
9
+ require File.join(Dir.pwd, file)
10
+ end
11
+ end
12
+ Isomorfeus.zeitwerk.enable_reloading
13
+ Isomorfeus.zeitwerk.setup
14
+ Isomorfeus.zeitwerk.eager_load
15
+ end
16
+
17
+ def run
18
+ Isomorfeus.pry
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ module Isomorfeus
2
+ module Installer
3
+ module Databases
4
+ module ArangoDB
5
+
6
+ end
7
+ end
8
+ end
9
+ end
10
+
11
+ Isomorfeus::Installer.add_database('arangodb',
12
+ gems: [ { name: 'arango-driver', version: "~> 3.5.0.alpha0" } ],
13
+ installer: Isomorfeus::Installer::Databases::ArangoDB)
@@ -0,0 +1,56 @@
1
+ require 'opal-webpack-loader/installer_cli'
2
+ require 'opal-webpack-loader/version'
3
+
4
+ module Isomorfeus
5
+ module Installer
6
+ class NewProject
7
+ def self.execute(yarn_and_bundle: true)
8
+ begin
9
+ Dir.mkdir(Isomorfeus::Installer.project_dir)
10
+ Dir.chdir(Isomorfeus::Installer.project_dir)
11
+ rescue
12
+ puts "Directory #{installer.project_dir} could not be created!"
13
+ exit 1
14
+ end
15
+
16
+ begin
17
+ Isomorfeus::Installer.create_directories
18
+ Isomorfeus::Installer.install_framework
19
+
20
+ OpalWebpackLoader::Installer::CLI.start(['iso'])
21
+ Isomorfeus::Installer.install_webpack_config
22
+
23
+ Isomorfeus::Installer.install_styles
24
+ Isomorfeus::Installer.install_js_entries
25
+ Isomorfeus::Installer.install_isomorfeus_entries
26
+
27
+ Isomorfeus::Installer.create_components
28
+ Isomorfeus::Installer.create_policy
29
+ Isomorfeus::Installer.create_spec
30
+
31
+ Isomorfeus::Installer.create_package_json
32
+ Isomorfeus::Installer.create_gemfile
33
+ Isomorfeus::Installer.create_procfile
34
+
35
+ Isomorfeus::Installer.copy_source_dir_files if Isomorfeus::Installer.source_dir
36
+
37
+ if yarn_and_bundle
38
+ puts 'Executing yarn install:'
39
+ system('env -i PATH=$PATH yarn install')
40
+ puts 'Executing bundle install:'
41
+ bundle_command = Gem.bin_path("bundler", "bundle")
42
+ Bundler.with_original_env do
43
+ system("#{Gem.ruby} #{bundle_command} install")
44
+ end
45
+ end
46
+
47
+ Dir.chdir('..')
48
+ puts 'Project setup finished, make your dreams come true :)'
49
+ rescue Exception => e
50
+ puts e.backtrace.join("\n")
51
+ puts "Installation failed: #{e.message}"
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,16 @@
1
+ module Isomorfeus
2
+ module Installer
3
+ module OptionsMangler
4
+ def self.mangle_options(options)
5
+ if options.key?(:rack_server) && Isomorfeus::Installer.sorted_rack_servers.include?(options[:rack_server])
6
+ Isomorfeus::Installer.rack_server = Isomorfeus::Installer.rack_servers[options[:rack_server]]
7
+ Isomorfeus::Installer.rack_server_name = options[:rack_server]
8
+ else
9
+ Isomorfeus::Installer.rack_server = Isomorfeus::Installer.rack_servers['iodine']
10
+ end
11
+ Isomorfeus::Installer.source_dir = File.expand_path(options[:source_dir]) if options.key?(:source_dir)
12
+ Isomorfeus::Installer.isomorfeus_module = "isomorfeus-#{options[:module]}".to_sym if options.key?(:module)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ # Isomorfeus::Installer.add_rack_server('agoo', {
2
+ # gems: [ { name: 'agoo', version: "~> 2.8.3" } ],
3
+ # start_command: 'bundle exec rackup -s agoo'
4
+ # })
5
+
6
+ Isomorfeus::Installer.add_rack_server('iodine', {
7
+ gems: [ { name: 'iodine', version: "~> 0.7.38", require: true } ],
8
+ start_command: 'bundle exec iodine',
9
+ init_template: 'iodine_config.rb.erb',
10
+ rack_server_init: "require_relative 'iodine_config'"
11
+ })
@@ -0,0 +1,25 @@
1
+ # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile '~/.gitignore_global'
6
+
7
+ # Ignore bundler config.
8
+ /.bundle
9
+
10
+ # Ignore all logfiles and tempfiles.
11
+ /log/*
12
+ /tmp/*
13
+ !/log/.keep
14
+ !/tmp/.keep
15
+
16
+ node_modules
17
+ public/assets
18
+
19
+ .byebug_history
20
+
21
+ yarn-error.log
22
+ yarn-debug.log*
23
+ .yarn-integrity
24
+
25
+ .DS_Store
File without changes
@@ -0,0 +1,28 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ <%= rack_server_gems %>
5
+ gem 'foreman', require: false
6
+
7
+ gem 'roda', '~> 3.25.0'
8
+
9
+ gem 'opal', github: 'janbiedermann/opal', branch: 'es6_modules_1_1'
10
+ gem 'opal-activesupport', '~> 0.3.3'
11
+ gem 'opal-webpack-loader', '>= 0.9.9'
12
+
13
+ gem 'isomorfeus-redux', '~> 4.0.16'
14
+ gem 'isomorfeus-react', '>= 16.12.1'
15
+ gem 'isomorfeus-policy', <%= isomorfeus_policy %>
16
+ gem 'isomorfeus-transport', <%= isomorfeus_transport %>
17
+ gem 'isomorfeus-i18n', <%= isomorfeus_i18n %>
18
+ gem 'isomorfeus-data', <%= isomorfeus_data %>
19
+ gem 'isomorfeus-operation', <%= isomorfeus_operation %>
20
+
21
+ group :development do
22
+ gem 'pry', '~> 0.12.2'
23
+ end
24
+
25
+ group :test do
26
+ gem 'rspec', '~> 3.8.0'
27
+ gem 'isomorfeus-puppetmaster', '~> 0.3.0'
28
+ end
@@ -0,0 +1,3 @@
1
+ web: <%= rack_server_start_command %>
2
+ webpack: bundle exec yarn run development
3
+ webpack_ssr: bundle exec yarn run development_ssr
@@ -0,0 +1,3 @@
1
+ web: <%= rack_server_start_command %>
2
+ webpack: bundle exec yarn run debug
3
+ webpack_ssr: bundle exec yarn run development_ssr
@@ -0,0 +1,4 @@
1
+ class AnonymousPolicy < LucidPolicy::Base
2
+ policy_for Anonymous
3
+ allow all
4
+ end
@@ -0,0 +1,57 @@
1
+ require_relative 'app_loader'
2
+ require_relative 'owl_init'
3
+ # require_relative 'arango_config'
4
+ <%= rack_server_init %>
5
+
6
+ class <%= app_class %> < Roda
7
+ extend Isomorfeus::Transport::Middlewares
8
+ include OpalWebpackLoader::ViewHelper
9
+ include Isomorfeus::ReactViewHelper
10
+
11
+ use_isomorfeus_middlewares
12
+ plugin :public, root: 'public'
13
+
14
+ def page_content(env, location)
15
+ locale = env.http_accept_language.preferred_language_from(Isomorfeus.available_locales)
16
+ locale = env.http_accept_language.compatible_language_from(Isomorfeus.available_locales) unless locale
17
+ locale = Isomorfeus.locale unless locale
18
+ rendered_tree = mount_component('<%= app_class %>', location_host: env['HTTP_HOST'], location: location, locale: locale)
19
+ <<~HTML
20
+ <!DOCTYPE html>
21
+ <html>
22
+ <head>
23
+ <title>Welcome to <%= app_class %></title>
24
+ <meta charset="utf-8"/>
25
+ <meta name="viewport" content="width=device-width, initial-scale=1">
26
+ <style id="jss-server-side" type="text/css">#{ssr_styles}</style>
27
+ #{owl_script_tag 'application.js'}
28
+ </head>
29
+ <body>
30
+ #{rendered_tree}
31
+ </body>
32
+ </html>
33
+ HTML
34
+ end
35
+
36
+ route do |r|
37
+ r.root do
38
+ page_content(env, '/')
39
+ end
40
+
41
+ r.public
42
+
43
+ r.get 'favicon.ico' do
44
+ r.public
45
+ end
46
+
47
+ r.get 'robots.txt' do
48
+ r.public
49
+ end
50
+
51
+ r.get do
52
+ content = page_content(env, env['PATH_INFO'])
53
+ response.status = ssr_response_status
54
+ content
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,8 @@
1
+ require 'bundler/setup'
2
+ if ENV['RACK_ENV'] && ENV['RACK_ENV'] == 'production'
3
+ Bundler.require(:default, :production)
4
+ elsif ENV['RACK_ENV'] && ENV['RACK_ENV'] == 'test'
5
+ Bundler.require(:default, :test)
6
+ else
7
+ Bundler.require(:default, :development)
8
+ end
@@ -0,0 +1,25 @@
1
+ // entry file for the browser environment
2
+ // import stylesheets here
3
+ import '../styles/application.css';
4
+
5
+ // import npm modules that are valid to use only in the browser
6
+ import ReactDOM from 'react-dom';
7
+ global.ReactDOM = ReactDOM;
8
+ import { BrowserRouter, Link, NavLink, Route, Switch } from 'react-router-dom';
9
+ // global.History = History;
10
+ global.Router = BrowserRouter;
11
+ global.Link = Link;
12
+ global.NavLink = NavLink;
13
+ global.Route = Route;
14
+ global.Switch = Switch;
15
+ import deepForceUpdate from 'react-deep-force-update'
16
+ global.deepForceUpdate = deepForceUpdate;
17
+ // import modules common to browser and server side rendering (ssr)
18
+ // environments from application_common.js
19
+ import './application_common.js';
20
+
21
+ import init_app from 'isomorfeus_loader.rb';
22
+ init_app();
23
+ Opal.load('isomorfeus_loader');
24
+
25
+ if (module.hot) { module.hot.accept(); }
@@ -0,0 +1,13 @@
1
+ // import javascript modules common to browser and server side rendering environments
2
+ import * as Redux from 'redux';
3
+ global.Redux = Redux;
4
+ import React from 'react';
5
+ global.React = React;
6
+ import * as ReactRouter from 'react-router';
7
+ import * as ReactRouterDOM from 'react-router-dom';
8
+ global.ReactRouter = ReactRouter;
9
+ global.ReactRouterDOM = ReactRouterDOM;
10
+ import * as ReactJSS from 'react-jss';
11
+ global.ReactJSS = ReactJSS;
12
+
13
+ if (module.hot) { module.hot.accept(); }
@@ -0,0 +1,23 @@
1
+ // entry file for the server side rendering environment (ssr)
2
+ // import npm modules that are only valid to use in the server side rendering environment
3
+ // for example modules which depend on objects provided by node js
4
+ import ReactDOMServer from 'react-dom/server';
5
+ global.ReactDOMServer = ReactDOMServer;
6
+ import { StaticRouter, Link, NavLink, Route, Switch } from 'react-router-dom';
7
+ // global.History = History;
8
+ global.Router = StaticRouter;
9
+ global.Link = Link;
10
+ global.NavLink = NavLink;
11
+ global.Route = Route;
12
+ global.Switch = Switch;
13
+ import WebSocket from 'ws';
14
+ global.WebSocket = WebSocket;
15
+ // import modules common to browser and server side rendering (ssr)
16
+ // environments from application_common.js
17
+ import './application_common.js';
18
+
19
+ import init_app from 'isomorfeus_loader.rb';
20
+ init_app();
21
+ global.Opal.load('isomorfeus_loader');
22
+
23
+ if (module.hot) { module.hot.accept(); }
@@ -0,0 +1,6 @@
1
+ // import modules for webworkers
2
+ import init_app from 'isomorfeus_web_worker_loader.rb';
3
+ init_app();
4
+ Opal.load('isomorfeus_web_worker_loader');
5
+
6
+ if (module.hot) { module.hot.accept(); }
@@ -0,0 +1,19 @@
1
+ # Arango DB
2
+ # set all to nil to disable arango
3
+ Isomorfeus.arango_production = { username: ENV['ARANGO_USER'], password: ENV['ARANGO_PASSWORD'],
4
+ host: "localhost", port: "8529",
5
+ database: "<%= app_class %>Production" }
6
+
7
+ Isomorfeus.arango_development = { username: ENV['ARANGO_USER'], password: ENV['ARANGO_PASSWORD'],
8
+ host: "localhost", port: "8529",
9
+ database: "<%= app_class %>Development" }
10
+
11
+ Isomorfeus.arango_test = { username: ENV['ARANGO_USER'], password: ENV['ARANGO_PASSWORD'],
12
+ host: "localhost", port: "8529",
13
+ database: "<%= app_class %>Test" }
14
+
15
+ # create database, if possible
16
+ # initialize Isomorfeus collections
17
+ # create housekeeping tasks
18
+ # keep it, it will take care of updates to the Isomorfeus collections when required
19
+ Isomorfeus.prepare_arango_database
@@ -0,0 +1,23 @@
1
+ require_relative '<%= app_require %>'
2
+
3
+ if !Isomorfeus.development?
4
+ Isomorfeus.zeitwerk.setup
5
+ Isomorfeus.zeitwerk.eager_load
6
+
7
+ run <%= app_class %>.app
8
+ else
9
+ Isomorfeus.zeitwerk.enable_reloading
10
+ Isomorfeus.zeitwerk.setup
11
+ Isomorfeus.zeitwerk.eager_load
12
+
13
+ run ->(env) do
14
+ write_lock = Isomorfeus.zeitwerk_lock.try_write_lock
15
+ if write_lock
16
+ Isomorfeus.zeitwerk.reload
17
+ Isomorfeus.zeitwerk_lock.release_write_lock
18
+ end
19
+ Isomorfeus.zeitwerk_lock.with_read_lock do
20
+ <%= app_class %>.call env
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,131 @@
1
+ const path = require('path');
2
+ const webpack = require('webpack');
3
+ const OwlResolver = require('opal-webpack-loader/resolver'); // to resolve ruby files
4
+ const ExtraWatchWebpackPlugin = require('extra-watch-webpack-plugin'); // to watch for added ruby files
5
+
6
+ const common_config = {
7
+ target: 'web',
8
+ context: path.resolve(__dirname, '../isomorfeus'),
9
+ mode: "development",
10
+ optimization: {
11
+ removeAvailableModules: false,
12
+ removeEmptyChunks: false,
13
+ minimize: false // dont minimize for debugging
14
+ },
15
+ performance: {
16
+ maxAssetSize: 20000000,
17
+ maxEntrypointSize: 20000000
18
+ },
19
+ // use one of these below for source maps
20
+ devtool: 'source-map', // this works well, good compromise between accuracy and performance
21
+ // devtool: 'cheap-eval-source-map', // less accurate
22
+ // devtool: 'inline-source-map', // slowest
23
+ // devtool: 'inline-cheap-source-map',
24
+ output: {
25
+ filename: '[name].js',
26
+ path: path.resolve(__dirname, '../public/assets'),
27
+ publicPath: 'http://localhost:3035/assets/'
28
+ },
29
+ externals: { crypto: 'Crypto' },
30
+ resolve: {
31
+ plugins: [new OwlResolver('resolve', 'resolved')], // this makes it possible for webpack to find ruby files
32
+ alias: {
33
+ 'react-dom': 'react-dom/profiling',
34
+ 'schedule/tracing': 'schedule/tracing-profiling',
35
+ }
36
+ },
37
+ plugins: [
38
+ // both for hot reloading
39
+ new webpack.HotModuleReplacementPlugin(),
40
+ // watch for added files in opal dir
41
+ new ExtraWatchWebpackPlugin({ dirs: [path.resolve(__dirname, '../isomorfeus')] }),
42
+ new webpack.DefinePlugin({
43
+ OPAL_DEVTOOLS_OBJECT_REGISTRY: true
44
+ })
45
+ ],
46
+ module: {
47
+ rules: [
48
+ {
49
+ test: /\.s[ac]ss$/,
50
+ use: [ "style-loader",
51
+ {
52
+ loader: "css-loader",
53
+ options: { sourceMap: true }
54
+ },
55
+ {
56
+ loader: "sass-loader",
57
+ options: {
58
+ sassOptions: { includePaths: [path.resolve(__dirname, '../isomorfeus/styles')] },
59
+ sourceMap: true // set to false to speed up hot reloads
60
+ }
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ test: /\.css$/,
66
+ use: [ "style-loader",
67
+ {
68
+ loader: "css-loader",
69
+ options: { sourceMap: true }
70
+ }
71
+ ]
72
+ },
73
+ {
74
+ test: /\.(png|svg|jpg|gif|woff|woff2|eot|ttf|otf)$/,
75
+ use: [ "file-loader" ]
76
+ },
77
+ {
78
+ test: /(\.js)?\.rb$/,
79
+ use: [
80
+ {
81
+ loader: 'opal-webpack-loader', // opal-webpack-loader will compile and include ruby files in the pack
82
+ options: {
83
+ sourceMap: true,
84
+ hmr: true,
85
+ hmrHook: 'Opal.Isomorfeus.$force_render()'
86
+ }
87
+ }
88
+ ]
89
+ }
90
+ ]
91
+ },
92
+ // configuration for webpack-dev-server
93
+ devServer: {
94
+ open: false,
95
+ lazy: false,
96
+ port: 3035,
97
+ hot: true,
98
+ // hotOnly: true,
99
+ inline: true,
100
+ https: false,
101
+ disableHostCheck: true,
102
+ headers: {
103
+ "Access-Control-Allow-Origin": "*",
104
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
105
+ "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
106
+ },
107
+ watchOptions: {
108
+ // in case of problems with hot reloading uncomment the following two lines:
109
+ // aggregateTimeout: 250,
110
+ // poll: 50,
111
+ ignored: /\bnode_modules\b/
112
+ },
113
+ contentBase: path.resolve(__dirname, 'public'),
114
+ useLocalIp: false
115
+ }
116
+ };
117
+
118
+ const browser_config = {
119
+ entry: { application: [path.resolve(__dirname, '../isomorfeus/imports/application.js')] }
120
+ };
121
+
122
+ //const web_worker_config = {
123
+ // target: 'webworker',
124
+ // entry: { web_worker: [path.resolve(__dirname, '../isomorfeus/imports/application_web_worker.js')] },
125
+ // externals: { crypto: 'Crypto' }
126
+ //};
127
+
128
+ const browser = Object.assign({}, common_config, browser_config);
129
+ // const web_worker = Object.assign({}, common_config, web_worker_config);
130
+
131
+ module.exports = [ browser ];