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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/bin/prism +8 -3
  3. data/dist/prism.js +106 -9
  4. data/wasm-server.js +3 -2
  5. metadata +63 -39
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 36c0324f6446d57063c551c9a6114912bec8b704f5d4d8033cf986825741e5ff
4
- data.tar.gz: 06224fb7480df29efc2300d3348f1cc549bc7367a1e96ad09bc3676021eacaa0
3
+ metadata.gz: 2f3d4a35ffb324e0a1d22b93747940ec6bdb07a1c059bebc361ba4372b15629d
4
+ data.tar.gz: 247be9c22ca8206425f033252d0dcadaaf2aabff39fba7675511018d709fd711
5
5
  SHA512:
6
- metadata.gz: 74fd836765795168ab1e53a4e7f3f208cc29aea243ce2fae03e7717e47ffe5f3b1635aa92ab84eba2d32b2f8b794d90161acc1d60a1ee1395ebd082f5b58abf3
7
- data.tar.gz: 834a5eb37a9560eea1528f49f7691487e746ea40a6011e8114400ca130628219c382f358fed19843cb545c3b667742f1f2ddb5c79d02e44c90ba3cfc1a13ba7e
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
- `node #{__dir__}/../wasm-server.js`
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
- server
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":10}],2:[function(require,module,exports){
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
- },{}],5:[function(require,module,exports){
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
- },{}],6:[function(require,module,exports){
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
- },{}],7:[function(require,module,exports){
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
- },{}],8:[function(require,module,exports){
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":9,"./vnode":10}],9:[function(require,module,exports){
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}],10:[function(require,module,exports){
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
- },{}],11:[function(require,module,exports){
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":8,"snabbdom/h":1,"snabbdom/modules/class":4,"snabbdom/modules/eventlisteners":5,"snabbdom/modules/props":6,"snabbdom/modules/style":7}]},{},[11]);
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("Listening on localhost:3042");
27
- proxy.listen(3042, '127.0.0.1');
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.6
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 samll differences,
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 inheriting from base
47
- classes.\n\nThe key concept in Prism is a Component, which should be familiar to
48
- anyone who has worked with JS frameworks like React.\n\n`Prism::Component` provides
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
- API\n\n#### **`Prism::Component`**\n\n##### `#div(identifier, options, children),
74
- #img, #p, ...`\n\nHelpers for creating virtual dom elements. There is a method for
75
- every type DOM element.\n\nThe arguments are all optional and can be provided in
76
- any order for convenience.\n\nArguments:\n\n - `identifier` *string, optional*
77
- - A shorthand for setting the id and classes. E.g. `\"#login\"`, `.alert`, `#header.flex.dark`\n\n
78
- \ - `options` *object, optional* - Element configuration\n\n - `attrs` *object,
79
- optional* - Attributes that are set when the element is created. Equivalent to putting
80
- items directly into the element in the HTML.\n - `props` *object, optional* -
81
- Props to be set on the object.\n - `style` *object, optional* - Element styles,
82
- keys are css properties and values are strings.\n - `class` *object, optional*
83
- - Keys are class names, values are booleans indicating whether or not the class
84
- is active. An easy way to add or remove classes based on a condition.\n - `on`
85
- *function, optional* - Keys are browser events (like `click` or `input`), values
86
- are `Prism::EventHandler` instances. See below on how to create `EventHandler` instances.
87
- \ Additionally, there are a number of aliases that let you set event handlers directly
88
- on the `options` object. The full list that is currently aliased is: `onClick`,
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\n\n#### **`Prism::EventHandler`**\n\nRepresents
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#### `#with_event`\n\nAdd
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#### `#with_event_data(*properties)`\n\nAdd arguments
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#### `#with_target_data(*properties)`\n\nAdd arguments that contain data
110
- from the target element. The properties should be either a string or a symbol. You
111
- could for example extract the `:value` of an `input` or the `:checked` field of
112
- a tickbox.\n\n#### `#prevent_default`\n\nCalls `.preventDefault()` on the event
113
- when it occurs.\n\n#### `#stop_propagation`\n\nCalls `.stopPropagation()` on the
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\n### Future\n\nAs mentioned above, Prism is still in extremely early
118
- development. The following would be nice to have but has yet to be implemented.\n\n
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### License\n\nPrism is available under the MIT license.
129
- Please see the LICENSE file for more details.\n"
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://rubygems.org/gems/prism-cli
196
+ homepage: https://github.com/prism/prism-rb
173
197
  licenses:
174
198
  - MIT
175
199
  metadata: {}