prism-cli 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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: {}
|