Comparing version 2.0.12 to 2.0.13
20
index.js
@@ -43,3 +43,3 @@ var SSR_NODE = 1 | ||
var patchSubs = (oldSubs, newSubs, dispatch) => { | ||
var patchSubs = (oldSubs, newSubs = EMPTY_ARR, dispatch) => { | ||
for ( | ||
@@ -370,7 +370,7 @@ var subs = [], i = 0, oldSub, newSub; | ||
export var app = ({ | ||
init = EMPTY_OBJ, | ||
node, | ||
view, | ||
subscriptions, | ||
dispatch = id, | ||
node, | ||
init = EMPTY_OBJ, | ||
}) => { | ||
@@ -382,8 +382,6 @@ var vdom = node && recycleNode(node) | ||
var setState = (newState) => { | ||
var update = (newState) => { | ||
if (state !== newState) { | ||
state = newState | ||
if (subscriptions) { | ||
subs = patchSubs(subs, subscriptions(state), dispatch) | ||
} | ||
if ((state = newState) == null) dispatch = subscriptions = render = id | ||
if (subscriptions) subs = patchSubs(subs, subscriptions(state), dispatch) | ||
if (view && !busy) enqueue(render, (busy = true)) | ||
@@ -418,7 +416,5 @@ } | ||
(fx) => fx && fx !== true && fx[0](dispatch, fx[1]), | ||
setState(action[0]) | ||
update(action[0]) | ||
) | ||
: action == null | ||
? patchSubs(subs, EMPTY_ARR, (dispatch = id)) | ||
: setState(action) | ||
: update(action) | ||
))(init), | ||
@@ -425,0 +421,0 @@ dispatch |
{ | ||
"name": "hyperapp", | ||
"version": "2.0.12", | ||
"version": "2.0.13", | ||
"type": "module", | ||
@@ -12,3 +12,3 @@ "main": "index.js", | ||
"files": [ | ||
"*.js*" | ||
"*.[tj]s" | ||
], | ||
@@ -25,6 +25,5 @@ "keywords": [ | ||
"scripts": { | ||
"release": "tag=$(npm run --silent which) npm run deploy && cd ./${pkg:+packages/$pkg} && npm publish --access public", | ||
"test": "c8 twist tests/*.js", | ||
"deploy": "npm test && git commit --all --message $tag && git tag --sign $tag --message $tag && git push && git push --tags", | ||
"which": "node --print \"('$pkg' ? '@$npm_package_name/$pkg@' : '') + require('./${pkg:+packages/$pkg/}package').version\"", | ||
"test": "c8 twist tests/*.js" | ||
"release": "tag=$npm_package_version npm run deploy && npm publish --access public" | ||
}, | ||
@@ -31,0 +30,0 @@ "devDependencies": { |
109
README.md
@@ -6,95 +6,66 @@ # Hyperapp | ||
- **Do more with less**—We have minimized the concepts you need to learn to get stuff done. Views, actions, effects, and subscriptions are all pretty easy to get to grips with and work together seamlessly. | ||
- **Write what, not how**—With a declarative API that's easy to read and fun to write, Hyperapp is the best way to build purely functional, feature-rich, browser-based apps in JavaScript. | ||
- **Smaller than a favicon**—1 kB, give or take. Hyperapp is an ultra-lightweight Virtual DOM, highly-optimized diff algorithm, and state management library obsessed with minimalism. | ||
- **Write what, not how**—With a declarative API that's easy to read and fun to write, Hyperapp is the best way to build purely functional, feature-rich, browser-based apps using idiomatic JavaScript. | ||
- **Smaller than a favicon**—1 kB, give or take. Hyperapp is an ultra-lightweight Virtual DOM, [highly-optimized diff algorithm](https://javascript.plainenglish.io/javascript-frameworks-performance-comparison-2020-cd881ac21fce), and state management library obsessed with minimalism. | ||
Here's the first example to get you started—look ma' no bundlers! [Try it in your browser](https://codepen.io/jorgebucaran/pen/zNxZLP?editors=1000). | ||
Here's the first example to get you started. [Try it here](https://codepen.io/jorgebucaran/pen/zNxZLP?editors=1000)—no build step required! | ||
<!-- prettier-ignore --> | ||
```html | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<script type="module"> | ||
import { h, text, app } from "https://unpkg.com/hyperapp" | ||
<script type="module"> | ||
import { h, text, app } from "https://unpkg.com/hyperapp" | ||
const AddTodo = (state) => ({ | ||
...state, | ||
value: "", | ||
todos: state.todos.concat(state.value), | ||
}) | ||
const AddTodo = (state) => ({ | ||
...state, | ||
value: "", | ||
todos: state.todos.concat(state.value), | ||
}) | ||
const NewValue = (state, event) => ({ | ||
...state, | ||
value: event.target.value, | ||
}) | ||
const NewValue = (state, event) => ({ | ||
...state, | ||
value: event.target.value, | ||
}) | ||
app({ | ||
init: { todos: [], value: "" }, | ||
view: ({ todos, value }) => | ||
h("main", {}, [ | ||
h("h1", {}, text("To do list")), | ||
h("input", { type: "text", oninput: NewValue, value }), | ||
h("ul", {}, | ||
todos.map((todo) => h("li", {}, text(todo))) | ||
), | ||
h("button", { onclick: AddTodo }, text("New!")), | ||
]), | ||
node: document.getElementById("app"), | ||
}) | ||
</script> | ||
</head> | ||
<body> | ||
<main id="app"></main> | ||
</body> | ||
</html> | ||
app({ | ||
init: { todos: [], value: "" }, | ||
view: ({ todos, value }) => | ||
h("main", {}, [ | ||
h("h1", {}, text("To do list")), | ||
h("input", { type: "text", oninput: NewValue, value }), | ||
h("ul", {}, | ||
todos.map((todo) => h("li", {}, text(todo))) | ||
), | ||
h("button", { onclick: AddTodo }, text("New!")), | ||
]), | ||
node: document.getElementById("app"), | ||
}) | ||
</script> | ||
<main id="app"></main> | ||
``` | ||
Now that you have poked around the code a bit, you may have some questions. What is `init` and `view`, and how do they fit together? The app starts off with `init`, where we set the initial state. The `view` returns a plain object that represents how we want the DOM to look (the virtual DOM) and Hyperapp takes care of modifying the actual DOM to match this specification whenever the state changes. That's really all there is to it. | ||
[Check out more examples](https://codepen.io/collection/nLLvrz?grid_type=grid) | ||
Ready to dive in? Learn the basics in the [tutorial](docs/tutorial.md) or visit the [API reference](docs/reference.md) for more documentation. If you prefer to learn by studying real-world examples, you can browse our [awesome list of resources](https://github.com/jorgebucaran/hyperawesome) too. | ||
The app starts by setting the initial state and rendering the view on the page. User input flows into actions, whose function is to update the state, causing Hyperapp to re-render the view. | ||
When describing how a page looks in Hyperapp, we don't write markup. Instead, we use `h()` and `text()` to create a lightweight representation of the DOM (or virtual DOM for short), and Hyperapp takes care of updating the real DOM efficiently. | ||
## Installation | ||
Install Hyperapp with npm or Yarn: | ||
```console | ||
npm i hyperapp | ||
npm install hyperapp | ||
``` | ||
Then with a module bundler like [Rollup](https://rollupjs.org) or [Webpack](https://webpack.js.org) import it in your application and get right down to business. | ||
## Documentation | ||
```js | ||
import { h, text, app } from "hyperapp" | ||
``` | ||
Ready to dive in? Learn the basics in the [Tutorial](docs/tutorial.md), check out the [Examples](https://codepen.io/collection/nLLvrz?grid_type=grid), or visit the [Reference](docs/reference.md) for more detail. | ||
Don't want to set up a build step? Import Hyperapp in a `<script>` tag as a module. Don't worry; modules are supported in all evergreen, self-updating desktop, and mobile browsers. | ||
To access [Web Platform APIs](https://platform.html5.org) (like `fetch` or `addEventListener`) in a way that makes sense for Hyperapp, learn [how to create your own effects and subscriptions](/docs/architecture/subscriptions.md). For everything else, from third-party packages to real-world examples, browse the [Hyperawesome](https://github.com/jorgebucaran/hyperawesome) collection. | ||
```html | ||
<script type="module"> | ||
import { h, text, app } from "https://unpkg.com/hyperapp" | ||
</script> | ||
``` | ||
## Packages | ||
Official packages provide access to [The Web Platform](https://platform.html5.org), and ensure that the APIs are exposed in a way that makes sense for Hyperapp, and the underlying code is stable. We already cover a decent amount of features, but you can always [create your own effects and subscriptions](docs/reference.md) if something is not available yet. | ||
| Package | Status | About | | ||
| ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | | ||
| [`@hyperapp/dom`](/packages/dom) | [![npm](https://img.shields.io/badge/-planned-6a737d?style=for-the-badge&label=)](https://www.npmjs.com/package/@hyperapp/dom) | Manipulate the DOM, focus, blur, and measure elements. | | ||
| [`@hyperapp/svg`](/packages/svg) | [![npm](https://img.shields.io/npm/v/@hyperapp/svg.svg?style=for-the-badge&color=0366d6&label=)](https://www.npmjs.com/package/@hyperapp/svg) | Draw SVG with plain functions. | | ||
| [`@hyperapp/html`](/packages/html) | [![npm](https://img.shields.io/npm/v/@hyperapp/html.svg?style=for-the-badge&color=0366d6&label=)](https://www.npmjs.com/package/@hyperapp/html) | Write HTML with plain functions. | | ||
| [`@hyperapp/time`](/packages/time) | [![npm](https://img.shields.io/npm/v/@hyperapp/time.svg?style=for-the-badge&color=0366d6&label=)](https://www.npmjs.com/package/@hyperapp/time) | Subscribe to intervals, get the time. | | ||
| [`@hyperapp/http`](/packages/http) | [![npm](https://img.shields.io/npm/v/@hyperapp/http.svg?style=for-the-badge&color=0366d6&label=)](https://www.npmjs.com/package/@hyperapp/http) | Talk to servers, make HTTP requests. | | ||
| [`@hyperapp/events`](/packages/events) | [![npm](https://img.shields.io/npm/v/@hyperapp/events.svg?style=for-the-badge&color=0366d6&label=)](https://www.npmjs.com/package/@hyperapp/events) | Subscribe animation frames, keyboard, mouse, window, and more. | | ||
| [`@hyperapp/random`](/packages/random) | [![npm](https://img.shields.io/badge/-planned-6a737d?style=for-the-badge&label=)](https://www.npmjs.com/package/@hyperapp/random) | Declarative random numbers and values. | | ||
| [`@hyperapp/navigation`](/packages/navigation) | [![npm](https://img.shields.io/badge/-planned-6a737d?style=for-the-badge&label=)](https://www.npmjs.com/package/@hyperapp/navigation) | Subscribe and manage the browser URL history. | | ||
## Help, I'm stuck! | ||
Don't panic! If you've hit a stumbling block, hop on the [Hyperapp Slack](https://join.slack.com/t/hyperapp/shared_invite/zt-frxjw3hc-TB4MgH4t74iPrY05KF9Jcg) to get help, and if you don't receive an answer, or if you remain stuck, [please file an issue](https://github.com/jorgebucaran/hyperapp/issues/new), and we'll figure it out together. | ||
If you've hit a stumbling block, hop on our [Discord](https://discord.gg/5CtfCYEq8V) server to get help, and if you remain stuck, [please file an issue](https://github.com/jorgebucaran/hyperapp/issues/new), and we'll help you figure it out. | ||
## Contributing | ||
Hyperapp is free and open source software. If you love Hyperapp, becoming a contributor or [sponsoring](https://github.com/sponsors/jorgebucaran) is the best way to give back. Thank you to everyone who already contributed to Hyperapp! | ||
Hyperapp is free and open-source software. If you love Hyperapp, becoming a contributor or [sponsoring](https://github.com/sponsors/jorgebucaran) is the best way to give back. Thank you to everyone who already contributed to Hyperapp! | ||
@@ -101,0 +72,0 @@ [![](https://opencollective.com/hyperapp/contributors.svg?width=1024&button=false)](https://github.com/jorgebucaran/hyperapp/graphs/contributors) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
22339
5
530
76