prism-cli 0.0.6 → 0.0.7
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 +4 -4
- data/bin/prism +8 -3
- data/dist/prism.js +106 -9
- data/wasm-server.js +3 -2
- metadata +63 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f3d4a35ffb324e0a1d22b93747940ec6bdb07a1c059bebc361ba4372b15629d
|
4
|
+
data.tar.gz: 247be9c22ca8206425f033252d0dcadaaf2aabff39fba7675511018d709fd711
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c155d93f8afe2bf331c8a1d019b1792f3e101727b495812d9c1347340ab8363dad21786360f95719e435f1a3d1ace543f83b1eb4a67bcfc8f4778eb83e097d2
|
7
|
+
data.tar.gz: 5ad0209c09e77ee547d42414b03328ce906890a80c0bce30d754d285143ebd9e7a1d15bdaa2288f024297c6140c9be8fd63510ff8b529d9115fbec87ec3780a8
|
data/bin/prism
CHANGED
@@ -85,9 +85,10 @@ def build(files)
|
|
85
85
|
puts "Compiled to build/"
|
86
86
|
end
|
87
87
|
|
88
|
-
def server
|
88
|
+
def server(port = 3042)
|
89
89
|
Dir.chdir("build")
|
90
|
-
|
90
|
+
puts "Listening on localhost:#{port}"
|
91
|
+
`node #{__dir__}/../wasm-server.js #{port}`
|
91
92
|
end
|
92
93
|
|
93
94
|
def help
|
@@ -110,7 +111,11 @@ when "build"
|
|
110
111
|
rest = ["app.rb"] if rest.empty?
|
111
112
|
build(rest)
|
112
113
|
when "server"
|
113
|
-
|
114
|
+
if rest.empty?
|
115
|
+
server
|
116
|
+
else
|
117
|
+
server(rest.first.to_i)
|
118
|
+
end
|
114
119
|
else
|
115
120
|
help
|
116
121
|
end
|
data/dist/prism.js
CHANGED
@@ -58,7 +58,7 @@ exports.h = h;
|
|
58
58
|
;
|
59
59
|
exports.default = h;
|
60
60
|
|
61
|
-
},{"./is":3,"./vnode":
|
61
|
+
},{"./is":3,"./vnode":12}],2:[function(require,module,exports){
|
62
62
|
"use strict";
|
63
63
|
Object.defineProperty(exports, "__esModule", { value: true });
|
64
64
|
function createElement(tagName) {
|
@@ -137,6 +137,62 @@ exports.primitive = primitive;
|
|
137
137
|
},{}],4:[function(require,module,exports){
|
138
138
|
"use strict";
|
139
139
|
Object.defineProperty(exports, "__esModule", { value: true });
|
140
|
+
var xlinkNS = 'http://www.w3.org/1999/xlink';
|
141
|
+
var xmlNS = 'http://www.w3.org/XML/1998/namespace';
|
142
|
+
var colonChar = 58;
|
143
|
+
var xChar = 120;
|
144
|
+
function updateAttrs(oldVnode, vnode) {
|
145
|
+
var key, elm = vnode.elm, oldAttrs = oldVnode.data.attrs, attrs = vnode.data.attrs;
|
146
|
+
if (!oldAttrs && !attrs)
|
147
|
+
return;
|
148
|
+
if (oldAttrs === attrs)
|
149
|
+
return;
|
150
|
+
oldAttrs = oldAttrs || {};
|
151
|
+
attrs = attrs || {};
|
152
|
+
// update modified attributes, add new attributes
|
153
|
+
for (key in attrs) {
|
154
|
+
var cur = attrs[key];
|
155
|
+
var old = oldAttrs[key];
|
156
|
+
if (old !== cur) {
|
157
|
+
if (cur === true) {
|
158
|
+
elm.setAttribute(key, "");
|
159
|
+
}
|
160
|
+
else if (cur === false) {
|
161
|
+
elm.removeAttribute(key);
|
162
|
+
}
|
163
|
+
else {
|
164
|
+
if (key.charCodeAt(0) !== xChar) {
|
165
|
+
elm.setAttribute(key, cur);
|
166
|
+
}
|
167
|
+
else if (key.charCodeAt(3) === colonChar) {
|
168
|
+
// Assume xml namespace
|
169
|
+
elm.setAttributeNS(xmlNS, key, cur);
|
170
|
+
}
|
171
|
+
else if (key.charCodeAt(5) === colonChar) {
|
172
|
+
// Assume xlink namespace
|
173
|
+
elm.setAttributeNS(xlinkNS, key, cur);
|
174
|
+
}
|
175
|
+
else {
|
176
|
+
elm.setAttribute(key, cur);
|
177
|
+
}
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
181
|
+
// remove removed attributes
|
182
|
+
// use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
|
183
|
+
// the other option is to remove all attributes with value == undefined
|
184
|
+
for (key in oldAttrs) {
|
185
|
+
if (!(key in attrs)) {
|
186
|
+
elm.removeAttribute(key);
|
187
|
+
}
|
188
|
+
}
|
189
|
+
}
|
190
|
+
exports.attributesModule = { create: updateAttrs, update: updateAttrs };
|
191
|
+
exports.default = exports.attributesModule;
|
192
|
+
|
193
|
+
},{}],5:[function(require,module,exports){
|
194
|
+
"use strict";
|
195
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
140
196
|
function updateClass(oldVnode, vnode) {
|
141
197
|
var cur, name, elm = vnode.elm, oldClass = oldVnode.data.class, klass = vnode.data.class;
|
142
198
|
if (!oldClass && !klass)
|
@@ -160,7 +216,46 @@ function updateClass(oldVnode, vnode) {
|
|
160
216
|
exports.classModule = { create: updateClass, update: updateClass };
|
161
217
|
exports.default = exports.classModule;
|
162
218
|
|
163
|
-
},{}],
|
219
|
+
},{}],6:[function(require,module,exports){
|
220
|
+
"use strict";
|
221
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
222
|
+
var CAPS_REGEX = /[A-Z]/g;
|
223
|
+
function updateDataset(oldVnode, vnode) {
|
224
|
+
var elm = vnode.elm, oldDataset = oldVnode.data.dataset, dataset = vnode.data.dataset, key;
|
225
|
+
if (!oldDataset && !dataset)
|
226
|
+
return;
|
227
|
+
if (oldDataset === dataset)
|
228
|
+
return;
|
229
|
+
oldDataset = oldDataset || {};
|
230
|
+
dataset = dataset || {};
|
231
|
+
var d = elm.dataset;
|
232
|
+
for (key in oldDataset) {
|
233
|
+
if (!dataset[key]) {
|
234
|
+
if (d) {
|
235
|
+
if (key in d) {
|
236
|
+
delete d[key];
|
237
|
+
}
|
238
|
+
}
|
239
|
+
else {
|
240
|
+
elm.removeAttribute('data-' + key.replace(CAPS_REGEX, '-$&').toLowerCase());
|
241
|
+
}
|
242
|
+
}
|
243
|
+
}
|
244
|
+
for (key in dataset) {
|
245
|
+
if (oldDataset[key] !== dataset[key]) {
|
246
|
+
if (d) {
|
247
|
+
d[key] = dataset[key];
|
248
|
+
}
|
249
|
+
else {
|
250
|
+
elm.setAttribute('data-' + key.replace(CAPS_REGEX, '-$&').toLowerCase(), dataset[key]);
|
251
|
+
}
|
252
|
+
}
|
253
|
+
}
|
254
|
+
}
|
255
|
+
exports.datasetModule = { create: updateDataset, update: updateDataset };
|
256
|
+
exports.default = exports.datasetModule;
|
257
|
+
|
258
|
+
},{}],7:[function(require,module,exports){
|
164
259
|
"use strict";
|
165
260
|
Object.defineProperty(exports, "__esModule", { value: true });
|
166
261
|
function invokeHandler(handler, vnode, event) {
|
@@ -256,7 +351,7 @@ exports.eventListenersModule = {
|
|
256
351
|
};
|
257
352
|
exports.default = exports.eventListenersModule;
|
258
353
|
|
259
|
-
},{}],
|
354
|
+
},{}],8:[function(require,module,exports){
|
260
355
|
"use strict";
|
261
356
|
Object.defineProperty(exports, "__esModule", { value: true });
|
262
357
|
function updateProps(oldVnode, vnode) {
|
@@ -283,7 +378,7 @@ function updateProps(oldVnode, vnode) {
|
|
283
378
|
exports.propsModule = { create: updateProps, update: updateProps };
|
284
379
|
exports.default = exports.propsModule;
|
285
380
|
|
286
|
-
},{}],
|
381
|
+
},{}],9:[function(require,module,exports){
|
287
382
|
"use strict";
|
288
383
|
Object.defineProperty(exports, "__esModule", { value: true });
|
289
384
|
// Bindig `requestAnimationFrame` like this fixes a bug in IE/Edge. See #360 and #409.
|
@@ -380,7 +475,7 @@ exports.styleModule = {
|
|
380
475
|
};
|
381
476
|
exports.default = exports.styleModule;
|
382
477
|
|
383
|
-
},{}],
|
478
|
+
},{}],10:[function(require,module,exports){
|
384
479
|
"use strict";
|
385
480
|
Object.defineProperty(exports, "__esModule", { value: true });
|
386
481
|
var vnode_1 = require("./vnode");
|
@@ -693,7 +788,7 @@ function init(modules, domApi) {
|
|
693
788
|
}
|
694
789
|
exports.init = init;
|
695
790
|
|
696
|
-
},{"./h":1,"./htmldomapi":2,"./is":3,"./thunk":
|
791
|
+
},{"./h":1,"./htmldomapi":2,"./is":3,"./thunk":11,"./vnode":12}],11:[function(require,module,exports){
|
697
792
|
"use strict";
|
698
793
|
Object.defineProperty(exports, "__esModule", { value: true });
|
699
794
|
var h_1 = require("./h");
|
@@ -741,7 +836,7 @@ exports.thunk = function thunk(sel, key, fn, args) {
|
|
741
836
|
};
|
742
837
|
exports.default = exports.thunk;
|
743
838
|
|
744
|
-
},{"./h":1}],
|
839
|
+
},{"./h":1}],12:[function(require,module,exports){
|
745
840
|
"use strict";
|
746
841
|
Object.defineProperty(exports, "__esModule", { value: true });
|
747
842
|
function vnode(sel, data, children, text, elm) {
|
@@ -752,13 +847,15 @@ function vnode(sel, data, children, text, elm) {
|
|
752
847
|
exports.vnode = vnode;
|
753
848
|
exports.default = vnode;
|
754
849
|
|
755
|
-
},{}],
|
850
|
+
},{}],13:[function(require,module,exports){
|
756
851
|
var snabbdom = require('snabbdom');
|
757
852
|
var patch = snabbdom.init([
|
758
853
|
require('snabbdom/modules/class').default,
|
854
|
+
require('snabbdom/modules/attributes').default,
|
759
855
|
require('snabbdom/modules/props').default,
|
760
856
|
require('snabbdom/modules/style').default,
|
761
857
|
require('snabbdom/modules/eventlisteners').default,
|
858
|
+
require('snabbdom/modules/dataset').default
|
762
859
|
]);
|
763
860
|
snabbdom_h = require('snabbdom/h').default;
|
764
861
|
|
@@ -877,4 +974,4 @@ window.Module = {
|
|
877
974
|
};
|
878
975
|
|
879
976
|
|
880
|
-
},{"snabbdom":
|
977
|
+
},{"snabbdom":10,"snabbdom/h":1,"snabbdom/modules/attributes":4,"snabbdom/modules/class":5,"snabbdom/modules/dataset":6,"snabbdom/modules/eventlisteners":7,"snabbdom/modules/props":8,"snabbdom/modules/style":9}]},{},[13]);
|
data/wasm-server.js
CHANGED
@@ -2,6 +2,7 @@ const http = require('http');
|
|
2
2
|
const fs = require('fs');
|
3
3
|
const path = require('path');
|
4
4
|
|
5
|
+
const port = parseInt(process.argv[2], 10) || 3042;
|
5
6
|
const proxy = http.createServer((req, res) => {
|
6
7
|
let p = path.join('.', req.url);
|
7
8
|
|
@@ -23,5 +24,5 @@ const proxy = http.createServer((req, res) => {
|
|
23
24
|
res.end();
|
24
25
|
});
|
25
26
|
|
26
|
-
console.log(
|
27
|
-
proxy.listen(
|
27
|
+
console.log(`Listening on localhost:${port}`);
|
28
|
+
proxy.listen(port, '127.0.0.1');
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prism-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Johnstone
|
@@ -35,22 +35,22 @@ description: "\n## Prism\n\nBuild React-style web apps with Ruby and WebAssembly
|
|
35
35
|
to the web.\n\nmruby is similar in many ways to cruby and will be a familiar experience
|
36
36
|
for someone who has only used the mainline interpreter. The most notable exception
|
37
37
|
is that mruby only supports syntax up to ruby 1.9, which means there are no keyword
|
38
|
-
arguments or safe traversal operator.\n\nThere are a number of other
|
38
|
+
arguments or safe traversal operator.\n\nThere are a number of other small differences,
|
39
39
|
and it's worth reviewing the [mruby limitations documentation](https://github.com/mruby/mruby/blob/master/doc/limitations.md).\n\nIf
|
40
40
|
you run `prism init`, it will create a sample application that makes a good starting
|
41
41
|
point. This is the code it outputs:\n\n```ruby\nclass HelloWorld < Prism::Component\n
|
42
42
|
\ attr_accessor :name\n\n def initialize(name = \"World\")\n @name = name\n
|
43
43
|
\ end\n\n def render\n div(\".hello-world\", [\n input(onInput: call(:name=).with_target_data(:value)),\n
|
44
44
|
\ div(\"Hello, #{name}\")\n ])\n end\nend\n\nPrism.mount(HelloWorld.new)\n```\n\nLet's
|
45
|
-
break this down piece by piece.\n\n```ruby\nclass HelloWorld < Prism::Component\n```\n\nMuch
|
46
|
-
like Rails, Prism provides most of it's functionality through
|
47
|
-
|
48
|
-
anyone who has worked with JS frameworks like React.\n\n`Prism::Component`
|
49
|
-
helper methods for creating virtual dom elements, and for handling events.\n\n```ruby\n
|
45
|
+
break this down piece by piece.\n\n----------\n\n```ruby\nclass HelloWorld < Prism::Component\n```\n\nMuch
|
46
|
+
like Rails, Prism provides most of it's functionality through base classes that
|
47
|
+
you should inherit from.\n\nThe key concept in Prism is a Component, which should
|
48
|
+
be familiar to anyone who has worked with JS frameworks like React, Vue or similar.\n\n`Prism::Component`
|
49
|
+
provides helper methods for creating virtual dom elements, and for handling events.\n\n----------\n\n```ruby\n
|
50
50
|
\ attr_accessor :name\n\n def initialize(name = \"World\")\n @name = name\n
|
51
51
|
\ end\n```\n\nThis is fairly standard Ruby, and there's nothing actually unique
|
52
52
|
to Prism or mruby going on. Note that we're defining an `attr_accessor` rather than
|
53
|
-
just an `attr_reader`, so that we can set the name directly when it changes.\n\n\n```ruby\n
|
53
|
+
just an `attr_reader`, so that we can set the name directly when it changes.\n\n----------\n\n```ruby\n
|
54
54
|
\ def render\n div(\".hello-world\", [\n input(onInput: call(:name=).with_target_data(:value)),\n
|
55
55
|
\ div(\"Hello, #{name}\")\n ])\n end\n```\n\nIt's expected that Prism components
|
56
56
|
implement a `#render` method that returns a representation of what the current view
|
@@ -60,32 +60,40 @@ description: "\n## Prism\n\nBuild React-style web apps with Ruby and WebAssembly
|
|
60
60
|
with options to configure the attributes, props, styles, classes and event listeners,
|
61
61
|
and an array of child elements.\n\nPrism's virtual dom is powered by `snabddom`,
|
62
62
|
a tried and true lightweight JavaScript vdom library. For the most part, the API
|
63
|
-
is simply passed through to snabbdom, so it's worth reading the [snabddom docs](https://github.com/mruby/mruby/blob/master/doc/limitations.md).\n\n\n```ruby\n
|
63
|
+
is simply passed through to snabbdom, so it's worth reading the [snabddom docs](https://github.com/mruby/mruby/blob/master/doc/limitations.md).\n\n----------\n\n```ruby\n
|
64
64
|
\ input(onInput: call(:name=).with_target_data(:value)),\n```\n\nThe most interesting
|
65
65
|
line in this example is the event handler for the `input` event.\n\n`Prism::Component`
|
66
66
|
defines a `#call` method that you can use to call methods on your component when
|
67
67
|
events occur.\n\n`#call` takes a symbol that is the method name to call, and any
|
68
68
|
arguments you want passed to the method.\n\nYou can also include data from the event
|
69
69
|
or target element using `.with_event_data` and `.with_target_data`. These methods
|
70
|
-
can be chained as needed.\n\n\n```ruby\nPrism.mount(HelloWorld.new)\n```\n\nThe
|
70
|
+
can be chained as needed.\n\n----------\n\n```ruby\nPrism.mount(HelloWorld.new)\n```\n\nThe
|
71
71
|
last line mounts the HelloWorld component. Prism is currently hardcoded to mount
|
72
72
|
to an element with id `#root` on load. In future this will be configurable.\n\n\n###
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
\
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
*
|
86
|
-
|
87
|
-
\
|
88
|
-
|
73
|
+
Components and State\n\nPrism aims to provide a component system that should feel
|
74
|
+
very similar to most virtual dom based JavaScript frameworks.\n\nYou can nest Prism
|
75
|
+
components, and use instances of Prism components directly when rendering in place
|
76
|
+
of dom elements.\n\nPrism has no explicit state management built in, preferring
|
77
|
+
to rely on Ruby's built-in state management tools, primarily instance variables
|
78
|
+
in class instances.\n\nComponents in a Prism app persist in memory, and will often
|
79
|
+
have multiple methods call over their lifetime.\n\nLarger Prism applications would
|
80
|
+
likely benefit from adapting a more structured approach to managing certain parts
|
81
|
+
of state, a la Redux.\n\n\n### API\n\n#### **`Prism::Component`**\n\n##### `#div(identifier,
|
82
|
+
options, children), #img, #p, ...`\n\nHelpers for creating virtual dom elements.
|
83
|
+
There is a method for every type DOM element.\n\nThe arguments are all optional
|
84
|
+
and can be provided in any order for convenience.\n\nArguments:\n\n - `identifier`
|
85
|
+
*string, optional* - A shorthand for setting the id and classes. E.g. `\"#login\"`,
|
86
|
+
`.alert`, `#header.flex.dark`\n\n - `options` *object, optional* - Element configuration\n\n
|
87
|
+
\ - `attrs` *object, optional* - Attributes that are set when the element is created.
|
88
|
+
Equivalent to putting items directly into the element in the HTML.\n - `props`
|
89
|
+
*object, optional* - Props to be set on the object.\n - `style` *object, optional*
|
90
|
+
- Element styles, keys are css properties and values are strings.\n - `class`
|
91
|
+
*object, optional* - Keys are class names, values are booleans indicating whether
|
92
|
+
or not the class is active. An easy way to add or remove classes based on a condition.\n
|
93
|
+
\ - `on` *function, optional* - Keys are browser events (like `click` or `input`),
|
94
|
+
values are `Prism::EventHandler` instances. See below on how to create `EventHandler`
|
95
|
+
instances. Additionally, there are a number of aliases that let you set event handlers
|
96
|
+
directly on the `options` object. The full list that is currently aliased is: `onClick`,
|
89
97
|
`onChange`, `onInput`, `onMousedown`, `onMouseup`, `onKeydown`, `onKeyup` and `onScroll`\n\n
|
90
98
|
\ - `children` *array or string, optional* - Either a string of content for the
|
91
99
|
element or an array of children. Each child should either be a string, a virtual
|
@@ -97,25 +105,28 @@ description: "\n## Prism\n\nBuild React-style web apps with Ruby and WebAssembly
|
|
97
105
|
will change in future.\n\n##### `#prevent_default`\n\nTakes no arguments, returns
|
98
106
|
a `Prism::EventHandler` that does nothing but call `event.preventDefault()`.\n\n#####
|
99
107
|
`#stop_propagation`\n\nTakes no arguments, returns a `Prism::EventHandler` that
|
100
|
-
does nothing but call `event.stopPropagation()`.\n\n
|
108
|
+
does nothing but call `event.stopPropagation()`.\n\n---------\n\n#### **`Prism::EventHandler`**\n\nRepresents
|
101
109
|
a handler for an event, with a method to call and arguments to pass. The arguments
|
102
110
|
are a mixture of values passed from Ruby and values pulled from the event and targed
|
103
111
|
in JS. The order of arguments is based on how the event handler was constructed.\n\n#####
|
104
|
-
`#with_args(*args)`\n\nAdds arguments to an existing event handler.\n\n
|
112
|
+
`#with_args(*args)`\n\nAdds arguments to an existing event handler.\n\n##### `#with_event`\n\nAdd
|
105
113
|
an event argument to the handler. When the method is called, a serialized version
|
106
|
-
of the event will be passed.\n\n
|
114
|
+
of the event will be passed.\n\n##### `#with_event_data(*properties)`\n\nAdd arguments
|
107
115
|
that contain data from the event. The properties should be either a string or a
|
108
116
|
symbol. One property you might want to extract from the event is `:key` for `keydown`
|
109
|
-
events.\n\n
|
110
|
-
from the target element. The properties should be either a string or a symbol.
|
111
|
-
could for example extract the `:value` of an `input` or the `:checked` field
|
112
|
-
a tickbox.\n\n
|
113
|
-
when it occurs.\n\n
|
117
|
+
events.\n\n##### `#with_target_data(*properties)`\n\nAdd arguments that contain
|
118
|
+
data from the target element. The properties should be either a string or a symbol.
|
119
|
+
You could for example extract the `:value` of an `input` or the `:checked` field
|
120
|
+
of a tickbox.\n\n##### `#prevent_default`\n\nCalls `.preventDefault()` on the event
|
121
|
+
when it occurs.\n\n##### `#stop_propagation`\n\nCalls `.stopPropagation()` on the
|
114
122
|
event when it occurs.\n\n#### Examples:\n\n`call(:name=).with_target_data(:value)`
|
115
123
|
- calls a setter with the content of the target element\n`call(:goto_page, 5).with_event`
|
116
124
|
- calls a method with the number 5 as the first argument and the event data as the
|
117
|
-
second\n\n
|
118
|
-
|
125
|
+
second\n\n#### `Prism.mount(component)`\n\nTakes an instance of a `Prism::Component`
|
126
|
+
and returns a `Prism::MountPoint`.\n\nThe `MountPoint` should be the result of the
|
127
|
+
last expression in the file, as it is used by the Prism C and JS runtime to interact
|
128
|
+
with the application.\n\n### Future\n\nAs mentioned above, Prism is still in extremely
|
129
|
+
early development. The following would be nice to have but has yet to be implemented.\n\n
|
119
130
|
- support for require\n - transpile modern ruby syntax to 1.9\n - a way for users
|
120
131
|
to make their own IO drivers\n - built in support for HTTP\n - compile time improvements\n
|
121
132
|
- fallback to asm.js for old browsers\n - rails integration\n - SSR\n - sourcemaps
|
@@ -125,8 +136,21 @@ description: "\n## Prism\n\nBuild React-style web apps with Ruby and WebAssembly
|
|
125
136
|
[get in touch with me](mailto:ncwjohnston@gmail.com).\n\nPrism is currently developed
|
126
137
|
by a single person (who also has a lot of other ambitious projects). I would love
|
127
138
|
to have some other people to help share the load. There's lots of low hanging fruit
|
128
|
-
still to be plucked.\n\n###
|
129
|
-
|
139
|
+
still to be plucked.\n\n### Supporting Prism Development\n\nMost open source projects
|
140
|
+
are built on a mountain of unpaid labour. Even hugely successful projects that have
|
141
|
+
good funding tend to have a history of excess unpaid labour to get to that point.\n\nPrism
|
142
|
+
is taking a different approach, by launching with an Open Collective page. We're
|
143
|
+
using Open Collective because it enables us to fund Prism as a project rather than
|
144
|
+
one particular person. Funds in the Open Collective will only go towards future
|
145
|
+
development.\n\nIf you think this is a worthwhile project, please support us on
|
146
|
+
Open Collective. If you think your company could benefit from Prism in the future,
|
147
|
+
please advocate for your company to financially support Prism.\n\nMy main goal around
|
148
|
+
starting Prism with funding is that I want as much of the work that's done on Prism
|
149
|
+
as possible to be reimbursed, no matter who's doing it. The other aspect is that
|
150
|
+
I don't have very much spare time for projects but if I can get paid for my work
|
151
|
+
I can do Prism as part of my day to day contract work.\n\n*[Support Prism on Open
|
152
|
+
Collective]*(https://opencollective.com/prism)\n\n### License\n\nPrism is available
|
153
|
+
under the MIT license. Please see the LICENSE file for more details.\n"
|
130
154
|
email: ncwjohnstone@gmail.com
|
131
155
|
executables:
|
132
156
|
- prism
|
@@ -169,7 +193,7 @@ files:
|
|
169
193
|
- mruby/include/mruby/version.h
|
170
194
|
- src/prism.rb
|
171
195
|
- wasm-server.js
|
172
|
-
homepage: https://
|
196
|
+
homepage: https://github.com/prism/prism-rb
|
173
197
|
licenses:
|
174
198
|
- MIT
|
175
199
|
metadata: {}
|