@lowdefy/docs-content 0.0.0-experimental-20260710073520
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +20 -0
- package/content/actions/callapi.md +66 -0
- package/content/actions/callmethod.md +41 -0
- package/content/actions/copytoclipboard.md +32 -0
- package/content/actions/displaymessage.md +53 -0
- package/content/actions/downloadcsv.md +89 -0
- package/content/actions/fetch.md +50 -0
- package/content/actions/geolocationcurrentposition.md +56 -0
- package/content/actions/link.md +104 -0
- package/content/actions/login.md +85 -0
- package/content/actions/logout.md +56 -0
- package/content/actions/pdfmake.md +304 -0
- package/content/actions/request.md +67 -0
- package/content/actions/reset.md +27 -0
- package/content/actions/resetvalidation.md +85 -0
- package/content/actions/scrollto.md +85 -0
- package/content/actions/setdarkmode.md +62 -0
- package/content/actions/setfocus.md +33 -0
- package/content/actions/setglobal.md +63 -0
- package/content/actions/setlocale.md +69 -0
- package/content/actions/setstate.md +70 -0
- package/content/actions/throw.md +72 -0
- package/content/actions/validate.md +87 -0
- package/content/actions/wait.md +24 -0
- package/content/agents/agent-endpoint-tools.md +190 -0
- package/content/agents/agent-mcp-tools.md +124 -0
- package/content/agents/agent-multi-agent.md +136 -0
- package/content/agents/agent-properties.md +174 -0
- package/content/agents/agent-server-hooks.md +336 -0
- package/content/agents/agentchat.md +515 -0
- package/content/agents/agentconversations.md +148 -0
- package/content/concepts/ai-agent-docs.md +190 -0
- package/content/concepts/cli.md +213 -0
- package/content/concepts/connections-and-requests.md +7 -0
- package/content/concepts/custom-html.md +3 -0
- package/content/concepts/custom-styling.md +161 -0
- package/content/concepts/events-and-actions.md +271 -0
- package/content/concepts/hosting-files.md +18 -0
- package/content/concepts/i18n.md +320 -0
- package/content/concepts/keyboard-shortcuts.md +218 -0
- package/content/concepts/layout-overview.md +478 -0
- package/content/concepts/lists.md +144 -0
- package/content/concepts/logger.md +43 -0
- package/content/concepts/lowdefy-schema.md +365 -0
- package/content/concepts/menus.md +144 -0
- package/content/concepts/module-authoring.md +564 -0
- package/content/concepts/modules.md +338 -0
- package/content/concepts/operators.md +45 -0
- package/content/concepts/overview.md +19 -0
- package/content/concepts/references-and-templates.md +207 -0
- package/content/concepts/secrets.md +24 -0
- package/content/concepts/selectors.md +143 -0
- package/content/connections/amazonredshift.md +176 -0
- package/content/connections/anthropic.md +232 -0
- package/content/connections/awss3.md +313 -0
- package/content/connections/azureblobstorage.md +133 -0
- package/content/connections/elasticsearch.md +371 -0
- package/content/connections/google.md +228 -0
- package/content/connections/googlecloudstorage.md +139 -0
- package/content/connections/googlesheet.md +313 -0
- package/content/connections/knex.md +206 -0
- package/content/connections/mariadb.md +177 -0
- package/content/connections/mcp.md +134 -0
- package/content/connections/mongodb.md +739 -0
- package/content/connections/mssql.md +191 -0
- package/content/connections/mysql.md +192 -0
- package/content/connections/openai-connection.md +228 -0
- package/content/connections/postgresql.md +200 -0
- package/content/connections/redis.md +116 -0
- package/content/connections/sendgridmail.md +94 -0
- package/content/connections/smtp.md +149 -0
- package/content/connections/sqlite.md +187 -0
- package/content/connections/stripe.md +115 -0
- package/content/container-blocks/affix.md +413 -0
- package/content/container-blocks/alert.md +937 -0
- package/content/container-blocks/badge.md +1222 -0
- package/content/container-blocks/box.md +1453 -0
- package/content/container-blocks/card.md +1200 -0
- package/content/container-blocks/carousel.md +2247 -0
- package/content/container-blocks/collapse.md +1335 -0
- package/content/container-blocks/configprovider.md +1070 -0
- package/content/container-blocks/confirmmodal.md +1159 -0
- package/content/container-blocks/content.md +597 -0
- package/content/container-blocks/descriptions.md +870 -0
- package/content/container-blocks/drawer.md +1379 -0
- package/content/container-blocks/dropdownmenu.md +643 -0
- package/content/container-blocks/flex.md +1510 -0
- package/content/container-blocks/footer.md +380 -0
- package/content/container-blocks/googlemaps.md +546 -0
- package/content/container-blocks/googlemapsheatmap.md +607 -0
- package/content/container-blocks/googlemapsscript.md +61 -0
- package/content/container-blocks/header.md +302 -0
- package/content/container-blocks/label.md +739 -0
- package/content/container-blocks/layout.md +604 -0
- package/content/container-blocks/masonry.md +1090 -0
- package/content/container-blocks/mobilemenu.md +1244 -0
- package/content/container-blocks/modal.md +1180 -0
- package/content/container-blocks/pageheadermenu.md +614 -0
- package/content/container-blocks/pagesidebarlayout.md +438 -0
- package/content/container-blocks/pagesidermenu.md +651 -0
- package/content/container-blocks/popover.md +1421 -0
- package/content/container-blocks/result.md +972 -0
- package/content/container-blocks/sider.md +1064 -0
- package/content/container-blocks/span.md +747 -0
- package/content/container-blocks/spinner.md +267 -0
- package/content/container-blocks/splitter.md +1735 -0
- package/content/container-blocks/tabs.md +1718 -0
- package/content/container-blocks/tooltip.md +1274 -0
- package/content/container-blocks/watermark.md +515 -0
- package/content/controls/for.md +103 -0
- package/content/controls/if.md +107 -0
- package/content/controls/log.md +50 -0
- package/content/controls/parallel.md +71 -0
- package/content/controls/parallel_for.md +36 -0
- package/content/controls/reject.md +56 -0
- package/content/controls/return.md +66 -0
- package/content/controls/set_state.md +98 -0
- package/content/controls/switch.md +90 -0
- package/content/controls/throw.md +79 -0
- package/content/controls/try.md +88 -0
- package/content/deployment/docker.md +149 -0
- package/content/deployment/node-server.md +27 -0
- package/content/deployment/vercel.md +101 -0
- package/content/display-blocks/aggrid.md +1459 -0
- package/content/display-blocks/anchor.md +336 -0
- package/content/display-blocks/avatar.md +1154 -0
- package/content/display-blocks/breadcrumb.md +517 -0
- package/content/display-blocks/button.md +758 -0
- package/content/display-blocks/calendar.md +156 -0
- package/content/display-blocks/dangeroushtml.md +314 -0
- package/content/display-blocks/dangerousmarkdown.md +423 -0
- package/content/display-blocks/diffgit.md +44 -0
- package/content/display-blocks/difflist.md +225 -0
- package/content/display-blocks/diffsidebyside.md +56 -0
- package/content/display-blocks/difftimeline.md +94 -0
- package/content/display-blocks/divider.md +406 -0
- package/content/display-blocks/download.md +60 -0
- package/content/display-blocks/dropdownbutton.md +661 -0
- package/content/display-blocks/echart.md +418 -0
- package/content/display-blocks/floatbutton.md +545 -0
- package/content/display-blocks/html.md +311 -0
- package/content/display-blocks/icon.md +717 -0
- package/content/display-blocks/img.md +479 -0
- package/content/display-blocks/markdown.md +520 -0
- package/content/display-blocks/markdownwithcode.md +730 -0
- package/content/display-blocks/menu.md +1123 -0
- package/content/display-blocks/message.md +941 -0
- package/content/display-blocks/notification.md +1410 -0
- package/content/display-blocks/paragraph.md +643 -0
- package/content/display-blocks/progress.md +818 -0
- package/content/display-blocks/qrcode.md +519 -0
- package/content/display-blocks/s3download.md +240 -0
- package/content/display-blocks/search.md +360 -0
- package/content/display-blocks/skeleton.md +272 -0
- package/content/display-blocks/skeletonavatar.md +222 -0
- package/content/display-blocks/skeletonbutton.md +245 -0
- package/content/display-blocks/skeletoninput.md +223 -0
- package/content/display-blocks/skeletonparagraph.md +201 -0
- package/content/display-blocks/statistic.md +485 -0
- package/content/display-blocks/steps.md +585 -0
- package/content/display-blocks/tag.md +620 -0
- package/content/display-blocks/title.md +654 -0
- package/content/display-blocks/tour.md +2359 -0
- package/content/input-blocks/autocomplete.md +786 -0
- package/content/input-blocks/buttonselector.md +964 -0
- package/content/input-blocks/checkboxselector.md +765 -0
- package/content/input-blocks/checkboxswitch.md +497 -0
- package/content/input-blocks/colorselector.md +884 -0
- package/content/input-blocks/daterangeselector.md +777 -0
- package/content/input-blocks/dateselector.md +693 -0
- package/content/input-blocks/datetimeselector.md +791 -0
- package/content/input-blocks/inputgallery.md +528 -0
- package/content/input-blocks/monthselector.md +717 -0
- package/content/input-blocks/multipleselector.md +1337 -0
- package/content/input-blocks/numberinput.md +855 -0
- package/content/input-blocks/pagination.md +679 -0
- package/content/input-blocks/paragraphinput.md +1664 -0
- package/content/input-blocks/passwordinput.md +480 -0
- package/content/input-blocks/phonenumberinput.md +688 -0
- package/content/input-blocks/radioselector.md +820 -0
- package/content/input-blocks/ratingslider.md +684 -0
- package/content/input-blocks/s3uploadbutton.md +384 -0
- package/content/input-blocks/s3uploaddragger.md +305 -0
- package/content/input-blocks/s3uploadphoto.md +288 -0
- package/content/input-blocks/segmentedselector.md +782 -0
- package/content/input-blocks/selector.md +1162 -0
- package/content/input-blocks/switch.md +552 -0
- package/content/input-blocks/textarea.md +714 -0
- package/content/input-blocks/textinput.md +639 -0
- package/content/input-blocks/tiptapinput.md +226 -0
- package/content/input-blocks/tiptapmentioninput.md +471 -0
- package/content/input-blocks/titleinput.md +1094 -0
- package/content/input-blocks/treeinput.md +144 -0
- package/content/input-blocks/treemultipleselector.md +162 -0
- package/content/input-blocks/treeselector.md +185 -0
- package/content/input-blocks/upload.md +149 -0
- package/content/input-blocks/uploaddragger.md +85 -0
- package/content/input-blocks/uploadphoto.md +84 -0
- package/content/input-blocks/weekselector.md +630 -0
- package/content/list-blocks/controlledlist.md +498 -0
- package/content/list-blocks/list.md +529 -0
- package/content/list-blocks/listselector.md +301 -0
- package/content/list-blocks/masonrylist.md +230 -0
- package/content/migration/upgrade-guide.md +106 -0
- package/content/migration/v4-to-v5.md +589 -0
- package/content/migration/v5-to-v6.md +36 -0
- package/content/operators/_actions.md +58 -0
- package/content/operators/_and.md +76 -0
- package/content/operators/_api.md +254 -0
- package/content/operators/_app.md +114 -0
- package/content/operators/_args.md +65 -0
- package/content/operators/_array.md +331 -0
- package/content/operators/_base64.md +49 -0
- package/content/operators/_boolean.md +33 -0
- package/content/operators/_build.md +166 -0
- package/content/operators/_change_case.md +357 -0
- package/content/operators/_date.md +415 -0
- package/content/operators/_dayjs.md +128 -0
- package/content/operators/_diff.md +61 -0
- package/content/operators/_divide.md +32 -0
- package/content/operators/_eq.md +52 -0
- package/content/operators/_event.md +86 -0
- package/content/operators/_function.md +52 -0
- package/content/operators/_get.md +92 -0
- package/content/operators/_global.md +86 -0
- package/content/operators/_gt.md +50 -0
- package/content/operators/_gte.md +50 -0
- package/content/operators/_hash.md +112 -0
- package/content/operators/_if.md +30 -0
- package/content/operators/_if_none.md +47 -0
- package/content/operators/_index.md +48 -0
- package/content/operators/_input.md +86 -0
- package/content/operators/_intl.md +135 -0
- package/content/operators/_item.md +166 -0
- package/content/operators/_js.md +113 -0
- package/content/operators/_json.md +120 -0
- package/content/operators/_jsonata.md +152 -0
- package/content/operators/_locale.md +65 -0
- package/content/operators/_location.md +40 -0
- package/content/operators/_log.md +22 -0
- package/content/operators/_lt.md +50 -0
- package/content/operators/_lte.md +50 -0
- package/content/operators/_math.md +407 -0
- package/content/operators/_media.md +83 -0
- package/content/operators/_menu.md +62 -0
- package/content/operators/_module.md +340 -0
- package/content/operators/_mql.md +95 -0
- package/content/operators/_ne.md +62 -0
- package/content/operators/_not.md +33 -0
- package/content/operators/_number.md +159 -0
- package/content/operators/_nunjucks.md +117 -0
- package/content/operators/_object.md +253 -0
- package/content/operators/_operator.md +33 -0
- package/content/operators/_or.md +67 -0
- package/content/operators/_product.md +45 -0
- package/content/operators/_random.md +90 -0
- package/content/operators/_ref.md +80 -0
- package/content/operators/_regex.md +69 -0
- package/content/operators/_request.md +35 -0
- package/content/operators/_request_details.md +29 -0
- package/content/operators/_secret.md +56 -0
- package/content/operators/_state.md +134 -0
- package/content/operators/_step.md +98 -0
- package/content/operators/_string.md +327 -0
- package/content/operators/_subtract.md +24 -0
- package/content/operators/_sum.md +45 -0
- package/content/operators/_switch.md +37 -0
- package/content/operators/_t.md +96 -0
- package/content/operators/_theme.md +65 -0
- package/content/operators/_type.md +78 -0
- package/content/operators/_uri.md +49 -0
- package/content/operators/_url_query.md +92 -0
- package/content/operators/_user.md +154 -0
- package/content/operators/_uuid.md +118 -0
- package/content/operators/_var.md +88 -0
- package/content/operators/_yaml.md +96 -0
- package/content/other/introduction.md +39 -0
- package/content/other/next-auth-providers.md +3 -0
- package/content/other/updatesession.md +26 -0
- package/content/plugins/plugins-actions.md +80 -0
- package/content/plugins/plugins-connections.md +98 -0
- package/content/plugins/plugins-dev.md +138 -0
- package/content/plugins/plugins-introduction.md +29 -0
- package/content/plugins/plugins-operators.md +71 -0
- package/content/testing/e2e-auth.md +108 -0
- package/content/testing/e2e-configuration.md +107 -0
- package/content/testing/e2e-getting-started.md +96 -0
- package/content/testing/e2e-introduction.md +53 -0
- package/content/testing/e2e-mocking.md +155 -0
- package/content/testing/e2e-writing-tests.md +214 -0
- package/content/tutorial/tutorial-actions-operators.md +222 -0
- package/content/tutorial/tutorial-add-blocks.md +86 -0
- package/content/tutorial/tutorial-create-page.md +57 -0
- package/content/tutorial/tutorial-display-data-page.md +181 -0
- package/content/tutorial/tutorial-next-steps.md +53 -0
- package/content/tutorial/tutorial-requests-sql.md +22 -0
- package/content/tutorial/tutorial-start.md +71 -0
- package/content/user-authentication/auth-providers.md +15 -0
- package/content/user-authentication/login-and-logout.md +122 -0
- package/content/user-authentication/users-introduction.md +31 -0
- package/index.json +2281 -0
- package/package.json +34 -0
- package/scripts/extractAgentDocs.js +130 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# _uri
|
|
2
|
+
|
|
3
|
+
The `_uri` operator [encodes and decodes](https://en.wikipedia.org/wiki/Percent-encoding) Uniform Resource Identifiers (URI). It encodes characters that are not in the limited US-ASCII characters legal within a URI.
|
|
4
|
+
|
|
5
|
+
> This operator can be used as a [`_build`](/_build) operator method.
|
|
6
|
+
|
|
7
|
+
# Operator methods:
|
|
8
|
+
|
|
9
|
+
## _uri.decode
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
(value: string): string
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The `_uri.decode` method decodes a string that has been uri-encoded. It uses [`decodeURIComponent`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent).
|
|
16
|
+
|
|
17
|
+
#### Arguments
|
|
18
|
+
|
|
19
|
+
###### string
|
|
20
|
+
The string to decode.
|
|
21
|
+
|
|
22
|
+
#### Examples
|
|
23
|
+
|
|
24
|
+
###### Decode a base64 string:
|
|
25
|
+
```yaml
|
|
26
|
+
_uri.decode: http%3A%2F%2Fusername%3Apassword%40www.example.com%3A80%2Fpath%2Fto%2Ffile.php%3Ffoo%3D316%26bar%3Dthis%2Bhas%2Bspaces%23anchor
|
|
27
|
+
```
|
|
28
|
+
Returns: `"http://username:password@www.example.com:80/path/to/file.php?foo=316&bar=this+has+spaces#anchor"`.
|
|
29
|
+
|
|
30
|
+
## _uri.encode
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
(value: string): string
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The `_uri.encode` uri-encodes a string. It uses [`encodeURIComponent`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent).
|
|
37
|
+
|
|
38
|
+
#### Arguments
|
|
39
|
+
|
|
40
|
+
###### string
|
|
41
|
+
The string to encode.
|
|
42
|
+
|
|
43
|
+
#### Examples
|
|
44
|
+
|
|
45
|
+
###### Encode a string as base64:
|
|
46
|
+
```yaml
|
|
47
|
+
_uri.encode: http://username:password@www.example.com:80/path/to/file.php?foo=316&bar=this+has+spaces#anchor
|
|
48
|
+
```
|
|
49
|
+
Returns: `"http%3A%2F%2Fusername%3Apassword%40www.example.com%3A80%2Fpath%2Fto%2Ffile.php%3Ffoo%3D316%26bar%3Dthis%2Bhas%2Bspaces%23anchor"`.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# _url_query
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
(key: string): any
|
|
5
|
+
(all: boolean): any
|
|
6
|
+
(arguments: {
|
|
7
|
+
all?: boolean,
|
|
8
|
+
key?: string,
|
|
9
|
+
default?: any,
|
|
10
|
+
}): any
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The `_url_query` operator gets a value from the [`urlQuery`](/page-and-app-state) object. The `urlQuery` is a data object that is set as the [`https://en.wikipedia.org/wiki/Query_string`] of the app URL. It can be set when linking to a new page using the [`Link`](/link) action, and can be used to set data like a `id` when switching to a new page. Unlike `input`, the `urlQuery` is visible to the user, and can be modified by the user.
|
|
14
|
+
|
|
15
|
+
> __DO NOT__ set any private or personal information to `urlQuery`; all data set to `urlQuery` are accessible publicly. Setting a `id` that can be guessed, like an incremental `id`, can lead to security issues, since users can easily guess and access data for other `ids`.
|
|
16
|
+
|
|
17
|
+
If the page is reloaded, the `urlQuery` is not lost. By using `urlQuery`, you can make links containing data that can be shared by users. By default, `_url_query` accesses the `url_query` object from the [page](/page-and-app-state) the operator is used in.
|
|
18
|
+
|
|
19
|
+
`urlQuery` objects are serialized to JSON, allowing nested objects or arrays to be specified.
|
|
20
|
+
|
|
21
|
+
#### Arguments
|
|
22
|
+
|
|
23
|
+
###### string
|
|
24
|
+
If the `_url_query` operator is called with a string argument, the value of the key in the `urlQuery` object is returned. If the value is not found, `null` is returned. Dot notation and [block list indexes](/lists) are supported.
|
|
25
|
+
|
|
26
|
+
###### boolean
|
|
27
|
+
If the `_url_query` operator is called with boolean argument `true`, the entire `urlQuery` object is returned.
|
|
28
|
+
|
|
29
|
+
###### object
|
|
30
|
+
- `all: boolean`: If `all` is set to `true`, the entire `urlQuery` object is returned. One of `all` or `key` are required.
|
|
31
|
+
- `key: string`: The value of the key in the `urlQuery` object is returned. If the value is not found, `null`, or the specified default value is returned. Dot notation and [block list indexes](/lists) are supported. One of `all` or `key` are required.
|
|
32
|
+
- `default: any`: A value to return if the `key` is not found in `urlQuery`. By default, `null` is returned if a value is not found.
|
|
33
|
+
|
|
34
|
+
#### Examples
|
|
35
|
+
|
|
36
|
+
###### Get the value of `my_key` from `urlQuery`:
|
|
37
|
+
```yaml
|
|
38
|
+
_url_query: my_key
|
|
39
|
+
```
|
|
40
|
+
```yaml
|
|
41
|
+
_url_query:
|
|
42
|
+
key: my_key
|
|
43
|
+
```
|
|
44
|
+
Returns: The value of `my_key` in `urlQuery`.
|
|
45
|
+
|
|
46
|
+
###### Get the entire `urlQuery` object:
|
|
47
|
+
```yaml
|
|
48
|
+
_url_query: true
|
|
49
|
+
```
|
|
50
|
+
```yaml
|
|
51
|
+
_url_query:
|
|
52
|
+
all: true
|
|
53
|
+
```
|
|
54
|
+
Returns: The entire `urlQuery` object.
|
|
55
|
+
|
|
56
|
+
###### Dot notation:
|
|
57
|
+
Assuming urlQuery:
|
|
58
|
+
```yaml
|
|
59
|
+
my_object:
|
|
60
|
+
subfield: 'Value'
|
|
61
|
+
```
|
|
62
|
+
then:
|
|
63
|
+
```yaml
|
|
64
|
+
_url_query: my_object.subfield
|
|
65
|
+
```
|
|
66
|
+
```yaml
|
|
67
|
+
_url_query:
|
|
68
|
+
key: my_object.subfield
|
|
69
|
+
```
|
|
70
|
+
Returns: `"Value"`.
|
|
71
|
+
|
|
72
|
+
###### Return a default value if the value is not found:
|
|
73
|
+
```yaml
|
|
74
|
+
_url_query:
|
|
75
|
+
key: might_not_exist
|
|
76
|
+
default: Default value
|
|
77
|
+
```
|
|
78
|
+
Returns: The value of `might_not_exist`, or `"Default value"`.
|
|
79
|
+
|
|
80
|
+
###### Block list indices:
|
|
81
|
+
Assuming `urlQuery`:
|
|
82
|
+
```yaml
|
|
83
|
+
my_array:
|
|
84
|
+
- value: 0
|
|
85
|
+
- value: 1
|
|
86
|
+
- value: 2
|
|
87
|
+
```
|
|
88
|
+
then:
|
|
89
|
+
```yaml
|
|
90
|
+
_url_query: my_array.$.value
|
|
91
|
+
```
|
|
92
|
+
Returns: `0` when used from the first block (0th index) in a list.
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# _user
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
(key: string): any
|
|
5
|
+
(all: boolean): any
|
|
6
|
+
(arguments: {
|
|
7
|
+
all?: boolean,
|
|
8
|
+
key?: string,
|
|
9
|
+
default?: any,
|
|
10
|
+
}): any
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The `_user` operator gets a value from the [`user`](/user-object) object. The `user` object contains the data in the user idToken if OpenID Connect authentication is configured and a user is logged in.
|
|
14
|
+
|
|
15
|
+
#### Arguments
|
|
16
|
+
|
|
17
|
+
###### string
|
|
18
|
+
If the `_user` operator is called with a string argument, the value of the key in the `user` object is returned. If the value is not found, `null` is returned. Dot notation and [block list indexes](/lists) are supported.
|
|
19
|
+
|
|
20
|
+
###### boolean
|
|
21
|
+
If the `_user` operator is called with boolean argument `true`, the entire `user` object is returned.
|
|
22
|
+
|
|
23
|
+
###### object
|
|
24
|
+
- `all: boolean`: If `all` is set to `true`, the entire `user` object is returned. One of `all` or `key` are required.
|
|
25
|
+
- `key: string`: The value of the key in the `user` object is returned. If the value is not found, `null`, or the specified default value is returned. Dot notation and [block list indexes](/lists) are supported. One of `all` or `key` are required.
|
|
26
|
+
- `default: any`: A value to return if the `key` is not found in `user`. By default, `null` is returned if a value is not found.
|
|
27
|
+
|
|
28
|
+
#### Examples
|
|
29
|
+
|
|
30
|
+
###### Get the value of `name` from `user`:
|
|
31
|
+
```yaml
|
|
32
|
+
_user: name
|
|
33
|
+
```
|
|
34
|
+
```yaml
|
|
35
|
+
_user:
|
|
36
|
+
key: name
|
|
37
|
+
```
|
|
38
|
+
Returns: The value of `name` in `user`.
|
|
39
|
+
|
|
40
|
+
###### Get the entire `user` object:
|
|
41
|
+
```yaml
|
|
42
|
+
_user: true
|
|
43
|
+
```
|
|
44
|
+
```yaml
|
|
45
|
+
_user:
|
|
46
|
+
all: true
|
|
47
|
+
```
|
|
48
|
+
Returns: The entire `user` object.
|
|
49
|
+
|
|
50
|
+
###### Dot notation:
|
|
51
|
+
Assuming user:
|
|
52
|
+
```yaml
|
|
53
|
+
sub: abc123
|
|
54
|
+
name: User Name
|
|
55
|
+
my_object:
|
|
56
|
+
subfield: 'Value'
|
|
57
|
+
```
|
|
58
|
+
then:
|
|
59
|
+
```yaml
|
|
60
|
+
_user: my_object.subfield
|
|
61
|
+
```
|
|
62
|
+
```yaml
|
|
63
|
+
_user:
|
|
64
|
+
key: my_object.subfield
|
|
65
|
+
```
|
|
66
|
+
Returns: `"Value"`.
|
|
67
|
+
|
|
68
|
+
###### Return a default value if the value is not found:
|
|
69
|
+
```yaml
|
|
70
|
+
_user:
|
|
71
|
+
key: might_not_exist
|
|
72
|
+
default: Default value
|
|
73
|
+
```
|
|
74
|
+
Returns: The value of `might_not_exist`, or `"Default value"`.
|
|
75
|
+
|
|
76
|
+
###### Block list indices:
|
|
77
|
+
Assuming `user`:
|
|
78
|
+
```yaml
|
|
79
|
+
sub: abc123
|
|
80
|
+
name: User Name
|
|
81
|
+
my_array:
|
|
82
|
+
- value: 0
|
|
83
|
+
- value: 1
|
|
84
|
+
- value: 2
|
|
85
|
+
```
|
|
86
|
+
then:
|
|
87
|
+
```yaml
|
|
88
|
+
_user: my_array.$.value
|
|
89
|
+
```
|
|
90
|
+
Returns: `0` when used from the first block (0th index) in a list.
|
|
91
|
+
|
|
92
|
+
# Operator methods:
|
|
93
|
+
|
|
94
|
+
## _user.hasRole
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
(role: string): boolean
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The `_user.hasRole` method returns `true` if the `user.roles` array contains the given role. It returns `false` when the user is not logged in, when `user.roles` is missing, or when the role is not present.
|
|
101
|
+
|
|
102
|
+
The `user.roles` value is read directly from the `user` object and must be an array of strings. An error is thrown if `user.roles` is defined but is not an array, or if the argument is not a string.
|
|
103
|
+
|
|
104
|
+
#### Examples
|
|
105
|
+
|
|
106
|
+
###### Check for a single role:
|
|
107
|
+
```yaml
|
|
108
|
+
_user.hasRole: admin
|
|
109
|
+
```
|
|
110
|
+
Returns: `true` if `user.roles` includes `"admin"`.
|
|
111
|
+
|
|
112
|
+
## _user.hasSomeRoles
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
(roles: string[]): boolean
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The `_user.hasSomeRoles` method returns `true` if the `user.roles` array contains at least one of the given roles. It returns `false` when the user is not logged in, when `user.roles` is missing, or when none of the roles match.
|
|
119
|
+
|
|
120
|
+
The `user.roles` value is read directly from the `user` object and must be an array of strings. An error is thrown if `user.roles` is defined but is not an array, or if the argument is not an array of strings.
|
|
121
|
+
|
|
122
|
+
For checking a single role, use [`_user.hasRole`](#hasRole).
|
|
123
|
+
|
|
124
|
+
#### Examples
|
|
125
|
+
|
|
126
|
+
###### Check for any of several roles:
|
|
127
|
+
```yaml
|
|
128
|
+
_user.hasSomeRoles:
|
|
129
|
+
- admin
|
|
130
|
+
- support
|
|
131
|
+
```
|
|
132
|
+
Returns: `true` if `user.roles` includes `"admin"` or `"support"`.
|
|
133
|
+
|
|
134
|
+
## _user.hasAllRoles
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
(roles: string[]): boolean
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
The `_user.hasAllRoles` method returns `true` if the `user.roles` array contains every one of the given roles. It returns `false` when the user is not logged in, when `user.roles` is missing, or when any required role is not present.
|
|
141
|
+
|
|
142
|
+
The `user.roles` value is read directly from the `user` object and must be an array of strings. An error is thrown if `user.roles` is defined but is not an array, or if the argument is not an array of strings.
|
|
143
|
+
|
|
144
|
+
For checking a single role, use [`_user.hasRole`](#hasRole).
|
|
145
|
+
|
|
146
|
+
#### Examples
|
|
147
|
+
|
|
148
|
+
###### Require all of several roles:
|
|
149
|
+
```yaml
|
|
150
|
+
_user.hasAllRoles:
|
|
151
|
+
- admin
|
|
152
|
+
- support
|
|
153
|
+
```
|
|
154
|
+
Returns: `true` only if `user.roles` includes both `"admin"` and `"support"`.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# _uuid
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
(void): string
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
The `_uuid` operator creates [UUIDs](https://en.wikipedia.org/wiki/Universally_unique_identifier). A UUID is a random identifier that is, for all practical purposes, unique. It looks like:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
123e4567-e89b-12d3-a456-426614174000
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
#### Arguments
|
|
14
|
+
|
|
15
|
+
###### default:
|
|
16
|
+
`_uuid: true`, `_uuid: null` or `_uuid: undefined` returns a version 4 UUID.
|
|
17
|
+
|
|
18
|
+
#### Examples
|
|
19
|
+
|
|
20
|
+
###### Generate a v4 uuid:
|
|
21
|
+
```yaml
|
|
22
|
+
_uuid: null
|
|
23
|
+
```
|
|
24
|
+
Returns: A version 4 UUID.
|
|
25
|
+
|
|
26
|
+
# Operator methods:
|
|
27
|
+
|
|
28
|
+
## _uuid.v1
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
(void): string
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Create a version 1 (timestamp) UUID.
|
|
35
|
+
|
|
36
|
+
#### Arguments
|
|
37
|
+
|
|
38
|
+
The `_uuid.v1` method does not take any arguments.
|
|
39
|
+
|
|
40
|
+
#### Examples
|
|
41
|
+
|
|
42
|
+
###### Generate a version 1 UUID:
|
|
43
|
+
```yaml
|
|
44
|
+
_uuid.v1: null
|
|
45
|
+
```
|
|
46
|
+
Returns: A version 1 UUID.
|
|
47
|
+
|
|
48
|
+
## _uuid.v3
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
({name: string | string[], namespace: string | string[]}): string
|
|
52
|
+
([name: string | string[], namespace: string | string[]]): string
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Create a version 3 (namespace w/ MD5) UUID.
|
|
56
|
+
|
|
57
|
+
#### Arguments
|
|
58
|
+
|
|
59
|
+
###### object:
|
|
60
|
+
If the `_uuid` operator is called with arguments, it can be one of the following:
|
|
61
|
+
- `name: string | string[]`: A string or an array.
|
|
62
|
+
- `namespace: string | string[]`: A string or an Array[16] - Namespace UUID.
|
|
63
|
+
|
|
64
|
+
#### Examples
|
|
65
|
+
|
|
66
|
+
###### Generate a version 3 UUID:
|
|
67
|
+
```yaml
|
|
68
|
+
_uuid.v3:
|
|
69
|
+
name: hello
|
|
70
|
+
namespace: world
|
|
71
|
+
```
|
|
72
|
+
Returns: A version 3 UUID.
|
|
73
|
+
|
|
74
|
+
## _uuid.v4
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
(void): string
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Create a version 4 (random) UUID.
|
|
81
|
+
|
|
82
|
+
#### Arguments
|
|
83
|
+
|
|
84
|
+
The `_uuid.v4` method does not take any arguments.
|
|
85
|
+
|
|
86
|
+
#### Examples
|
|
87
|
+
|
|
88
|
+
###### Generate a version 4 UUID:
|
|
89
|
+
```yaml
|
|
90
|
+
_uuid.v4: null
|
|
91
|
+
```
|
|
92
|
+
Returns: A version 4 UUID.
|
|
93
|
+
|
|
94
|
+
## _uuid.v5
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
({name: string | string[], namespace: string | string[]}): string
|
|
98
|
+
([name: string | string[], namespace: string | string[]]): string
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Create a version 5 (namespace w/ SHA-1) UUID.
|
|
102
|
+
|
|
103
|
+
#### Arguments
|
|
104
|
+
|
|
105
|
+
###### object:
|
|
106
|
+
If the `_uuid` operator is called with arguments, it can be one of the following:
|
|
107
|
+
- `name: string | string[]`: A string or an array.
|
|
108
|
+
- `namespace: string | string[]`: A string or an Array[16] - Namespace UUID.
|
|
109
|
+
|
|
110
|
+
#### Examples
|
|
111
|
+
|
|
112
|
+
###### Generate a version 5 UUID:
|
|
113
|
+
```yaml
|
|
114
|
+
_uuid.v5:
|
|
115
|
+
name: hello
|
|
116
|
+
namespace: world
|
|
117
|
+
```
|
|
118
|
+
Returns: A version 5 UUID.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# _var
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
(key: string): any
|
|
5
|
+
(arguments: {
|
|
6
|
+
key: string,
|
|
7
|
+
default?: any,
|
|
8
|
+
}): any
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
The `_var` operator gets a value from the `vars` object, specified by a [`_ref`](/ref) operator when referencing a file.
|
|
12
|
+
|
|
13
|
+
> The `_var` operator is a build time operator: it is evaluated when the app configuration is being built. This means it is not evaluated dynamically as the app is running, and can be used anywhere in the configuration as long as the resulting configuration files are valid YAML.
|
|
14
|
+
|
|
15
|
+
> For module-level variables (passed by the app developer in `lowdefy.yaml` `modules[].vars`), use [`_module.var`](/_module) instead. `_module.var` works at any depth within module files without threading vars through each `_ref`.
|
|
16
|
+
|
|
17
|
+
#### Arguments
|
|
18
|
+
|
|
19
|
+
###### string
|
|
20
|
+
If the `_var` operator is called with a string argument, the value of the key in the `vars` object is returned. If the value is not found, `null` is returned. Dot notation is supported.
|
|
21
|
+
|
|
22
|
+
###### object
|
|
23
|
+
- `key: string`: The value of the key in the `vars` object is returned. If the value is not found, `null`, or the specified default value is returned. Dot notation is supported.
|
|
24
|
+
- `default: any`: A value to return if the `key` is not found in `vars`. By default, `null` is returned if a value is not found.
|
|
25
|
+
|
|
26
|
+
#### Examples
|
|
27
|
+
|
|
28
|
+
###### Using a standardized input label template:
|
|
29
|
+
```yaml
|
|
30
|
+
blocks:
|
|
31
|
+
- id: name
|
|
32
|
+
type: TextInput
|
|
33
|
+
properties:
|
|
34
|
+
label:
|
|
35
|
+
_ref:
|
|
36
|
+
path: label.yaml
|
|
37
|
+
vars:
|
|
38
|
+
title: Name
|
|
39
|
+
description: Your name and surname.
|
|
40
|
+
descriptionTextColor: '#546358'
|
|
41
|
+
- id: age
|
|
42
|
+
type: NumberInput
|
|
43
|
+
properties:
|
|
44
|
+
label:
|
|
45
|
+
_ref:
|
|
46
|
+
path: label.yaml
|
|
47
|
+
vars:
|
|
48
|
+
title: Age
|
|
49
|
+
description: Your age.
|
|
50
|
+
```
|
|
51
|
+
```yaml
|
|
52
|
+
# label.yaml
|
|
53
|
+
title:
|
|
54
|
+
_var: title
|
|
55
|
+
extra:
|
|
56
|
+
_var: description
|
|
57
|
+
span: 8
|
|
58
|
+
colon: false
|
|
59
|
+
extraStyle:
|
|
60
|
+
color:
|
|
61
|
+
_var:
|
|
62
|
+
key: descriptionTextColor
|
|
63
|
+
default: '#333333'
|
|
64
|
+
```
|
|
65
|
+
Returns:
|
|
66
|
+
```yaml
|
|
67
|
+
blocks:
|
|
68
|
+
- id: name
|
|
69
|
+
type: TextInput
|
|
70
|
+
properties:
|
|
71
|
+
label:
|
|
72
|
+
title: Name
|
|
73
|
+
extra: Your name and surname.
|
|
74
|
+
span: 8
|
|
75
|
+
colon: false
|
|
76
|
+
extraStyle:
|
|
77
|
+
color: '#546358'
|
|
78
|
+
- id: age
|
|
79
|
+
type: NumberInput
|
|
80
|
+
properties:
|
|
81
|
+
label:
|
|
82
|
+
title: Age
|
|
83
|
+
extra: Your age.
|
|
84
|
+
span: 8
|
|
85
|
+
colon: false
|
|
86
|
+
extraStyle:
|
|
87
|
+
color: '#333333'
|
|
88
|
+
```
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# _yaml
|
|
2
|
+
|
|
3
|
+
The `_yaml` parses and writes YAML strings.
|
|
4
|
+
|
|
5
|
+
# Operator methods:
|
|
6
|
+
|
|
7
|
+
## _yaml.parse
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
({on: string, options?: object}): object
|
|
11
|
+
([on: string, options?: object]): object
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The `_yaml.parse` method parses a YAML string into an object.
|
|
15
|
+
|
|
16
|
+
#### Arguments
|
|
17
|
+
|
|
18
|
+
###### object
|
|
19
|
+
- `on: string`: String to parse.
|
|
20
|
+
- `options?: object`: Optional settings. See the [YAML.parse: method here](https://eemeli.org/yaml/#parse-options) for supported settings.
|
|
21
|
+
|
|
22
|
+
#### Examples
|
|
23
|
+
|
|
24
|
+
###### Parse a YAML string:
|
|
25
|
+
```yaml
|
|
26
|
+
_yaml.parse:
|
|
27
|
+
on: |
|
|
28
|
+
key: Value
|
|
29
|
+
boolean: true
|
|
30
|
+
array:
|
|
31
|
+
- 1
|
|
32
|
+
- 2
|
|
33
|
+
```
|
|
34
|
+
or:
|
|
35
|
+
```yaml
|
|
36
|
+
_yaml.parse:
|
|
37
|
+
- |
|
|
38
|
+
key: Value
|
|
39
|
+
boolean: true
|
|
40
|
+
array:
|
|
41
|
+
- 1
|
|
42
|
+
- 2
|
|
43
|
+
```
|
|
44
|
+
Returns:
|
|
45
|
+
```
|
|
46
|
+
key: Value
|
|
47
|
+
boolean: true
|
|
48
|
+
array:
|
|
49
|
+
- 1
|
|
50
|
+
- 2
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## _yaml.stringify
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
({on: any, options?: object}): string
|
|
57
|
+
([on: any, options?: object]): string
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The `_yaml.stringify` method creates a YAML string from an object.
|
|
61
|
+
|
|
62
|
+
#### Arguments
|
|
63
|
+
|
|
64
|
+
###### object
|
|
65
|
+
- `on: any`: The object to stringify.
|
|
66
|
+
- `options?: object`: Optional settings. See the [YAML.stringify: method here](https://eemeli.org/yaml/#tostring-options) for supported settings.
|
|
67
|
+
|
|
68
|
+
#### Examples
|
|
69
|
+
|
|
70
|
+
###### Stringify an object as YAML:
|
|
71
|
+
```yaml
|
|
72
|
+
_yaml.stringify:
|
|
73
|
+
on:
|
|
74
|
+
key: Value
|
|
75
|
+
boolean: true
|
|
76
|
+
array:
|
|
77
|
+
- 1
|
|
78
|
+
- 2
|
|
79
|
+
```
|
|
80
|
+
or:
|
|
81
|
+
```yaml
|
|
82
|
+
_yaml.stringify:
|
|
83
|
+
- key: Value
|
|
84
|
+
boolean: true
|
|
85
|
+
array:
|
|
86
|
+
- 1
|
|
87
|
+
- 2
|
|
88
|
+
```
|
|
89
|
+
Returns (as a string):
|
|
90
|
+
```text
|
|
91
|
+
key: Value
|
|
92
|
+
boolean: true
|
|
93
|
+
array:
|
|
94
|
+
- 1
|
|
95
|
+
- 2
|
|
96
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Introduction
|
|
2
|
+
|
|
3
|
+
Lowdefy makes it really easy to build web apps. With Lowdefy you can build CRUD apps, admin panels, internal tools, BI dashboards, workflow apps, websites, blogs, webforms or even documentation pages such as this one.
|
|
4
|
+
|
|
5
|
+
Lowdefy apps are defined in YAML config that follows a structured schema - this makes Lowdefy apps easy to read, write and understand.
|
|
6
|
+
|
|
7
|
+
## Quickstart
|
|
8
|
+
|
|
9
|
+
Run the following command to initialize a new Lowdefy app in your current working directory.
|
|
10
|
+
|
|
11
|
+
$
|
|
12
|
+
|
|
13
|
+
pnpx lowdefy@5 init && pnpx lowdefy@5 dev
|
|
14
|
+
|
|
15
|
+
This will create a file called `lowdefy.yaml` in the current working directory that contains the configuration for a Lowdefy app (as well as a `.gitignore`) and launch a local development server at http://localhost:3000. Make changes in the `lowdefy.yaml` file to see them reflect in the app.
|
|
16
|
+
|
|
17
|
+
> You need Node v22 or newer and pnpm installed to run Lowdefy. For more details see [the tutorial](/tutorial-start).
|
|
18
|
+
|
|
19
|
+
## Why create web apps using a YAML schema?
|
|
20
|
+
|
|
21
|
+
The Lowdefy schema is a simple definition of a web app which primarily makes use of block, action, operator and request definitions.
|
|
22
|
+
|
|
23
|
+
Some advantages of writing web apps in YAML are:
|
|
24
|
+
- All apps use the same schema. This makes it easy to debug large apps or pick up where others left off.
|
|
25
|
+
- Nothing is hidden in a GUI. This allows you to do basic stuff, like copy, paste, find, replace etc. which makes developing apps more productive.
|
|
26
|
+
- App config is just data, thus you can develop scripts to create and manage your apps.
|
|
27
|
+
- YAML files work with your favorite developer and source control tools.
|
|
28
|
+
|
|
29
|
+
> If you aren't a fan of YAML, you can also build your app using JSON files.
|
|
30
|
+
|
|
31
|
+
## Build future proof web apps on an source available platform
|
|
32
|
+
|
|
33
|
+
To date, more than 25 000 apps have been built by the Lowdefy community. We hope to see many community Lowdefy apps and plugins in the future and actively nurture the Lowdefy community on [Github](https://github.com/lowdefy/lowdefy/discussions) and [Discord](https://discord.gg/QQY9eJ7A2D) to help other developers to get started with Lowdefy and grow the ecosystem.
|
|
34
|
+
|
|
35
|
+
We've built Lowdefy to scale our own ability to develop and maintain web apps and internal tools for customers. Currently, we also provide Custom Software as a Service for larger customers, as well as support plans for those who need some extra help. Using Lowdefy we've built ticketing systems, call center solutions, advanced CRMs, custom MRPs, surveys and BI dashboard solutions and more for startup to enterprise customers. If you are looking for a Custom Software as a Service partner, please [reach out to us](http://lowdefy.com/contact-us).
|
|
36
|
+
|
|
37
|
+
## Tutorial
|
|
38
|
+
|
|
39
|
+
The easiest way to get started with Lowdefy is to follow the tutorial. In this tutorial we will be building a simple Lowdefy app to get you started.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# UpdateSession
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
(void): void
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
The `UpdateSession` action is used to update the user session. If a adapter is used, any new user data in the database will be added to the user object.
|
|
8
|
+
|
|
9
|
+
#### Parameters
|
|
10
|
+
|
|
11
|
+
The `UpdateSession` action does not take any parameters.
|
|
12
|
+
|
|
13
|
+
#### Examples
|
|
14
|
+
|
|
15
|
+
###### Update session after user updates their profile:
|
|
16
|
+
```yaml
|
|
17
|
+
id: update_profile
|
|
18
|
+
type: Button
|
|
19
|
+
events:
|
|
20
|
+
onClick:
|
|
21
|
+
- id: update_profile_in_db
|
|
22
|
+
type: Request
|
|
23
|
+
params: update_user
|
|
24
|
+
- id: update_session
|
|
25
|
+
type: UpdateSession
|
|
26
|
+
```
|