Use build_runner to generate documentation

This commit is contained in:
Simon Binder
2021-03-12 21:14:45 +01:00
parent 6f6f73616e
commit ba95127cab
63 changed files with 713 additions and 1463 deletions
-4
View File
@@ -1,4 +0,0 @@
[submodule "docs/themes/docsy"]
path = docs/themes/docsy
url = https://github.com/google/docsy.git
-7
View File
@@ -1,7 +0,0 @@
public/
resources/
node_modules/
tech-doc-hugo
.vscode/
+27 -7
View File
@@ -1,13 +1,33 @@
# Moor documentation
Contains the source code for the moor documentation, live at moor.simonbinder.eu
We use [Docsy](https://github.com/google/docsy), a Hugo theme for this website. You'll need the extended version of Hugo as described
[here](https://www.docsy.dev/docs/getting-started/).
To work on the documentation, first cd into this directory, then run `git submodule update --init --recursive` and
`npm install`. To update the dependencies, run `git pull --recurse-submodules`.
Welcome to the source of moor's documentation, live at moor.simonbinder.eu.
We use a static site generator based on `build_runner` to build the documentation.
## Running the website locally
After the setup, it's just a simple
For a fast edit-refresh cycle, run
```
hugo server
dart run webdev serve --auto refresh pages:9999 web:8080
```
You can ignore the `pages:9999` (or use any other port), it's just required
so that the build system actually generates pages.
## Building the website
To build the website, first run
```
dart run build_runner build --release
```
To then copy generated contents into a directory, use:
```
dart run build_runner build --release --output web:out
```
Where `out` is the desired output directory.
Note that both steps are necessary since the build system doesn't re-generate
pages otherwise.
+32
View File
@@ -0,0 +1,32 @@
targets:
# Preprocess css first, so that we can read generated assets in the main target (for subresource integrity)
css:
auto_apply_builders: false
builders:
sass_builder:
enabled: true
sources:
- "web/main.scss"
- "web/main.css"
$default:
dependencies: [":css"]
builders:
sass_builder:
enabled: false
build_web_compilers|entrypoint:
release_options:
# Turn of null assertions for release builds, it looks like this
# makes generated code slightly smaller.
native_null_assertions: false
dart2js_args:
- "-O4"
- "--csp"
sources:
- "lib/**"
- "pages/**"
- "templates/**"
- "web/**"
- "$package$"
- "pubspec.yaml"
- "website.yaml"
-136
View File
@@ -1,136 +0,0 @@
baseURL = "https://moor.simonbinder.eu/"
title = "Moor"
enableRobotsTXT = true
# Hugo allows theme composition (and inheritance). The precedence is from left to right.
theme = ["docsy"]
# Will give values to .Lastmod etc.
enableGitInfo = true
# Language settings
contentDir = "content/en"
defaultContentLanguage = "en"
defaultContentLanguageInSubdir = false
# Useful when translating.
#enableMissingTranslationPlaceholders = true
disableKinds = ["taxonomy", "taxonomyTerm"]
# Highlighting config
pygmentsCodeFences = true
pygmentsUseClasses = false
# Use the new Chroma Go highlighter in Hugo.
pygmentsUseClassic = false
#pygmentsOptions = "linenos=table"
# See https://help.farbox.com/pygments.html
pygmentsStyle = "vs"
# First one is picked as the Twitter card image if not set on page.
#images = ["images/project-illustration.png"]
# Configure how URLs look like per section.
[permalinks]
blog = "/:section/:year/:month/:day/:slug/"
## Configuration for BlackFriday markdown parser: https://github.com/russross/blackfriday
[blackfriday]
plainIDAnchors = true
hrefTargetBlank = false
angledQuotes = false
latexDashes = true
[markup]
# todo migrate to goldmark (will need configuration for backwards-compatibility https://gohugo.io/getting-started/configuration-markup/)
defaultMarkdownHandler = "blackfriday"
# Image processing configuration.
[imaging]
resampleFilter = "CatmullRom"
quality = 75
anchor = "smart"
[services]
[services.googleAnalytics]
# Comment out the next line to disable GA tracking. Also disables the feature described in [params.ui.feedback].
#id = "UA-00000000-0"
# Language configuration
[languages]
[languages.en]
title = "Moor"
description = "A typesafe, reactive persistence library for Dart and Flutter apps"
languageName ="English"
# Weight used for sorting.
weight = 1
#[languages.no]
#title = "Goldydocs"
#description = "Docsy er operativsystem for skyen"
#languageName ="Norsk"
#contentDir = "content/no"
#time_format_default = "02.01.2006"
#time_format_blog = "02.01.2006"
# Additional menu items to GitHub and pub
[[menu.main]]
name = "Pub"
weight = 100
url = "https://pub.dev/packages/moor"
[[menu.main]]
name = "GitHub"
weight = 110
url = "https://github.com/simolus3/moor/"
[[menu.main]]
name = "API docs"
weight = 120
url = "https://pub.dev/documentation/moor/latest/"
# Everything below this are Site Params
[params]
copyright = "Simon Binder"
#privacy_policy = "https://policies.google.com/privacy"
# Menu title if your navbar has a versions selector to access old versions of your site.
# This menu appears only if you have at least one [params.versions] set.
version_menu = "Releases"
# Repository configuration (URLs for in-page links to opening issues and suggesting changes)
github_repo = "https://github.com/simolus3/moor"
# Specify a value here if your content directory is not in your repo's root directory
github_subdir = "docs"
# Google Custom Search Engine ID. Remove or comment out to disable search.
gcs_engine_id = " 002567324444333206795:_yptu7lact8 "
# User interface configuration
[params.ui]
# Enable to show the side bar menu in its compact state.
sidebar_menu_compact = false
# Set to true to disable breadcrumb navigation.
breadcrumb_disable = false
# Set to true to hide the sidebar search box (the top nav search box will still be displayed if search is enabled)
sidebar_search_disable = false
# Set to false if you don't want to display a logo (/assets/icons/logo.svg) in the top nav bar
navbar_logo = false
[params.links]
# End user relevant links. These will show up on left side of footer and in the community page if you have one.
[[params.links.user]]
name = "Contact me via e-mail"
url = "mailto:oss@simonbinder.eu"
icon = "fa fa-envelope"
[[params.links.user]]
name = "Room in gitter"
url = "https://gitter.im/moor-dart/community"
icon = "fab fa-gitter"
[[params.links.user]]
name = "Project on GitHub"
url = "https://github.com/simolus3/moor"
icon = "fab fa-github"
desc = "Development takes place here!"
# could also add another with params.links.developer. They appear on the right
-78
View File
@@ -1,78 +0,0 @@
---
title: "Moor - Reactive, typesafe persistence library for Dart"
description: Moor is a reactive and typesafe persistence library for Dart and Flutter apps.
It generates code to let you write complex queries easily.
linkTitle: "Moor"
---
{{< blocks/cover title="Moor: Persistence library for Dart" image_anchor="top" height="med" color="indigo" >}}
<div class="mx-auto">
<a class="btn btn-lg btn-primary mr-3 mb-4" href="{{< relref "/docs" >}}">
Learn moor <i class="fas fa-arrow-alt-circle-right ml-2"></i>
</a>
<a class="btn btn-lg btn-secondary mr-3 mb-4" href="https://pub.dev/packages/moor_flutter">
Get from pub <i class="fas fa-code ml-2 "></i>
</a>
<p class="lead mt-5">
With a fluent query api, a powerful sql analyzer, auto-updating streams and much moor,
moor makes persistence fun. Scroll down to learn about moor's key features, or visit the
<a href="{{< relref "/docs/Getting started" >}}">getting started guide</a> for a step-by-step guide on using moor.
</p>
</div>
{{< /blocks/cover >}}
{{% blocks/lead color="dark" %}}
Moor is an easy to use, reactive persistence library for Flutter apps. Define tables in Dart or
SQL and enjoy a fluent query API, auto-updating streams and more!
{{% /blocks/lead %}}
{{< blocks/section color="primary" >}}
{{% blocks/feature icon="fa-lightbulb" title="Declarative tables, fluent queries!" %}}
With moor, you can write your database tables in pure Dart without having to miss out on
advanced sqlite features. Moor will take care of creating the tables and generate code
that allows you run fluent queries on your data.
[Get started now]({{< ref "/docs/Getting started/_index.md" >}})
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-database" title="Prefer SQL? Moor got you covered!" %}}
Moor contains a powerful sql parser and analyzer, allowing it to create typesafe APIs for all your sql queries. All sql queries are
validated and analyzed during build-time, so moor can provide hints about potential errors quickly and generate efficient mapping
code.
[Learn more]({{< ref "/docs/Using SQL/_index.md" >}})
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-star" title="And much more!" %}}
Moor provides auto-updating streams for all your queries, makes dealing with transactions and migrations easy
and lets your write modular database code with DAOs. We even have a [sql IDE](too) builtin to the project
When using moor, working with databases in Dart is fun!
{{% /blocks/feature %}}
{{< /blocks/section >}}
{{< blocks/section color="light" type="section" >}}
<h2>Key moor features</h2>
Here are some of the many ways moor helps you write awesome database code:
<ul>
<li><b>Auto-updating streams</b>: With moor, any query - no matter how complex - can be turned into a stream that emits new data as the underlying data changes.</li>
<li><b>Polyglot</b>: Moor lets you write queries in a fluent Dart api or directly in SQL - you can even embed Dart expressions in SQL.</li>
<li><b>Safety</b>: Moor can verify your table declarations and queries at compile time, providing helpful and descriptive hints when it finds problems.</li>
<li><b>Boilerplate-free</b>: Stop writing mapping code yourself - moor can take of that. Moor generates Dart code around your data so you can focus
on building great apps.</li>
<li><b>Flexible</b>: Want to write queries in SQL? Moor verifies them at compile time and generates Dart apis for them. Prefer to write them in Dart?
Moor will generate efficient SQL for Dart queries.</li>
<li><b>Easy to learn</b>: Instead of having to learn yet another ORM, moor lets you write queries in SQL and generates typesafe wrappers. Queries and tables
can also be written in Dart that looks similar to SQL without loosing type-safety.</li>
<li><b>Fast _and_ powerful</b>: With the new `ffi` backend, moor can outperform key-value stores without putting any compromises on the integrity
and flexibility that relational databases provide. Moor is the only major persistence library with builtin support for multiple isolates.</li>
<li><b>Well tested and production ready</b>: Each component of moor is verified by a wide range of unit and integration tests. Moor powers many Flutter apps
in production.</li>
<li><b>Cross-Platform</b>: Moor works on iOS, Android, Linux, macOS, Windows and on the web. It doesn't even require Flutter. See <a href="{{<relref "docs/platforms.md">}}">supported platforms.</a></li>
</ul>
{{< /blocks/section >}}
@@ -1,5 +0,0 @@
---
title: "Advanced features"
weight: 20
description: Learn about some advanced features of moor
---
@@ -1,5 +0,0 @@
---
title: "Other engines"
weight: 100
description: Use moor on the web or other platforms
---
-6
View File
@@ -1,6 +0,0 @@
---
title: Search Results
layout: search
---
-114
View File
@@ -1,114 +0,0 @@
---
title: Version 2.0
layout: home
---
{{< blocks/cover title="Moor 2.0: Supercharged SQL for Dart" image_anchor="top" height="min" color="indigo" >}}
<div class="mx-auto">
<p class="lead mt-5">
Learn everything about Dart-SQL interop, the SQL IDE, experimental ffi support and all things new in moor
</p>
<a class="btn btn-lg btn-primary mr-3 mb-4" href="{{< relref "/docs" >}}">
Get started <i class="fas fa-arrow-alt-circle-right ml-2"></i>
</a>
<a class="btn btn-lg btn-secondary mr-3 mb-4" href="{{< relref "/docs/Getting started/starting_with_sql.md" >}}">
Migrate an existing project <i class="fas fa-code ml-2 "></i>
</a>
</div>
{{< /blocks/cover >}}
{{% blocks/lead color="blue" %}}
## Generator overhaul
The rewritten compiler is faster than ever, supports more SQL features and gives you
more flexibility when writing database code.
[Check the updated documentation]({{< ref "../docs/Using SQL/moor_files.md" >}})
{{% /blocks/lead %}}
{{< blocks/section color="light" >}}
{{% blocks/feature icon="fas fa-database" title="Pure SQL API" %}}
The new `.moor` files have been updated and can now hold both `CREATE TABLE` statements
and queries you define. Moor will then generate typesafe Dart APIs based on your tables
and statements.
[Get started with SQL and moor]({{< ref "../docs/Getting started/starting_with_sql.md" >}})
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-plus" title="Analyzer improvements" %}}
We now support more advanced features like compound select statements and window functions,
including detailed static analysis and lints. The updated type inference engine provides
better results on complex expressions. We also generate simpler methods for queries that only
return one column.
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-code-branch" title="Dart-SQL interop" %}}
Declare tables in Dart, write your queries in SQL. Or do it the other way around. Or do it all in Dart.
Or all in SQL. Moor makes writing database code fun without taking control over your code.
For maximum flexibilty, moor lets you inline Dart expressions into SQL and use the best of both
worlds.
{{% /blocks/feature %}}
{{< /blocks/section >}}
{{% blocks/lead color="green" %}}
## Builtin SQL IDE
Moor 2.0 expands the previous sql parser and analyzer, providing real-time feedback on your
SQL queries as you type. Moor plugs right into the Dart analysis server, so you don't have
to install any additional extensions.
[Learn more about the IDE]({{< ref "../docs/Using SQL/sql_ide.md" >}})
{{% /blocks/lead %}}
{{< blocks/section color="dark" >}}
{{% blocks/feature icon="fa-lightbulb" title="Quickfixes" %}}
![](quickfix.png)
Moor lets you write query code faster with helpful actions.
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-exclamation-circle" title="Smart warnings" %}}
![](warning.png)
Moor analyzes statements as you write them and reports errors right away.
This helps you identify problems fast, without having to open your app.
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-info-circle" title="Structure view" %}}
![](outline.png)
Moor provides an outline of your tables and queries for a better overview.
{{% /blocks/feature %}}
{{< /blocks/section >}}
{{% blocks/lead color="purple" %}}
## And much, much more
Moor 2.0 contains a set of optimizations and makes common tasks simpler
{{% /blocks/lead %}}
{{< blocks/section color="light" >}}
{{% blocks/feature icon="fa-lightbulb" title="New database helpers" %}}
New utils to load database from assets or to perform additional work before creating a database.
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-exclamation" title="Removed deprecated features" %}}
We removed a whole bunch of deprecated apis that made it harder to develop new features.
[Read the changelog for details](https://pub.dev/packages/moor#-changelog-tab-)
{{% /blocks/feature %}}
{{% blocks/feature icon="fas fa-bolt" title="Experimental `dart:ffi` bindings" %}}
The new [moor_ffi](https://pub.dev/packages/moor_ffi) package brings moor to the desktop and is up to 500x faster than the old
implementation.
_Please not that the package is still in preview_
{{% /blocks/feature %}}
{{< /blocks/section >}}
{{< blocks/section color="dark" type="section" >}}
## Try moor now
- To get started with moor, follow our [getting started guide]({{< ref "../docs/Getting started/_index.md" >}}) here.
- To get started with SQL in moor, or to migrate an existing project to moor, follow our
[migration guide]({{< ref "../docs/Getting started/starting_with_sql.md" >}})
{{< /blocks/section >}}
-8
View File
@@ -1,8 +0,0 @@
{{ define "main"}}
<main id="main">
<div>
<h1 id="title">Not found</h1>
<p>Oops! This page doesn't exist. Try going back to our <a href="{{ "/" | relURL }}">home page</a>.</p>
</div>
</main>
{{ end }}
-42
View File
@@ -1,42 +0,0 @@
{{/* This file is adapted from themes/docsy/partials/head.html, but we use
the regular title for the home page and write a meta description tag */}}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
{{ hugo.Generator }}
{{ if eq (getenv "HUGO_ENV") "production" }}
<META NAME="ROBOTS" CONTENT="INDEX, FOLLOW">
{{ else }}
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
{{ end }}
{{ range .AlternativeOutputFormats -}}
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink | safeURL }}">
{{ end -}}
{{ partialCached "favicons.html" . }}
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }}</title>
{{ if .Description }}
<meta name="description" content="{{ .Description }}">
{{ else }}
<meta name="description" content="{{ .Site.Params.SiteDescription }}">
{{ end }}
{{- template "_internal/opengraph.html" . -}}
{{- template "_internal/google_news.html" . -}}
{{- template "_internal/schema.html" . -}}
{{- template "_internal/twitter_cards.html" . -}}
{{ if eq (getenv "HUGO_ENV") "production" }}
{{ template "_internal/google_analytics_async.html" . }}
{{ end }}
{{ partialCached "head-css.html" . "asdf" }}
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
{{ if .Site.Params.offlineSearch }}
<script
src="https://unpkg.com/lunr@2.3.8/lunr.min.js"
integrity="sha384-vRQ9bDyE0Wnu+lMfm57BlYLO0/XauFuKpVsZPs7KEDwYKktWi5+Kz3MP8++DFlRY"
crossorigin="anonymous"></script>
{{end}}
{{ partial "hooks/head-end.html" . }}
+93
View File
@@ -0,0 +1,93 @@
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
background: #f8f8f8;
}
.hljs-comment,
.hljs-quote {
color: #998;
font-style: italic;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-subst {
color: #333;
font-weight: bold;
}
.hljs-number,
.hljs-literal,
.hljs-variable,
.hljs-template-variable,
.hljs-tag .hljs-attr {
color: #008081;
}
.hljs-string,
.hljs-doctag {
color: #d14;
}
.hljs-title,
.hljs-section,
.hljs-selector-id {
color: #900;
font-weight: bold;
}
.hljs-subst {
font-weight: normal;
}
.hljs-type,
.hljs-class .hljs-title {
color: #458;
font-weight: bold;
}
.hljs-tag,
.hljs-name,
.hljs-attribute {
color: #000080;
font-weight: normal;
}
.hljs-regexp,
.hljs-link {
color: #009926;
}
.hljs-symbol,
.hljs-bullet {
color: #990073;
}
.hljs-built_in,
.hljs-builtin-name {
color: #0086b3;
}
.hljs-meta {
color: #999;
font-weight: bold;
}
.hljs-deletion {
background: #fdd;
}
.hljs-addition {
background: #dfd;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
@@ -1,4 +1,3 @@
// todo: figure out why none of these actually do anything at all
$enable-gradients: false;
$enable-rounded: false;
$enable-shadows: false;
@@ -6,4 +5,4 @@ $enable-shadows: false;
$secondary: #4CAF50;
$navbar-padding-x: 1rem;
$code-color: #dc3545;
$code-color: #dc3545;
-830
View File
@@ -1,830 +0,0 @@
{
"name": "tech-doc-hugo",
"version": "0.0.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@nodelib/fs.scandir": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
"integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "2.0.3",
"run-parallel": "^1.1.9"
}
},
"@nodelib/fs.stat": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
"integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
"dev": true
},
"@nodelib/fs.walk": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
"integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
"dev": true,
"requires": {
"@nodelib/fs.scandir": "2.1.3",
"fastq": "^1.6.0"
}
},
"@types/color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
"ansi-styles": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
"@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"anymatch": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
"integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
},
"array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true
},
"at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true
},
"autoprefixer": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.0.0.tgz",
"integrity": "sha512-rFlVYthz6Iw0LhEYryiGGyjTGofebWie3ydvtqTCJiwWe+z6y8H35b4cadYbOUcYlP495TNeVktW+ZZqxbPW4Q==",
"dev": true,
"requires": {
"browserslist": "^4.14.2",
"caniuse-lite": "^1.0.30001131",
"colorette": "^1.2.1",
"normalize-range": "^0.1.2",
"num2fraction": "^1.2.2",
"postcss-value-parser": "^4.1.0"
}
},
"binary-extensions": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
"integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
"dev": true
},
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
"fill-range": "^7.0.1"
}
},
"browserslist": {
"version": "4.14.4",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.4.tgz",
"integrity": "sha512-7FOuawafVdEwa5Jv4nzeik/PepAjVte6HmVGHsjt2bC237jeL9QlcTBDF3PnHEvcC6uHwLGYPwZHNZMB7wWAnw==",
"dev": true,
"requires": {
"caniuse-lite": "^1.0.30001135",
"electron-to-chromium": "^1.3.570",
"escalade": "^3.1.0",
"node-releases": "^1.1.61"
}
},
"caller-callsite": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
"integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
"dev": true,
"requires": {
"callsites": "^2.0.0"
}
},
"caller-path": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
"integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
"dev": true,
"requires": {
"caller-callsite": "^2.0.0"
}
},
"callsites": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
"integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
"dev": true
},
"caniuse-lite": {
"version": "1.0.30001135",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001135.tgz",
"integrity": "sha512-ziNcheTGTHlu9g34EVoHQdIu5g4foc8EsxMGC7Xkokmvw0dqNtX8BS8RgCgFBaAiSp2IdjvBxNdh0ssib28eVQ==",
"dev": true
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"chokidar": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
"integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
"dev": true,
"requires": {
"anymatch": "~3.1.1",
"braces": "~3.0.2",
"fsevents": "~2.1.2",
"glob-parent": "~5.1.0",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.4.0"
}
},
"cliui": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.1.tgz",
"integrity": "sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ==",
"dev": true,
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"colorette": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
"integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
"dev": true
},
"cosmiconfig": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
"integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
"dev": true,
"requires": {
"import-fresh": "^2.0.0",
"is-directory": "^0.3.1",
"js-yaml": "^3.13.1",
"parse-json": "^4.0.0"
}
},
"dependency-graph": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz",
"integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==",
"dev": true
},
"dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
"requires": {
"path-type": "^4.0.0"
}
},
"electron-to-chromium": {
"version": "1.3.571",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.571.tgz",
"integrity": "sha512-UYEQ2Gtc50kqmyOmOVtj6Oqi38lm5yRJY3pLuWt6UIot0No1L09uu6Ja6/1XKwmz/p0eJFZTUZi+khd1PV1hHA==",
"dev": true
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
"requires": {
"is-arrayish": "^0.2.1"
}
},
"escalade": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz",
"integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==",
"dev": true
},
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
"fast-glob": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
"integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.0",
"merge2": "^1.3.0",
"micromatch": "^4.0.2",
"picomatch": "^2.2.1"
}
},
"fastq": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
"integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
}
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
"to-regex-range": "^5.0.1"
}
},
"fs-extra": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
"integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
"dev": true,
"requires": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^1.0.0"
}
},
"fsevents": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
"integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
"dev": true,
"optional": true
},
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
"get-stdin": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
"integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
"dev": true
},
"glob-parent": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
}
},
"globby": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
"integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.1.1",
"ignore": "^5.1.4",
"merge2": "^1.3.0",
"slash": "^3.0.0"
}
},
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"ignore": {
"version": "5.1.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
"integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
},
"import-cwd": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
"integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
"dev": true,
"requires": {
"import-from": "^2.1.0"
}
},
"import-fresh": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
"integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
"dev": true,
"requires": {
"caller-path": "^2.0.0",
"resolve-from": "^3.0.0"
}
},
"import-from": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
"integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
"dev": true,
"requires": {
"resolve-from": "^3.0.0"
}
},
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true
},
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
"binary-extensions": "^2.0.0"
}
},
"is-directory": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
"integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
"dev": true
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"isobject": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
"integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
"dev": true,
"requires": {
"isarray": "1.0.0"
}
},
"js-yaml": {
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
"integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
}
},
"json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
"dev": true
},
"jsonfile": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
"integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^1.0.0"
}
},
"line-column": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz",
"integrity": "sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=",
"dev": true,
"requires": {
"isarray": "^1.0.0",
"isobject": "^2.0.0"
}
},
"lodash.difference": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
"integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
"dev": true
},
"lodash.forown": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz",
"integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=",
"dev": true
},
"lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
"dev": true
},
"lodash.groupby": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz",
"integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=",
"dev": true
},
"lodash.sortby": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
"integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
"dev": true
},
"log-symbols": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
"integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
"dev": true,
"requires": {
"chalk": "^4.0.0"
}
},
"merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true
},
"micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
"integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"dev": true,
"requires": {
"braces": "^3.0.1",
"picomatch": "^2.0.5"
}
},
"nanoid": {
"version": "3.1.12",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz",
"integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==",
"dev": true
},
"node-releases": {
"version": "1.1.61",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz",
"integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==",
"dev": true
},
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
"normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
"integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
"dev": true
},
"num2fraction": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
"integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
"dev": true
},
"parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
"dev": true,
"requires": {
"error-ex": "^1.3.1",
"json-parse-better-errors": "^1.0.1"
}
},
"path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true
},
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"dev": true
},
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
},
"postcss": {
"version": "8.0.9",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.0.9.tgz",
"integrity": "sha512-9Ikq03Hvb/L6dgnOtNOUbcgg9Rsff5uKrI1TyNTQ2ALpa6psZk1Ar3/Hhxv2Q0rECRGDxtcMUTZIQglXozlrDQ==",
"dev": true,
"requires": {
"colorette": "^1.2.1",
"line-column": "^1.0.2",
"nanoid": "^3.1.12",
"source-map": "^0.6.1"
}
},
"postcss-cli": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.0.0.tgz",
"integrity": "sha512-WgQIz1tc8htjob2DULE6dTssDzItuBh3UbscdrAlvid7M6X2WBZUrHCaLMtIuFkHFijAnimIq3nkpXV6FdDTSg==",
"dev": true,
"requires": {
"chalk": "^4.0.0",
"chokidar": "^3.3.0",
"dependency-graph": "^0.9.0",
"fs-extra": "^9.0.0",
"get-stdin": "^8.0.0",
"globby": "^11.0.0",
"postcss-load-config": "^2.1.1",
"postcss-reporter": "^7.0.0",
"pretty-hrtime": "^1.0.3",
"read-cache": "^1.0.0",
"yargs": "^16.0.0"
}
},
"postcss-load-config": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.1.tgz",
"integrity": "sha512-D2ENobdoZsW0+BHy4x1CAkXtbXtYWYRIxL/JbtRBqrRGOPtJ2zoga/bEZWhV/ShWB5saVxJMzbMdSyA/vv4tXw==",
"dev": true,
"requires": {
"cosmiconfig": "^5.0.0",
"import-cwd": "^2.0.0"
}
},
"postcss-reporter": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.0.tgz",
"integrity": "sha512-TQ7aIDKgd7FFekFMHLRoDfl0aY3XmIAAhE4Bduyh5GvFi6uYPSVORWY4jkeC7qidFw7YtXwF5ejYQfUHOC73rQ==",
"dev": true,
"requires": {
"colorette": "^1.2.1",
"lodash.difference": "^4.5.0",
"lodash.forown": "^4.4.0",
"lodash.get": "^4.4.2",
"lodash.groupby": "^4.6.0",
"lodash.sortby": "^4.7.0",
"log-symbols": "^4.0.0"
}
},
"postcss-value-parser": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
"dev": true
},
"pretty-hrtime": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
"integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
"dev": true
},
"read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
"dev": true,
"requires": {
"pify": "^2.3.0"
}
},
"readdirp": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
"integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
"dev": true,
"requires": {
"picomatch": "^2.2.1"
}
},
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
"dev": true
},
"resolve-from": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
"integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
"dev": true
},
"reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true
},
"run-parallel": {
"version": "1.1.9",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
"integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
"dev": true
},
"slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
"string-width": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.0"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"requires": {
"is-number": "^7.0.0"
}
},
"universalify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
"integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
"dev": true
},
"wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
}
},
"y18n": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.1.tgz",
"integrity": "sha512-/jJ831jEs4vGDbYPQp4yGKDYPSCCEQ45uZWJHE1AoYBzqdZi8+LDWas0z4HrmJXmKdpFsTiowSHXdxyFhpmdMg==",
"dev": true
},
"yargs": {
"version": "16.0.3",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.0.3.tgz",
"integrity": "sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA==",
"dev": true,
"requires": {
"cliui": "^7.0.0",
"escalade": "^3.0.2",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.1",
"yargs-parser": "^20.0.0"
}
},
"yargs-parser": {
"version": "20.2.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.0.tgz",
"integrity": "sha512-2agPoRFPoIcFzOIp6656gcvsg2ohtscpw2OINr/q46+Sq41xz2OYLqx5HRHabmFU1OARIPAYH5uteICE7mn/5A==",
"dev": true
}
}
}
-25
View File
@@ -1,25 +0,0 @@
{
"name": "tech-doc-hugo",
"version": "0.0.1",
"description": "Hugo theme for technical documentation.",
"main": "none.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/bep/tech-doc-hugo.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/bep/tech-doc-hugo/issues"
},
"homepage": "https://github.com/bep/tech-doc-hugo#readme",
"dependencies": {},
"devDependencies": {
"autoprefixer": "^10.0.0",
"postcss": "^8.0.9",
"postcss-cli": "^8.0.0"
}
}
@@ -1,7 +1,9 @@
---
title: "Builder options"
description: >-
Advanced options applied when writing the generated code
data:
title: "Builder options"
description: >-
Advanced options applied when writing the generated code
template: layouts/docs/single
---
The `moor_generator` package has some options that control how the
@@ -42,7 +44,7 @@ At the moment, moor supports these options:
of inserted data and report detailed errors when the integrity is violated. If you're only using
inserts with SQL, or don't need this functionality, enabling this flag can help to reduce the amount
generated code.
* `use_data_class_name_for_companions`: By default, the name for [companion classes]({{< relref "../Getting started/writing_queries.md#updates-and-deletes" >}})
* `use_data_class_name_for_companions`: By default, the name for [companion classes]({{ "../Getting started/writing_queries.md#updates-and-deletes" | pageUrl }})
is based on the table name (e.g. a `@DataClassName('Users') class UsersTable extends Table` would generate
a `UsersTableCompanion`). With this option, the name is based on the data class (so `UsersCompanion` in
this case).
@@ -51,7 +53,7 @@ At the moment, moor supports these options:
(so a column named `user_name` would also use `user_name` as a json key instead of `userName`).
You can always override the json key by using a `JSON KEY` column constraint
(e.g. `user_name VARCHAR NOT NULL JSON KEY userName`)
* `generate_connect_constructor`: Generate necessary code to support the [isolate runtime]({{< relref "isolates.md" >}}).
* `generate_connect_constructor`: Generate necessary code to support the [isolate runtime]({{ "isolates.md" | pageUrl }}).
This is a build option because isolates are still experimental. This will be the default option eventually.
* `sqlite_modules`: This list can be used to enable sqlite extensions, like those for json or full-text search.
Modules have to be enabled explicitly because they're not supported on all platforms. See the following section for
@@ -77,7 +79,7 @@ At the moment, moor supports these options:
__Note__: This enables extensions in the analyzer for custom queries only. For instance, when the `json1` extension is
enabled, the [`json`](https://www.sqlite.org/json1.html) functions can be used in moor files. This doesn't necessarily
mean that those functions are supported at runtime! Both extensions are available on iOS 11 or later. On Android, they're
only available when using `moor_ffi`. See [our docs]({{< relref "extensions.md" >}}) for more details on them.
only available when using `moor_ffi`.
```yaml
targets:
@@ -97,7 +99,7 @@ We currently support the following extensions:
- [fts5](https://www.sqlite.org/fts5.html): Support `CREATE VIRTUAL TABLE` statements for `fts5` tables and the `MATCH` operator.
Functions like `highlight` or `bm25` are available as well.
- `moor_ffi`: Enables support for functions that are only available when using `moor_ffi`. This contains `pow`, `sqrt` and a variety
of trigonometric functions. Details on those functions are available [here]({{< relref "../Other engines/vm.md#moor-only-functions" >}}).
of trigonometric functions. Details on those functions are available [here]({{ "../Other engines/vm.md#moor-only-functions" }}).
## Recommended options
@@ -127,9 +129,9 @@ and minor code changes. Put this content in a file called `build.yaml` next to y
```yaml
targets:
$default:
# disable the default generators, we'll only use the non-shared moor generator here
auto_apply_builders: false
builders:
# disable the default generators, we'll only use the non-shared moor generator here
auto_apply_builders: false
moor_generator|moor_generator_not_shared:
enabled: true
# If needed, you can configure the builder like this:
@@ -1,8 +1,10 @@
---
title: "DAOs"
description: Keep your database code modular with DAOs
data:
title: "DAOs"
description: Keep your database code modular with DAOs
aliases:
- /daos/
template: layouts/docs/single
---
When you have a lot of queries, putting them all into one class might become
@@ -1,11 +1,12 @@
---
title: "Expressions"
linkTitle: "Expressions in Dart"
description: Deep-dive into what kind of SQL expressions can be written in Dart
weight: 200
data:
title: Expressions
description: Deep-dive into what kind of SQL expressions can be written in Dart
weight: 200
# used to be in the "getting started" section
url: docs/getting-started/expressions/
path: docs/Getting started/expressions/
template: layouts/docs/single
---
Expressions are pieces of sql that return a value when the database interprets them.
@@ -112,7 +113,7 @@ from the Dart api. Unlike regular functions, aggregate functions operate on mult
once.
By default, they combine all rows that would be returned by the select statement into a single value.
You can also make them run over different groups in the result by using
[group by]({{< relref "joins.md#group-by" >}}).
[group by]({{ "joins.md#group-by" | pageUrl }}).
### Comparing
@@ -136,12 +137,12 @@ Stream<double> averageItemLength() {
__Note__: We're using `selectOnly` instead of `select` because we're not interested in any colum that
`todos` provides - we only care about the average length. More details are available
[here]({{< relref "joins.md#group-by" >}})
[here]({{ "joins.md#group-by" | pageUrl }})
### Counting
Sometimes, it's useful to count how many rows are present in a group. By using the
[table layout from the example]({{<relref "../Getting started/_index.md">}}), this
[table layout from the example]({{ "../Getting started/index.md" | pageUrl }}), this
query will report how many todo entries are associated to each category:
```dart
@@ -166,7 +167,7 @@ To count all rows (instead of a single value), you can use the top-level `countA
function.
More information on how to write aggregate queries with moor's Dart api is available
[here]({{< relref "joins.md#group-by" >}})
[here]({{ "joins.md#group-by" | pageUrl }})
### group_concat
@@ -188,7 +189,7 @@ with the `separator` argument on `groupConcat`.
When using a `VmDatabase`, a basic set of trigonometric functions will be available.
It also defines the `REGEXP` function, which allows you to use `a REGEXP b` in sql queries.
For more information, see the [list of functions]({{< relref "../Other engines/vm.md#moor-only-functions" >}}) here.
For more information, see the [list of functions]({{ "../Other engines/vm.md#moor-only-functions" | pageUrl }}) here.
## Subqueries
@@ -246,4 +247,4 @@ select(users)..where((u) => inactive);
_Note_: It's easy to write invalid queries by using `CustomExpressions` too much. If you feel like
you need to use them because a feature you use is not available in moor, consider creating an issue
to let us know. If you just prefer sql, you could also take a look at
[compiled sql]({{< ref "../Using SQL/custom_queries.md" >}}) which is typesafe to use.
[compiled sql]({{ "../Using SQL/custom_queries.md" | pageUrl }}) which is typesafe to use.
@@ -0,0 +1,7 @@
---
data:
title: Advanced Features
weight: 20
description: Learn about some advanced features of moor
template: layouts/docs/list
---
@@ -1,17 +1,19 @@
---
title: "Isolates"
description: Seamlessly run moor on a background isolate and unblock the main thread
data:
title: Isolates
description: Using moor databases on a background isolate
template: layouts/docs/single
---
{{% alert title="New feature" color="primary" %}}
{% block "blocks/alert" title="New feature" color="primary" %}
The api for background isolates only works with moor version 2.1.0 or newer. Due to
platform limitations, using [moor_ffi]({{< relref "../Other engines/vm.md" >}}) is required when
platform limitations, using [moor_ffi]({{ "../Other engines/vm.md" | pageUrl }}) is required when
using a background isolate. Using `moor_flutter` is not supported.
{{% /alert %}}
{% endblock %}
## Preparations
To use the isolate api, first enable the appropriate [build option]({{< relref "builder_options.md" >}}) by
To use the isolate api, first enable the appropriate [build option]({{ "builder_options.md" | pageUrl }}) by
creating a file called `build.yaml` in your project root, next to your `pubspec.yaml`. It should have the following
content:
```yaml
@@ -1,10 +1,11 @@
---
title: "Advanced queries in Dart"
weight: 1
description: Use sql joins or custom expressions from the Dart api
url: /docs/advanced-features/joins
data:
title: "Advanced queries in Dart"
weight: 1
description: Use sql joins or custom expressions from the Dart api
aliases:
- /queries/joins
- queries/joins/
template: layouts/docs/single
---
## Joins
@@ -12,7 +13,7 @@ aliases:
Moor supports sql joins to write queries that operate on more than one table. To use that feature, start
a select regular select statement with `select(table)` and then add a list of joins using `.join()`. For
inner and left outer joins, a `ON` expression needs to be specified. Here's an example using the tables
defined in the [example]({{< relref "../Getting started/_index.md" >}}).
defined in the [example]({{ "../Getting started/index.md" | pageUrl }}).
```dart
// we define a data class to contain both a todo entry and the associated category
@@ -161,7 +162,7 @@ comes from multiple rows. Common questions include
What these queries have in common is that data from multiple rows needs to be combined into a single
row. In sql, this can be achieved with "aggregate functions", for which moor has
[builtin support]({{< relref "expressions.md#aggregate" >}}).
[builtin support]({{ "expressions.md#aggregate" | pageUrl }}).
_Additional info_: A good tutorial for group by in sql is available [here](https://www.sqlitetutorial.net/sqlite-group-by/).
@@ -1,9 +1,11 @@
---
title: "Migrations"
weight: 10
description: Define what happens when your database gets created or updated
data:
title: "Migrations"
weight: 10
description: Define what happens when your database gets created or updated
aliases:
- /migrations
template: layouts/docs/single
---
Moor provides a migration API that can be used to gradually apply schema changes after bumping
@@ -226,7 +228,7 @@ By using those test databases, moor can help you test migrations from and to any
To use this feature, moor needs to know all schemas of your database. A schema is the set of all tables, triggers
and indices that you use in your database.
You can use the [CLI tools]({{< relref "../CLI.md" >}}) to export a json representation of your schema.
You can use the [CLI tools]({{ "../CLI.md" | pageUrl }}) to export a json representation of your schema.
In this guide, we'll assume a file layout like the following, where `my_app` is the root folder of your project:
```
@@ -327,7 +329,7 @@ In general, a test looks like this:
- Use `verifier.startAt()` to obtain a [connection](https://pub.dev/documentation/moor/latest/moor/DatabaseConnection-class.html)
to a database with an initial schema.
This database contains all your tables, indices and triggers from that version, created by using `Migrator.createAll`.
- Create your application database (you can enable the [`generate_connect_constructor`]({{< relref "builder_options.md" >}}) to use
- Create your application database (you can enable the [`generate_connect_constructor`]({{ "builder_options.md" | pageUrl }}) to use
a `DatabaseConnection` directly)
- Call `verifier.migrateAndValidate(db, version)`. This will initiate a migration towards the target version (here, `2`).
Unlike the database created by `startAt`, this uses the migration logic you wrote for your database.
@@ -335,11 +337,11 @@ In general, a test looks like this:
`migrateAndValidate` will extract all `CREATE` statement from the `sqlite_schema` table and semantically compare them.
If it sees anything unexpected, it will throw a `SchemaMismatch` exception to fail your test.
{{% alert title="Writing testable migrations" %}}
{% block "blocks/alert" title="Writing testable migrations" %}
To test migrations _towards_ an old schema version (e.g. from `v1` to `v2` if your current version is `v3`),
you're `onUpgrade` handler must be capable of upgrading to a version older than the current `schemaVersion`.
For this, check the `to` parameter of the `onUpgrade` callback to run a different migration if necessary.
{{% /alert %}}
{% endblock %}
#### Verifying data integrity
@@ -1,8 +1,10 @@
---
title: "Type converters"
description: Store more complex data in columns with type converters
data:
title: "Type converters"
description: Store more complex data in columns with type converters
aliases:
- /type_converters
template: layouts/docs/single
---
Moor supports a variety of types out of the box, but sometimes you need to store more complex data.
@@ -74,12 +76,12 @@ class Users extends Table {
The generated `User` class will then have a `preferences` column of type
`Preferences`. Moor will automatically take care of storing and loading
the object in `select`, `update` and `insert` statements. This feature
also works with [compiled custom queries]({{ "/queries/custom" | absolute_url }}).
also works with [compiled custom queries]({{ "/queries/custom" | absURL }}).
{{% alert title="Caution with equality" color="warning" %}}
{% block "blocks/alert" title="Caution with equality" color="warning" %}
> If your converter returns an object that is not comparable by value, the generated dataclass will not
be comparable by value.
{{% /alert %}}
{% endblock %}
### Implicit enum converters
@@ -101,7 +103,7 @@ class Tasks extends Table {
}
```
{{% alert title="Caution with enums" color="warning" %}}
{% block "blocks/alert" title="Caution with enums" color="warning" %}
> It can be easy to accidentally invalidate your database by introducing another enum value.
For instance, let's say we inserted a `Task` into the database in the above example and set its
`Status` to `running` (index = 1).
@@ -119,7 +121,7 @@ class Tasks extends Table {
For this reason, it's best to add new values at the end of the enumeration, where they can't conflict
with existing values. Otherwise you'd need to bump your schema version and run a custom update statement
to fix this.
{{% /alert %}}
{% endblock %}
Also note that you can't apply another type converter on a column declared with an enum converter.
@@ -140,7 +142,7 @@ CREATE TABLE users (
);
```
When using type converters in moor files, we recommend the [`apply_converters_on_variables`]({{< relref "builder_options.md" >}})
When using type converters in moor files, we recommend the [`apply_converters_on_variables`]({{ "builder_options.md" | pageUrl }})
build option. This will also apply the converter from Dart to SQL, for instance if used on variables: `SELECT * FROM users WHERE preferences = ?`.
With that option, the variable will be inferred to `Preferences` instead of `String`.
@@ -1,12 +1,14 @@
---
title: "Command line tools for moor"
description: A set of CLI tools to interact with moor files
data:
title: "Command line tools for moor"
description: A set of CLI tools to interact with moor files
url: /cli/
template: layouts/docs/single
---
{{% alert title="Experimental" %}}
{% block "blocks/alert" title="Experimental" %}
The moor cli tool is experimental at the moment. Please report all issues you can find.
{{% /alert %}}
{% endblock %}
## Usage
@@ -69,4 +71,4 @@ The generated file (`schema.json` in this case) contains information about all
- dependecies thereof
Exporting a schema can be used to generate test code for your schema migrations. For details,
see [the guide]({{< relref "Advanced Features/migrations.md#verifying-migrations" >}}).
see [the guide]({{ "Advanced Features/migrations.md#verifying-migrations" | pageUrl }}).
@@ -1,6 +1,8 @@
---
title: "Existing databases"
description: Using moor with an existing database
data:
title: "Existing databases"
description: Using moor with an existing database
template: layouts/docs/single
---
You can use moor with a pre-propulated database that you ship with your app.
@@ -1,8 +1,9 @@
---
title: "Examples"
linkTitle: "Examples"
weight: 3
description: Example apps using moor
data:
title: "Examples"
weight: 3
description: Example apps using moor
template: layouts/docs/list
---
@@ -1,6 +1,8 @@
---
title: "Many to many relationships"
description: An example that models a shopping cart system with moor.
data:
title: "Many to many relationships"
description: An example that models a shopping cart system with moor.
template: layouts/docs/single
---
## Defining the model
@@ -16,6 +18,7 @@ class BuyableItems extends Table {
}
```
We're going to define two tables for shopping carts: One for the cart
itself, and another one to store the entries in the cart:
```dart
@@ -115,7 +118,7 @@ Stream<CartWithItems> watchCart(int id) {
});
// now, we can merge the two queries together in one stream
return Observable.combineLatest2(cartStream, contentStream,
return Rx.combineLatest2(cartStream, contentStream,
(ShoppingCart cart, List<BuyableItem> items) {
return CartWithItems(cart, items);
});
@@ -1,15 +1,17 @@
---
title: "Dart tables"
description: Further information on Dart tables
weight: 150
data:
title: "Dart tables"
description: Further information on Dart tables
weight: 150
template: layouts/docs/single
---
{{% pageinfo %}}
{% block "blocks/pageinfo" %}
__Prefer sql?__ If you prefer, you can also declare tables via `CREATE TABLE` statements.
Moor's sql analyzer will generate matching Dart code. [Details]({{< ref "starting_with_sql.md" >}}).
{{% /pageinfo %}}
Moor's sql analyzer will generate matching Dart code. [Details]({{ "starting_with_sql.md" | pageUrl }}).
{% endblock %}
As shown in the [getting started guide]({{<relref "_index.md">}}), sql tables can be written in Dart:
As shown in the [getting started guide]({{ "index.md" | pageUrl }}), sql tables can be written in Dart:
```dart
class Todos extends Table {
IntColumn get id => integer().autoIncrement()();
@@ -129,7 +131,7 @@ Note that the primary key must essentially be constant so that the generator can
## Supported column types
Moor supports a variety of column types out of the box. You can store custom classes in columns by using
[type converters]({{<relref "../Advanced Features/type_converters.md">}}).
[type converters]({{ "../Advanced Features/type_converters.md" | pageUrl }}).
| Dart type | Column | Corresponding SQLite type |
|--------------|---------------|-----------------------------------------------------|
@@ -1,11 +1,11 @@
---
title: "Getting Started"
linkTitle: "Getting Started"
weight: 2
description: Simple guide to get a moor project up and running
data:
title: Getting started
description: Simple guide to get a moor project up and running
weight: 1
template: layouts/docs/list
aliases:
- /getting-started/ # Used to have this url
- /Getting started/ # Used to have this url
---
_Note:_ If you prefer a tutorial video, Reso Coder has made a detailed video explaining
@@ -36,7 +36,7 @@ If you're wondering why so many packages are necessary, here's a quick overview
- `moor_generator`: Generates query code based on your tables
- `build_runner`: Common tool for code-generation, maintained by the Dart team
{{% changed_to_ffi %}}
{% include "partials/changed_to_ffi" %}
### Declaring tables
Using moor, you can model the structure of your tables with simple dart code:
@@ -118,5 +118,5 @@ class MyDatabase extends _$MyDatabase {
```
Congratulations! You're now ready to use all of moor. See the articles below for further reading.
The ["Writing queries"]({{< relref "writing_queries.md" >}}) article contains everything you need
The ["Writing queries"]({{ "writing_queries.md" | pageUrl }}) article contains everything you need
to know to write selects, updates and inserts in moor!
@@ -1,10 +1,12 @@
---
title: "Getting started with sql"
weight: 5
description: Learn how to get started with the SQL version of moor, or how to migrate an existing project to moor.
data:
title: "Getting started with sql"
weight: 5
description: Learn how to get started with the SQL version of moor, or how to migrate an existing project to moor.
template: layouts/docs/single
---
The regular [getting started guide]({{< relref "_index.md" >}}) explains how to get started with moor by
The regular [getting started guide]({{ "index.md" | pageUrl }}) explains how to get started with moor by
declaring both tables and queries in Dart. This version will focus on how to use moor with SQL instead.
## Adding the dependency
@@ -32,7 +34,7 @@ If you're wondering why so many packages are necessary, here's a quick overview
- `moor_generator`: Generates Dart apis for the sql queries and tables you wrote
- `build_runner`: Common tool for code-generation, maintained by the Dart team
{{% changed_to_ffi %}}
{% include "partials/changed_to_ffi" %}
## Declaring tables and queries
@@ -72,14 +74,14 @@ countEntries:
SELECT null, (SELECT COUNT(*) FROM todos WHERE category IS NULL)
```
{{% alert title="On that AS Category" %}}
{% block "blocks/alert" title="On that AS Category" %}
Moor will generate Dart classes for your tables, and the name of those
classes is based on the table name. By default, moor just strips away
the trailing `s` from your table. That works for most cases, but in some
(like the `categories` table above), it doesn't. We'd like to have a
`Category` class (and not `Categorie`) generated, so we tell moor to
generate a different name with the `AS <name>` declaration at the end.
{{% /alert %}}
{% endblock %}
## Generating matching code
@@ -135,7 +137,7 @@ Let's take a look at what moor generated during the build:
- Generated data classes (`Todo` and `Category`) - these hold a single
row from the respective table.
- Companion versions of these classes. Those are only relevant when
using the Dart apis of moor, you can [learn more here]({{< relref "writing_queries.md#inserts" >}}).
using the Dart apis of moor, you can [learn more here]({{ "writing_queries.md#inserts" | pageUrl }}).
- A `CountEntriesResult` class, it holds the result rows when running the
`countEntries` query.
- A `_$AppDb` superclass. It takes care of creating the tables when
@@ -159,10 +161,10 @@ a `.moor` file - moor will generate matching code for them as well.
Now that you know how to use moor together with sql, here are some
further guides to help you learn more:
- The [SQL IDE]({{< relref "../Using SQL/sql_ide.md" >}}) that provides feedback on sql queries right in your editor.
- [Transactions]({{< relref "../transactions.md" >}})
- [Schema migrations]({{< relref "../Advanced Features/migrations.md" >}})
- Writing [queries]({{< relref "writing_queries.md" >}}) and
[expressions]({{< relref "expressions.md" >}}) in Dart
- A more [in-depth guide]({{< relref "../Using SQL/moor_files.md" >}})
- The [SQL IDE]({{ "../Using SQL/sql_ide.md" | pageUrl }}) that provides feedback on sql queries right in your editor.
- [Transactions]({{ "../transactions.md" | pageUrl }})
- [Schema migrations]({{ "../Advanced Features/migrations.md" | pageUrl }})
- Writing [queries]({{ "writing_queries.md" | pageUrl }}) and
[expressions]({{ "../Advanced Features/expressions.md" | pageUrl }}) in Dart
- A more [in-depth guide]({{ "../Using SQL/moor_files.md" | pageUrl }})
on `moor` files, which explains `import` statements and the Dart-SQL interop.
@@ -1,15 +1,17 @@
---
title: "Writing queries"
linkTitle: "Writing queries"
description: Learn how to write database queries in pure Dart with moor
data:
title: "Writing queries"
linkTitle: "Writing queries"
description: Learn how to write database queries in pure Dart with moor
weight: 100
aliases:
- /queries/
weight: 100
template: layouts/docs/single
---
{{% pageinfo %}}
__Note__: This assumes that you already completed [the setup]({{< ref "_index.md" >}}).
{{% /pageinfo %}}
{% block "blocks/pageinfo" %}
__Note__: This assumes that you've already completed [the setup]({{ "index.md" | pageUrl }}).
{% endblock %}
For each table you've specified in the `@UseMoor` annotation on your database class,
a corresponding getter for a table will be generated. That getter can be used to
@@ -43,7 +45,7 @@ You can apply filters to a query by calling `where()`. The where method takes a
should map the given table to an `Expression` of boolean. A common way to create such expression
is by using `equals` on expressions. Integer columns can also be compared with `isBiggerThan`
and `isSmallerThan`. You can compose expressions using `a & b, a | b` and `a.not()`. For more
details on expressions, see [this guide]({{< relref "expressions.md" >}}).
details on expressions, see [this guide]({{ "../Advanced Features/expressions.md" | pageUrl }}).
### Limit
You can limit the amount of results returned by calling `limit` on queries. The method accepts
@@ -58,7 +60,7 @@ Future<List<Todo>> limitTodos(int limit, {int offset}) {
### Ordering
You can use the `orderBy` method on the select statement. It expects a list of functions that extract the individual
ordering terms from the table. You can use any expression as an ordering term - for more details, see
[this guide]({{< relref "expressions.md" >}}).
[this guide]({{ "../Advanced Features/expressions.md" | pageUrl }}).
```dart
Future<List<Todo>> sortEntriesAlphabetically() {
@@ -97,7 +99,7 @@ Stream<List<String>> contentWithLongTitles() {
```
If you need more complex queries with joins or custom columns, see [this site]({{< relref "../Advanced Features/joins.md" >}}).
If you need more complex queries with joins or custom columns, see [this site]({{ "../Advanced Features/joins.md" | pageUrl }}).
## Updates and deletes
You can use the generated classes to update individual fields of any row:
@@ -132,7 +134,7 @@ Future feelingLazy() {
__⚠️ Caution:__ If you don't explicitly add a `where` clause on updates or deletes,
the statement will affect all rows in the table!
{{% alert title="Entries, companions - why do we need all of this?" %}}
{% block "blocks/alert" title="Entries, companions - why do we need all of this?" %}
You might have noticed that we used a `TodosCompanion` for the first update instead of
just passing a `Todo`. Moor generates the `Todo` class (also called _data
class_ for the table) to hold a __full__ row with all its data. For _partial_ data,
@@ -145,7 +147,7 @@ Fields in the companions have a special `Value.absent()` state which makes this
Companions also have a special constructor for inserts - all columns which don't have
a default value and aren't nullable are marked `@required` on that constructor. This makes
companions easier to use for inserts because you know which fields to set.
{{% /alert %}}
{% endblock %}
## Inserts
You can very easily insert any valid object into tables. As some values can be absent
@@ -246,14 +248,14 @@ Future<void> trackWord(String word) {
}
```
{{% alert title="Unique constraints and conflict targets" %}}
{% block "blocks/alert" title="Unique constraints and conflict targets" %}
> Both `insertOnConflictUpdate` and `onConflict: DoUpdate` use an `DO UPDATE`
upsert in sql. This requires us to provide a so-called "conflict target", a
set of columns to check for uniqueness violations. By default, moor will use
the table's primary key as conflict target. That works in most cases, but if
you have custom `UNIQUE` constraints on some columns, you'll need to use
the `target` parameter on `DoUpdate` in Dart to include those columns.
{{% /alert %}}
{% endblock %}
Note that this requires a fairly recent sqlite3 version (3.24.0) that might not
be available on older Android devices when using `moor_flutter`. `moor_ffi`
@@ -1,7 +1,9 @@
---
title: "Moor internals"
weight: 300000
description: Work in progress documentation on moor internals
data:
title: "Moor internals"
weight: 300000
description: Work in progress documentation on moor internals
template: layouts/docs/list
---
## Using an unreleased moor version
@@ -34,4 +36,4 @@ dependency_overrides:
```
If you're using `moor_flutter`, just exchange `moor_ffi` with `moor_flutter` in the package name
and path. To use the bleeding edge of moor, change `ref: beta` to `ref: develop` for all packages.
and path. To use the bleeding edge of moor, change `ref: beta` to `ref: develop` for all packages.
@@ -1,6 +1,8 @@
---
title: Encryption
description: Use moor on encrypted databases
data:
title: Encryption
description: Use moor on encrypted databases
template: layouts/docs/single
---
There are two ways to use moor on encrypted databases.
+7
View File
@@ -0,0 +1,7 @@
---
data:
title: "Other engines"
description: "Use moor on the web or other platforms"
weight: 100
template: layouts/docs/list
---
@@ -1,6 +1,7 @@
---
title: moor ffi (Desktop support)
description: Run moor on both mobile and desktop
data:
title: moor ffi (Desktop support)
description: Run moor on both mobile and desktop
---
## Supported platforms
@@ -108,7 +109,7 @@ moor. Important options are marked in bold.
- __SQLITE_DQS=0__: This will make sqlite not accept double-quoted strings (and instead parse them as identifiers). This matches
the behavior of moor and compiled queries
- __SQLITE_THREADSAFE=0__: Since the majority of Flutter apps only use one isolate, thread safety is turned off. Note that you
can still use the [isolate api]({{<relref "../Advanced Features/isolates.md">}}) for background operations. As long as all
can still use the [isolate api]({{"../Advanced Features/isolates.md" | pageUrl}}) for background operations. As long as all
database accesses happen from the same thread, there's no problem.
- SQLITE_DEFAULT_MEMSTATUS=0: The `sqlite3_status()` interfaces are not exposed by moor_ffi, so there's no point of having them.
- SQLITE_MAX_EXPR_DEPTH=0: Disables maximum depth when sqlite parses expressions, which can make the parser faster.
@@ -137,7 +138,7 @@ For more details on sqlite compile options, see [their documentation](https://ww
Note that `NaN`, `-infinity` or `+infinity` are represented as `NULL` in sql.
When enabling the `moor_ffi` module in your [build options]({{< relref "../Advanced Features/builder_options.md#available-extensions" >}}),
When enabling the `moor_ffi` module in your [build options]({{ "../Advanced Features/builder_options.md#available-extensions" | pageUrl }}),
the generator will allow you to use those functions in moor files or compiled queries.
To use those methods from Dart, you need to import `package:moor/extensions/moor_ffi.dart`.
@@ -1,7 +1,9 @@
---
title: Web support
url: /web
description: Experimental support for moor and webapps.
data:
title: Web
description: Experimental support for moor and webapps.
template: layouts/docs/single
path: web/
---
Starting from moor `1.6`, you can experimentally use moor in Dart webapps. Moor web supports
@@ -9,7 +11,7 @@ Flutter Web, AngularDart, plain `dart:html` or any other web framework.
## Getting started
Instead of depending on `moor_flutter` in your pubspec, you need to depend on on `moor` directly. Apart from that, you can
follow the [getting started guide]({{ site.common_links.getting_started | absolute_url }}).
follow the [getting started guide]({{ '../Getting started/index.md' | pageUrl }}).
Also, instead of using a `FlutterQueryExecutor` in your database classes, you can use a `WebDatabase` executor:
```dart
import 'package:moor/moor_web.dart';
@@ -151,7 +153,7 @@ DatabaseConnection connectToWorker() {
You can pass that `DatabaseConnection` to your database by enabling the
`generate_connect_constructor` build option.
For more information on the `DatabaseConnection` class, see the documentation on
[isolates]({{< relref "../Advanced Features/isolates.md" >}}).
[isolates]({{ "../Advanced Features/isolates.md" | pageUrl }}).
A small, but working example is available under [extras/web_worker_example](https://github.com/simolus3/moor/tree/develop/extras/web_worker_example)
in the moor repository.
@@ -1,17 +1,19 @@
---
title: "Custom queries"
weight: 10
description: Let moor generate Dart from your SQL statements
data:
title: "Custom queries"
weight: 10
description: Let moor generate Dart from your SQL statements
aliases:
- /queries/custom
template: layouts/docs/single
---
{{% alert title="Moor files!" color="warning" %}}
{% block "blocks/alert" title="Moor files!" color="warning" %}
With moor 2.0, we moved the new `.moor` files out of preview and added some powerful features to them.
They are easier to use than the approaches described here. While these features will continue to
be supported, moor files will get better tooling support in the future and we recommend to
migrate. See [their api]({{%relref "moor_files.md"%}}) for details.
{{% /alert %}}
migrate. See [their api]({{ "moor_files.md" | pageUrl }}) for details.
{% endblock %}
Although moor includes a fluent api that can be used to model most statements, advanced
features like `WITH` clauses or subqueries aren't supported yet. You can
@@ -46,17 +48,17 @@ Queries can have parameters in them by using the `?` or `:name` syntax. When you
moor will figure out an appropriate type for them and include them in the generated methods. For instance,
`'categoryById': 'SELECT * FROM categories WHERE id = :id'` will generate the method `categoryById(int id)`.
{{% alert title="On table names" color="info" %}}
{% block "blocks/alert" title="On table names" color="info" %}
To use this feature, it's helpful to know how Dart tables are named in sql. For tables that don't
override `tableName`, the name in sql will be the `snake_case` of the class name. So a Dart table
called `Categories` will be named `categories`, a table called `UserAddressInformation` would be
called `user_address_information`. The same rule applies to column getters without an explicit name.
Tables and columns declared in [Moor files]({{< relref "moor_files.md" >}}) will always have the
Tables and columns declared in [Moor files]({{ "moor_files.md" | pageUrl }}) will always have the
name you specified.
{{% /alert %}}
{% endblock %}
You can also use `UPDATE` or `DELETE` statements here. Of course, this feature is also available for
[daos]({{< relref "../Advanced Features/daos.md" >}}),
[daos]({{ "../Advanced Features/daos.md" | pageUrl }}),
and it perfectly integrates with auto-updating streams by analyzing what tables you're reading from or
writing to.
@@ -65,7 +67,7 @@ If you don't want to use the statements with an generated api, you can
still send custom queries by calling `customSelect` for a one-time query or
`customSelectStream` for a query stream that automatically emits a new set of items when
the underlying data changes. Using the todo example introduced in the
[getting started guide]({{< ref "/docs/Getting started/_index.md" >}}), we can
[getting started guide]({{ "../Getting started/index.md" | pageUrl }}), we can
write this query which will load the amount of todo entries in each category:
```dart
class CategoryWithCount {
@@ -1,7 +1,9 @@
---
title: "Supported sqlite extensions"
weight: 10
description: Information on json1 and fts5 support in the generator
data:
title: "Supported sqlite extensions"
weight: 10
description: Information on json1 and fts5 support in the generator
template: layouts/docs/single
---
_Note_: Since `moor_flutter` uses the sqlite version shipped on the device, these extensions might not
@@ -11,7 +13,7 @@ This enables the extensions listed here on all Android devices and on iOS 11 and
## json1
To enable the json1 extension in moor files and compiled queries, modify your
[build options]({{<relref "../Advanced Features/builder_options.md">}}) to include
[build options]({{ "../Advanced Features/builder_options.md" | pageUrl }}) to include
`json1` in the `sqlite_module` section.
The sqlite extension doesn't require any special tables and works on all text columns. In moor
@@ -50,7 +52,7 @@ You can learn more about the json1 extension on [sqlite.org](https://www.sqlite.
The fts5 extension provides full-text search capabilities in sqlite tables.
To enable the fts5 extension in moor files and compiled queries, modify the
[build options]({{<relref "../Advanced Features/builder_options.md">}}) to include
[build options]({{ "../Advanced Features/builder_options.md" | pageUrl }}) to include
`fts5` in the `sqlite_module` section.
Just like you'd expect when using sqlite, you can create a fts5 table in a moor file
@@ -1,7 +1,9 @@
---
title: "Using SQL"
weight: 30
description: Write typesafe sql with moor
data:
title: "Using SQL"
weight: 30
description: Write typesafe sql with moor
template: layouts/docs/list
---
Moor let's you express a variety of queries in pure Dart. However, you don't have to miss out
@@ -1,10 +1,12 @@
---
title: "Moor files"
weight: 1
description: Learn everything about the new `.moor` files which can contain tables and queries
data:
title: "Moor files"
weight: 1
description: Learn everything about the new `.moor` files which can contain tables and queries
aliases:
- /docs/using-sql/custom_tables/ # Redirect from outdated "custom tables" page which has been deleted
template: layouts/docs/single
---
Moor files are a new feature that lets you write all your database code in SQL - moor will generate typesafe APIs for them.
@@ -244,7 +246,7 @@ Stream<List<Todo>> watchInCategory(int category) {
This lets you write a single SQL query and dynamically apply a predicate at runtime!
This feature works for
- [expressions]({{< relref "../Advanced Features/expressions.md" >}}), as you've seen in the example above
- [expressions]({{ "../Advanced Features/expressions.md" | pageUrl }}), as you've seen in the example above
- single ordering terms: `SELECT * FROM todos ORDER BY $term, id ASC`
will generate a method taking an `OrderingTerm`.
- whole order-by clauses: `SELECT * FROM todos ORDER BY $order`
@@ -259,7 +261,7 @@ _filterTodos ($predicate = TRUE): SELECT * FROM todos WHERE $predicate;
This will make the `predicate` parameter optional in Dart. It will use the
default SQL value (here, `TRUE`) when not explicitly set.
{{% alert title="Using column names in Dart" color="warning" %}}
{% block "blocks/alert" title="Using column names in Dart" color="warning" %}
If your query uses table aliases, you'll need to account for that when embedding Dart
expressions in your SQL query. Consider this for instance:
@@ -279,11 +281,11 @@ Future<List<Route>> routesByStart(int startPointId) {
return findRoutes(start.id.equals(startPointId));
}
```
{{% /alert %}}
{% endblock %}
### Type converters
You can import and use [type converters]({{< relref "../Advanced Features/type_converters.md" >}})
You can import and use [type converters]({{ "../Advanced Features/type_converters.md" | pageUrl }})
written in Dart in a moor file. Importing a Dart file works with a regular `import` statement.
To apply a type converter on a column definition, you can use the `MAPPED BY` column constraints:
```sql
@@ -295,9 +297,9 @@ CREATE TABLE users (
```
More details on type converts in moor files are available
[here]({{< relref "../Advanced Features/type_converters.md#using-converters-in-moor" >}}).
[here]({{ "../Advanced Features/type_converters.md#using-converters-in-moor" | pageUrl }}).
When using type converters, we recommend the [`apply_converters_on_variables`]({{< relref "../Advanced Features/builder_options.md" >}})
When using type converters, we recommend the [`apply_converters_on_variables`]({{ "../Advanced Features/builder_options.md" | pageUrl }})
build option. This will also apply the converter from Dart to SQL, for instance if used on variables: `SELECT * FROM users WHERE preferences = ?`.
With that option, the variable will be inferred to `Preferences` instead of `String`.
@@ -1,7 +1,9 @@
---
title: "Experimental IDE"
weight: 5
description: Get real-time feedback as you type sql
data:
title: "Experimental IDE"
weight: 5
description: Get real-time feedback as you type sql
template: layouts/docs/single
---
Moor ships with an experimental analyzer plugin that provides real-time feedback on errors,
@@ -1,13 +1,15 @@
---
title: "Community"
description: Packages contributed by the community
data:
title: "Community"
description: Packages contributed by the community
template: layouts/docs/single
---
{{% pageinfo %}}
{% block "blocks/pageinfo" %}
Do you have a moor-related package you want to share? Awesome, please let me know!
Contact me on [Gitter](https://gitter.im/simolus3), [Twitter](https://twitter.com/dersimolus)
or via email to oss &lt;at&gt;simonbinder&lt;dot&gt;eu.
{{% /pageinfo %}}
{% endblock %}
## Moor inspector
@@ -1,11 +1,13 @@
---
title: "Frequently asked questions"
data:
title: "Frequently asked questions"
url: /faq/
path: faq/
template: layouts/docs/single
---
## Using the database
If you've created a `MyDatabase` class by following the [getting started guide]({{<relref "Getting started/_index.md">}}), you
If you've created a `MyDatabase` class by following the [getting started guide]({{ "Getting started/index.md" | pageUrl }}), you
still need to somehow obtain an instance of it. It's recommended to only have one (singleton) instance of your database,
so you could store that instance in a global variable:
@@ -43,7 +45,7 @@ in your favorite dependency injection framework for flutter hence solves this pr
## Why am I getting no such table errors?
If you add another table after your app has already been installed, you need to write a [migration]({{< relref "Advanced Features/migrations.md" >}})
If you add another table after your app has already been installed, you need to write a [migration]({{ "Advanced Features/migrations.md" | pageUrl }})
that covers creating that table. If you're in the process of developing your app and want to use un- and reinstall your app
instead of writing migrations, that's fine too. Please note that your apps data might be backed up on Android, so
manually deleting your app's data instead of a reinstall is necessary on some devices.
@@ -97,7 +99,7 @@ result of your queries.
## floor
Floor also has a lot of convenience features like auto-updating queries and schema migrations. Similar to moor, you
define the structure of your database in Dart. Then, you have write queries in sql - the mapping code if generated
by floor. Moor has a [similar feature]({{< relref "Using SQL/custom_queries.md" >}}), but it can also verify that your queries are valid at compile time. Moor
by floor. Moor has a [similar feature]({{ "Using SQL/custom_queries.md" | pageUrl }}), but it can also verify that your queries are valid at compile time. Moor
additionally has an api that let's you write some queries in Dart instead of sql.
A difference between these two is that Floor let's you write your own classes and generates mapping code around that.
+6 -8
View File
@@ -1,14 +1,12 @@
---
title: "Welcome to Moor"
linkTitle: "Documentation & Guides"
weight: 20
menu:
main:
weight: 20
description: Welcome to the moor documentation. This site shows you what moor can do and how to use it.
data:
title: "Documentation & Guides"
description: Welcome to moor's documentation. This site shows you what moor can do and how to use it.
template: layouts/docs/list
---
## So what's moor?
## Welcome to moor
Moor is a reactive persistence library for Dart and Flutter applications. It's built on top
of database libraries like [sqflite](https://pub.dev/packages/sqflite) or [sql.js](https://github.com/sql-js/sql.js/)
and provides additional features, like:
@@ -1,6 +1,8 @@
---
title: "Supported platforms"
description: All platforms supported by moor, and how to use them
data:
title: "Supported platforms"
description: All platforms supported by moor, and how to use them
template: layouts/docs/single
---
Being built ontop of the sqlite3 database, moor can run on almost every Dart platform.
@@ -30,12 +32,12 @@ is still maintained and suppported.
### using `moor/ffi`
The new `package:moor/ffi.dart` implementation uses `dart:ffi` to bind to sqlite3 on Android and iOS.
This is the recommended approach for newer projects as described in the [getting started]({{<relref "Getting started/_index.md">}}) guide.
This is the recommended approach for newer projects as described in the [getting started]({{ "Getting started/index.md" | pageUrl }}) guide.
To ensure that your app ships with the latest sqlite3 version, also add a dependency to the `sqlite3_flutter_libs`
package when using `package:moor/ffi.dart`!
{{% alert title="A note on ffi and Android" %}}
{% block "blocks/alert" title="A note on ffi and Android" %}
> `package:moor/ffi.dart` is the recommended moor implementation for new Android apps.
However, there are some smaller issues on some devices that you should be aware of:
@@ -49,11 +51,11 @@ package when using `package:moor/ffi.dart`!
- Out of memory errors for very complex queries: Since the regular tmp directory isn't available on Android, you need to inform
sqlite3 about the right directory to store temporary data. See [this comment](https://github.com/simolus3/moor/issues/876#issuecomment-710013503)
for an example on how to do that.
{{% /alert %}}
{% endblock %}
## Web
_Main article: [Web]({{<relref "Other engines/web.md">}})_
_Main article: [Web]({{ "Other engines/web.md" | pageUrl }})_
For apps that run on the web, you can use moor's experimental web implementation, located
in `package:moor/moor_web.dart`.
@@ -1,10 +1,13 @@
---
title: "Testing"
description: Guide on writing unit tests for moor databases
data:
title: "Testing"
description: Guide on writing unit tests for moor databases
template: layouts/docs/single
---
Flutter apps using moor can always be tested with [integration tests](https://flutter.dev/docs/cookbook/testing/integration/introduction)
running on a real device. This guide focusses on writing unit tests for a database written in moor.
running on a real device. This guide focuses on writing unit tests for a database written in moor.
Those tests can be run and debugged on your computer without additional setup, you don't need a
physical device to run them.
@@ -49,7 +52,7 @@ class MyDatabase extends _$MyDatabase {
}
```
{{% alert title="Installing sqlite" %}}
{% block "blocks/alert" title="Installing sqlite" %}
We can't distribute an sqlite installation as a pub package (at least
not as something that works outside of a Flutter build), so you need
to ensure that you have the sqlite3 shared library installed on your
@@ -64,7 +67,7 @@ On Windows, you can [download 'Precompiled Binaries for Windows'](https://www.sq
and extract `sqlite3.dll` into a folder that's in your `PATH`
environment variable. Then restart your device to ensure that
all apps will run with this `PATH` change.
{{% /alert %}}
{% endblock %}
## Writing tests
@@ -115,4 +118,4 @@ test('stream emits a new user when the name updates', () async {
## Testing migrations
Moor can help you generate code for schema migrations. For more details, see
[this guide]({{< relref "Advanced Features/migrations.md#verifying-migrations" >}}).
[this guide]({{ "Advanced Features/migrations.md#verifying-migrations" | pageUrl }}).
@@ -1,8 +1,10 @@
---
title: "Transactions"
weight: 70
description: Run multiple queries atomically
data:
title: "Transactions"
weight: 70
description: Run multiple queries atomically
template: layouts/docs/single
aliases:
- /transactions/
---
@@ -14,6 +16,7 @@ To begin a transaction, call the `transaction` method on your database or a DAO.
It takes a function as an argument that will be run transactionally. In the
following example, which deals with deleting a category, we move all todo entries
in that category back to the default category:
```dart
Future deleteCategory(Category category) {
return transaction(() async {
@@ -56,4 +59,4 @@ This behavior is useful if you're collapsing streams inside a transaction, for i
calling `first` or `fold`.
However, we recommend that streams created _inside_ a transaction are not listened to
_outside_ of a transaction. While it's possible, it defeats the isolation principle
of transactions as its state is exposed through the stream.
of transactions as its state is exposed through the stream.
+82
View File
@@ -0,0 +1,82 @@
---
page:
title: "Moor - Reactive, typesafe persistence library for Dart"
template: layouts/home.html
path: ""
---
{% block "blocks/cover.html" title="Moor: Persistence library for Dart" image_anchor="top" height="med" color="indigo" %}
<div class="mx-auto">
<a class="btn btn-lg btn-primary mr-3 mb-4" href="{{ 'docs/index' | pageUrl }}">
Learn moor <i class="fas fa-arrow-alt-circle-right ml-2"></i>
</a>
<a class="btn btn-lg btn-secondary mr-3 mb-4" href="https://pub.dev/packages/moor">
Get fom pub <i class="fas fa-code ml-2 "></i>
</a>
<p class="lead mt-5">
With a fluent query api, a powerful sql analyzer, auto-updating streams and much more,
moor makes persistence fun. Scroll down to learn about moor's key features, or visit the
<a href="{{ 'docs/Getting started/index' | pageUrl }}">getting started guide</a> for a step-by-step guide on using moor.
</p>
</div>
{% endblock %}
{% block "blocks/lead.html" color="dark" %}
Moor is an easy to use, reactive persistence library for Flutter apps. Define tables in Dart or
SQL and enjoy a fluent query API, auto-updating streams and more!
{% endblock %}
{% block "blocks/section.html" color="primary" %}
{% block "blocks/feature.html" icon="fas fa-lightbulb" title="Declarative tables, fluent queries" %}
{% block "blocks/markdown.html" %}
With moor, you can write your database tables in pure Dart without having to miss out on
advanced sqlite features. Moor will take care of creating the tables and generate code
that allows you run fluent queries on your data.
[Get started now]({{ "docs/Getting started/index.md" | pageUrl }})
{% endblock %}
{% endblock %}
{% block "blocks/feature.html" icon="fas fa-database" title="Prefer SQL? Moor got you covered!" %}
{% block "blocks/markdown.html" %}
Moor contains a powerful sql parser and analyzer, allowing it to create typesafe APIs for all your sql queries. All sql queries are
validated and analyzed during build-time, so moor can provide hints about potential errors quickly and generate efficient mapping
code.
[Learn more]({{ 'docs/Using SQL/index.md' | pageUrl }})
{% endblock %}
{% endblock %}
{% block "blocks/feature.html" icon="fas fa-star" title="And much more!" %}
{% block "blocks/markdown.html" %}
Or should I say, much moor? Moor provides auto-updating straems for all your queries, makes dealing with transactions and migrations easy
and lets your write modular database code with DAOs. We even have a [sql IDE]({{ 'docs/Using SQL/sql_ide.md' | pageUrl }}) builtin to the project
When using moor, working with databases in Dart is fun!
{% endblock %}
{% endblock %}
{% endblock %}
{% block "blocks/section.html" color="light" type="section" %}
{% block "blocks/markdown.html" %}
## Key moor features
Here are some of the many ways moor helps you write awesome database code:
* __Auto-updating streams__: With moor, any query - no matter how complex - can be turned into a stream that emits new data as the underlying data changes.
* __Polyglot__: Moor lets you write queries in a fluent Dart api or directly in SQL - you can even embed Dart expressions in SQL.
* __Boilerplate-free__: Stop writing mapping code yourself - moor can take of that. Moor generates Dart code around your data so you can focus
on building great apps.
* __Flexible__: Want to write queries in SQL? Moor verifies them at compile time and generates Dart apis for them. Prefer to write them in Dart?
Moor will generate efficient SQL for Dart queries too.
* __Easy to learn__: Instead of having to learn yet another ORM, moor lets you write queries in SQL and generates typesafe wrappers. Queries and tables
can also be written in Dart that looks similar to SQL without loosing type-safety.
* __Fast _and_ powerful__: With the new `ffi` backend, moor can outperform key-value stores without putting any compromises on the integrity
and flexibility that relational databases provide. Moor is the only major persistence library with builtin support for multiple isolates.
* __Well tested and production ready__: Each component of moor is verified by a wide range of unit and integration tests. Moor powers many Flutter apps
in production.
* __Cross-Platform__: Moor works on iOS, Android, Linux, macOS, Windows and on the web. It doesn't even require Flutter. See [supported platforms]({{ "docs/platforms.md" | pageUrl }}).
{% endblock %}
{% endblock %}
+116
View File
@@ -0,0 +1,116 @@
---
template: layouts/home.html
path: v2
---
{% block "blocks/cover" title="Moor 2.0: Supercharged SQL for Dart" image_anchor="top" height="min" color="indigo" %}
<div class="mx-auto">
<p class="lead mt-5">
Learn everything about Dart-SQL interop, the SQL IDE, experimental ffi support and all things new in moor
</p>
<a class="btn btn-lg btn-primary mr-3 mb-4" href="{{ "docs/index.md" | pageUrl }}">
Get started <i class="fas fa-arrow-alt-circle-right ml-2"></i>
</a>
<a class="btn btn-lg btn-secondary mr-3 mb-4" href="{{ "docs/Getting started/starting_with_sql.md" | pageUrl }}">
Migrate an existing project <i class="fas fa-code ml-2 "></i>
</a>
</div>
{% endblock %}
{% block "blocks/lead" color="blue" %}
{% block "blocks/markdown" %}
## Generator overhaul
The rewritten compiler is faster than ever, supports more SQL features and gives you
more flexibility when writing database code.
[Check the updated documentation]({{ "docs/Using SQL/moor_files.md" | pageUrl }})
{% endblock %}
{% endblock %}
{% block "blocks/section" color="light" %}
{% block "blocks/feature" icon="fas fa-database" title="Pure SQL API" %} {% block "blocks/markdown" %}
The new `.moor` files have been updated and can now hold both `CREATE TABLE` statements
and queries you define. Moor will then generate typesafe Dart APIs based on your tables
and statements.
[Get started with SQL and moor]({{ "docs/Getting started/starting_with_sql.md" | pageUrl }})
{% endblock %} {% endblock %}
{% block "blocks/feature" icon="fas fa-plus" title="Analyzer improvements" %} {% block "blocks/markdown" %}
We now support more advanced features like compound select statements and window functions,
including detailed static analysis and lints. The updated type inference engine provides
better results on complex expressions. We also generate simpler methods for queries that only
return one column.
{% endblock %} {% endblock %}
{% block "blocks/feature" icon="fas fa-code-branch" title="Dart-SQL interop" %} {% block "blocks/markdown" %}
Declare tables in Dart, write your queries in SQL. Or do it the other way around. Or do it all in Dart.
Or all in SQL. Moor makes writing database code fun without taking control over your code.
For maximum flexibilty, moor lets you inline Dart expressions into SQL and use the best of both
worlds.
{% endblock %} {% endblock %}
{% endblock %}
{% block "blocks/lead" color="green" %} {% block "blocks/markdown" %}
## Builtin SQL IDE
Moor 2.0 expands the previous sql parser and analyzer, providing real-time feedback on your
SQL queries as you type. Moor plugs right into the Dart analysis server, so you don't have
to install any additional extensions.
[Learn more about the IDE]({{ "docs/Using SQL/sql_ide.md" | pageUrl }})
{% endblock %} {% endblock %}
{% block "blocks/section" color="dark" %}
{% block "blocks/feature" icon="fas fa-lightbulb" title="Quickfixes" %} {% block "blocks/markdown" %}
![](quickfix.png)
Moor lets you write query code faster with helpful actions.
{% endblock %} {% endblock %}
{% block "blocks/feature" icon="fas fa-exclamation-circle" title="Smart warnings" %} {% block "blocks/markdown" %}
![](warning.png)
Moor analyzes statements as you write them and reports errors right away.
This helps you identify problems fast, without having to open your app.
{% endblock %} {% endblock %}
{% block "blocks/feature" icon="fas fa-info-circle" title="Structure view" %} {% block "blocks/markdown" %}
![](outline.png)
Moor provides an outline of your tables and queries for a better overview.
{% endblock %} {% endblock %}
{% endblock %}
{% block "blocks/lead" color="purple" %} {% block "blocks/markdown" %}
## And much, much more
Moor 2.0 contains a set of optimizations and makes common tasks simpler
{% endblock %} {% endblock %}
{% block "blocks/section" color="light" %}
{% block "blocks/feature" icon="fas fa-lightbulb" title="New database helpers" %} {% block "blocks/markdown" %}
New utils to load database from assets or to perform additional work before creating a database.
{% endblock %} {% endblock %}
{% block "blocks/feature" icon="fas fa-exclamation" title="Removed deprecated features" %} {% block "blocks/markdown" %}
We removed a whole bunch of deprecated apis that made it harder to develop new features.
[Read the changelog for details](https://pub.dev/packages/moor#-changelog-tab-)
{% endblock %} {% endblock %}
{% block "blocks/feature" icon="fas fa-bolt" title="Experimental `dart:ffi` bindings" %} {% block "blocks/markdown" %}
The new [moor_ffi](https://pub.dev/packages/moor_ffi) package brings moor to the desktop and is up to 500x faster than the old
implementation.
_Please not that the package is still in preview_
{% endblock %} {% endblock %}
{% endblock %}
{% block "blocks/section" color="dark" type="section" %} {% block "blocks/markdown" %}
## Try moor now
- To get started with moor, follow our [getting started guide]({{ "docs/Getting started/index.md" | pageUrl }}) here.
- To get started with SQL in moor, or to migrate an existing project to moor, follow our
[migration guide]({{ "docs/Getting started/starting_with_sql.md" | pageUrl }})
{% endblock %} {% endblock %}
+34
View File
@@ -0,0 +1,34 @@
name: moor_documentation
description: Documentation of the moor packages
publish_to: none
environment:
sdk: '>=2.12.0 <3.0.0'
dependencies:
docsy:
hosted:
url: https://simonbinder.eu
name: docsy
version: ^0.1.0
dev_dependencies:
build_runner: ^1.11.1
build_web_compilers: ^2.16.3
built_site:
hosted:
url: https://simonbinder.eu
name: built_site
version: ^0.1.0
webdev: ^2.7.1
sass_builder: ^2.1.3
dependency_overrides:
args: ^2.0.0
yaml: ^3.0.0
crypto: ^3.0.0
# todo: Remove after https://github.com/dart-lang/mime/pull/43
mime:
git:
url: https://github.com/simolus3/mime.git
ref: woff2
+2
View File
@@ -0,0 +1,2 @@
<link rel="stylesheet" href="{{ "/main.css" | relURL }}">
<script defer src="{{ "/main.dart.js" | relURL }}"></script>
Submodule docs/themes/docsy deleted from c2039d6322
+5
View File
@@ -0,0 +1,5 @@
import 'package:docsy/main.dart' as docsy;
void main() {
docsy.built_site_main();
}
+3
View File
@@ -0,0 +1,3 @@
@import "package:moor_documentation/_variables";
@import "package:docsy/style";
@import "package:moor_documentation/_highlight";

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

+42
View File
@@ -0,0 +1,42 @@
themes:
- docsy
site:
title: "Moor"
language: "en"
copyright: "Simon Binder"
github_repo: "https://github.com/simolus3/moor"
github_subdir: "docs/"
github_branch: master
# gcs_engine_id: "002567324444333206795:_yptu7lact8"
links:
user:
- name: "Contact me via e-mail"
url: "mailto:oss@simonbinder.eu"
icon: "fa fa-envelope"
- name: "Room in gitter"
url: "https://gitter.im/moor-dart/community"
icon: "fab fa-gitter"
- name: "Project on GitHub"
url: "https://github.com/simolus3/moor"
icon: "fab fa-github"
desc: "Development takes place here"
menu:
main:
- name: "Documentation & Guides"
url: "/docs/"
- name: "Pub"
url: "https://pub.dev/packages/moor"
- name: "GitHub"
url: "https://github.com/simolus3/moor/"
- name: "API docs"
url: "https://pub.dev/documentation/moor/latest/"
environments:
dev:
minify: false
base_url: "http://localhost:8080/"
prod:
minify: true
base_url: "https://moor.simonbinder.eu/"
+6 -6
View File
@@ -1,18 +1,18 @@
# We use netlify to deploy the documentation.
[build]
base = "docs"
publish = "docs/public"
command = 'git submodule update --init --recursive && npm i && hugo'
base = ""
publish = "docs/deploy"
command = 'tool/netlify_build.sh'
[[redirects]]
from = "https://moor.netlify.com/*"
from = "https://moor.netlify.app/*"
to = "https://moor.simonbinder.eu/:splat"
status = 301
force = true
[context.production]
environment = { HUGO_ENV="production", HUGO_VERSION="0.74.3" }
environment = { BUILD_RELEASE="release" }
[context.deploy-preview]
environment = { HUGO_VERSION="0.74.3" }
environment = { }
+16
View File
@@ -0,0 +1,16 @@
curl https://storage.googleapis.com/dart-archive/channels/stable/release/latest/linux_packages/dart_2.12.1-1_amd64.deb --output /tmp/dart.deb
dpkg -i /tmp/dart.deb
cd docs
dart pub get
if [[ -v BUILD_RELEASE ]]
then
dart run build_runner build --release
dart run build_runner build --release --output web:deploy
else
dart run build_runner build
dart run build_runner build --output web:deploy
fi
rm -r deploy/packages