An emulator of user behavioural actions for SPAs. Could be used as a part of Remote Control functionality.
https://artsiom.mezin.eu/preoccupyjs/docs
The main idea of the PreoccupyJS package is to emulate users actions within a remote-controlled SPA and to change the SPA's DOM accordingly.
Under the hood PreoccupyJS consists of the next main parts:
PreoccupyJS doesn't provide any functionality to grab, broadcast, or present Screen Media streams. You have to take care about this part of fuctionality separetly.
Install from NPM
npm install --save-dev preoccupyjs
On the Host side:
import { Host, RxjsTransport } from 'preoccupyjs';
const hostEl = document.createElement('div'); // fill free to style and modify this element as you wish, but don't delete it!
hostEl.tabIndex = 0; // make it focusable
const transport = new RxjsTransport(options as {
subject: Subject<object>; // an AnonymousSubject, e.g. WebSocketSubject
wrapFn?: (data: Message) => object; // wraps a preoccupyJS message to make it fits for your Subject type
});
const host = new Host(transport, hostEl);
host.start(); // run the communication whenever your app is ready!
On the client side:
import { Host, RxjsTransport } from 'preoccupyjs';
const transport = new RxjsTransport(options as {
subject: Subject<object>; // an AnonymousSubject, e.g. WebSocketSubject
filterFn?: (rawMsg: object) => boolean; // filter all messages in subject to avoid non-preoccupyjs related
});
const client = new Client(transport, new DomController(document.body)); // you can specify the controlled scope of the page by passing any other DOM element
client.start(); // run the communication whenever your app is ready!
You can import the generated bundle to use the whole library generated by this starter:
import { createHost, createClient } from 'preoccupyjs';
Additionally, you can import the transpiled modules (transports, actions) from dist/lib
:
import { DblClickToAction } from 'preoccupyjs/lib/actions/DblClickToAction';
npm t
: Run test suitenpm start
: Run npm run build
in watch modenpm run test:watch
: Run test suite in interactive watch modenpm run test:prod
: Run linting and generate coveragenpm run build
: Generate bundles and typings, create docsnpm run lint
: Lints codenpm run commit
: Commit using conventional commit style (husky will tell you to use it if you haven't :wink:)On library development, one might want to set some peer dependencies, and thus remove those from the final bundle. You can see in Rollup docs how to do that.
Good news: the setup is here for you, you must only include the dependency name in external
property within rollup.config.js
. For example, if you want to exclude lodash
, just write there external: ['lodash']
.
Prerequisites: you need to create/login accounts and add your project to:
Prerequisite for Windows: Semantic-release uses node-gyp so you will need to install Microsoft's windows-build-tools using this command:
npm install --global --production windows-build-tools
Follow the console instructions to install semantic release and run it (answer NO to "Do you want a .travis.yml
file with semantic-release setup?").
Note: make sure you've setup repository.url
in your package.json
file
npm install -g semantic-release-cli
semantic-release-cli setup
# IMPORTANT!! Answer NO to "Do you want a `.travis.yml` file with semantic-release setup?" question. It is already prepared for you :P
From now on, you'll need to use npm run commit
, which is a convenient way to create conventional commits.
Automatic releases are possible thanks to semantic release, which publishes your code automatically on github and npm, plus generates automatically a changelog. This setup is highly influenced by Kent C. Dodds course on egghead.io
There is already set a precommit
hook for formatting your code with Prettier :nail_care:
By default, there are two disabled git hooks. They're set up when you run the npm run semantic-release-prepare
script. They make sure:
git push
This makes more sense in combination with automatic releases
Array.prototype.from
, Promise
, Map
... is undefined?TypeScript or Babel only provides down-emits on syntactical features (class
, let
, async/await
...), but not on functional features (Array.prototype.find
, Set
, Promise
...), . For that, you need Polyfills, such as core-js
or babel-polyfill
(which extends core-js
).
For a library, core-js
plays very nicely, since you can import just the polyfills you need:
import "core-js/fn/array/find"
import "core-js/fn/string/includes"
import "core-js/fn/promise"
...
Contributions of any kind are welcome!
Generated using TypeDoc