Skip to content
This repository was archived by the owner on Aug 11, 2022. It is now read-only.

Commit 5683606

Browse files
committed
Add generator for installation
1 parent a5759da commit 5683606

File tree

14 files changed

+176
-8
lines changed

14 files changed

+176
-8
lines changed

README.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,23 @@ Make sure, you have [set-up Webpacker](https://github.com/rails/webpacker#instal
1212
Add this line to your application's Gemfile:
1313

1414
```ruby
15-
gem 'svelte-rails'
15+
gem 'svelte-rails', path: '../svelte-rails'
1616
```
1717

1818
And then execute:
1919

20-
$ bundle install
21-
$ rails generate svelte:install
20+
$ bundle
21+
$ rails svelte:install
2222

23-
An example Rails app with svelte-rails can be seen here:
24-
https://github.com/nning/rails-svelte-poc
23+
If you have started with a fresh Rails app, you can overwrite conflicting files.
24+
25+
An example Rails app demonstrating the integration of svelte-rails can be found here:
26+
https://github.com/nning/svelte-rails-demo/commits/master
2527

2628
## View Helper
2729

2830
```erb
29-
<%= svelte_component(:Hello, name: 'Svelte') %>
31+
<%= svelte_component :Hello, name: 'Svelte' %>
3032
```
3133

3234
## Missing Features

lib/svelte/rails.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
module Svelte
44
module Rails
5-
class Error < StandardError; end
6-
# Your code goes here...
5+
# class Error < StandardError; end
76
end
87
end
98

lib/svelte/rails/install_generator.rb

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
require 'rails/generators'
2+
3+
4+
module Svelte
5+
class InstallGenerator < ::Rails::Generators::Base
6+
TEMPLATE_DIR = File.expand_path('../templates', __FILE__)
7+
source_root TEMPLATE_DIR
8+
9+
desc 'Install Svelte support'
10+
11+
def create_directories
12+
empty_directory components_dir
13+
create_file File.join(components_dir, '.keep')
14+
end
15+
16+
def copy_templates
17+
copy_template(webpack_dir, 'environment.js')
18+
copy_template(webpack_dir, 'development.js')
19+
copy_template(webpack_dir, 'production.js')
20+
copy_template(webpack_dir, 'test.js')
21+
22+
copy_template(webpack_dir, 'loaders', 'svelte.js')
23+
copy_template(webpack_dir, 'loaders', 'svelte-ssr.js')
24+
25+
copy_template(packs_dir, 'server_rendering.js')
26+
copy_template(components_dir, 'Hello.svelte')
27+
end
28+
29+
def update_application_entry
30+
path = Pathname.new('app/javascript/packs/application.js')
31+
content = File.read(File.join(TEMPLATE_DIR, path))
32+
33+
if path.exist?
34+
append_file(path, content)
35+
else
36+
create_file(path, content)
37+
end
38+
end
39+
40+
def install_svelte_ujs
41+
`yarn add ../svelte-rails`
42+
end
43+
44+
private
45+
46+
def rails_dir
47+
Pathname.new(destination_root).relative_path_from(::Rails.root)
48+
end
49+
50+
def packs_dir
51+
Webpacker.config.source_entry_path.relative_path_from(::Rails.root)
52+
end
53+
54+
def js_dir
55+
packs_dir.parent
56+
end
57+
58+
def components_dir
59+
File.join(js_dir, 'components')
60+
end
61+
62+
def webpack_dir
63+
File.join(rails_dir, 'config', 'webpack')
64+
end
65+
66+
def copy_template(*path_segments)
67+
source = File.join(*path_segments)
68+
template(source, ::Rails.root.join(source))
69+
end
70+
end
71+
end

lib/svelte/rails/install_task.rake

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require 'svelte/rails/install_generator'
2+
3+
namespace :svelte do
4+
desc 'Install Svelte support'
5+
task :install do
6+
Svelte::InstallGenerator.start
7+
end
8+
end

lib/svelte/rails/railtie.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,9 @@ class Railtie < ::Rails::Railtie
77
include ::Svelte::Rails::ViewHelper
88
end
99
end
10+
11+
rake_tasks do
12+
load 'svelte/rails/install_task.rake'
13+
end
1014
end
1115
end
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<svelte:head>
2+
<title>Hello {name}! ❤</title>
3+
</svelte:head>
4+
5+
<script>
6+
import { onMount } from 'svelte'
7+
8+
export let name
9+
let time
10+
11+
onMount(() => {
12+
const interval = setInterval(() => {
13+
time = new Date();
14+
}, 1000);
15+
16+
return () => {
17+
clearInterval(interval);
18+
};
19+
});
20+
</script>
21+
22+
<style>
23+
:global(body) {
24+
background-color: #223;
25+
}
26+
27+
h1, code {
28+
color: #fee;
29+
}
30+
</style>
31+
32+
<h1>Hello {name}! ❤</h1>
33+
34+
{#if time}
35+
<code>{time}</code>
36+
{/if}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import SvelteRailsUJS from 'svelte_ujs';
2+
self.SvelteRailsUJS = SvelteRailsUJS;
3+
SvelteRailsUJS.start();
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import SvelteRailsUJS from 'svelte_ujs';
2+
3+
self.SvelteRailsUJS = SvelteRailsUJS;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
process.env.NODE_ENV = process.env.NODE_ENV || 'development'
2+
3+
const environment = require('./environment')
4+
5+
module.exports = environment.map(x => x.toWebpackConfig())
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const clientLoader = require('./loaders/svelte')
2+
const serverLoader = require('./loaders/svelte-ssr')
3+
4+
const getSvelteEnvironments = require('svelte_ujs/getSvelteEnvironments')
5+
6+
module.exports = getSvelteEnvironments(clientLoader, serverLoader)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module.exports = {
2+
test: /\.svelte$/,
3+
use: [{
4+
loader: 'svelte-loader',
5+
options: {
6+
generate: 'ssr',
7+
emitCss: false,
8+
css: false
9+
}
10+
}],
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module.exports = {
2+
test: /\.svelte$/,
3+
use: [{
4+
loader: 'svelte-loader',
5+
options: {
6+
hotReload: true,
7+
hydratable: true
8+
}
9+
}],
10+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
process.env.NODE_ENV = process.env.NODE_ENV || 'production'
2+
3+
const environment = require('./environment')
4+
5+
module.exports = environment.map(x => x.toWebpackConfig())
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
process.env.NODE_ENV = process.env.NODE_ENV || 'development'
2+
3+
const environment = require('./environment')
4+
5+
module.exports = environment.map(x => x.toWebpackConfig())

0 commit comments

Comments
 (0)