diff --git a/ivette/.gitignore b/ivette/.gitignore index 20f8498402296474789aa4240bdc0a5d51010dca..da037a9e2fa9fa6eb676dcadabf0f8486c4b79bf 100644 --- a/ivette/.gitignore +++ b/ivette/.gitignore @@ -9,7 +9,6 @@ yarn.lock yarn-error.log /bin /dist -/build /doc/html # -------------------------------------------------------------------------- diff --git a/ivette/Makefile b/ivette/Makefile index c450fa9dcc9157419a69d43c923e1e1f4954c005..bde89ca5f3448b5e1f3f7531d55b2bbf62eda872 100644 --- a/ivette/Makefile +++ b/ivette/Makefile @@ -8,7 +8,7 @@ DOME_API=./src/frama-c COPYRIGHT=CEA LIST / LSL # -------------------------------------------------------------------------- -.PHONY: all app dev doc dist typecheck lint +.PHONY: all app dev doc serve dist typecheck lint all: typecheck lint app @@ -28,23 +28,43 @@ lint: dome-pkg dome-templ # --- Ivette Documentation # -------------------------------------------------------------------------- -# can also use dome-doc to generate Dome-only documentation +VERSION=$(shell echo "console.log(require('./package.json').version)" | node -) -D_JSDOC=$(CURDIR)/node_modules/.bin/jsdoc -D_ICONS=$(addprefix $(DOME)/doc/template/gallery-, head.html icons.html tail.html) -D_OUT=./doc/html +DOC_ICONS_CSS= src/dome/doc/gallery.css +DOC_ICONS_MAKE= src/dome/doc/iconsmd.js +DOC_ICONS_DATA= src/dome/src/renderer/controls/icons.json +DOC_GUIDES= src/dome/doc/guides -doc: $(D_JSDOC) $(D_ICONS) - @echo "[Ivette] documentation" - @rm -fr ./build ./doc - @yarn run build - @mkdir -p ./doc/html - @(APP=$(APP) COPYRIGHT="$(COPYRIGHT)" DOME=$(DOME) \ - yarn exec jsdoc -- -c jsdoc.json -d doc/html) - @cat $(D_ICONS) > $(D_OUT)/tutorial-icons.html - @cp -f $(DOME)/doc/gallery.css $(D_OUT)/styles/ - @cp -f $(DOME)/doc/tutorials/*.png $(D_OUT)/ - @echo "[Ivette] $(DOME_DOC)/index.html" +NODEBIN= ./node_modules/.bin + +doc: $(NODEBIN)/typedoc + @echo "\n[Ivette] documentation" + @rm -fr doc/html + @yarn run typedoc + @mkdir -p doc/html/guides + @echo "\n[Ivette] guides" + @node $(DOC_ICONS_MAKE) $(DOC_ICONS_DATA) > doc/html/guides/icons.md + @cp $(DOC_ICONS_CSS) doc/html/assets/css/ + @find $(DOC_GUIDES) -name "*.md" -exec cp -f {} doc/html/guides/ \; + @find doc/html/guides -name "*.md" -print -exec pandoc \ + --standalone --toc --toc-depth=2 --to html \ + --template doc/pandoc/template.html \ + --metadata title="Ivette Documentation" \ + --metadata version="v$(VERSION)" \ + --metadata-file=doc/pandoc/index.json \ + --lua-filter doc/pandoc/href.lua \ + {} -o {}.html \; -delete + @echo "\n[Ivette] main page" + @echo " file://$(PWD)/doc/html/index.html" + +# For searching the doc +serve: $(NODEBIN)/serve + @echo "[Ivette] serve doc documentation" + @yarn run serve doc/html + +$(NODEBIN)/%: + @echo "[Node] install package $*" + yarn add -D $* # -------------------------------------------------------------------------- # --- Ivette Plugins diff --git a/ivette/README.md b/ivette/README.md index 1c38042881e4dbf21e7724a716159cec0a8ae78b..ca9c70e965912edb4ce8a840534414d00a0c8f9d 100644 --- a/ivette/README.md +++ b/ivette/README.md @@ -1,3 +1,15 @@ +## Dome Framework Guides + +- [Dome Framework](guides/dome.md.html) +- [Quick Start](guides/quickstart.md.html) +- [Live Editing](guides/hotreload.md.html) +- [Application Design](guides/application.md.html) +- [Application Development](guides/development.md.html) +- [Styling Components](guides/styling.md.html) +- [Custom Hooks](guides/hooks.md.html) +- [Icon Gallery](guides/icons.md.html) +- [Glossary](guides/glossary.md.html) + ## Setup From the `./ivette` sub-directory of Frama-C main directory: @@ -10,7 +22,8 @@ $ make app Emacs mode configuration can be setup with Typescript, Web-mode and Tide packages which are all available with MELPA. For configuring your `.emacs` accordingly, -please look at the `EMACS.el`. This setup the Tide package to work with +please look at the `share/typescript-config.el` file. +This setup the Tide package to work with `typescript-mode` for `*.ts` files (see also `tsfmt.json` config file) and `web-mode` for `*.tsx` files. diff --git a/ivette/doc/pandoc/href.lua b/ivette/doc/pandoc/href.lua new file mode 100644 index 0000000000000000000000000000000000000000..080635d1533c0aee541b0c4b85bb8917b80bcd74 --- /dev/null +++ b/ivette/doc/pandoc/href.lua @@ -0,0 +1,4 @@ +function Link(el) + el.target = string.gsub(el.target, "%.md", ".md.html") + return el +end diff --git a/ivette/doc/pandoc/index.json b/ivette/doc/pandoc/index.json new file mode 100644 index 0000000000000000000000000000000000000000..34a59010156b256763292e5231e8fb7e3a93f71b --- /dev/null +++ b/ivette/doc/pandoc/index.json @@ -0,0 +1,13 @@ +{ + "guides": [ + { "page": "dome.md", "title": "Dome Framework" }, + { "page":"quickstart.md", "title": "Quick Start" }, + { "page":"hotreload.md", "title": "Live Editing" }, + { "page":"application.md", "title": "Application Design" }, + { "page":"development.md", "title": "Application Development" }, + { "page":"hooks.md", "title": "Custom React Hooks" }, + { "page":"icons.md", "title": "Icons Gallery" }, + { "page":"styling.md", "title": "styling" }, + { "page":"glossary.md", "title": "Glossary" } + ] +} diff --git a/ivette/doc/pandoc/template.html b/ivette/doc/pandoc/template.html new file mode 100644 index 0000000000000000000000000000000000000000..a2c6516d3d1b1ac67871f306521d7ea91aabcbbb --- /dev/null +++ b/ivette/doc/pandoc/template.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<html class="default no-js"> +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>$subtitle$ | $title$ – $version$</title> + $if(description)$ + <meta name="description" content="$description$"> + $endif$ + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="stylesheet" href="../assets/css/main.css"> + <link rel="stylesheet" href="../assets/css/gallery.css"> +</head> +<body> + <header> + <div class="tsd-page-toolbar"> + <div class="container"> + <div class="table-wrap"> + <div class="table-cell" id="tsd-search" + data-index="../assets/js/search.json" data-base="."> + <div class="field"> + <label for="tsd-search-field" class="tsd-widget search no-caption">Search</label> + <input id="tsd-search-field" type="text" /> + </div> + <ul class="results"> + <li class="state loading">Preparing search index...</li> + <li class="state failure">The search index is not available</li> + </ul> + <a href="../index.html" class="title">$title$ - $version$</a> + </div> + </div> + </div> + </div> + <div class="tsd-page-title"> + <div class="container"> + <ul class="tsd-breadcrumb"> + <li><a href="../globals.html">Globals</a></li> + </ul> + <h1 id="MAIN">$subtitle$</h1> + </div> + </div> + </header> + <div class="container container-main"> + <div class="row"> + <div class="col-8 col-content"> + <div class="tsd-panel tsd-typography"> + $body$ + </div> + </div> + <div class="col-4 col-menu menu-sticky-wrap menu-highlight"> + <nav class="tsd-navigation primary"> + <ul> + <li class="globals"><a href="../index.html"><em>$title$</em></a></li> + $for(guides)$ + <li><a href="$guides.page$.html">$guides.title$</a></li> + $endfor$ + </ul> + </nav> + <nav class="tsd-navigation secondary menu-sticky"> + <a href="#MAIN"><b>$subtitle$</b></a> + <ul class="before-current"> + $table-of-contents$ + </ul> + </nav> + </div> + </div> + </div> + <div class="overlay"></div> + <script src="../assets/js/main.js"></script> +</body> +</html> diff --git a/ivette/package.json b/ivette/package.json index 6e6fdbb307b69d351ef934e596df1bb51d33dc79..847f6c4cd4a65f95f1356a03c94d6e0be4f2702e 100644 --- a/ivette/package.json +++ b/ivette/package.json @@ -44,6 +44,9 @@ "html-loader": "1.0.0-alpha.0", "jsdoc": "^3.6.3", "react-hot-loader": "^4.12.20", + "serve": "^11.3.0", + "typedoc": "^0.17.6", + "typedoc-plugin-external-module-name": "^3.1.0", "typescript": "^3.8.3", "webpack": "^4.41.4" }, diff --git a/ivette/EMACS.el b/ivette/share/typescript-config.el similarity index 94% rename from ivette/EMACS.el rename to ivette/share/typescript-config.el index 0b474609b3cc917db56eca077d665273f2121952..bac505c7d20ee59d0a05090fc42aa6ec7f959c30 100644 --- a/ivette/EMACS.el +++ b/ivette/share/typescript-config.el @@ -18,8 +18,7 @@ (defun setup-txs-mode () (interactive) - (when (string-equal "tsx" - (file-name-extension buffer-file-name)) + (when (string-equal "tsx" (file-name-extension buffer-file-name)) (setup-tide-mode))) ;; aligns annotation to the right hand side diff --git a/ivette/src/dome/doc/guides/application.md b/ivette/src/dome/doc/guides/application.md new file mode 100644 index 0000000000000000000000000000000000000000..8abb0b0ebdce327a8a1cf2d20d71f4b28bc69a02 --- /dev/null +++ b/ivette/src/dome/doc/guides/application.md @@ -0,0 +1,121 @@ +--- +subtitle: Application Design +--- + +This tutorial introduces how to design a **Dome** application within the +**Electron** & **React** frameworks. You shall be reasonably familiar with +**React** concepts, but no knowledge of **Electron** is required. + +A desktop **Dome** application looks like a native application, but is actually +a static web page rendered in a **Chrome** web browser. This is what provides +the **Electron** framework by default. **Dome** is simply a library of **React** +components and development templates tuned together to enable professional +application development. + +This tutorial provides an overview of this environment and how to design a typical +**Dome** application. + +## System Architecture + +Following the **Electron** framework design, your application will consists of +two different processes interacting with each others. +One is responsible for the management of the main GUI resources +(windows, menu-bar, desktop interaction, user settings, etc.) +and is named the `Main` process. +The second one will be responsible for running the +web page holding the main application window, and is named the `Renderer` process. +Both kind of process communicates through the message-passing API provided by +the **Electron** framework. + +When several instances of your application are running simultaneously, each invokation +have its own window, running its owan, separate `Renderer` process. However, the +**Dome** framework automatically makes them sharing the same `Main` process. + +Hence, each application instance has its own working directory and command-line arguments, +depending on how its has been launched by the user. The **Dome** framework build +both command-line and desktop entry points, depending on each target platform. + +## Event Driven Design + +On the renderer process side, the **React** framework induces a natural design where +_Application State_ is separated from _Application Rendering_. Moreover, +following a popular design introduced with **Redux**, application rendering tend +to be written like a pure function (or _view_) on the state, where user +actions are just state updater callbacks. Each time the state is modified, the +entire application rendering is recomputed, and **React** computes a minimal +diff to apply on the web page displayed in the main application window. + +Putting everything together, its is recommended to design **Dome** application +into two different parts, both running in the `Renderer` process of each +application instance: + +- **Application Internals (State)** +holding your application state and data and updating it in response to user or +system events; + +- **Application Components (View)** +responsible for rendering the application main window and +binding callbacks to application services. + +<img src="dataflow.png" style="float: right; width: 30em"/> + +Such an architecture is typical of a _Model-View-Controller_ design, but +revisited to scale. In particular, data flow between those three different +layers shall follow a unique-direction pattern in order to avoid the +combinatorial explosion of interactions between components that is generally +observed in most Model-View-Controller designs. + +Hence, data-flow shall follow one of the following routes between these +three layers, illustrated above: + +- from `State` to `View` : your rendering components shall only access the +current application state and data; +- from `View` to `State` or `System` : user action callbacks shall only trigger +state update or system operation, not any other view direct modification. +- from `System` to `State` : upon completion, system services shall trigger state +updates that would in turn trigger new requests and view re-rendering. + +## Data Management + +To implement the recommended data-flow described above, you may use a full +featured [Redux](https://redux.js.org) platform or any other framework of your +choice. However, **Dome** provides you with many facilities for implementing +your data flow. + +- **Global States** are necessary to implement the unidirectional data-flow. These + data are stored in the renderer process, but outside of the view hierarchy of + **React** components actually mounted in the DOM. Hence, it remains consistent whatever + the evolution of the view. See `Dome.State` class and the associated custom **React** hooks + to implement global states. You may also use global JavaScript variables and emit events + on your own. + +- **Local States** are necessary to maintain local states associated + to views. We strongly encourage the use of the `Dome.useState()` hook for this + purpose, since it generalizes `React.useState()` with persistent window settings + (see below). + +- **View Updates** to make your views listening for updates of the various data + sources, we encourage to use the **React** hooks we provide, since they + transparently make your components to re-render when required. However, + sometimes you will need to respond to special events by hand. For this purpose, + you can use **Dome** as a central event emitter, by using `Dome.emit()`, + `Dome.on()` and `Dome.off()` functions. Moreover, the `Dome.useUpdate()` and + `Dome.useEvent()` hooks can be used to make your components being notified by + events. + +- **Window Settings** are stored in the user's home directory but remain + generally unnoticed by most users, although they are responsible for a good user + experience. They typically include the window's position and dimension, + resizable items position, fold/unfold states, presentation options, etc. Most + **Dome** components with presentation options can be assigned a `settings` key + to make their state persistent. Contrary to Global Settings, however, they are + not shared across several windows. You may also access these data by using + `Dome.setWindowSetting()` and `Dome.getWindowSetting()`, or the **React** hook + `Dome.useWindowSetting()`. + +- **Global Settings** are stored in the user's home directory and automatically + saved and load with your application; they are typically modified _via_ the + Settings Window, which is accessible from the application menubar. In **Dome**, + you access these data by using `Dome.setGlobalSetting()` and + `Dome.getGlobalSetting()`, or the **React** hook `Dome.useGlobalSetting()`. + Settings must be JSON serializable JavaScript values. diff --git a/ivette/src/dome/doc/guides/development.md b/ivette/src/dome/doc/guides/development.md new file mode 100644 index 0000000000000000000000000000000000000000..a1bfa4c54602b2ea514f1be81044601f7196a59b --- /dev/null +++ b/ivette/src/dome/doc/guides/development.md @@ -0,0 +1,203 @@ +--- +subtitle: Application Development +--- + +The [Quick Start](quickstart.md) tutorial introduces how to setup a new application project, +and [Application Design](application.md) draw a high-level view of how it works. +This tutorial goes into more details about the development environment provided by the **Dome** +framework. + + +## HTML & JavaScript Environment + +The Web environment for designing your application is based on the following +framework: + +- **Electron** [v5.0+](https://electronjs.org) runtime environment (packaging Chrome and Node) +- **Node** [v12.0+](https://nodejs.org/dist/latest-v12.x/docs/api) provided by Electron +- **Chromium** [v73.0+](https://www.chromium.org/Home) HTML rendering engine provided by Electron + +You will write your application in a an environment setup with the following +JavaScript features: + +- **Webpack** for packaging the application from sources +- **Babel** to parse language extensions +- **Babel Presets Env** to use ECMA modules and JavaScript strict mode +- **Babel Presets React** to use JSX react notation in all your `*.js` files +- **Babel Object Rest Spread** to use object spread syntax `{ ...props }` +- **React v16** with its latest features (including Hooks) +- **React Hot Loader** for [live-editing](hotreload.md) your application +- **CSS Loader** to load and install `*.css` files + +## Available Packages + +The implementation and internals of the **Dome** framework rely on +high-quality and mature popular packages. They are automatically packed +into your dependencies by the provided template makefile. We list them here +since you may re-use them for your own purpose: + +- [**Lodash**](https://lodash.com) convenient JavaScript utilities +- [**React-Virtualized**](http://bvaughn.github.io/react-virtualized) +for layout of large data set in list, tables and grids +- [**React-Draggable**](https://github.com/mzabriskie/react-draggable) +for straightforward drag-and-drop features +- [**CodeMirror**](https://codemirror.net) for rich text capabilities and edition +that scales on large document + +## Project Files Organization + +The main directory holding your application project with **Dome** consists of +several files and directories. Each is created and/or managed by various +entities : yourself the **Developer**, the **Dome** template makefile, the +**Yarn** JavaScript package manager and the **Electron** suite of +utilities. Parts of those files are generated and updated on demand and shall or +shall _not_ be tracked in your source version control system, be it based on `git`, +`svn` or anything else. + +Most files are actually created and used by **Dome**, **Electron** and **Yarn**. +However, that are _in fine_ under the responsibility of the **Developer** +since you can edit and extend them to fit your needs. +Those generated files generally contains comments to indicate how you +can extend them. You shall put those files under version control only if you edit them. + +As depicted in the [Quick Start](quickstart.md) tutorial, the only file you +need to create by yourself is the main `Makefile`, with a minimal content +limited to: + +```makefile +DOME="..." ;; path to your dome installation +include $(DOME)/template/makefile +``` + +The following table lists the main files and directories of your project, with +the associated entity responsible for it, and whether they should be tracked by +your source version control system (VCS). + +Optional files are tagged with « (Opt.) » in the corresponding `Entity` column, +and are _not_ generated by default. Similarly, files mainly used by the system +but that can still be configured by the developer are tagged with « (+Dev) ». +Files are tagged with « ✓(*) » in the `VCS` column shall be tracked only if you +actually modified them. + +| File or Directory | Description | Entity | VCS | +|:------------------|:------------|:-------:|:---:| +| `./Makefile` | Drives the build system | **Developer** | ✓ | +| `./src/main/` | Sources for the main process | **Developer** | ✓ | +| `./src/main/index.js` | Main process entry point | **Electron** (+Dev) | ✓ | +| `./src/renderer/` | Sources for the renderer process | **Developer** | ✓ | +| `./src/renderer/index.js` | Renderer process entry point | **Electron** (+Dev) | ✓ | +| `./src/renderer/Application.js` | Top React component of the main application window | **Developer** | ✓ | +| `./src/renderer/Preferences.js` | Top React component of the user preferences window | **Developer** | ✓ | +| `./src/common/` | Sources for _both_ processes | **Developer** (Opt.) | ✓ | +| `./static/` | Static resources | **Developer** (Opt.) | ✓ | +| `./package.json` | JavaScript packages configuration | **Yarn** (+Dev) | ✓ | +| `./node_modules` | Downloaded packages | **Yarn** | ð„‚ | +| `./yarn.lock` | Packages versions stamps | **Yarn** | ✓ | +| `./electron-webpack.json` | Electron configuration | **Electron** (+Dev) | ✓(*) | +| `./babelrc` | Babel configuration | **Electron** (+Dev) | ✓(*) | +| `./webpack.main.json` | Webpack main process config. | **Electron** (+Dev) | ✓(*) | +| `./webpack.renderer.json` | Webpack renderer process config. | **Electron** (+Dev) | ✓(*) | +| `./.dome-*` | Dome makefile stamps | **Dome** | ð„‚ | +| `$(DOME)/*` | Dome framework clone | **Dome** | (var.) | +| `./dist/` | Packaged application | **Dome** | ð„‚ | +| `./bin/` | Local command-lines | **Dome** | ð„‚ | + +The main entry points of the two **Electron** processes running your application, +`src/main/index.js` and `src/renderer/index.js` shall be modified with extreme care, +since they are in charge with the correct bootstrap of your application. +The generated files from **Dome** templates contains explicit comments and guidelines. + +You may want to modify the name of your application top-level **React** components, +namely `src/renderer/Application.js` and `src/render/Preferences.js` by default. +To do this, you shall hook into the +`src/renderer/index.js` file and follow the provided comments and guidelines, +and set the `DOME_CUSTOM_ENTRIES` variable into your own `./Makefile` to make +**Dome** aware about this. + +If you need static resource files to be packed with your application, put them in the `static` directory. +You can then access to their actual path from your code by using the `System.getStatic(<path>)` utility function. + +The location of the **Dome** resources actually depends on the developer +profile, as explained in more detailed in the [Live Editing](hotreload.md) tutorial. +To summarize: +- for normal developers, it can be a local copy of the dome framework, for instance in your `/usr/local/lib/dome` directory; +- for developers working with a specific or modified version of the dome framework, it can be in the local +`./dome/` directory of your project, with or without versioning control; +- for **Dome** developers, it is also possible to clone the Git repository inside the `./src/dome/` sub-directory of your +project, hence also enabling live-editing of **Dome** itself; +- for **Dome** maintainers, it is even possible to use the root of the **Dome** development repository as an application project +in itself, for demos, examples or testing purposes. + +Most of the **Electron** configuration files depends on the definition of the +`DOME` environment variable to find the necessary resources for your application +during development. Commands initiated by **Dome** from `$(DOME)/template/makefile` +will explicitly copy the `$(DOME)` makefile variable into the `$DOME` shell environment +variable when calling the **Electron** builder utilities, and might use it to generate static +files from templates, if necessary. + +If you ever _move_ the place where **Dome** is installed, you +probably have to inspect the generated files that you have modified to check +if they still behave as expected. + +Notice, however, that distributed versions of +the application (those accessible from the `./dist/` directory) are +self-contained: they are _not_ tied to your local installation of **Dome**. + +The command-line version of the application is accessible to the developer from the `./bin` directory. + +# Common Development Tasks + +Most development tasks shall be accessible from your `./Makefile`, and simply delegate to the +predefined **Dome** targets in `$(DOME)/template/makefile` ; however, for very specific needs, +you can borrow the content of the template makefile into your own one and modify it at your +convenience. The **Dome** environment will not target this template makefile explicitly. + +The top target of the **Dome** template makefile is `make dome-help`, +which is thus activated by default unless you put your own targets _before_ +its inclusion. The `dome-help` target simply echoes a short list of all the +`dome-xxx` predefined targets in the template. It also reports on +actual values of makefile variables used by the template. + +``` +$ make dome-help + +[Dome] Builtin Targets: + make dome-help This help + make dome-dev Run application in development mode + make dome-app Compile application + make dome-dist Package application for production + make dome-doc Generate Dome documentation + make dome-api Generate Application documentation + make dome-pkg Install development packages + make dome-templ Update templates + make dome-reboot Rebuild templates from scratch + make dome-clean Remove dome temporary files + make dome-plugins Package plugins for distribution + +[Dome] Development: + Dome framework DOME = '…' + Local command DOME_CLI = '…' + Arguments (dev) DOME_ARGS = '…' + Export modules DOME_EXPORTS = '…' + Plugin modules DOME_PLUGINS = '…' + +[Dome] Documentation: + Application APP = '…' + Copyright COPYRIGHT = '…' + Dome framework DOME_DOC = '…' + Output dir DOME_DOC = '…' + Public API DOME_API = '…' + +``` + +As depicted above, the **Dome** template also provides two extensible targets `help::` and `clean::`. +By default, the `make clean` would only remove the **Dome** stamp files, not the actually generated files, +since they can have been modified when developing the application. This can cause, however, an _update_ of +configuration files that can be managed incrementally, typically for the `package.json` and the installed +JavaScript packages. + +The **Dome** framework can generate its own documentation locally, hence you may consult it offline. It +is also capable of generating internal **JSDoc** documentation of the application itself. The application +documentation does _not_ contain the framework documentation, though. + +The environment variable can be redefined _via_ your own Makefile before the **Dome** template inclusion. diff --git a/ivette/src/dome/doc/guides/dome.md b/ivette/src/dome/doc/guides/dome.md new file mode 100644 index 0000000000000000000000000000000000000000..ec896895a6ce9dee7a786f28ce4231d2b9fee8f0 --- /dev/null +++ b/ivette/src/dome/doc/guides/dome.md @@ -0,0 +1,29 @@ +--- +subtitle: Dome Framework +--- + +**Dome** allows you to build native, desktop applications using +[React](https://reactjs.org) javascript technology. It is build upon the +[Electron](http://electron.atom.io) framework, featuring a full-featured Chromium +engine which renders the graphical user interface to the user. + +The **Dome** framework provides you with the following facilities: +- all-in-one pre-configured rich development environment +- live-editing of your application code +- a collection of ready-to-use, well designed, scalable components +- easy integration with any other React components from your own +- binary distribution for all supported platform (Windows, Linux and MacOS) + +## To Start With + +- [Quick Start](quickstart.md) +- [Live Editing](hotreload.md) +- [Application Design](application.md) +- [Application Development](development.md) +- [Styling Components](styling.md) + +## References + +- [Custom Hooks](hooks.md) +- [Icons Gallery](icons.md) +- [Glossary](glossary.md) diff --git a/ivette/src/dome/doc/guides/glossary.md b/ivette/src/dome/doc/guides/glossary.md new file mode 100644 index 0000000000000000000000000000000000000000..d0a89315011696cc76bb0100052e76805f36a810 --- /dev/null +++ b/ivette/src/dome/doc/guides/glossary.md @@ -0,0 +1,32 @@ +--- +subtitle: Glossary +--- + +## Basic Concepts + +- **Component** a React Component definition (class of function) +- **Element** a React Component instance of a Component, typically `<Component ...>` +- **Elements** a fragment of any number of elements, typically the `children` properties of elements +- **Render Prop** a function returning element(s), typically used instead of children elements + +## Component Properties + +- `id` an element identifier +- `icon` an icon identifier, as listed in the [icon gallery](tutorial-icons.html) +- `label` a short text used as the displayed title of a component +- `text` textual content to be printed on screen +- `title` a description for a component, usually provided in a tooltip box +- `settings` a key for making local state(s) persistent in user's settings +- `value` the value associated to some basic control (see `onChange`) +- `state` an object holding some current state (see `onUpdate`) +- `default` identifies the element selected by default in a list +- `selected` whether an element is selected or not (never by default) +- `disabled` whether an element will not responds to user actions (never by default) +- `selection` the identifier or value of current selection, or `undefined` (see `onSelect`) +- `children` the children elements of a component instance +- `onClick` a callback function in response to a click event +- `onClose` a callback function in response to closing action +- `onChange` a callback function in response to value changes (see `value`) +- `onUpdate` a callback function in response to (partial) state updates (see `state`) +- `onSelection` a callback function in response to user selection (see `selection`) +- `style` an inlined CSS style object to inject in a DOM element diff --git a/ivette/src/dome/doc/guides/hooks.md b/ivette/src/dome/doc/guides/hooks.md new file mode 100644 index 0000000000000000000000000000000000000000..100724e3cabd244a672ae62ae72a0d02ace03590 --- /dev/null +++ b/ivette/src/dome/doc/guides/hooks.md @@ -0,0 +1,22 @@ +--- +subtitle: Custom React Hooks +--- + +The **Dome** framework provides several [React Hooks](https://reactjs.org/docs/hooks-intro.html) +to ease your developpement process. Here is a summary of them. + +- [`useUpdate(evt)`](dome_.html#.useUpdate) to trigger re-rendering on **Dome** events; +- [`useEvent(emitter,event,callback)`](dome_.html#.useEvent) to trigger callbacks on events; +- [`useForceUpdate()`](dome_.html#.useForceUpdate) to trigger re-rendering on demand; +- [`useState(settings,defaultValue)`](dome_.html#.useState) + similar to `React.useState()` with optional persistent _window_ settings; +- [`useSwitch(settings,defaultValue)`](dome_.html#.useSwitch) + similar to `React.useState()` for boolean values with _window_ settings; +- [`useGlobalSetting(settings,defaultValue)`](dome_.html#.useGlobalSetting) + similar to `React.useState()` with optional persistent _global_ settings; +- [`useHistory(settings,defaultValue)`](dome_.html#.useHistory) + for managing histories +- [`useClock(period,initStart)`](dome_.html#.useClock) +returns start/stop clocks synchronized on period. +- [`useCommand()`](dome_.html#.useCommand) for working with different application instances. +- See also the [`Dome.State`](dome(renderer).State.html) and the associated hooks. diff --git a/ivette/src/dome/doc/guides/hotreload.md b/ivette/src/dome/doc/guides/hotreload.md new file mode 100644 index 0000000000000000000000000000000000000000..24279c93ad02d2af0bb9ac3101660d306a99cfb2 --- /dev/null +++ b/ivette/src/dome/doc/guides/hotreload.md @@ -0,0 +1,47 @@ +--- +subtitle: Live Code Editing +--- + +The **Dome** framework comes with live-editing facilities, provided by a +combination of +[Webpack Hot Module Reloading](https://webpack.js.org/concepts/hot-module-replacement) +and [React Hot Loader](http://gaearon.github.io/react-hot-loader). +This allows you to live edit your code and style sheets in real time while application +is running. This feature is only enabled in development mode, not in production mode +used when packaging the application for some platform. + +Hot reloading for **React** components is known to be a fragile feature and to +suffer from certain limitations. Typically, files that can trigger live updates +must be reachable from the `./src` directory, without traversing symbolic links. +Style sheets in `*.css` files can be live edited, and **React** components in +`*.js` files as well. Most **React** components can be live-edited, provided +they are defined in top-level variables or exported by modules. Generally, the +component states are preserved during live-editing. + +For live-editing to work properly, your source code must follow strict +configuration settings. These rules are enforced when using configuration files +and application entry points generated from **Dome** templates. Pay attention to +the provided comments in generated files when modifying them. + +By default, we suggest to install the **Dome** framework in the sub-directory `./dome` +of your project. Being outside `./src`, this normally prevents **Dome** files to +be live-edited. If you want to also live-edit the framework, you shall move the +`$(DOME)` directory inside your own `./src`. +In particular, you might install the framework with `DOME=src/dome` for instance. + +**State Management:** hot-reloading on **React** components preserves application +states _only_ when they are stored outside the reloaded module. This is the case +for local states maintained in **React** components, as they live in the virtual DOM. +However, for global application state stored in global variables of modules, +they simply vanish when a module is hot-reloaded. Worst, the virtual DOM will +be still bound to the _old_ versions of the modules. However, you usually don't +want to live-edit the global state of your application and mix new data with +old ones. A good practice is to separate files holding global state from files +implementing views. Hence, live-editing the views will not cause the global state +modules to reload, and views will stay in sync with your data. If you ever modify +the global state, you will have to reload the application window (`CmdOrCtrl-R`). + +**Versioning Note:** the framework currently sticks on `webpack` version 3 and +`react-hot-loader` version 3, because of limitations and issues when using +`electron-webpack` with most recent versions of those libraries. However, we +hope to be able to migrate to newer versions as soon as possible. diff --git a/ivette/src/dome/doc/guides/quickstart.md b/ivette/src/dome/doc/guides/quickstart.md new file mode 100644 index 0000000000000000000000000000000000000000..142497c0ec5f5343935818fc64f187b193d9fa20 --- /dev/null +++ b/ivette/src/dome/doc/guides/quickstart.md @@ -0,0 +1,26 @@ +--- +subtitle: Quick Start +--- + +We strongly recommand to use [**Yarn**](https://reactjs.org) +for installing the necessary Node packages and their dependencies. + +Then, prepare a directory for developing your application, and download +the Dome Application Framework into sub-directory `dome`. +You shall now setup a makefile for your application as follows: + +<pre> + # Makefile + include dome/template/makefile + all: dome-dev +</pre> + +Now, simply type `make` and all the necessary packages will be automatically +installed and configured. This can take a while for the very first installation. +You will be prompted for generating a default `package.json` file +if you do not have some already. + +Eventually, your application will start with +a « _Hello World_ » window. +Now, you can _live edit_ the generated `src/renderer/Application.js` which is the main entry point +of your application and see what happens into the main window. diff --git a/ivette/src/dome/doc/guides/styling.md b/ivette/src/dome/doc/guides/styling.md new file mode 100644 index 0000000000000000000000000000000000000000..0488e131916230b0d1c99eea264218f6501ddc28 --- /dev/null +++ b/ivette/src/dome/doc/guides/styling.md @@ -0,0 +1,65 @@ +--- +subtitle: Styling Components +--- + +This tutorial explains how **Dome** style sheets are organized and how +to reuse them for styling your own components. Although modern styling +usually rely on _style preprocessors_ to leverage the complexity of +CSS style sheets development, the approach used here is based on separation +of concerns and multi-class styling. The advantage is that you can +develop your _own_ style sheets, while still being able +to re-use the existing classes provided by the framework. + +All CSS classes provided by **Dome** start with prefix `dome-` ; you shall not +use such a prefix when designing your own classes. Many class names are provided +with optional or mandatory variants. Typically: + +- `dome-<base>[-<a>,<b>,...]` describes class `dome-<base>` and its variants +`dome-<base>-<a>`, `dome-<base>-<b>` _etc_. + +- `dome-<name>-[<a>,<b>,...]` describes classes `dome-<name>-<a>`, `dome-<name>-<b>` _etc_. + +## Platform Context + +These classes can be used when writing selectors in order to style things +with respect to the target platform. The main window container is attributed +with one of the following class: + +- `dome-platform-[darwin,linux,windows]` derived from the `process.darwin` +global variable (**Node.js** environment). + +- `dome-window-[active|inactive]` depending on whether the main application window +has focus or not. + +## Color Palettes + +Attributing colors to graphical elements is often an issue, since a precise +hex variants shall be tuned depending on the surrounding context. However, +base colors are provided in public classes for several usages: + +- `dome-color-frame` background, foreground and borders for +window frames, which includes tool-bars, status-bars, tabs and such. +Those colors actually depend on the focus state of the main application window. + +- `dome-color-[dragzone|dragging]` for painting the background of a dragging +zone, typically a splitting rule. The `dragzone` variant is completely +transparent with a very transparent light gray when hovered. +The `dragging` variant is semi-transparent blended blue with light gray. +All these drag background effects are smoothly transitioned. + +## Text Properties + +- `dome-text-[label|title|descr]` for labels (_eg._ buttons, tabs, menu +entries), titles (larger labels) and descriptions (_eg._ tooltips). +Uses a sans-serif font, is non-selectable and truncated with an ellipsis. + +- `dome-text-[data|code]` for selectable text, typically input fields. +Uses a sans-serif font (for `data`) or monospace font (for `code`), +never wraps and is clipped when overflow. + +## Component Layout + +The entire application uses the `box-model` box-sizing property by default, +since it is usually much more consistent with nested `<div>` components. +Similarly, default margins and paddings are set to `0px` to avoid unwanted +messy background issues. diff --git a/ivette/src/dome/doc/iconsmd.js b/ivette/src/dome/doc/iconsmd.js new file mode 100644 index 0000000000000000000000000000000000000000..74cdbec61c0bffee30a58382025c46a1248343b2 --- /dev/null +++ b/ivette/src/dome/doc/iconsmd.js @@ -0,0 +1,55 @@ +// -------------------------------------------------------------------------- +// --- Icons Markdown Gallery Generator +// -------------------------------------------------------------------------- + +const path = require('path'); +const icons = require(path.resolve( process.argv[2] )); +const index = []; +const sections = {}; + +// --- Indexing & Sectioning ----------------------------------------- + +for ( var name in icons ) { + const icon = icons[name]; + const section = icon.section || "Others" ; + if (section != "Others" && index.indexOf(section) < 0) index.push( section ); + var content = sections[section] ; + if (!content) sections[section] = content = [] ; + content.push(name) ; +} + +index.sort(); +if (sections["Others"]) index.push("Others"); + +console.log( '---' ); +console.log( 'subtitle: Icons Gallery' ); +console.log( '---' ); +console.log(); + +// --- Gallery (per section) ----------------------------------------- + +for ( var s = 0 ; s < index.length ; s++ ) { + const section = index[s] ; + console.log( `## ${section} {#SECTION.${section}}` ); + console.log(); + console.log( ` <div class="database">` ); + + const content = sections[section] ; + content.sort(); + + for( var k = 0 ; k < content.length ; k++ ) { + const name = content[k]; + const icon = icons[name]; + const title = icon.title || name ; + console.log( `<div class="icon-block" title="${title}">`); + console.log( `<div class="icon-name refname" id="ICON.${name}">${name}</div>` ); + console.log( `<svg class="icon-svg" viewBox="${icon.viewBox}">` ); + console.log( `<path d="${icon.path}"/>`); + console.log( `</svg>` ); + console.log( `</div>` ); + } + console.log( `</div>`); + console.log(); +} + +// ------------------------------------------------------------------- diff --git a/ivette/src/dome/src/main/dome.js b/ivette/src/dome/src/main/dome.js index 6aa043b842e613d3ab64a75a8981b3d3d777c734..c1f1452eb93ee84409a60bc9e49bb4f25a1f868a 100644 --- a/ivette/src/dome/src/main/dome.js +++ b/ivette/src/dome/src/main/dome.js @@ -1,4 +1,5 @@ /** + @packageDocumentation @module dome(main) @description diff --git a/ivette/src/dome/src/misc/system.js b/ivette/src/dome/src/misc/system.js index f246c2c372fd2145d9a2cc9b35ef7e9f2c06edd1..48808f72562593c59043fcd977d147a4f5abee93 100644 --- a/ivette/src/dome/src/misc/system.js +++ b/ivette/src/dome/src/misc/system.js @@ -1,4 +1,7 @@ -/** @module dome/system */ +/** + @packageDocumentation + @module dome/system +*/ // -------------------------------------------------------------------------- // --- Evolved Spawn Process diff --git a/ivette/src/dome/src/renderer/controls/buttons.js b/ivette/src/dome/src/renderer/controls/buttons.js index a79c24cbb0bbae6791025dc909af8ebd0adfe6a4..c1bb0d0724d4b633e58c6967929ffc5e920a3512 100644 --- a/ivette/src/dome/src/renderer/controls/buttons.js +++ b/ivette/src/dome/src/renderer/controls/buttons.js @@ -3,6 +3,7 @@ // -------------------------------------------------------------------------- /** + @packageDocumentation @module dome/controls/buttons @description @@ -346,7 +347,7 @@ export const Switch = (props) => { @property {string} [className] - Additional class @property {object} [style] - Additional style @description - See also [RadioGroup](module-dome_controls_buttons.RadioGroup.html). + See also [[RadioGroup]]. <strong>Note:</strong> property `value` and `selection` are consistent with HTML standards and DOM element properties. @@ -382,8 +383,7 @@ export const Radio = (props) => { @property {string} [className] - Additional class of the container `<div>` @property {object} [style] - Additional style of the container `<div>` @description - Childrens of the `RadioGroup` shall be [Radio](module-dome_controls_buttons.Radio.html) - buttons. + Childrens of the `RadioGroup` shall be [[Radio]] buttons. The selected value of the group is broadcasted to the radio buttons. Their callbacks are activated _before_ the radio group one, if any. diff --git a/ivette/src/dome/src/renderer/controls/icons.js b/ivette/src/dome/src/renderer/controls/icons.js index 35da53950a70dd0007afeb5fbd72578c443bd1bd..1b7e040130b7f48ce748d38a53712540c12f4647 100644 --- a/ivette/src/dome/src/renderer/controls/icons.js +++ b/ivette/src/dome/src/renderer/controls/icons.js @@ -3,8 +3,10 @@ // -------------------------------------------------------------------------- /** + @packageDocumentation @module dome/controls/icons @description + Consult the [Icon Gallery](gallery-icons.html) for default icons. You can [register](#.register) new icons or override existing ones and [iterate](#.forEach) over the icon base. diff --git a/ivette/src/dome/src/renderer/controls/labels.js b/ivette/src/dome/src/renderer/controls/labels.js index 70c86ce85776657822ec9c692671b5e73de0b25f..53b435e88844660349f64faa3ad5310d34de8fb4 100644 --- a/ivette/src/dome/src/renderer/controls/labels.js +++ b/ivette/src/dome/src/renderer/controls/labels.js @@ -2,7 +2,10 @@ // --- Labels // -------------------------------------------------------------------------- -/** @module dome/controls/labels */ +/** + @packageDocumentation + @module dome/controls/labels +*/ import React from 'react' ; import { Icon } from './icons' ; diff --git a/ivette/src/dome/src/renderer/data.js b/ivette/src/dome/src/renderer/data.js index 8265985149388b4d948586f91a4f286e8e703b43..2105a9bfafdc20127753ecc59635233daf6c1b6f 100644 --- a/ivette/src/dome/src/renderer/data.js +++ b/ivette/src/dome/src/renderer/data.js @@ -2,123 +2,124 @@ // --- Data Collector // -------------------------------------------------------------------------- -/** @module dome/data - @description - -This module allows to integrate data definitions within React elements. -Typically, you can use it to define your own structure of logical elements -and display them at different places in the GUI. For instance, you may -want to define a custom list of elements, where each element -will be rendered twice: locally with the currenly selected item, and in a side-bar -or in the menu-bar, or for any other purpose than rendering. You want to declare -your list like this: - -```{jsx} - <MyList> - <MyItem id={A} ... >...</MyItem> - <MyItem id={B} ... >...</MyItem> - <MyItem id={C} ... >...</MyItem> - </MyList> -``` - -Dome data libraries, as provided by this module, allows you to define such -collection of data mixed with rendered elements. - -Data are collected through libraries. -You create libraries with `createLibrary()` or `useLocalLibrary()` and -then provide them to `<Data.Item>`, `<Data.Component>`, `<Data.Node>` or -`<Data.Fragment>` elements. - -At any (other) point of the tree, you can use the collected items -with the `useLibrary()` custom React hook. - -Libraries are pushed down the React virtual tree _via_ React context, -so you don't need to re-specify it for children of `<Data.Node/>` -and `<Data.Fragment/>`. - -Items must be identified with a unique `id` ; they are sorted according -to their `order` property, although `<Data.Fragment/>` and `<Data.Node/>` -preserve the order of data collected from each of their children. Items are -collected when they are actually _mounted_ by React, -like any other React element. - -Data elements are normal React element, that might be rendered by -visible elements in the DOM. You may think of data elements as having a -double rendering: mounted data items are collected into libraries, and normal visible -elements are collected into the React virtual DOM. Each kind of data element is -rendered differenly with this respect: - -- `<Data.Item>` renders its children within a React fragment; -- `<Data.Node>` is like an item, with its data children stored in the registered item; -- `<Data.Component>` always renders 'null' and capture its React children elements in the registered item; -- `<Data.Fragment>` renders its children within a React fragment, with optional context library and specified order. - -See each component for more details. - -As an example of use, the introductory example can be implemented as follows: - - -```{jsx} - const lib = createLibrary(); - - // To be used at any (possibly repeated) place in the hierarchy of react elements - // Children items are only added to the library when the list is mounted - const MyList = ({ children }) => { +/** + @packageDocumentation + @module dome/data + @description + This module allows to integrate data definitions within React elements. + + Typically, you can use it to define your own structure of logical elements + and display them at different places in the GUI. For instance, you may + want to define a custom list of elements, where each element + will be rendered twice: locally with the currenly selected item, and in a side-bar + or in the menu-bar, or for any other purpose than rendering. You want to declare + your list like this: + + * ```jsx + * <MyList> + * <MyItem id={A} ... >...</MyItem> + * <MyItem id={B} ... >...</MyItem> + * <MyItem id={C} ... >...</MyItem> + * </MyList> + * ``` + + Dome data libraries, as provided by this module, allows you to define such + collection of data mixed with rendered elements. + + Data are collected through libraries. + You create libraries with `createLibrary()` or `useLocalLibrary()` and + then provide them to `<Data.Item>`, `<Data.Component>`, `<Data.Node>` or + `<Data.Fragment>` elements. + + At any (other) point of the tree, you can use the collected items + with the `useLibrary()` custom React hook. + + Libraries are pushed down the React virtual tree _via_ React context, + so you don't need to re-specify it for children of `<Data.Node/>` + and `<Data.Fragment/>`. + + Items must be identified with a unique `id` ; they are sorted according + to their `order` property, although `<Data.Fragment/>` and `<Data.Node/>` + preserve the order of data collected from each of their children. Items are + collected when they are actually _mounted_ by React, + like any other React element. + + Data elements are normal React element, that might be rendered by + visible elements in the DOM. You may think of data elements as having a + double rendering: mounted data items are collected into libraries, and normal visible + elements are collected into the React virtual DOM. Each kind of data element is + rendered differenly with this respect: + + - `<Data.Item>` renders its children within a React fragment; + - `<Data.Node>` is like an item, with its data children stored in the registered item; + - `<Data.Component>` always renders 'null' and capture its React children elements + in the registered item; + - `<Data.Fragment>` renders its children within a React fragment, with optional context + library and specified order. + + See each component for more details. + + As an example of use, the introductory example can be implemented as follows: + + ```jsx + const lib = createLibrary(); + + // To be used at any (possibly repeated) place in the hierarchy of react elements + // Children items are only added to the library when the list is mounted + const MyList = ({ children }) => { // Actually renders nothing if children only contains items. // The fragment makes items keep their declaration ordering. return ( <Data.Fragment lib={lib}>{children}</Data.Fragment> ); - }; + }; - // To be used also at any (possibly repeated) place in the hierarchy - const MyItem = (props) => <Data.Item lib={lib} {...props} /> ; + // To be used also at any (possibly repeated) place in the hierarchy + const MyItem = (props) => <Data.Item lib={lib} {...props} /> ; - // To be used for instance at top-level inside a side-bar - const MyListIndex = () => { + // To be used for instance at top-level inside a side-bar + const MyListIndex = () => { let items = Data.useLibrary(lib); return ( <ul> { items.map(({id,label}) => (<li key={id}>{label}</li>)) } </ul> ); - }; -``` - + }; + ``` */ -import _ from 'lodash' ; +import _ from 'lodash'; import React from 'react'; -import * as Dome from 'dome' ; -import EventEmitter from 'events' ; +import * as Dome from 'dome'; +import EventEmitter from 'events'; // -------------------------------------------------------------------------- // --- Libraries // -------------------------------------------------------------------------- const reOrder = (items) => - _.sortBy( items , [ 'order','id' ] ) - .map( (item,order) => Object.assign( item, { order } )); + _.sortBy(items, ['order', 'id']) + .map((item, order) => Object.assign(item, { order })); /** @summary Data Collector. @description Libraries are used to collect data through the React virtual DOM. */ -class Library extends EventEmitter -{ +class Library extends EventEmitter { constructor() { super(); this.items = {}; this.lastItems = {}; - this._trigger = _.debounce(this._trigger,10); + this._trigger = _.debounce(this._trigger, 10); } _trigger() { - if (!_.isEqual( this.items , this.lastItems )) { - this.lastItems = this.items ; - this.sorted = undefined ; + if (!_.isEqual(this.items, this.lastItems)) { + this.lastItems = this.items; + this.sorted = undefined; this.emit('trigger'); } }; @@ -128,10 +129,10 @@ class Library extends EventEmitter @param {object} item - must have an `'id'` property */ add(item) { - const id = item.id ; + const id = item.id; if (Dome.DEVEL && this.items[id]) console.warn(`[dome/data] duplicate item identifier (${id})`); - this.items[id] = item ; + this.items[id] = item; this._trigger(); } @@ -149,20 +150,20 @@ class Library extends EventEmitter @return {Array<object>} items array sorted by `'order'` and `'id'` properties. */ contents() { - return this.sorted || (this.sorted = reOrder( this.items )); + return this.sorted || (this.sorted = reOrder(this.items)); } /** @summary Register callback. @param {function} callback - invoked when library contents changes **/ - on(callback) { this.on('trigger',callback); } + on(callback) { this.on('trigger', callback); } /** @summary Un-register callback. @param {function} callback - callback to unregister **/ - off(callback) { this.off('trigger',callback); } + off(callback) { this.off('trigger', callback); } } @@ -184,7 +185,7 @@ export function createLibrary() { return new Library(); } */ export function useLibrary(library) { const forceUpdate = Dome.useForceUpdate(); - Dome.useEmitter( library , 'trigger' , forceUpdate ); + Dome.useEmitter(library, 'trigger', forceUpdate); return library.contents(); } @@ -200,40 +201,39 @@ export function useLibrary(library) { ``` */ export function useLocalLibrary() { - const library = React.useMemo( createLibrary , [] ); - const items = useLibrary( library ); - return { library , items }; + const library = React.useMemo(createLibrary, []); + const items = useLibrary(library); + return { library, items }; } const CurrentLib = React.createContext(); const CurrentPath = React.createContext([]); -const makePath = (path,order) => - order === undefined ? path : path.slice(0,-1).concat(order); +const makePath = (path, order) => + order === undefined ? path : path.slice(0, -1).concat(order); /** @summary Current library (Custom React Hook). @return {Library} in local context */ export function useCurrentLibrary() { - return React.useContext( CurrentLib ); + return React.useContext(CurrentLib); } // -------------------------------------------------------------------------- // --- Internals // -------------------------------------------------------------------------- -function useLocalItem( { lib:localLib, id, order, ...itemProps }, children ) -{ +function useLocalItem({ lib: localLib, id, order, ...itemProps }, children) { const currentLib = React.useContext(CurrentLib); const currentPath = React.useContext(CurrentPath); - const path = makePath( currentPath, order ); - React.useEffect( () => { - const library = localLib || currentLib ; + const path = makePath(currentPath, order); + React.useEffect(() => { + const library = localLib || currentLib; if (id && library) { - const item = { id, order:path, ...itemProps }; - if (children) item.children = children ; - library.add(item) ; + const item = { id, order: path, ...itemProps }; + if (children) item.children = children; + library.add(item); return () => library.remove(id); } else return undefined; @@ -241,23 +241,22 @@ function useLocalItem( { lib:localLib, id, order, ...itemProps }, children ) return path; }; -function makeChildren( path, children) -{ - const n = React.Children.count( children ); +function makeChildren(path, children) { + const n = React.Children.count(children); if (n == 0) return null; else { - const childContext = (elt,k) => { + const childContext = (elt, k) => { if (elt) { - const newPath = path.concat(1+k); + const newPath = path.concat(1 + k); return ( <CurrentPath.Provider value={newPath}> {elt} </CurrentPath.Provider> ); } else - return elt ; + return elt; }; - return React.Children.map( children, childContext ); + return React.Children.map(children, childContext); } } @@ -285,9 +284,9 @@ function makeChildren( path, children) An `<Item/>` element rendres its children in a nested, ordered fragment, but with the same current library than the inherited one, if any. */ -export const Item = ( { children, ...props} ) => { - let path = useLocalItem( props ); - return (<React.Fragment>{makeChildren(path,children)}</React.Fragment>); +export const Item = ({ children, ...props }) => { + let path = useLocalItem(props); + return (<React.Fragment>{makeChildren(path, children)}</React.Fragment>); }; // -------------------------------------------------------------------------- @@ -321,8 +320,8 @@ export const Item = ( { children, ...props} ) => { The component element itself is rendered as `null` when mounted in the virtual DOM by React. */ -export const Component = ( { children, ...props} ) => { - useLocalItem( props, children ); +export const Component = ({ children, ...props }) => { + useLocalItem(props, children); return null; }; @@ -358,10 +357,10 @@ export const Component = ( { children, ...props} ) => { */ export const Node = ({ children, ...props }) => { let { library, items } = useLocalLibrary(); - let path = useLocalItem( props , items ); + let path = useLocalItem(props, items); return ( <CurrentLib.Provider value={library}> - {makeChildren( path, children )} + {makeChildren(path, children)} </CurrentLib.Provider> ); }; @@ -378,16 +377,15 @@ export const Node = ({ children, ...props }) => { @property {boolean} [disabled] - fragment shal not be rendered (default: `false`) @property {React.Children} [children] - sub-data and rendering of the data collection */ -export const Fragment = ({lib:localLib, order, enabled=true, disabled=false, children, ...localProps}) => { +export const Fragment = ({ lib: localLib, order, enabled = true, disabled = false, children, ...localProps }) => { const currentLib = React.useContext(CurrentLib); const currentPath = React.useContext(CurrentPath); - const library = localLib || currentLib ; - if ( enabled && !disabled && React.Children.count(children) > 0 ) - { - const path = makePath( currentPath, order ); + const library = localLib || currentLib; + if (enabled && !disabled && React.Children.count(children) > 0) { + const path = makePath(currentPath, order); return ( <CurrentLib.Provider value={library}> - {makeChildren( path, children )} + {makeChildren(path, children)} </CurrentLib.Provider> ); } else diff --git a/ivette/src/dome/src/renderer/dialogs.js b/ivette/src/dome/src/renderer/dialogs.js index f76515e4587052f0d75d360aff2456cb7eff1335..1532f867e03d3d77374951c3e39839fb4c39f349 100644 --- a/ivette/src/dome/src/renderer/dialogs.js +++ b/ivette/src/dome/src/renderer/dialogs.js @@ -1,4 +1,5 @@ /** + @packageDocumentation @module dome/dialogs @description Various kind of (modal) dialogs attached to the main application window. diff --git a/ivette/src/dome/src/renderer/dnd.js b/ivette/src/dome/src/renderer/dnd.js index 74aa1755bbab4081c6c4c5d1574b3f4f4cf5cf8f..603de8c4280207045929d6a63329a8d95ba792b5 100644 --- a/ivette/src/dome/src/renderer/dnd.js +++ b/ivette/src/dome/src/renderer/dnd.js @@ -1,9 +1,9 @@ /** + @packageDocumentation @module dome/dnd - @summary Drag & Drop Features. @description -## D&D Sequences +## Drag & Drop A Drag & Drop sequence is monitored by a D&D controller. Drag Sources initiates the a D&D sequence, and the D&D controller will then @@ -200,8 +200,7 @@ export const dispatchEvent = ( dragging , handlers ) => { The handler object shall define listeners to the D&D dragging events. Each callback is sensible to specific kind of events, as specified - in the [event listeners](module-dome_dnd.html) - documentation. + in the [[dome/dnd]] documentation. You need a D&D controller whenever an element can be dragged between different containers. D&D controllers also offers an @@ -620,17 +619,16 @@ Source element to attach its event handlers into it. You are then fully responsi the element both _during_ and _outside_ of a D&D sequence. No internal `<div>` element is inserted for you, and the `className`, `style` and `position` properties are ignored. -Finally, you may also use an [Overlay](module-dome_dnd.Overlay.html) component to render +Finally, you may also use an [[Overlay]] component to render your content, by setting `overlay=true` or passing `overlay` the desired properties. -When dragged, the [DnD](module-dome_dnd.DnD.html) controller is informed and dispatches +When dragged, the [[DnD]] controller is informed and dispatches the dragging events to the registered drop targets. The `handle` selector can be used to identify which parts of the content may initiate the drag. By default, any drag event may initiate the drag. The `onDnd` event listener receives all D&D events associated to this drop target. -See [event callbacks](module-dome_dnd.html) -documentation for more details on other specific event listeners. +See event callbacks documentation for more details on other specific event listeners. The `draggable` object, when provided, is used to inject additional properties into the internal `Draggable` or `DraggableCore` wrapper used to manage D&D events. @@ -762,7 +760,7 @@ export class DragSource extends React.Component @description Crates a drop target container and register its callbacks into the specified -[DnD](module-dome_dnd.DnD.html) controller. In case the DnD controller is undefined, +[[DnD]] controller. In case the DnD controller is undefined, the drag events are just disabled. The drop target container must inform the D&D controller of its DOM element that is responsible @@ -778,8 +776,8 @@ will not respond to dragging events. In case of custom rendering, the `className` and `style` properties are ignored. During a D&D sequence, the `onDnd` event listener receives all D&D events associated -to this drop target. See [event callbacks](module-dome_dnd.html) -documentation for more details on other specific event listeners. +to this drop target. See event callbacks documentation for more details on +other specific event listeners. */ export class DropTarget extends React.Component diff --git a/ivette/src/dome/src/renderer/dome.js b/ivette/src/dome/src/renderer/dome.js index 0c97272ae00420cfbdd2e279d5f5ddce6dc7706b..a50223b1aaf9e79850f1df144ff227e6acf79430 100644 --- a/ivette/src/dome/src/renderer/dome.js +++ b/ivette/src/dome/src/renderer/dome.js @@ -1,4 +1,5 @@ /** + @packageDocumentation @module dome(renderer) @description @@ -7,9 +8,13 @@ This modules manages your main application window and its interaction with the main process. - @example // File 'src/renderer/index.js': + Example: + + ```typescript + // File 'src/renderer/index.js': import Application from './Application.js' ; Dome.setContent( Application ); + ``` */ import _ from 'lodash' ; @@ -51,7 +56,7 @@ export const DEVEL = System.DEVEL ; /** @summary System platform. @description - Same as [`platform`](module-dome_system.html#.platform) from `dome/system` */ + Same as `platform` from `dome/system` */ export const platform = System.platform ; // -------------------------------------------------------------------------- @@ -127,9 +132,9 @@ Register a callback on [dome.command](#~event:'dome.reload') event, emitted by the `Main` process when the application instance is launched. See also: - - [Dome.useCommand](#.useCommand) - - [System.getArguments](module-dome_system.html#.getArguments) - - [System.getWorkingDir](module-dome_system.html#.getWorkingDir) + - [[useCommand]] + - `System.getArguments` + - `System.getWorkingDir` */ export function onCommand(job) { emitter.on('dome.command',job); } @@ -474,7 +479,6 @@ ipcRenderer.on('dome.ipc.settings.update',(sender,patches) => { @param {string} key User's Setting Key (`'dome.*'` are reserved keys) @param {any} [defaultValue] - default value if the key is not present @return {any} associated value of object or `undefined`. - @tutorial application @description This settings are local to the current window, but persistently saved in the user's home directory.<br/> @@ -487,7 +491,6 @@ export function getWindowSetting( key, defaultValue ) { /** @summary Set value into local window (persistent) settings. @param {string} key to store the data @param {any} value associated value or object - @tutorial application @description This settings are local to the current window, but persistently saved in the user's home directory.<br/> @@ -502,7 +505,6 @@ export function setWindowSetting( key , value ) { @param {string} key User's Setting Key (`'dome.*'` are reserved keys) @param {any} [defaultValue] - default value if the key is not present @return {any} associated value of object or `undefined`. - @tutorial application @description These settings are global to the application and persistently saved in the user's home directory.<br/> @@ -515,7 +517,6 @@ export function getGlobalSetting( key, defaultValue ) { /** @summary Set value into application (persistent) settings. @param {string} key to store the data @param {any} value associated value or object - @tutorial application @description These settings are global to the current window, but persistently saved in the user's home directory. Updated values are broadcasted @@ -602,7 +603,6 @@ export function useForceUpdate() /** @summary Hook to re-render on Dome events (Custom React Hook). @param {string} [event,...] - event names (default: `'dome.update'`) - @tutorial hooks @description Returns nothing. */ @@ -621,7 +621,6 @@ export function useUpdate(...evts) @summary Hook to register callbacks to Dome events (Custom React Hook). @param {string} event - Event to register on @param {function} callback - The callback to register - @tutorial hooks @description Register the callback on event until the component is unmount. Do not force the component to re-render (unless the callback does).<br/> @@ -640,7 +639,6 @@ export function useEvent(evt,callback) @param {EventEmitter} emitter - event emitter @param {string} event - Event to register on @param {function} callback - The callback to register - @tutorial hooks @description Register the callback on event until the component is unmount. Do not force the component to re-render (unless the callback does).<br/> @@ -663,12 +661,11 @@ const NULL = {}; // Dummy initial value /** @summary Hook for command-line interface (Custom React Hook). @return {array} `[argv,wdir]` command-line arguments and working directory - @tutorial hooks @description Returns the command-line arguments and working directory for the application instance running in the window. Automatically updated on `dome.command` events. - See also [Dome.onCommand](#.onCommand) event handler. + See also [[onCommand]] event handler. */ export function useCommand() { useUpdate('dome.command'); @@ -711,7 +708,6 @@ function useSettings( local, settings, defaultValue ) @param {string} [settings] - optional window settings to backup the value @param {any} [defaultValue] - the initial (and default) value @return {array} `[value,setValue]` of the local state - @tutorial hooks @description Similar to `React.useState()` with persistent _window_ settings. When the settings key is undefined, it simply uses a local React state. @@ -731,7 +727,6 @@ export function useState( settings, defaultValue ) @param {string} [settings] - optional window settings to backup the value @param {boolean} [defaultValue] - the initial value (default is `false`) @return {array} `[value,flipValue]` for the local state - @tutorial hooks @description Same as [useState](#.useState) with a boolean value that can be set or flipped: - `flipValue()` change the value to its opposite; @@ -816,7 +811,6 @@ export function useHistory( settings, defaultValue ) @param {string} settings - global settings for storing the value @param {any} [defaultValue] - the initial and default value @return {array} `[value,setValue]` of the local state - @tutorial hooks @description Similar to `React.useState()` with persistent _global_ settings. When the settings key is undefined, it simply uses a local React state. @@ -981,7 +975,6 @@ const DEC_CLOCK = (period) => { @summary Synchronized start & stop timer (Custom React Hook). @param {number} period - timer interval, in milliseconds (ms) @param {boolean} [initStart] - whether to initially start the timer (default is `false`) - @tutorial hooks @return {timer} Timer object @description Create a local timer, synchronized on a global clock, that can be started diff --git a/ivette/src/dome/src/renderer/errors.js b/ivette/src/dome/src/renderer/errors.js index bb3ea064aae87841fe90421142efec17808be573..ae951aa7ee0fe87c9be98dd687e9d0e769b63fa8 100644 --- a/ivette/src/dome/src/renderer/errors.js +++ b/ivette/src/dome/src/renderer/errors.js @@ -2,12 +2,15 @@ // --- Managing Errors // -------------------------------------------------------------------------- +/** + @packageDocumentation + @module dome/errors +*/ + import React from 'react' ; import { Label } from 'dome/controls/labels' ; import { Button } from 'dome/controls/buttons' ; -/** @module dome/errors */ - // -------------------------------------------------------------------------- // --- Error Boundaries // -------------------------------------------------------------------------- diff --git a/ivette/src/dome/src/renderer/frame/sidebars.js b/ivette/src/dome/src/renderer/frame/sidebars.js index 5f0421cfd42984c7465e45e4e9a5e9ed59223552..e8c5da03242bcf2429877f3bd7a014f605118fec 100644 --- a/ivette/src/dome/src/renderer/frame/sidebars.js +++ b/ivette/src/dome/src/renderer/frame/sidebars.js @@ -2,7 +2,10 @@ // --- SideBars // -------------------------------------------------------------------------- -/** @module dome/frame/sidebars */ +/** + @packageDocumentation + @module dome/frame/sidebars +*/ import React from 'react' ; import * as Dome from 'dome' ; @@ -25,7 +28,6 @@ const SideBarContext = React.createContext(); @property {function} [onSelection] - Selection callback @property {function} [onContextMenu] - Context Menu callback @description - See also [Frame](module-dome_layout_frames.Frame.html) containers. When a base settings is set on the sidebar, all contained sections and items are attributed derived settings based on their identifiers. @@ -160,7 +162,7 @@ export function Section(props) { Context menu callback also triggers the selection callback (first). In case callbacks are defined from the englobing sidebar, both are invoked. - Badges can be single or multiple [Badge](module-dome_controls_icons.Badge.html) values. + Badges can be single or multiple [[Badge]] values. They are displayed stacked on the right edge of the item. **/ diff --git a/ivette/src/dome/src/renderer/frame/tabs.js b/ivette/src/dome/src/renderer/frame/tabs.js index 9f14f3c9d6dfe97174c12b0ef734ebd9174a0c62..fe89a5691e857ff128406b1d2af3b85e5a780be5 100644 --- a/ivette/src/dome/src/renderer/frame/tabs.js +++ b/ivette/src/dome/src/renderer/frame/tabs.js @@ -2,7 +2,10 @@ // --- Tabs // -------------------------------------------------------------------------- -/** @module dome/frame/tabs */ +/** + @packageDocumentation + @module dome/frame/tabs +*/ import React from 'react' ; import { Icon } from 'dome/controls/icons' ; @@ -13,7 +16,7 @@ import './style.css' ; @class @summary Pure Container for tab buttons. @description - Shall contains [Tab](module-dome_layout_tabs.Tab.html) instances. + Shall contains only [[Tab]] instances. */ // -------------------------------------------------------------------------- // --- Tabs Bar @@ -48,8 +51,7 @@ const HIDDEN = { display: 'none' }; @property {boolean} [content] - render content instead of tab @description A single tab selector. Shall only be used as a children - of [TabsBar](module-dome_layout_tabs.TabsBar.html) - or [Frame](module-dome_layout_frames.Frame.html). + of [[TabsBar]]. When `content` is positionned, the component renders its content children instead of the tab button. In such a case, content @@ -98,7 +100,7 @@ export function Tab(props) { @property {string} selection - tab identifier to render @property {Tab[]} children - tabs (content) to render @description - Shall contains [Tab](module-dome_layout_tabs.Tab.html) instances. + Shall contains [[Tab]] instances. Only the selected tab identifier will be displayed, although all tab contents remains properly mounted. If no tab is selected, no content is displayed. diff --git a/ivette/src/dome/src/renderer/frame/toolbars.js b/ivette/src/dome/src/renderer/frame/toolbars.js index 24dff66185ff93bbe3a6749aa768ba236e467e84..a34a6c5f091d6e4639b93d8223b89127d5acf753 100644 --- a/ivette/src/dome/src/renderer/frame/toolbars.js +++ b/ivette/src/dome/src/renderer/frame/toolbars.js @@ -2,7 +2,10 @@ // --- ToolBars // -------------------------------------------------------------------------- -/** @module dome/frame/toolbars */ +/** + @packageDocumentation + @module dome/frame/toolbars +*/ import React from 'react' ; @@ -15,8 +18,6 @@ import './style.css' ; /** @class @summary Container for toolbar items. - @description - See also [Frame](module-dome_layout_frames.Frame.html) containers. */ export class ToolBar extends React.Component { diff --git a/ivette/src/dome/src/renderer/layout/boxes.js b/ivette/src/dome/src/renderer/layout/boxes.js index 6dc0a7b8c92b318e001fbfb57cf91234e290f9d6..e7848a9ddcc671c3b9c0dfeb80a733708875357d 100644 --- a/ivette/src/dome/src/renderer/layout/boxes.js +++ b/ivette/src/dome/src/renderer/layout/boxes.js @@ -2,41 +2,39 @@ // --- Box Layout // -------------------------------------------------------------------------- -/** @module dome/layout/boxes - @description - -This modules offers several `<div>` containers with various -predefined layout. - -Boxes are the very elementary way to layout components horizontally -or vertically. The different kinds of proposed boxes differ in how they -extends in both directions: normal boxes extends -along their layout direction, _pack_ boxes don't extends and _fill_ boxes -extends along both directions. +/** + @packageDocumentation + @module dome/layout/boxes + @description -Grids layout their component from left-to-right inside predefined _columns_, -then vertically by wrapping cells in rows. + This modules offers several `<div>` containers with various + predefined layout. -The various containers are summarized on the table below: + Boxes are the very elementary way to layout components horizontally + or vertically. The different kinds of proposed boxes differ in how they + extends in both directions: normal boxes extends + along their layout direction, _pack_ boxes don't extends and _fill_ boxes + extends along both directions. -| **Box** | Layout | Extends | -|:-------------:|:-----------:|:----------:|:----------:| -| [Hbox](module-dome_layout_boxes.Hpack.html) | horiz. | horiz. | -| [Vbox](module-dome_layout_boxes.Vpack.html) | vert. | vert. | -| [Hpack](module-dome_layout_boxes.Hpack.html) | horiz. | none | -| [Vpack](module-dome_layout_boxes.Vpack.html) | vert. | none | -| [Hfill](module-dome_layout_boxes.Hpack.html) | horiz. | both | -| [Vfill](module-dome_layout_boxes.Vpack.html) | vert. | both | -| [Grid](module-dome_layout_boxes.Hpack.html) | columns | both | -| [Scroll](module-dome_layout_boxes.Scroll.html) | n/a | both | + Grids layout their component from left-to-right inside predefined _columns_, + then vertically by wrapping cells in rows. -Inside a box, you may add `<Space/>` and `<Filler/>` to separate items. -Inside a grid, you may also use `<Space/>` or an empty `<div/>` for empty cells. + The various containers layout and extensibility is listed below: + - [[Hbox]] horizontal, fixed height + - [[Vbox]] vertical, fixed width + - [[Hpack]] horizontal, fixed dimensions + - [[Vpack]] vertical, fixed dimensions + - [[Hfill]] horizontal, extends in both directions + - [[Vfill]] vertical, extends in both directions + - [[Grid]] uses CSS grid columns, extends in both directions + - [[Scroll]] scrolls its content -<strong>Warning:</strong> large elements will be clipped if they overflow. -If you want to add scrolling capabilities to some item that does not manage overflow -natively, place it inside a `<Scroll/>` sub-container. + Inside a box, you may add `<Space/>` and `<Filler/>` to separate items. + Inside a grid, you may also use `<Space/>` or an empty `<div/>` for empty cells. + <strong>Warning:</strong> large elements will be clipped if they overflow. + If you want to add scrolling capabilities to some item that does not manage overflow + natively, place it inside a `<Scroll/>` sub-container. */ import React from 'react'; diff --git a/ivette/src/dome/src/renderer/layout/dispatch.js b/ivette/src/dome/src/renderer/layout/dispatch.js index 3ab66aeeb6f6afd544249cf6a02d2db25d3f2dc3..1e02c53c0c8529ef1c1cee74572572a384e0e7a4 100644 --- a/ivette/src/dome/src/renderer/layout/dispatch.js +++ b/ivette/src/dome/src/renderer/layout/dispatch.js @@ -2,17 +2,19 @@ // --- Dispatch Layout // -------------------------------------------------------------------------- -/** @module dome/layout/dispatch - @description +/** + @packageDocumentation + @module dome/layout/dispatch + @description -This module allow to declare components anywhere in a component hierarchy -and to render them a totally different place. + This module allows to declare components anywhere in a component hierarchy + and to render them a totally different place. -You shall wrap dispatched components inside a `<Dispatch.Item>` container, -and render them wherever you want with `<Dispatch.Render>`. Each target -place can display only one uniquely identified item. + You shall wrap dispatched components inside a `<Dispatch.Item>` container, + and render them wherever you want with `<Dispatch.Render>`. Each target + place can display only one uniquely identified item. -This can be also used to display some item among many in one unique place. + This can be also used to display some item among many in one unique place. */ import _ from 'lodash' ; diff --git a/ivette/src/dome/src/renderer/layout/forms.js b/ivette/src/dome/src/renderer/layout/forms.js index ad53e812169f6f0149e0eefc3fac577fbb6176e1..101bbfaf6ffc1874950835aec4856f27e9650e33 100644 --- a/ivette/src/dome/src/renderer/layout/forms.js +++ b/ivette/src/dome/src/renderer/layout/forms.js @@ -2,7 +2,10 @@ // --- Form Layout // -------------------------------------------------------------------------- -/** @module dome/layout/forms */ +/** + @packageDocumentation + @module dome/layout/forms +*/ import _ from 'lodash' ; import React from 'react' ; @@ -307,14 +310,14 @@ export function Select({ @property {object} [error] - Set the form context error @property {boolean} [disabled] - Disables the form (default is `false`) @property {onChange} [function] - Callback to updated `(value,error)` - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @property {React.children|function} [children] - Fields to populate the form @description Setup a form context with the provided values. A local state is maintained unless you fully control the `value` and `error` properties. You may also specify any other properties of the - [Select](module-dome_layout_forms.Select.html) filter component. + [[Select]] filter component. */ @@ -387,7 +390,7 @@ const TITLE_DISABLED = 'dome-text-title dome-disabled' ; @property {string} [path] - Fields selection @property {string} [settings] - User's settings for making fold/unfold state persistent @property {boolean} [unfold] - Default fold/unfold state (default is `false`) - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @property {React.children|function} [children] - Section field content @description Wraps some fields inside a foldable section. @@ -431,7 +434,7 @@ export function Section(props) /** @summary Full width form block. - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @property {React.children|function} [children] - Block content @description Wraps its children inside the entire width of the form. @@ -464,7 +467,7 @@ const FIELD_DISABLED = 'dome-xForm-field dome-text-label dome-disabled'; @property {string} [title] - Field tooltip text @property {number} [offset] - Vertical label offset (for baseline alignment) @property {boolean|string} [warn] - Display errors (default: `true`) - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @property {React.children|function} [children] - Custom field content @description @@ -472,10 +475,10 @@ Field layout inside a Form container. The custom field component is positionned on the left of the label, right-aligned. The label itself is left-aligned with the other fields. -The Field component setup a [Select](module-dome_layout_forms.Select.html) -filter for your custom component. Additionnaly, if you use a custom function rendering, -the context is enriched with the `id` of the `<label/>` DOM element of the label, that -you can use with `<input htmlFor={id}/>` as custom field component. +The Field component setup a [[Select]] filter for your custom +component. Additionnaly, if you use a custom function rendering, the context is +enriched with the `id` of the `<label/>` DOM element of the label, that you can +use with `<input htmlFor={id}/>` as custom field component. A warning badge is displayed on the right of your custom component, unless `warn:false` is specified. When hovered, the badge displays `Error` or the specified `string`. When @@ -524,7 +527,7 @@ export class Field extends React.Component @property {string} [label] - Field label @property {string} [title] - Field tooltip text @property {boolean} [warn] - Display errors (default: `false`) - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @property {React.children|function} [children] - List field content @description @@ -554,7 +557,7 @@ export const FieldList = ({ label, title, warn=false, children, ...props }) => ( @property {string} [placeholder] - Input field place holder @property {string} [className] - Input field additional class @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description Field with a Text Input element. The default latency is set to 600ms. */ @@ -585,7 +588,7 @@ export const FieldText = ({ className, style, latency=true, placeholder, ...prop @property {string} [placeholder] - Input field place holder @property {string} [className] - Input field additional class @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description Field with a Text Input element. The default latency is set to 600ms. */ @@ -618,7 +621,7 @@ export const FieldCode = ({ className, style, latency=true, placeholder, ...prop @property {number} [cols] - Number of columns (default 35, min 5) @property {number} [rows] - Number of lines (default 5, min 2) @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description Field with a Text Input element. The default latency is set to 900ms. */ @@ -654,7 +657,7 @@ export const FieldTextArea = ({ className, style, cols=35, rows=5, @property {number} [cols] - Number of columns (default 35, min 5) @property {number} [rows] - Number of lines (default 5, min 2) @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description Field with a Text Input element. The default latency is set to 900ms. */ @@ -706,7 +709,7 @@ const NUMBER_OF_TEXT = (s) => s==='' ? undefined : PARSE_NUMBER(s.replace(/[ ,]/ @property {string} [units] - Number units or currency @property {string} [className] - Input field additional class @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description Field to edit number values with a Text Input element. The default latency is set to 600ms. Numbers are rendered in the english locale, grouping thousands @@ -772,7 +775,7 @@ const INT_RANGE = (min,max,warning) => (v) => @property {string} [warning] - Out of bound message (default is explaining the range) @property {string} [className] - Input field additional class @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description Field to edit integer numbers with a spinner element. The default latency is set to 600ms. @@ -868,7 +871,7 @@ class REVEAL extends React.Component { @property {boolean|function} [show] - Display the selected value on the right (default is `true`) @property {string} [className] - Input field additional class @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description Field to edit integer numbers with a spinner element. The default latency is set to 600ms. Double click on the slider reset it @@ -914,7 +917,7 @@ export const FieldSlider = @property {string} [max] - Maximum date (default to `undefined`) @property {string} [className] - Input field additional class @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description Field with a Date Input element. The default latency is set to 600ms. The date is presented in english locale, with format `mm/dd/yyyy`, but the internal value @@ -947,7 +950,7 @@ export const FieldDate = ({ className, style, latency=true, min, max, ...props } @property {string} [max] - Maximum time (default to `undefined`) @property {string} [className] - Input field additional class @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description Field with a Time Input element. The default latency is set to 600ms. The time is presented in english locale, but its internal value is a string 'hh:mm' @@ -979,7 +982,7 @@ export const FieldTime = ({ className, style, latency=true, min, max, ...props } @property {string} [title] - Field tooltip text @property {string} [className] - Input field additional class @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description Field with a Text Input element. The default latency is set to 600ms. */ @@ -1009,7 +1012,7 @@ export const FieldColor = ({ className, style, latency=true, ...props }) => ( @property {string} [placeholder] - Selector placeholder @property {string} [className] - Input field additional class @property {object} [style] - Input field additional style - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @property {option|optgroup} [children] - HTML options of the `<select>` element @description Field with a Select element. Children must be standard `<option>` and `<optgroup>` elements. @@ -1048,7 +1051,7 @@ export const FieldSelect = ({ className, style, children, placeholder, ...props @property {string} [label] - Field label @property {string} [title] - Field tooltip text @property {boolean} [inverted] - Inverted value (incompatible with `input` and `output` properties) - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description A check box field. */ @@ -1076,7 +1079,7 @@ export const FieldCheckbox = ({ label, title, inverted, ...props }) => { @property {string} [label] - Field label @property {string} [title] - Field tooltip text @property {any} [value] - Value associated with the radio button - @property {any} [...props] - [Select](module-dome_layout_forms.Select.html) properties + @property {any} [...props] - [[Select]] properties @description A radio button field. diff --git a/ivette/src/dome/src/renderer/layout/grids.js b/ivette/src/dome/src/renderer/layout/grids.js index aad4e32c7b6e21b1d36d9b17d31c74093487d254..dd38a71915d290b50a82601b796ce8a9152e1938 100644 --- a/ivette/src/dome/src/renderer/layout/grids.js +++ b/ivette/src/dome/src/renderer/layout/grids.js @@ -2,7 +2,10 @@ // --- Grid Layout // -------------------------------------------------------------------------- -/** @module dome/layout/grids */ +/** + @packageDocumentation + @module dome/layout/grids +*/ import _ from 'lodash' ; import React from 'react' ; @@ -790,26 +793,22 @@ It can be used only as direct children of `GridLayout` and other `GridBox` containers. See also: - - [GridLayout](module-dome_layout_grids.GridLayout.html) top-level container - - [GridItem](module-dome_layout_grids.GridItem.html) elementary component - - [GridHbox](module-dome_layout_grids.GridHbox.html) horizontal box - - [GridVbox](module-dome_layout_grids.GridVbox.html) vertical box + - [[GridLayout]] top-level container + - [[GridItem]] elementary component + - [[GridHbox]] horizontal box + - [[GridVbox]] vertical box */ export const GridBox = (props) => null ; /** - @summary Layout its content in an horizontal box. + [[GridBox]] with horizontal layout @property {ident} [id] - the box identifier - @description - See [GridBox](module-dome_layout_grids.GridBox.html) */ export const GridHbox = (props) => null ; /** - @summary Layout its content in a vertical box. + [[GridBox]] with vertical layout @property {ident} [id] - the box identifier - @description - See [GridBox](module-dome_layout_grids.GridBox.html) */ export const GridVbox = (props) => null ; @@ -956,7 +955,7 @@ Low-level GridLayout container, with only resizing capabilities. Additional rendering options are available: - `dragged` : item being dragged, materialized with a dragging background; -- `dragging` : current [D&D](dome-module_dnd.html) event to notify `onTarget()` with; +- `dragging` : current D&D event to notify `onTarget()` with; - `target` : `{at,dir,left,top,width,height}` insertion position to materialize; - `shape:Shape` : desired reshaping of the children grid; - `onReshape(Shape)` : notified when grid content has been resized; @@ -1112,14 +1111,14 @@ const DRAGGABLEITEM = @property {function} [onReshape] - Callback on reshaping self content @property {function} [onInsert] - Callback on dropping the holding element @property {function} [onDnd] - Callback on D&D events - @property {function} [onXxx] - Other D&D [callback events](module-dome_dnd.html) + @property {function} [onXxx] - Other D&D callback events @description Layout several components with nested vertical and horizontal boxes. Direct children of the container must be either: -- [GridBox](module-dome_layout_grids.GridBox.html) and its derivated -- [GridItem](module-dome_layout_grids.GridItem.html) for elementary component +- [[GridBox]] and its derivated +- [[GridItem]] for elementary component Top-level children are laidout vertically (default) or horizontally according to the `dir` property. Nested boxes of same directions are flattened, @@ -1136,7 +1135,7 @@ simply ignored from the shape taken into account. GridLayout containers can be used as drop targets, both for re-arranging internal grid items, or to insert external drag sources inside. -If you supply an external [DnD](module-dome_dnd.DnD.html) controller, +If you supply an external [[DnD]] controller, the GridLayout will register itself as a drop target. Otherwize, it will use its own controller. diff --git a/ivette/src/dome/src/renderer/layout/splitters.js b/ivette/src/dome/src/renderer/layout/splitters.js index 5b4ced76388a4e017b0718e4e50a82abad5cde19..b6468165cfcf2a07a4e425d291150a7c1a8b8527 100644 --- a/ivette/src/dome/src/renderer/layout/splitters.js +++ b/ivette/src/dome/src/renderer/layout/splitters.js @@ -2,7 +2,10 @@ // --- Splitters // -------------------------------------------------------------------------- -/** @module dome/layout/splitters */ +/** + @packageDocumentation + @module dome/layout/splitters +*/ import _ from 'lodash' ; import * as React from 'react' ; diff --git a/ivette/src/dome/src/renderer/table/arrays.js b/ivette/src/dome/src/renderer/table/arrays.js index 92836415961c8022b850dd73db74f5202d6ed558..19f0fd189fc614060c975186da2660c2ba2c47f1 100644 --- a/ivette/src/dome/src/renderer/table/arrays.js +++ b/ivette/src/dome/src/renderer/table/arrays.js @@ -2,7 +2,10 @@ // --- Table Models // -------------------------------------------------------------------------- -/** @module dome/table/arrays */ +/** + @packageDocumentation + @module dome/table/arrays +*/ import _ from 'lodash' ; import React from 'react' ; @@ -173,11 +176,11 @@ A comparison ring can be used to implement column ordering, where each column selection _refines_ the previous ordering. Hence, the ring holds the current comparison order and it is well suited -for being used in conjunction with [Table](module-dome_table_views.Table.html) +for being used in conjunction with [[Table]] components. A comparison specification can be a property name or a function. -See [compareWith](module-dome_table_arrays.html#compareWith) for more details. +See [[compareWith]] for more details. By default, the ring uses the column identifier as a property name for comparing. Initially, the ordering is _natural_. @@ -201,7 +204,7 @@ export class ComparisonRing { @description Returns the comparison function corresponding to the current order. The comparison function is _chainable_, see - [compareWith](module-dome_table_arrays.html#compareWith) for more details. + [[compareWith]] for more details. */ compareWith() { @@ -303,7 +306,7 @@ export class ComparisonRing { @summary A table Model for unsorted datasets. @description - This class implements a simple [Model](module-dome_table_models.Model.html) + This class implements a simple [[Model]] where item's are identified by their index. Such a model is not adapted to re-ordering and filtering, because table views will have no way to synchronize the selected index before and after re-ordering, hence the name. @@ -359,11 +362,10 @@ export class UnsortedModel extends Model { @extends Model @description - This class implements a simple [Model](module-dome_table_models.Model.html) + This class implements a simple [[Model]] implementation where item's are stored in an array. The model supports built-in ordering thanks with a - [ComparisonRing](module-dome_table_arrays.ComparisonRing.html) - with additional filtering capabilities. + [[ComparisonRing]] with additional filtering capabilities. The model keep items in sync with their ordered & filtered index by injecting an `index` property in them each time the collection is re-ordered. diff --git a/ivette/src/dome/src/renderer/table/models.js b/ivette/src/dome/src/renderer/table/models.js index 1f95258200b6502eae2527b8cf92deb16352d461..8a1dc224ce856ce67825653891a2fe2ba8ae1acd 100644 --- a/ivette/src/dome/src/renderer/table/models.js +++ b/ivette/src/dome/src/renderer/table/models.js @@ -2,7 +2,10 @@ // --- Models // -------------------------------------------------------------------------- -/** @module dome/table/models */ +/** + @packageDocumentation + @module dome/table/models +*/ import _ from 'lodash' ; import { SortDirection } from 'react-virtualized' ; @@ -30,12 +33,6 @@ export const DESC = SortDirection.DESC ; with their associated data sets. The model listens for updates, retrieves items from their index, and re-render the views when necessary. - - Model could be part of the global _Application State_, or part of a - statefull React Component, depending on your need as described in - the [Application Design](tutorial-application.html) tutorial. - - Several tables may connect to the same table model, but they will share the same number and ordering of items. However, each connected table will only render its own range of items and will re-renderer only when impacted by @@ -91,7 +88,7 @@ export const DESC = SortDirection.DESC ; ##### Model Helpers - The module [dome/table/arrays](module-dome_table_arrays.html) provides you with + The module [[dome/table/arrays]] provides you with usefull helpers to implement Models with filtering and ordering features. */ diff --git a/ivette/src/dome/src/renderer/table/views.js b/ivette/src/dome/src/renderer/table/views.js index 696552bb85ac792cceb7b4dc2b23e0c2db7c71ee..dc7923748ce90485095863132c57818cb7823f00 100644 --- a/ivette/src/dome/src/renderer/table/views.js +++ b/ivette/src/dome/src/renderer/table/views.js @@ -2,7 +2,10 @@ // --- Tables // -------------------------------------------------------------------------- -/** @module dome/table/views */ +/** + @packageDocumentation + @module dome/table/views +*/ import _ from 'lodash' ; import React from 'react' ; @@ -153,17 +156,12 @@ const computeWidth = (elt) => { By default, values are obtained from the underlying model by invoking - [Model.getValue](module-dome_table_models.Model.html#getValue) with the column - identifier. - - The default `renderValue` renders the item's value - packed in a `<label>` with class `dome-text-data` as described in the - [Styling Component](tutorial-styling.html) tutorial. + [[Model.getValue]] with the column identifier. This separation of concerns allows for defining Column types, where for instance the renderer is already defined and you only need to know how to extract the expected value of items. - See [DefineColumn](module-dome_table_views.DefineColumn.html) + See [[DefineColumn]] for more informations and examples. A table should have at least one extensible column to occupy the available width. @@ -229,8 +227,7 @@ const defaultVisible = (visible) => { @return {Column} a new Column class of Component @description - Allow to define specialized instances of - [Column](module-dome_table_views.Column.html) + Allow to define specialized instances of [[Column]]. @example // Example of column type import { DefineColumn } from 'dome/table/views' ; @@ -293,11 +290,11 @@ const DEFAULT_STATE = { width:{}, resize:{}, visible:{} }; datasets. A table shall be connected to an instance of - [Model](module-dome_table_models.Model.html) class to retrieve the data and + [[Model]] class to retrieve the data and get informed of data updates. The table columns shall be instances of - [Column](module-dome_table_views.Column.html) class. + [[Column]] class. Clicking on table headers trigger re-ordering callback on the model with the expected column and direction, unless disabled _via_ the column diff --git a/ivette/src/dome/src/renderer/text/buffers.js b/ivette/src/dome/src/renderer/text/buffers.js index 6bd46b845cacb47218a5e55bacb73df57db889b0..ebab6e603aba83c5d8f79094c61861da1bc8cfec 100644 --- a/ivette/src/dome/src/renderer/text/buffers.js +++ b/ivette/src/dome/src/renderer/text/buffers.js @@ -2,7 +2,10 @@ // --- Text Documents // -------------------------------------------------------------------------- -/** @module dome/text/buffers */ +/** + @packageDocumentation + @module dome/text/buffers +*/ import Emitter from 'events' ; import CodeMirror from 'codemirror/lib/codemirror.js' ; diff --git a/ivette/src/dome/src/renderer/text/editors.js b/ivette/src/dome/src/renderer/text/editors.js index aece9b84143297c1ae11852e4dec4c9d94450839..6040d63c4eb90b0fade6c5516bd388f2497bd4de 100644 --- a/ivette/src/dome/src/renderer/text/editors.js +++ b/ivette/src/dome/src/renderer/text/editors.js @@ -2,7 +2,10 @@ // --- Text Documents // -------------------------------------------------------------------------- -/** @module dome/text/editors */ +/** + @packageDocumentation + @module dome/text/editors +*/ import _ from 'lodash' ; import React from 'react' ; @@ -22,8 +25,7 @@ const CSS_SELECTED = 'dome-xText-select' ; /** @class @summary Rich Text Editor. - @property {Buffer} buffer - - associated [Buffer](module-dome_text_buffers.Buffer.html) holding the text content + @property {Buffer} buffer - associated Buffer holding the text content @property {string} className - additional class name(s) @property {object} style - additional CSS style @property {number} fontSize - editor font-size @@ -35,7 +37,7 @@ const CSS_SELECTED = 'dome-xText-select' ; @description A component rendering the content of a text buffer, that shall be instances - of the [Buffer](module-dome_text_buffers.Buffer.html) base class. + of the `Buffer` base class. The view is based on a [CodeMirror](https://codemirror.net) component linked with the internal Code Mirror Document from the associated buffer. diff --git a/ivette/src/dome/src/renderer/text/pages.js b/ivette/src/dome/src/renderer/text/pages.js index ca8b486e080521af0ac5c26f9d2410baca5a6930..9714adbb0a05617fa81bef98bd8f8117b88eefa8 100644 --- a/ivette/src/dome/src/renderer/text/pages.js +++ b/ivette/src/dome/src/renderer/text/pages.js @@ -3,8 +3,10 @@ // -------------------------------------------------------------------------- /** + @packageDocumentation @module dome/text/pages @description + A collection of text area and elements do render textual content. Inside such areas, all elements are styled like a classical web page. @@ -15,12 +17,11 @@ most other widget components. The behaviour of `<a href=...>` elements differs for local links and external URLs. - Local links trigger a ['dome.href'](dome_.html#~event:'dome.href') event, that + Local links trigger a `'dome.href'` event, that you can listen to from the originating renderer process, _eg. by using `Dome.useUpdate()` custom hook. External links launch the user's default browser. - */ import React from 'react' ; diff --git a/ivette/src/frama-c/LabViews.tsx b/ivette/src/frama-c/LabViews.tsx index 0c3cadd7c717f16a16998efcd18648e0ba0d8873..ff74b6542fe75e975cdf230cf68d09cd7d0cc027 100644 --- a/ivette/src/frama-c/LabViews.tsx +++ b/ivette/src/frama-c/LabViews.tsx @@ -2,7 +2,10 @@ // --- Lab View Component // -------------------------------------------------------------------------- -/** @module frama-c/labviews */ +/** + @packageDocumentation + @module frama-c/labviews +*/ import _ from 'lodash'; import React from 'react'; @@ -527,8 +530,7 @@ function CustomGroup({ title: sectionTitle, label: sectionLabel, components, -}: any) -{ +}: any) { const makeComponent = ({ id, label, title }: any) => { const itemId = getItemId('components', id); const disabled = Grids.getShapeItem(shape, itemId) !== undefined; diff --git a/ivette/src/frama-c/server.ts b/ivette/src/frama-c/server.ts index 0d68f26e796cc5ec4aaa25e21840ef925118902f..4220a8918ae6d0f81284131f6c723126abc63588 100644 --- a/ivette/src/frama-c/server.ts +++ b/ivette/src/frama-c/server.ts @@ -3,9 +3,11 @@ // -------------------------------------------------------------------------- /** - * @module frama-c/server - * @description Manage the current Frama-C server/client interface - */ + @packageDocumentation + @module frama-c/server + @description + Manage the current Frama-C server/client interface +*/ import _ from 'lodash'; import React from 'react'; diff --git a/ivette/src/frama-c/states.ts b/ivette/src/frama-c/states.ts index 5241835c744431420927022c9cab728e3650d182..13298285713cc3e76c857ee1175240c931a8b06a 100644 --- a/ivette/src/frama-c/states.ts +++ b/ivette/src/frama-c/states.ts @@ -3,10 +3,11 @@ // -------------------------------------------------------------------------- /** - * @module frama-c/states - * @description - * Manage the current Frama-C project and projectified state values. - */ + @packageDocumentation + @module frama-c/states + @decsription + Manage the current Frama-C project and projectified state values. +*/ import _ from 'lodash'; import React from 'react'; diff --git a/ivette/tsconfig.json b/ivette/tsconfig.json index 681879ffba4a382c6bf2ad8fbc46b5de3705d4f8..21834d78d30a7ad2a5832468a6aca67245f1eb4a 100644 --- a/ivette/tsconfig.json +++ b/ivette/tsconfig.json @@ -77,5 +77,26 @@ "dist", "src/dome/doc", "src/dome/template" - ] + ], + "typedocOptions": { + "name": "Ivette Documentation", + "mode": "modules", + "out": "doc/html", + "includeVersion": true, + "disableSources": true, + "excludePrivate": true, + "excludeNotExported": true, + "excludeExternals": true, + "categorizeByGroup": false, + "categoryOrder": [ "Hooks", "Components", "*", "Other" ], + "stripInternal": true, + "listInvalidSymbolLinks":true, + "hideGenerator":true, + "readme": "./README.md", + "inputFiles": [ + "doc/pages", + "src/frama-c", + "src/dome/src/renderer" + ] + } } diff --git a/ivette/yarn.lock b/ivette/yarn.lock index 92759d49f5d57ca41a516fde994c7b0d52d7b4ca..26425e68bbe7e3614e4d8c1ebfc3315a0ab914f1 100644 --- a/ivette/yarn.lock +++ b/ivette/yarn.lock @@ -1382,6 +1382,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@zeit/schemas@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.6.0.tgz#004e8e553b4cd53d538bd38eac7bcbf58a867fe3" + integrity sha512-uUrgZ8AxS+Lio0fZKAipJjAh415JyrOZowliZAzmnJSsf7piVL5w+G0+gFJ0KSu3QRhvui/7zuvpLz03YjXAhg== + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -1423,6 +1428,16 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== +ajv@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.1, ajv@^6.10.2, ajv@^6.12.0: version "6.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" @@ -1438,6 +1453,13 @@ alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + ansi-align@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" @@ -1548,6 +1570,16 @@ aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +arch@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf" + integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ== + +arg@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545" + integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1841,6 +1873,19 @@ boolean@^3.0.0: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.1.tgz#35ecf2b4a2ee191b0b44986f14eb5f052a5cbb4f" integrity sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA== +boxen@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + boxen@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" @@ -2119,6 +2164,11 @@ camel-case@^4.1.1: pascal-case "^3.1.1" tslib "^1.10.0" +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -2151,7 +2201,16 @@ catharsis@^0.8.11: dependencies: lodash "^4.17.14" -chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2275,6 +2334,11 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + cli-boxes@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" @@ -2292,6 +2356,14 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== +clipboardy@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" + integrity sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA== + dependencies: + arch "^2.1.0" + execa "^0.8.0" + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -2424,7 +2496,7 @@ colors@~1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= -commander@^2.11.0, commander@^2.19.0, commander@^2.20.0: +commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2444,13 +2516,26 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compressible@~2.0.16: +compressible@~2.0.14, compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" +compression@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.2" + vary "~1.1.2" + compression@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" @@ -2524,6 +2609,11 @@ contains-path@^0.1.0: resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -2647,6 +2737,15 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cross-unzip@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/cross-unzip/-/cross-unzip-0.0.2.tgz#5183bc47a09559befcf98cc4657964999359372f" @@ -3676,6 +3775,32 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -3793,6 +3918,11 @@ extract-zip@^1.0.3: mkdirp "^0.5.4" yauzl "^2.10.0" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + fast-deep-equal@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" @@ -3808,6 +3938,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + dependencies: + punycode "^1.3.2" + faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -4077,6 +4214,11 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -4254,6 +4396,18 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== +handlebars@^4.7.6: + version "4.7.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -4345,6 +4499,11 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +highlight.js@^10.0.0: + version "10.0.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.0.3.tgz#5effcc58420f113f279a0badb8ac50c4be06e63b" + integrity sha512-9FG7SSzv9yOY5CGGxfI6NDm7xLYtMOjKtPBxw7Zff3t5UcRcUNTGEeS8lNjhceL34KeetLMoGMFTGoaa83HwyQ== + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -4701,7 +4860,7 @@ internal-slot@^1.0.2: has "^1.0.3" side-channel "^1.0.2" -interpret@1.2.0: +interpret@1.2.0, interpret@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== @@ -5323,7 +5482,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@^4.2.0: +lodash@^4.1.2, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@^4.2.0: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -5357,6 +5516,14 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -5364,6 +5531,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lunr@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" + integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -5414,6 +5586,11 @@ markdown-it@^8.4.2: mdurl "^1.0.1" uc.micro "^1.0.5" +marked@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-1.0.0.tgz#d35784245a04871e5988a491e28867362e941693" + integrity sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng== + marked@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" @@ -5532,6 +5709,18 @@ mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + mime-types@^2.1.26, mime-types@~2.1.17, mime-types@~2.1.24: version "2.1.26" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" @@ -5586,7 +5775,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -5734,7 +5923,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.1: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== @@ -5978,7 +6167,7 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.0.2: +on-headers@~1.0.1, on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== @@ -6237,7 +6426,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: +path-is-inside@1.0.2, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= @@ -6257,6 +6446,11 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -6739,6 +6933,11 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -6781,7 +6980,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4: +punycode@^1.2.4, punycode@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= @@ -6846,6 +7045,11 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -6861,7 +7065,7 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.8: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7008,6 +7212,13 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + reduce-css-calc@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" @@ -7092,6 +7303,14 @@ regexpu-core@^4.7.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" +registry-auth-token@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + registry-auth-token@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" @@ -7099,6 +7318,13 @@ registry-auth-token@^4.0.0: dependencies: rc "^1.2.8" +registry-url@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + registry-url@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" @@ -7206,6 +7432,13 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@^1.1.6, resolve@^1.12.0, resolve@^1.13.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + resolve@^1.10.0, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" @@ -7213,13 +7446,6 @@ resolve@^1.10.0, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1: dependencies: path-parse "^1.0.6" -resolve@^1.12.0, resolve@^1.13.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -7406,6 +7632,11 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.1.1: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + semver@^7.1.2, semver@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" @@ -7442,6 +7673,20 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +serve-handler@6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.2.tgz#f05b0421a313fff2d257838cba00cbcc512cd2b6" + integrity sha512-RFh49wX7zJmmOVDcIjiDSJnMH+ItQEvyuYLYuDBVoA/xmQSCuj+uRmk1cmBB5QQlI3qOiWKp6p4DUGY+Z5AB2A== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -7465,6 +7710,21 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" +serve@^11.3.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/serve/-/serve-11.3.0.tgz#1d342e13e310501ecf17b6602f1f35da640d6448" + integrity sha512-AU0g50Q1y5EVFX56bl0YX5OtVjUX1N737/Htj93dQGKuHiuLvVB45PD8Muar70W6Kpdlz8aNJfoUqTyAq9EE/A== + dependencies: + "@zeit/schemas" "2.6.0" + ajv "6.5.3" + arg "2.0.0" + boxen "1.3.0" + chalk "2.4.1" + clipboardy "1.2.3" + compression "1.7.3" + serve-handler "6.1.2" + update-check "1.5.2" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -7520,6 +7780,15 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shelljs@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + side-channel@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" @@ -8040,6 +8309,13 @@ temp-file@^3.3.7: async-exit-hook "^2.0.1" fs-extra "^8.1.0" +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + term-size@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" @@ -8241,6 +8517,37 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typedoc-default-themes@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.10.1.tgz#eb27b7d689457c7ec843e47ec0d3e500581296a7" + integrity sha512-SuqAQI0CkwhqSJ2kaVTgl37cWs733uy9UGUqwtcds8pkFK8oRF4rZmCq+FXTGIb9hIUOu40rf5Kojg0Ha6akeg== + dependencies: + lunr "^2.3.8" + +typedoc-plugin-external-module-name@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/typedoc-plugin-external-module-name/-/typedoc-plugin-external-module-name-3.1.0.tgz#3c2dc72ee6fa511efdee21f9f470140a5c69042b" + integrity sha512-7Jym2cOkSbMtXRb2C9RytIihryB/a7UZZbCWeIZ+PoSxglOwiHqTAPWWVN2AbVKh3iKy8PpGRCYggfDnpb177g== + dependencies: + lodash "^4.1.2" + semver "^7.1.1" + +typedoc@^0.17.6: + version "0.17.6" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.17.6.tgz#cab87a72c10e05429016d659a4c3071a5a3ffb61" + integrity sha512-pQiYnhG3yJk7939cv2n8uFoTsSgy5Hfiw0dgOQYa9nT9Ya1013dMctQdAXMj8JbNu7KhcauQyq9Zql9D/TziLw== + dependencies: + fs-extra "^8.1.0" + handlebars "^4.7.6" + highlight.js "^10.0.0" + lodash "^4.17.15" + lunr "^2.3.8" + marked "1.0.0" + minimatch "^3.0.0" + progress "^2.0.3" + shelljs "^0.8.4" + typedoc-default-themes "^0.10.1" + typescript@^3.8.3: version "3.8.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" @@ -8251,6 +8558,13 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== +uglify-js@^3.1.4: + version "3.9.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.3.tgz#4a285d1658b8a2ebaef9e51366b3a0f7acd79ec2" + integrity sha512-r5ImcL6QyzQGVimQoov3aL2ZScywrOgBXGndbWrdehKoSvGe/RmiE5Jpw/v+GvxODt6l2tpBXwA7n+qZVlHBMA== + dependencies: + commander "~2.20.3" + underscore@~1.9.1: version "1.9.2" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f" @@ -8353,6 +8667,14 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-check@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.2.tgz#2fe09f725c543440b3d7dabe8971f2d5caaedc28" + integrity sha512-1TrmYLuLj/5ZovwUS7fFd1jMH3NnFDN1y1A8dboedIDt7zs/zJMo6TwwlhYKkSeEwzleeiSBV5/3c9ufAQWDaQ== + dependencies: + registry-auth-token "3.3.2" + registry-url "3.1.0" + update-notifier@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" @@ -8677,6 +8999,13 @@ which@^1.2.14, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + widest-line@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" @@ -8689,6 +9018,11 @@ word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -8783,6 +9117,11 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"