From f108775a6a822abe430971e7d708aeaf9f1e2d79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 00:28:40 +0000 Subject: [PATCH 1/4] chore(deps): update dependency jsdoc to v4.0.4 --- package-lock.json | 28 ++++++++++++++-------------- package.json | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 47e4aede6..d70bdb233 100644 --- a/package-lock.json +++ b/package-lock.json @@ -149,7 +149,7 @@ "esm": "3.2.25", "iconsur": "1.7.0", "jasmine": "5.5.0", - "jsdoc": "4.0.3", + "jsdoc": "4.0.4", "lorem-ipsum": "2.0.8", "nodemon": "3.1.7", "rcedit": "4.0.1", @@ -5399,10 +5399,11 @@ } }, "node_modules/bluebird": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", - "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==", - "dev": true + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" }, "node_modules/bmp-js": { "version": "0.1.0", @@ -12020,10 +12021,11 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "node_modules/jsdoc": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", - "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz", + "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@babel/parser": "^7.20.15", "@jsdoc/salty": "^0.2.1", @@ -12048,17 +12050,12 @@ "node": ">=12.0.0" } }, - "node_modules/jsdoc/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "node_modules/jsdoc/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -12068,6 +12065,7 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -12080,6 +12078,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -12092,6 +12091,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, diff --git a/package.json b/package.json index 8c67cfba6..83ebcef2f 100644 --- a/package.json +++ b/package.json @@ -189,7 +189,7 @@ "esm": "3.2.25", "iconsur": "1.7.0", "jasmine": "5.5.0", - "jsdoc": "4.0.3", + "jsdoc": "4.0.4", "lorem-ipsum": "2.0.8", "nodemon": "3.1.7", "rcedit": "4.0.1", From 6bbff3efd82eb36b9060d60252c90ff358651405 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Dec 2024 18:31:29 +0200 Subject: [PATCH 2/4] chore(frontend-docs): fix warnings & update --- docs/frontend_api/BasicWidget.html | 659 +++++++++++++++++- docs/frontend_api/FAttachment.html | 2 +- docs/frontend_api/FAttribute.html | 2 +- docs/frontend_api/FBranch.html | 2 +- docs/frontend_api/FNote.html | 142 ++-- docs/frontend_api/FrontendScriptApi.html | 98 +-- docs/frontend_api/NoteContextAwareWidget.html | 592 +++++++++++++++- docs/frontend_api/RightPanelWidget.html | 593 +++++++++++++++- .../frontend_api/entities_fattachment.js.html | 2 +- docs/frontend_api/entities_fattribute.js.html | 2 +- docs/frontend_api/entities_fblob.js.html | 2 +- docs/frontend_api/entities_fbranch.js.html | 2 +- docs/frontend_api/entities_fnote.js.html | 5 +- docs/frontend_api/global.html | 6 +- docs/frontend_api/index.html | 2 +- .../services_frontend_script_api.js.html | 14 +- .../frontend_api/widgets_basic_widget.js.html | 83 ++- .../widgets_note_context_aware_widget.js.html | 19 +- .../widgets_right_panel_widget.js.html | 8 +- src/public/app/widgets/basic_widget.js | 2 +- .../app/widgets/note_context_aware_widget.js | 2 +- 21 files changed, 2070 insertions(+), 169 deletions(-) diff --git a/docs/frontend_api/BasicWidget.html b/docs/frontend_api/BasicWidget.html index 2e8edd905..69f029e13 100644 --- a/docs/frontend_api/BasicWidget.html +++ b/docs/frontend_api/BasicWidget.html @@ -95,7 +95,7 @@ For information on using widgets, see the tutorial widget_basics.
Source:
@@ -151,6 +151,176 @@ For information on using widgets, see the tutorial widget_basics. +

css(name, value)

+ + + + + + +
+ Sets the CSS attribute of the given name to the given value. +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + +string + + + + the name of the CSS attribute to set (e.g. `padding-left`).
value + + +string + + + + the value of the CSS attribute to set (e.g. `12px`).
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ self for chaining. +
+ + + + + + + + + + + + + + +

cssBlock(block) → {this}

@@ -252,7 +422,7 @@ For information on using widgets, see the tutorial widget_basics.
Source:
@@ -365,7 +535,7 @@ The method is expected to create a this.$widget containing jQuery object
Source:
@@ -395,6 +565,487 @@ The method is expected to create a this.$widget containing jQuery object + + + + + + +

isEnabled()

+ + + + + + +
+ Indicates if the widget is enabled. Widgets are enabled by default. Generally setting this to `false` will cause the widget not to be displayed, however it will still be available on the DOM but hidden. +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ whether the widget is enabled. +
+ + + + + + + + + + + + + + + +

optChild(condition, …components)

+ + + + + + +
+ Conditionally adds the given components as children to this component. +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
condition + + +boolean + + + + + + + + + + whether to add the components.
components + + +any + + + + + + + + + + <repeatable>
+ +
the components to be added as children to this component provided the condition is truthy.
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ self for chaining. +
+ + + + + + + + + + + + + + + +

optCss(condition, name, value)

+ + + + + + +
+ Sets the CSS attribute of the given name to the given value, but only if the condition provided is truthy. +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
condition + + +boolean + + + + `true` in order to apply the CSS, `false` to ignore it.
name + + +string + + + + the name of the CSS attribute to set (e.g. `padding-left`).
value + + +string + + + + the value of the CSS attribute to set (e.g. `12px`).
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ self for chaining. +
+ + + + + + + + + @@ -417,7 +1068,7 @@ The method is expected to create a this.$widget containing jQuery object
diff --git a/docs/frontend_api/FAttachment.html b/docs/frontend_api/FAttachment.html index 1a5d764ee..60f500c85 100644 --- a/docs/frontend_api/FAttachment.html +++ b/docs/frontend_api/FAttachment.html @@ -1058,7 +1058,7 @@ being a hidden child.
diff --git a/docs/frontend_api/FAttribute.html b/docs/frontend_api/FAttribute.html index 81679fb79..4516e1f1d 100644 --- a/docs/frontend_api/FAttribute.html +++ b/docs/frontend_api/FAttribute.html @@ -918,7 +918,7 @@ and relation (representing named relationship between source and target note) diff --git a/docs/frontend_api/FBranch.html b/docs/frontend_api/FBranch.html index e00fbede0..5ce64a09f 100644 --- a/docs/frontend_api/FBranch.html +++ b/docs/frontend_api/FBranch.html @@ -1130,7 +1130,7 @@ parents.
diff --git a/docs/frontend_api/FNote.html b/docs/frontend_api/FNote.html index 09040de56..49208f06d 100644 --- a/docs/frontend_api/FNote.html +++ b/docs/frontend_api/FNote.html @@ -165,7 +165,7 @@
Source:
@@ -268,7 +268,7 @@
Source:
@@ -336,7 +336,7 @@
Source:
@@ -404,7 +404,7 @@
Source:
@@ -472,7 +472,7 @@
Source:
@@ -540,7 +540,7 @@
Source:
@@ -608,7 +608,7 @@
Source:
@@ -680,7 +680,7 @@
Source:
@@ -748,7 +748,7 @@
Source:
@@ -816,7 +816,7 @@
Source:
@@ -884,7 +884,7 @@
Source:
@@ -952,7 +952,7 @@
Source:
@@ -1020,7 +1020,7 @@
Source:
@@ -1092,7 +1092,7 @@
Source:
@@ -1172,7 +1172,7 @@
Source:
@@ -1278,7 +1278,7 @@
Source:
@@ -1380,7 +1380,7 @@
Source:
@@ -1482,7 +1482,7 @@
Source:
@@ -1656,7 +1656,7 @@
Source:
@@ -1834,7 +1834,7 @@
Source:
@@ -2034,7 +2034,7 @@
Source:
@@ -2213,7 +2213,7 @@
Source:
@@ -2392,7 +2392,7 @@
Source:
@@ -2498,7 +2498,7 @@
Source:
@@ -2602,7 +2602,7 @@
Source:
@@ -2706,7 +2706,7 @@
Source:
@@ -2808,7 +2808,7 @@
Source:
@@ -2910,7 +2910,7 @@
Source:
@@ -3012,7 +3012,7 @@
Source:
@@ -3163,7 +3163,7 @@
Source:
@@ -3318,7 +3318,7 @@
Source:
@@ -3485,7 +3485,7 @@
Source:
@@ -3595,7 +3595,7 @@
Source:
@@ -3699,7 +3699,7 @@
Source:
@@ -3801,7 +3801,7 @@
Source:
@@ -3975,7 +3975,7 @@
Source:
@@ -4153,7 +4153,7 @@
Source:
@@ -4353,7 +4353,7 @@
Source:
@@ -4508,7 +4508,7 @@
Source:
@@ -4663,7 +4663,7 @@
Source:
@@ -4830,7 +4830,7 @@
Source:
@@ -4985,7 +4985,7 @@
Source:
@@ -5140,7 +5140,7 @@
Source:
@@ -5307,7 +5307,7 @@
Source:
@@ -5413,7 +5413,7 @@
Source:
@@ -5515,7 +5515,7 @@
Source:
@@ -5617,7 +5617,7 @@
Source:
@@ -5719,7 +5719,7 @@
Source:
@@ -5870,7 +5870,7 @@
Source:
@@ -6025,7 +6025,7 @@
Source:
@@ -6195,7 +6195,7 @@
Source:
@@ -6346,7 +6346,7 @@
Source:
@@ -6513,7 +6513,7 @@
Source:
@@ -6619,7 +6619,7 @@
Source:
@@ -6797,7 +6797,7 @@
Source:
@@ -6903,7 +6903,7 @@
Source:
@@ -7009,7 +7009,7 @@
Source:
@@ -7183,7 +7183,7 @@
Source:
@@ -7289,7 +7289,7 @@
Source:
@@ -7440,7 +7440,7 @@
Source:
@@ -7618,7 +7618,7 @@
Source:
@@ -7773,7 +7773,7 @@
Source:
@@ -7928,7 +7928,7 @@
Source:
@@ -8083,7 +8083,7 @@
Source:
@@ -8191,7 +8191,7 @@
Source:
@@ -8275,7 +8275,7 @@
Source:
@@ -8369,7 +8369,7 @@
Source:
@@ -8475,7 +8475,7 @@
Source:
@@ -8581,7 +8581,7 @@
Source:
@@ -8732,7 +8732,7 @@
Source:
@@ -8806,7 +8806,7 @@
diff --git a/docs/frontend_api/FrontendScriptApi.html b/docs/frontend_api/FrontendScriptApi.html index 85072e613..b4ba0f146 100644 --- a/docs/frontend_api/FrontendScriptApi.html +++ b/docs/frontend_api/FrontendScriptApi.html @@ -462,7 +462,7 @@ available in the JS frontend notes. You can use e.g. api.showMessage(api.s
Source:
@@ -1530,7 +1530,7 @@ See https://day.js.org for documentation
Source:
@@ -1738,7 +1738,7 @@ See https://day.js.org for documentation
Source:
@@ -2157,7 +2157,7 @@ See https://day.js.org for documentation
Source:
@@ -2312,7 +2312,7 @@ See https://day.js.org for documentation
Source:
@@ -2469,7 +2469,7 @@ See https://day.js.org for documentation
Source:
@@ -2624,7 +2624,7 @@ See https://day.js.org for documentation
Source:
@@ -2730,7 +2730,7 @@ See https://day.js.org for documentation
Source:
@@ -2840,7 +2840,7 @@ See https://day.js.org for documentation
Source:
@@ -2946,7 +2946,7 @@ See https://day.js.org for documentation
Source:
@@ -3052,7 +3052,7 @@ See https://day.js.org for documentation
Source:
@@ -3162,7 +3162,7 @@ See https://day.js.org for documentation
Source:
@@ -3268,7 +3268,7 @@ See https://day.js.org for documentation
Source:
@@ -3379,7 +3379,7 @@ implementation of actual widget type.
Source:
@@ -3534,7 +3534,7 @@ implementation of actual widget type.
Source:
@@ -3689,7 +3689,7 @@ implementation of actual widget type.
Source:
@@ -3796,7 +3796,7 @@ if some action needs to happen on only one specific instance.
Source:
@@ -3898,7 +3898,7 @@ if some action needs to happen on only one specific instance.
Source:
@@ -4057,7 +4057,7 @@ if some action needs to happen on only one specific instance.
Source:
@@ -4213,7 +4213,7 @@ if some action needs to happen on only one specific instance.
Source:
@@ -4315,7 +4315,7 @@ if some action needs to happen on only one specific instance.
Source:
@@ -4520,7 +4520,7 @@ otherwise (by e.g. createLink())
Source:
@@ -4626,7 +4626,7 @@ otherwise (by e.g. createLink())
Source:
@@ -4781,7 +4781,7 @@ otherwise (by e.g. createLink())
Source:
@@ -4936,7 +4936,7 @@ otherwise (by e.g. createLink())
Source:
@@ -5086,7 +5086,7 @@ otherwise (by e.g. createLink())
Source:
@@ -5593,7 +5593,7 @@ otherwise (by e.g. createLink())
Source:
@@ -5771,7 +5771,7 @@ otherwise (by e.g. createLink())
Source:
@@ -5945,7 +5945,7 @@ otherwise (by e.g. createLink())
Source:
@@ -6100,7 +6100,7 @@ otherwise (by e.g. createLink())
Source:
@@ -6254,7 +6254,7 @@ otherwise (by e.g. createLink())
Source:
@@ -6409,7 +6409,7 @@ otherwise (by e.g. createLink())
Source:
@@ -6578,7 +6578,7 @@ If you have a synchronous function, please use api.runOnBackend().
Source:
@@ -6833,7 +6833,7 @@ with transaction management. If you really know what you're doing, you can call
This is a powerful search method - you can search by attributes and their values, e.g.: -"#dateModified =* MONTH AND #log". See full documentation for all options at: https://github.com/zadam/trilium/wiki/Search +"#dateModified =* MONTH AND #log". See full documentation for all options at: https://triliumnext.github.io/Docs/Wiki/search.html
@@ -6926,7 +6926,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -6989,7 +6989,7 @@ with transaction management. If you really know what you're doing, you can call
This is a powerful search method - you can search by attributes and their values, e.g.: -"#dateModified =* MONTH AND #log". See full documentation for all options at: https://github.com/zadam/trilium/wiki/Search +"#dateModified =* MONTH AND #log". See full documentation for all options at: https://triliumnext.github.io/Docs/Wiki/search.html
@@ -7082,7 +7082,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -7144,7 +7144,7 @@ with transaction management. If you really know what you're doing, you can call
- Hoist note in the current tab. See https://github.com/zadam/trilium/wiki/Note-hoisting + Hoist note in the current tab. See https://triliumnext.github.io/Docs/Wiki/note-hoisting.html
@@ -7237,7 +7237,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -7388,7 +7388,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -7543,7 +7543,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -7702,7 +7702,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -7839,7 +7839,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -7994,7 +7994,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -8226,7 +8226,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -8408,7 +8408,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -8568,7 +8568,7 @@ with transaction management. If you really know what you're doing, you can call
Source:
@@ -8660,7 +8660,7 @@ Typical use case is when a new note has been created, we should wait until it is
Source:
@@ -8730,7 +8730,7 @@ Typical use case is when a new note has been created, we should wait until it is
diff --git a/docs/frontend_api/NoteContextAwareWidget.html b/docs/frontend_api/NoteContextAwareWidget.html index cafbd5af4..09a02b6d9 100644 --- a/docs/frontend_api/NoteContextAwareWidget.html +++ b/docs/frontend_api/NoteContextAwareWidget.html @@ -320,7 +320,7 @@
Source:
@@ -464,6 +464,181 @@ +

css(name, value)

+ + + + + + +
+ Sets the CSS attribute of the given name to the given value. +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + +string + + + + the name of the CSS attribute to set (e.g. `padding-left`).
value + + +string + + + + the value of the CSS attribute to set (e.g. `12px`).
+ + + + + + +
+ + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ self for chaining. +
+ + + + + + + + + + + + + + +

cssBlock(block) → {this}

@@ -570,7 +745,7 @@
Source:
@@ -688,7 +863,7 @@ The method is expected to create a this.$widget containing jQuery object
Source:
@@ -731,6 +906,13 @@ The method is expected to create a this.$widget containing jQuery object +
+ Indicates if the widget is enabled. Widgets are enabled by default. Generally setting this to `false` will cause the widget not to be displayed, however it will still be available on the DOM but hidden. + +

+If the widget is not enabled, it will not receive `refreshWithNote` updates. +

+ @@ -752,6 +934,11 @@ The method is expected to create a this.$widget containing jQuery object +
Overrides:
+
+ @@ -772,7 +959,7 @@ The method is expected to create a this.$widget containing jQuery object
Source:
@@ -830,6 +1017,399 @@ The method is expected to create a this.$widget containing jQuery object +

optChild(condition, …components)

+ + + + + + +
+ Conditionally adds the given components as children to this component. +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
condition + + +boolean + + + + + + + + + + whether to add the components.
components + + +any + + + + + + + + + + <repeatable>
+ +
the components to be added as children to this component provided the condition is truthy.
+ + + + + + +
+ + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ self for chaining. +
+ + + + + + + + + + + + + + + +

optCss(condition, name, value)

+ + + + + + +
+ Sets the CSS attribute of the given name to the given value, but only if the condition provided is truthy. +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
condition + + +boolean + + + + `true` in order to apply the CSS, `false` to ignore it.
name + + +string + + + + the name of the CSS attribute to set (e.g. `padding-left`).
value + + +string + + + + the value of the CSS attribute to set (e.g. `12px`).
+ + + + + + +
+ + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ self for chaining. +
+ + + + + + + + + + + + + + +

(async) refreshWithNote(note) → {Promise.<void>}

@@ -932,7 +1512,7 @@ widget with each note.
Source:
@@ -1002,7 +1582,7 @@ widget with each note.
diff --git a/docs/frontend_api/RightPanelWidget.html b/docs/frontend_api/RightPanelWidget.html index 307ecefd4..855aab27b 100644 --- a/docs/frontend_api/RightPanelWidget.html +++ b/docs/frontend_api/RightPanelWidget.html @@ -93,7 +93,7 @@
Source:
@@ -335,7 +335,7 @@
Source:
@@ -523,7 +523,7 @@
Source:
@@ -551,6 +551,181 @@ +

css(name, value)

+ + + + + + +
+ Sets the CSS attribute of the given name to the given value. +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + +string + + + + the name of the CSS attribute to set (e.g. `padding-left`).
value + + +string + + + + the value of the CSS attribute to set (e.g. `12px`).
+ + + + + + +
+ + + + + + + + +
Overrides:
+
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ self for chaining. +
+ + + + + + + + + + + + + + +

cssBlock(block) → {this}

@@ -657,7 +832,7 @@
Source:
@@ -773,7 +948,7 @@ Do not override this method unless you know what you're doing.
Source:
@@ -863,7 +1038,7 @@ Your class should override this method.
Source:
@@ -931,6 +1106,13 @@ Your class should override this method. +
+ Indicates if the widget is enabled. Widgets are enabled by default. Generally setting this to `false` will cause the widget not to be displayed, however it will still be available on the DOM but hidden. + +

+If the widget is not enabled, it will not receive `refreshWithNote` updates. +

+ @@ -977,7 +1159,7 @@ Your class should override this method.
Source:
@@ -1035,6 +1217,399 @@ Your class should override this method. +

optChild(condition, …components)

+ + + + + + +
+ Conditionally adds the given components as children to this component. +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
condition + + +boolean + + + + + + + + + + whether to add the components.
components + + +any + + + + + + + + + + <repeatable>
+ +
the components to be added as children to this component provided the condition is truthy.
+ + + + + + +
+ + + + + + + + +
Overrides:
+
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ self for chaining. +
+ + + + + + + + + + + + + + + +

optCss(condition, name, value)

+ + + + + + +
+ Sets the CSS attribute of the given name to the given value, but only if the condition provided is truthy. +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
condition + + +boolean + + + + `true` in order to apply the CSS, `false` to ignore it.
name + + +string + + + + the name of the CSS attribute to set (e.g. `padding-left`).
value + + +string + + + + the value of the CSS attribute to set (e.g. `12px`).
+ + + + + + +
+ + + + + + + + +
Overrides:
+
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + + + +
Returns:
+ + +
+ self for chaining. +
+ + + + + + + + + + + + + + +

(async) refreshWithNote(note) → {Promise.<void>}

@@ -1142,7 +1717,7 @@ widget with each note.
Source:
@@ -1212,7 +1787,7 @@ widget with each note.
diff --git a/docs/frontend_api/entities_fattachment.js.html b/docs/frontend_api/entities_fattachment.js.html index 1b301f3b9..e38fc1ecb 100644 --- a/docs/frontend_api/entities_fattachment.js.html +++ b/docs/frontend_api/entities_fattachment.js.html @@ -93,7 +93,7 @@ export default FAttachment;
diff --git a/docs/frontend_api/entities_fattribute.js.html b/docs/frontend_api/entities_fattribute.js.html index de5addfac..7f0cd60cc 100644 --- a/docs/frontend_api/entities_fattribute.js.html +++ b/docs/frontend_api/entities_fattribute.js.html @@ -127,7 +127,7 @@ export default FAttribute;
diff --git a/docs/frontend_api/entities_fblob.js.html b/docs/frontend_api/entities_fblob.js.html index 284d2542b..b4170baea 100644 --- a/docs/frontend_api/entities_fblob.js.html +++ b/docs/frontend_api/entities_fblob.js.html @@ -81,7 +81,7 @@
diff --git a/docs/frontend_api/entities_fbranch.js.html b/docs/frontend_api/entities_fbranch.js.html index faad3c117..9f3af1a28 100644 --- a/docs/frontend_api/entities_fbranch.js.html +++ b/docs/frontend_api/entities_fbranch.js.html @@ -106,7 +106,7 @@ export default FBranch;
diff --git a/docs/frontend_api/entities_fnote.js.html b/docs/frontend_api/entities_fnote.js.html index 655101712..b3fc9c853 100644 --- a/docs/frontend_api/entities_fnote.js.html +++ b/docs/frontend_api/entities_fnote.js.html @@ -50,7 +50,8 @@ const NOTE_TYPE_ICONS = { "webView": "bx bx-globe-alt", "launcher": "bx bx-link", "doc": "bx bxs-file-doc", - "contentWidget": "bx bxs-widget" + "contentWidget": "bx bxs-widget", + "mindMap": "bx bx-sitemap" }; /** @@ -1054,7 +1055,7 @@ export default FNote;
diff --git a/docs/frontend_api/global.html b/docs/frontend_api/global.html index 5e4f2f1ae..3a73d00e8 100644 --- a/docs/frontend_api/global.html +++ b/docs/frontend_api/global.html @@ -674,7 +674,7 @@
Source:
@@ -790,7 +790,7 @@ not for direct use.
Source:
@@ -898,7 +898,7 @@ not for direct use.
diff --git a/docs/frontend_api/index.html b/docs/frontend_api/index.html index 27b2a8b84..e15c1dea5 100644 --- a/docs/frontend_api/index.html +++ b/docs/frontend_api/index.html @@ -56,7 +56,7 @@
diff --git a/docs/frontend_api/services_frontend_script_api.js.html b/docs/frontend_api/services_frontend_script_api.js.html index eded4a0c0..cb50e8197 100644 --- a/docs/frontend_api/services_frontend_script_api.js.html +++ b/docs/frontend_api/services_frontend_script_api.js.html @@ -245,8 +245,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain */ this.runOnBackend = async (func, params = []) => { if (func?.constructor.name === "AsyncFunction" || func?.startsWith?.("async ")) { - toastService.showError("You're passing an async function to api.runOnBackend() which will likely not work as you intended. " - + "Either make the function synchronous (by removing 'async' keyword), or use api.runAsyncOnBackendWithManualTransactionHandling()"); + toastService.showError(t("frontend_script_api.async_warning")); } return await this.__runOnBackendInner(func, params, true); @@ -268,8 +267,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain */ this.runAsyncOnBackendWithManualTransactionHandling = async (func, params = []) => { if (func?.constructor.name === "Function" || func?.startsWith?.("function")) { - toastService.showError("You're passing a synchronous function to api.runAsyncOnBackendWithManualTransactionHandling(), " + - "while you should likely use api.runOnBackend() instead."); + toastService.showError(t("frontend_script_api.sync_warning")); } return await this.__runOnBackendInner(func, params, false); @@ -277,7 +275,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain /** * This is a powerful search method - you can search by attributes and their values, e.g.: - * "#dateModified =* MONTH AND #log". See full documentation for all options at: https://github.com/zadam/trilium/wiki/Search + * "#dateModified =* MONTH AND #log". See full documentation for all options at: https://triliumnext.github.io/Docs/Wiki/search.html * * @method * @param {string} searchString @@ -289,7 +287,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain /** * This is a powerful search method - you can search by attributes and their values, e.g.: - * "#dateModified =* MONTH AND #log". See full documentation for all options at: https://github.com/zadam/trilium/wiki/Search + * "#dateModified =* MONTH AND #log". See full documentation for all options at: https://triliumnext.github.io/Docs/Wiki/search.html * * @method * @param {string} searchString @@ -586,7 +584,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain this.getYearNote = dateNotesService.getYearNote; /** - * Hoist note in the current tab. See https://github.com/zadam/trilium/wiki/Note-hoisting + * Hoist note in the current tab. See https://triliumnext.github.io/Docs/Wiki/note-hoisting.html * * @method * @param {string} noteId - set hoisted note. 'root' will effectively unhoist @@ -700,7 +698,7 @@ export default FrontendScriptApi;
diff --git a/docs/frontend_api/widgets_basic_widget.js.html b/docs/frontend_api/widgets_basic_widget.js.html index 6a203fd6d..9d36a448f 100644 --- a/docs/frontend_api/widgets_basic_widget.js.html +++ b/docs/frontend_api/widgets_basic_widget.js.html @@ -27,7 +27,9 @@
import Component from "../components/component.js";
-
+import froca from "../services/froca.js";
+import { t } from "../services/i18n.js";
+import toastService from "../services/toast.js";
 
 /**
  * This is the base widget for all other widgets.
@@ -66,6 +68,21 @@ class BasicWidget extends Component {
         return this;
     }
 
+    /**
+     * Conditionally adds the given components as children to this component.
+     * 
+     * @param {boolean} condition whether to add the components.
+     * @param  {...any} components the components to be added as children to this component provided the condition is truthy. 
+     * @returns self for chaining.
+     */
+    optChild(condition, ...components) {
+        if (condition) {
+            return this.child(...components);
+        } else {
+            return this;
+        }
+    }
+
     id(id) {
         this.attrs.id = id;
         return this;
@@ -76,11 +93,34 @@ class BasicWidget extends Component {
         return this;
     }
 
+    /**
+     * Sets the CSS attribute of the given name to the given value.
+     * 
+     * @param {string} name the name of the CSS attribute to set (e.g. `padding-left`).
+     * @param {string} value the value of the CSS attribute to set (e.g. `12px`).
+     * @returns self for chaining.
+     */
     css(name, value) {
         this.attrs.style += `${name}: ${value};`;
         return this;
     }
 
+    /**
+     * Sets the CSS attribute of the given name to the given value, but only if the condition provided is truthy.
+     * 
+     * @param {boolean} condition `true` in order to apply the CSS, `false` to ignore it.
+     * @param {string} name the name of the CSS attribute to set (e.g. `padding-left`).
+     * @param {string} value the value of the CSS attribute to set (e.g. `12px`).
+     * @returns self for chaining.
+     */
+    optCss(condition, name, value) {
+        if (condition) {
+            return this.css(name, value);
+        }
+
+        return this;
+    }
+
     contentSized() {
         this.css("contain", "none");
 
@@ -109,7 +149,11 @@ class BasicWidget extends Component {
     }
 
     render() {
-        this.doRender();
+        try {
+            this.doRender();
+        } catch (e) {                        
+            this.logRenderingError(e);
+        }
 
         this.$widget.attr('data-component-id', this.componentId);
         this.$widget
@@ -147,6 +191,39 @@ class BasicWidget extends Component {
         return this.$widget;
     }
 
+    logRenderingError(e) {
+        console.log("Got issue in widget ", this);
+        console.error(e);
+
+        let noteId = this._noteId;
+        if (this._noteId) {
+            froca.getNote(noteId, true).then((note) => {
+                toastService.showPersistent({
+                    title: t("toast.widget-error.title"),
+                    icon: "alert",
+                    message: t("toast.widget-error.message-custom", {
+                        id: noteId,
+                        title: note.title,
+                        message: e.message
+                    })
+                });
+            });
+            return;
+        }
+
+        toastService.showPersistent({
+            title: t("toast.widget-error.title"),
+            icon: "alert",
+            message: t("toast.widget-error.message-unknown", {
+                message: e.message
+            })
+        });
+    }
+
+    /**
+     * Indicates if the widget is enabled. Widgets are enabled by default. Generally setting this to `false` will cause the widget not to be displayed, however it will still be available on the DOM but hidden.
+     * @returns whether the widget is enabled.
+     */
     isEnabled() {
         return true;
     }
@@ -222,7 +299,7 @@ export default BasicWidget;
 
diff --git a/docs/frontend_api/widgets_note_context_aware_widget.js.html b/docs/frontend_api/widgets_note_context_aware_widget.js.html index e9f707f32..bbc72f6a3 100644 --- a/docs/frontend_api/widgets_note_context_aware_widget.js.html +++ b/docs/frontend_api/widgets_note_context_aware_widget.js.html @@ -76,6 +76,11 @@ class NoteContextAwareWidget extends BasicWidget { } /** + * Indicates if the widget is enabled. Widgets are enabled by default. Generally setting this to `false` will cause the widget not to be displayed, however it will still be available on the DOM but hidden. + * + * <p> + * If the widget is not enabled, it will not receive `refreshWithNote` updates. + * * @returns {boolean} true when an active note exists */ isEnabled() { @@ -85,7 +90,17 @@ class NoteContextAwareWidget extends BasicWidget { async refresh() { if (this.isEnabled()) { this.toggleInt(true); - await this.refreshWithNote(this.note); + + try { + await this.refreshWithNote(this.note); + } catch (e) { + // Ignore errors when user is refreshing or navigating away. + if (e === "rejected by browser") { + return; + } + + throw e; + } } else { this.toggleInt(false); @@ -164,7 +179,7 @@ export default NoteContextAwareWidget;
diff --git a/docs/frontend_api/widgets_right_panel_widget.js.html b/docs/frontend_api/widgets_right_panel_widget.js.html index cf98c0aa5..cb63ea9fd 100644 --- a/docs/frontend_api/widgets_right_panel_widget.js.html +++ b/docs/frontend_api/widgets_right_panel_widget.js.html @@ -27,6 +27,8 @@
import NoteContextAwareWidget from "./note_context_aware_widget.js";
+import toastService from "../services/toast.js";
+import { t } from "../services/i18n.js";
 
 const WIDGET_TPL = `
 <div class="card widget">
@@ -82,7 +84,9 @@ class RightPanelWidget extends NoteContextAwareWidget {
             this.$buttons.append(buttonWidget.render());
         }
 
-        this.initialized = this.doRenderBody();
+        this.initialized = this.doRenderBody().catch(e => {
+            this.logRenderingError(e);
+        });
     }
 
     /**
@@ -111,7 +115,7 @@ export default RightPanelWidget;
 
diff --git a/src/public/app/widgets/basic_widget.js b/src/public/app/widgets/basic_widget.js index 33ade4cb4..54b0b92a7 100644 --- a/src/public/app/widgets/basic_widget.js +++ b/src/public/app/widgets/basic_widget.js @@ -194,7 +194,7 @@ class BasicWidget extends Component { /** * Indicates if the widget is enabled. Widgets are enabled by default. Generally setting this to `false` will cause the widget not to be displayed, however it will still be available on the DOM but hidden. - * @returns + * @returns whether the widget is enabled. */ isEnabled() { return true; diff --git a/src/public/app/widgets/note_context_aware_widget.js b/src/public/app/widgets/note_context_aware_widget.js index 06e6219e4..014775210 100644 --- a/src/public/app/widgets/note_context_aware_widget.js +++ b/src/public/app/widgets/note_context_aware_widget.js @@ -48,7 +48,7 @@ class NoteContextAwareWidget extends BasicWidget { } /** - * @inheritdoc + * Indicates if the widget is enabled. Widgets are enabled by default. Generally setting this to `false` will cause the widget not to be displayed, however it will still be available on the DOM but hidden. * *

* If the widget is not enabled, it will not receive `refreshWithNote` updates. From 3fe4608ff6de2de7729f55f48b7c8314a3c2aece Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Dec 2024 18:44:45 +0200 Subject: [PATCH 3/4] chore(backend-docs): process with typedoc --- docs/backend_api/.nojekyll | 1 + docs/backend_api/AbstractBeccaEntity.html | 1207 -- docs/backend_api/BAttachment.html | 2894 --- docs/backend_api/BAttribute.html | 2130 --- docs/backend_api/BBranch.html | 2244 --- docs/backend_api/BEtapiToken.html | 1687 -- docs/backend_api/BNote.html | 14966 ---------------- docs/backend_api/BOption.html | 1545 -- docs/backend_api/BRecentNote.html | 1477 -- docs/backend_api/BRevision.html | 3243 ---- docs/backend_api/BackendScriptApi.html | 9164 ---------- docs/backend_api/assets/hierarchy.js | 1 + docs/backend_api/assets/highlight.css | 50 + docs/backend_api/assets/icons.js | 18 + docs/backend_api/assets/icons.svg | 1 + docs/backend_api/assets/main.js | 60 + docs/backend_api/assets/navigation.js | 1 + docs/backend_api/assets/search.js | 1 + docs/backend_api/assets/style.css | 1610 ++ ...cca_entities_abstract_becca_entity.js.html | 360 - .../becca_entities_battachment.js.html | 294 - .../becca_entities_battribute.js.html | 293 - docs/backend_api/becca_entities_bblob.js.html | 81 - .../becca_entities_bbranch.js.html | 333 - .../becca_entities_betapi_token.js.html | 129 - docs/backend_api/becca_entities_bnote.js.html | 1779 -- .../becca_entities_boption.js.html | 101 - .../becca_entities_brecent_note.js.html | 86 - .../becca_entities_brevision.js.html | 259 - ...ntities_abstract_becca_entity.default.html | 29 + .../becca_entities_battachment.default.html | 56 + .../becca_entities_battribute.default.html | 53 + .../classes/becca_entities_bblob.default.html | 34 + .../becca_entities_bbranch.default.html | 57 + .../becca_entities_betapi_token.default.html | 42 + .../classes/becca_entities_bnote.default.html | 347 + .../becca_entities_boption.default.html | 34 + .../becca_entities_brecent_note.default.html | 34 + .../becca_entities_brevision.default.html | 57 + .../fonts/OpenSans-Bold-webfont.eot | Bin 19544 -> 0 bytes .../fonts/OpenSans-Bold-webfont.svg | 1830 -- .../fonts/OpenSans-Bold-webfont.woff | Bin 22432 -> 0 bytes .../fonts/OpenSans-BoldItalic-webfont.eot | Bin 20133 -> 0 bytes .../fonts/OpenSans-BoldItalic-webfont.svg | 1830 -- .../fonts/OpenSans-BoldItalic-webfont.woff | Bin 23048 -> 0 bytes .../fonts/OpenSans-Italic-webfont.eot | Bin 20265 -> 0 bytes .../fonts/OpenSans-Italic-webfont.svg | 1830 -- .../fonts/OpenSans-Italic-webfont.woff | Bin 23188 -> 0 bytes .../fonts/OpenSans-Light-webfont.eot | Bin 19514 -> 0 bytes .../fonts/OpenSans-Light-webfont.svg | 1831 -- .../fonts/OpenSans-Light-webfont.woff | Bin 22248 -> 0 bytes .../fonts/OpenSans-LightItalic-webfont.eot | Bin 20535 -> 0 bytes .../fonts/OpenSans-LightItalic-webfont.svg | 1835 -- .../fonts/OpenSans-LightItalic-webfont.woff | Bin 23400 -> 0 bytes .../fonts/OpenSans-Regular-webfont.eot | Bin 19836 -> 0 bytes .../fonts/OpenSans-Regular-webfont.svg | 1831 -- .../fonts/OpenSans-Regular-webfont.woff | Bin 22660 -> 0 bytes docs/backend_api/global.html | 657 - docs/backend_api/hierarchy.html | 1 + docs/backend_api/index.html | 148 +- .../becca_entities_rows.AttachmentRow.html | 14 + .../becca_entities_rows.AttributeRow.html | 9 + .../becca_entities_rows.BlobRow.html | 6 + .../becca_entities_rows.BranchRow.html | 9 + .../becca_entities_rows.EtapiTokenRow.html | 7 + .../becca_entities_rows.NoteRow.html | 14 + .../becca_entities_rows.OptionRow.html | 11 + .../becca_entities_rows.RecentNoteRow.html | 4 + .../becca_entities_rows.RevisionRow.html | 14 + docs/backend_api/media/README-ZH_CN.md | 97 + docs/backend_api/media/README.es.md | 106 + docs/backend_api/media/README.it.md | 93 + docs/backend_api/media/README.ja.md | 73 + docs/backend_api/media/README.md | 126 + docs/backend_api/media/README.ru.md | 59 + docs/backend_api/module-sql.html | 1309 -- docs/backend_api/modules.html | 1 + .../becca_entities_abstract_becca_entity.html | 1 + .../modules/becca_entities_battachment.html | 1 + .../modules/becca_entities_battribute.html | 1 + .../modules/becca_entities_bblob.html | 1 + .../modules/becca_entities_bbranch.html | 1 + .../modules/becca_entities_betapi_token.html | 1 + .../modules/becca_entities_bnote.html | 1 + .../modules/becca_entities_boption.html | 1 + .../modules/becca_entities_brecent_note.html | 1 + .../modules/becca_entities_brevision.html | 1 + .../modules/becca_entities_rows.html | 1 + .../modules/services_backend_script_api.html | 1 + docs/backend_api/modules/services_sql.html | 1 + docs/backend_api/scripts/linenumber.js | 25 - .../scripts/prettify/Apache-License-2.0.txt | 202 - docs/backend_api/scripts/prettify/lang-css.js | 2 - docs/backend_api/scripts/prettify/prettify.js | 28 - .../services_backend_script_api.js.html | 735 - docs/backend_api/services_sql.js.html | 436 - docs/backend_api/styles/jsdoc-default.css | 358 - docs/backend_api/styles/prettify-jsdoc.css | 111 - docs/backend_api/styles/prettify-tomorrow.css | 132 - .../becca_entities_rows.AttributeType.html | 1 + .../types/becca_entities_rows.NoteType.html | 1 + ...ecca_entities_rows.ALLOWED_NOTE_TYPES.html | 4 + .../services_backend_script_api.default.html | 1 + .../variables/services_sql.default.html | 7 + package-lock.json | 117 + package.json | 5 +- typedoc.json | 8 + 107 files changed, 3370 insertions(+), 59319 deletions(-) create mode 100644 docs/backend_api/.nojekyll delete mode 100644 docs/backend_api/AbstractBeccaEntity.html delete mode 100644 docs/backend_api/BAttachment.html delete mode 100644 docs/backend_api/BAttribute.html delete mode 100644 docs/backend_api/BBranch.html delete mode 100644 docs/backend_api/BEtapiToken.html delete mode 100644 docs/backend_api/BNote.html delete mode 100644 docs/backend_api/BOption.html delete mode 100644 docs/backend_api/BRecentNote.html delete mode 100644 docs/backend_api/BRevision.html delete mode 100644 docs/backend_api/BackendScriptApi.html create mode 100644 docs/backend_api/assets/hierarchy.js create mode 100644 docs/backend_api/assets/highlight.css create mode 100644 docs/backend_api/assets/icons.js create mode 100644 docs/backend_api/assets/icons.svg create mode 100644 docs/backend_api/assets/main.js create mode 100644 docs/backend_api/assets/navigation.js create mode 100644 docs/backend_api/assets/search.js create mode 100644 docs/backend_api/assets/style.css delete mode 100644 docs/backend_api/becca_entities_abstract_becca_entity.js.html delete mode 100644 docs/backend_api/becca_entities_battachment.js.html delete mode 100644 docs/backend_api/becca_entities_battribute.js.html delete mode 100644 docs/backend_api/becca_entities_bblob.js.html delete mode 100644 docs/backend_api/becca_entities_bbranch.js.html delete mode 100644 docs/backend_api/becca_entities_betapi_token.js.html delete mode 100644 docs/backend_api/becca_entities_bnote.js.html delete mode 100644 docs/backend_api/becca_entities_boption.js.html delete mode 100644 docs/backend_api/becca_entities_brecent_note.js.html delete mode 100644 docs/backend_api/becca_entities_brevision.js.html create mode 100644 docs/backend_api/classes/becca_entities_abstract_becca_entity.default.html create mode 100644 docs/backend_api/classes/becca_entities_battachment.default.html create mode 100644 docs/backend_api/classes/becca_entities_battribute.default.html create mode 100644 docs/backend_api/classes/becca_entities_bblob.default.html create mode 100644 docs/backend_api/classes/becca_entities_bbranch.default.html create mode 100644 docs/backend_api/classes/becca_entities_betapi_token.default.html create mode 100644 docs/backend_api/classes/becca_entities_bnote.default.html create mode 100644 docs/backend_api/classes/becca_entities_boption.default.html create mode 100644 docs/backend_api/classes/becca_entities_brecent_note.default.html create mode 100644 docs/backend_api/classes/becca_entities_brevision.default.html delete mode 100644 docs/backend_api/fonts/OpenSans-Bold-webfont.eot delete mode 100644 docs/backend_api/fonts/OpenSans-Bold-webfont.svg delete mode 100644 docs/backend_api/fonts/OpenSans-Bold-webfont.woff delete mode 100644 docs/backend_api/fonts/OpenSans-BoldItalic-webfont.eot delete mode 100644 docs/backend_api/fonts/OpenSans-BoldItalic-webfont.svg delete mode 100644 docs/backend_api/fonts/OpenSans-BoldItalic-webfont.woff delete mode 100644 docs/backend_api/fonts/OpenSans-Italic-webfont.eot delete mode 100644 docs/backend_api/fonts/OpenSans-Italic-webfont.svg delete mode 100644 docs/backend_api/fonts/OpenSans-Italic-webfont.woff delete mode 100644 docs/backend_api/fonts/OpenSans-Light-webfont.eot delete mode 100644 docs/backend_api/fonts/OpenSans-Light-webfont.svg delete mode 100644 docs/backend_api/fonts/OpenSans-Light-webfont.woff delete mode 100644 docs/backend_api/fonts/OpenSans-LightItalic-webfont.eot delete mode 100644 docs/backend_api/fonts/OpenSans-LightItalic-webfont.svg delete mode 100644 docs/backend_api/fonts/OpenSans-LightItalic-webfont.woff delete mode 100644 docs/backend_api/fonts/OpenSans-Regular-webfont.eot delete mode 100644 docs/backend_api/fonts/OpenSans-Regular-webfont.svg delete mode 100644 docs/backend_api/fonts/OpenSans-Regular-webfont.woff delete mode 100644 docs/backend_api/global.html create mode 100644 docs/backend_api/hierarchy.html create mode 100644 docs/backend_api/interfaces/becca_entities_rows.AttachmentRow.html create mode 100644 docs/backend_api/interfaces/becca_entities_rows.AttributeRow.html create mode 100644 docs/backend_api/interfaces/becca_entities_rows.BlobRow.html create mode 100644 docs/backend_api/interfaces/becca_entities_rows.BranchRow.html create mode 100644 docs/backend_api/interfaces/becca_entities_rows.EtapiTokenRow.html create mode 100644 docs/backend_api/interfaces/becca_entities_rows.NoteRow.html create mode 100644 docs/backend_api/interfaces/becca_entities_rows.OptionRow.html create mode 100644 docs/backend_api/interfaces/becca_entities_rows.RecentNoteRow.html create mode 100644 docs/backend_api/interfaces/becca_entities_rows.RevisionRow.html create mode 100644 docs/backend_api/media/README-ZH_CN.md create mode 100644 docs/backend_api/media/README.es.md create mode 100644 docs/backend_api/media/README.it.md create mode 100644 docs/backend_api/media/README.ja.md create mode 100644 docs/backend_api/media/README.md create mode 100644 docs/backend_api/media/README.ru.md delete mode 100644 docs/backend_api/module-sql.html create mode 100644 docs/backend_api/modules.html create mode 100644 docs/backend_api/modules/becca_entities_abstract_becca_entity.html create mode 100644 docs/backend_api/modules/becca_entities_battachment.html create mode 100644 docs/backend_api/modules/becca_entities_battribute.html create mode 100644 docs/backend_api/modules/becca_entities_bblob.html create mode 100644 docs/backend_api/modules/becca_entities_bbranch.html create mode 100644 docs/backend_api/modules/becca_entities_betapi_token.html create mode 100644 docs/backend_api/modules/becca_entities_bnote.html create mode 100644 docs/backend_api/modules/becca_entities_boption.html create mode 100644 docs/backend_api/modules/becca_entities_brecent_note.html create mode 100644 docs/backend_api/modules/becca_entities_brevision.html create mode 100644 docs/backend_api/modules/becca_entities_rows.html create mode 100644 docs/backend_api/modules/services_backend_script_api.html create mode 100644 docs/backend_api/modules/services_sql.html delete mode 100644 docs/backend_api/scripts/linenumber.js delete mode 100644 docs/backend_api/scripts/prettify/Apache-License-2.0.txt delete mode 100644 docs/backend_api/scripts/prettify/lang-css.js delete mode 100644 docs/backend_api/scripts/prettify/prettify.js delete mode 100644 docs/backend_api/services_backend_script_api.js.html delete mode 100644 docs/backend_api/services_sql.js.html delete mode 100644 docs/backend_api/styles/jsdoc-default.css delete mode 100644 docs/backend_api/styles/prettify-jsdoc.css delete mode 100644 docs/backend_api/styles/prettify-tomorrow.css create mode 100644 docs/backend_api/types/becca_entities_rows.AttributeType.html create mode 100644 docs/backend_api/types/becca_entities_rows.NoteType.html create mode 100644 docs/backend_api/variables/becca_entities_rows.ALLOWED_NOTE_TYPES.html create mode 100644 docs/backend_api/variables/services_backend_script_api.default.html create mode 100644 docs/backend_api/variables/services_sql.default.html create mode 100644 typedoc.json diff --git a/docs/backend_api/.nojekyll b/docs/backend_api/.nojekyll new file mode 100644 index 000000000..e2ac6616a --- /dev/null +++ b/docs/backend_api/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/backend_api/AbstractBeccaEntity.html b/docs/backend_api/AbstractBeccaEntity.html deleted file mode 100644 index 1efeb3ab8..000000000 --- a/docs/backend_api/AbstractBeccaEntity.html +++ /dev/null @@ -1,1207 +0,0 @@ - - - - - JSDoc: Class: AbstractBeccaEntity - - - - - - - - - - -

- -

Class: AbstractBeccaEntity

- - - - - - -
- -
- -

AbstractBeccaEntity()

- -
Base class for all backend entities.
- - -
- -
-
- - - - -

Constructor

- - - -

new AbstractBeccaEntity()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Members

- - - -

(protected) becca

- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -

Methods

- - - - - - - -

(protected) _getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

(protected) _setContent()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) beforeSaving()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) generateHash() → {string}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

(abstract, protected) getPojo()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getPojoToSave()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getUtcDateChanged()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

markAsDeleted(deleteIdopt)

- - - - - - -
- Mark the entity as (soft) deleted. It will be completely erased later. - -This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
deleteId - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) putEntityChange()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

save() → {this}

- - - - - - -
- Saves entity - executes SQL, but doesn't commit the transaction on its own -
- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/BAttachment.html b/docs/backend_api/BAttachment.html deleted file mode 100644 index 4da4cb240..000000000 --- a/docs/backend_api/BAttachment.html +++ /dev/null @@ -1,2894 +0,0 @@ - - - - - JSDoc: Class: BAttachment - - - - - - - - - - -
- -

Class: BAttachment

- - - - - - -
- -
- -

BAttachment()

- -
Attachment represent data related/attached to the note. Conceptually similar to attributes, but intended for -larger amounts of data and generally not accessible to the user.
- - -
- -
-
- - - - -

Constructor

- - - -

new BAttachment()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -

Extends

- - - - - - - - - - - - - - - - - - - - -

Members

- - - -

attachmentId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

(protected) becca

- - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

blobId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

contentLength :int

- - - - -
- optionally added to the entity -
- - - -
Type:
-
    -
  • - -int - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

dateModified :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

isProtected :boolean

- - - - - - -
Type:
-
    -
  • - -boolean - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

mime :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

ownerId :string

- - - - -
- either noteId or revisionId to which this attachment belongs -
- - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

position :int

- - - - - - -
Type:
-
    -
  • - -int - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

role :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

title :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateModified :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateScheduledForErasureSince :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -

Methods

- - - - - - - -

(protected) _getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

(protected) _setContent()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) beforeSaving()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

convertToNote() → {Object}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Object - - -
-
- - - - - - - - - - - - - -

copy() → {BAttachment}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttachment - - -
-
- - - - - - - - - - - - - -

(protected) generateHash() → {string}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

getNote() → {BNote}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote - - -
-
- - - - - - - - - - - - - -

(abstract, protected) getPojo()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getPojoToSave()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getUtcDateChanged()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

hasStringContent() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if the note has string content (not binary) -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

markAsDeleted(deleteIdopt)

- - - - - - -
- Mark the entity as (soft) deleted. It will be completely erased later. - -This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
deleteId - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) putEntityChange()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

save() → {this}

- - - - - - -
- Saves entity - executes SQL, but doesn't commit the transaction on its own -
- - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - - - - - -

setContent(content, optsopt)

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
content - - - - - - - -
opts - - -object - - - - - - <optional>
- - - - - -
-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
forceSave - - -object - - - - - - <optional>
- - - - - -
- - false - - will also save this BAttachment entity
forceFrontendReload - - -object - - - - - - <optional>
- - - - - -
- - false - - override frontend heuristics on when to reload, instruct to reload
- -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/BAttribute.html b/docs/backend_api/BAttribute.html deleted file mode 100644 index 961eff31d..000000000 --- a/docs/backend_api/BAttribute.html +++ /dev/null @@ -1,2130 +0,0 @@ - - - - - JSDoc: Class: BAttribute - - - - - - - - - - -
- -

Class: BAttribute

- - - - - - -
- -
- -

BAttribute()

- -
Attribute is an abstract concept which has two real uses - label (key - value pair) -and relation (representing named relationship between source and target note)
- - -
- -
-
- - - - -

Constructor

- - - -

new BAttribute()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -

Extends

- - - - - - - - - - - - - - - - - - - - -

Members

- - - -

attributeId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

(protected) becca

- - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

isInheritable :boolean

- - - - - - -
Type:
-
    -
  • - -boolean - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

name :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

noteId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

position :int

- - - - - - -
Type:
-
    -
  • - -int - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

type :AttributeType

- - - - - - -
Type:
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateModified :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

value :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -

Methods

- - - - - - - -

(protected) _getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

(protected) _setContent()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) beforeSaving()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) generateHash() → {string}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

getNote() → {BNote|null}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

(abstract, protected) getPojo()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getPojoToSave()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

getTargetNote() → {BNote|null}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

(protected) getUtcDateChanged()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

isDefinition() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

markAsDeleted(deleteIdopt)

- - - - - - -
- Mark the entity as (soft) deleted. It will be completely erased later. - -This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
deleteId - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) putEntityChange()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

save() → {this}

- - - - - - -
- Saves entity - executes SQL, but doesn't commit the transaction on its own -
- - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/BBranch.html b/docs/backend_api/BBranch.html deleted file mode 100644 index 184c2156c..000000000 --- a/docs/backend_api/BBranch.html +++ /dev/null @@ -1,2244 +0,0 @@ - - - - - JSDoc: Class: BBranch - - - - - - - - - - -
- -

Class: BBranch

- - - - - - -
- -
- -

BBranch()

- -
Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple -parents. - -Note that you should not rely on the branch's identity, since it can change easily with a note's move. -Always check noteId instead.
- - -
- -
-
- - - - -

Constructor

- - - -

new BBranch()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -

Extends

- - - - - - - - - - - - - - - - - - - - -

Members

- - - -

(protected) becca

- - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

branchId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

childNote

- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

isExpanded :boolean

- - - - - - -
Type:
-
    -
  • - -boolean - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

isWeak

- - - - -
- Branch is weak when its existence should not hinder deletion of its note. -As a result, note with only weak branches should be immediately deleted. -An example is shared or bookmarked clones - they are created automatically and exist for technical reasons, -not as user-intended actions. From user perspective, they don't count as real clones and for the purpose -of deletion should not act as a clone. -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

noteId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

notePosition :int

- - - - - - -
Type:
-
    -
  • - -int - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

parentNote

- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

parentNoteId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

prefix :string|null

- - - - - - -
Type:
-
    -
  • - -string -| - -null - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateModified :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -

Methods

- - - - - - - -

(protected) _getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

(protected) _setContent()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) beforeSaving()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

deleteBranch(deleteIdopt, taskContextopt) → {boolean}

- - - - - - -
- Delete a branch. If this is a last note's branch, delete the note as well. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
deleteId - - -string - - - - - - <optional>
- - - - - -
optional delete identified
taskContext - - -TaskContext - - - - - - <optional>
- - - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - true if note has been deleted, false otherwise -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

(protected) generateHash() → {string}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

getNote() → {BNote}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote - - -
-
- - - - - - - - - - - - - -

(abstract, protected) getPojo()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getPojoToSave()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getUtcDateChanged()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

markAsDeleted(deleteIdopt)

- - - - - - -
- Mark the entity as (soft) deleted. It will be completely erased later. - -This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
deleteId - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) putEntityChange()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

save() → {this}

- - - - - - -
- Saves entity - executes SQL, but doesn't commit the transaction on its own -
- - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/BEtapiToken.html b/docs/backend_api/BEtapiToken.html deleted file mode 100644 index ac8b156f5..000000000 --- a/docs/backend_api/BEtapiToken.html +++ /dev/null @@ -1,1687 +0,0 @@ - - - - - JSDoc: Class: BEtapiToken - - - - - - - - - - -
- -

Class: BEtapiToken

- - - - - - -
- -
- -

BEtapiToken()

- -
EtapiToken is an entity representing token used to authenticate against Trilium REST API from client applications. -Used by: -- Trilium Sender -- ETAPI clients - -The format user is presented with is "_". This is also called "authToken" to distinguish it -from tokenHash and token.
- - -
- -
-
- - - - -

Constructor

- - - -

new BEtapiToken()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -

Extends

- - - - - - - - - - - - - - - - - - - - -

Members

- - - -

(protected) becca

- - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

etapiTokenId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

isDeleted :boolean

- - - - - - -
Type:
-
    -
  • - -boolean - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

name :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

tokenHash :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateCreated :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateModified :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -

Methods

- - - - - - - -

(protected) _getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

(protected) _setContent()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) beforeSaving()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) generateHash() → {string}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

(abstract, protected) getPojo()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getPojoToSave()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getUtcDateChanged()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

markAsDeleted(deleteIdopt)

- - - - - - -
- Mark the entity as (soft) deleted. It will be completely erased later. - -This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
deleteId - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) putEntityChange()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

save() → {this}

- - - - - - -
- Saves entity - executes SQL, but doesn't commit the transaction on its own -
- - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/BNote.html b/docs/backend_api/BNote.html deleted file mode 100644 index 785bc82aa..000000000 --- a/docs/backend_api/BNote.html +++ /dev/null @@ -1,14966 +0,0 @@ - - - - - JSDoc: Class: BNote - - - - - - - - - - -
- -

Class: BNote

- - - - - - -
- -
- -

BNote()

- -
Trilium's main entity, which can represent text note, image, code note, file attachment etc.
- - -
- -
-
- - - - -

Constructor

- - - -

new BNote()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -

Extends

- - - - - - - - - - - - - - - - - - - - -

Members

- - - -

__flatTextCache :string|null

- - - - - - -
Type:
-
    -
  • - -string -| - -null - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

(protected) becca

- - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

blobId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

dateCreated :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

dateModified :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

isBeingDeleted :boolean

- - - - -
- set during the deletion operation, before it is completed (removed from becca completely) -
- - - -
Type:
-
    -
  • - -boolean - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

isDecrypted :boolean

- - - - - - -
Type:
-
    -
  • - -boolean - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

isProtected :boolean

- - - - - - -
Type:
-
    -
  • - -boolean - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

mime :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

noteId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

title :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

type :NoteType

- - - - - - -
Type:
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateCreated :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateModified :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -

Methods

- - - - - - - -

(protected) _getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

(protected) _setContent()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

addAttribute(type, name, valueopt, isInheritableopt, positionopt) → {BAttribute}

- - - - - - -
- Adds a new attribute to this note. The attribute is saved and returned. -See addLabel, addRelation for more specific methods. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
type - - -string - - - - - - - - - - - - attribute type (label / relation)
name - - -string - - - - - - - - - - - - name of the attribute, not including the leading ~/#
value - - -string - - - - - - <optional>
- - - - - -
- - value of the attribute - text for labels, target note ID for relations; optional.
isInheritable - - -boolean - - - - - - <optional>
- - - - - -
- - false - -
position - - -int -| - -null - - - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttribute - - -
-
- - - - - - - - - - - - - -

addLabel(name, valueopt, isInheritableopt) → {BAttribute}

- - - - - - -
- Adds a new label to this note. The label attribute is saved and returned. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
name - - -string - - - - - - - - - - - - name of the label, not including the leading #
value - - -string - - - - - - <optional>
- - - - - -
- - text value of the label; optional
isInheritable - - -boolean - - - - - - <optional>
- - - - - -
- - false - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttribute - - -
-
- - - - - - - - - - - - - -

addRelation(name, targetNoteId, isInheritableopt) → {BAttribute}

- - - - - - -
- Adds a new relation to this note. The relation attribute is saved and -returned. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
name - - -string - - - - - - - - - - - - name of the relation, not including the leading ~
targetNoteId - - -string - - - - - - - - - - - -
isInheritable - - -boolean - - - - - - <optional>
- - - - - -
- - false - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttribute - - -
-
- - - - - - - - - - - - - -

(protected) beforeSaving()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

cloneTo(parentNoteId) → {Object}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
parentNoteId - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Object - - -
-
- - - - - - - - - - - - - -

convertToParentAttachment() → {BAttachment|null}

- - - - - - -
- Some notes are eligible for conversion into an attachment of its parent, note must have these properties: -- it has exactly one target relation -- it has a relation from its parent note -- it has no children -- it has no clones -- the parent is of type text -- both notes are either unprotected or user is in protected session - -Currently, works only for image notes. - -In the future, this functionality might get more generic and some of the requirements relaxed. -
- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - null if note is not eligible for conversion -
- - - -
-
- Type -
-
- -BAttachment -| - -null - - -
-
- - - - - - - - - - - - - -

deleteNote(deleteIdopt, taskContextopt)

- - - - - - -
- (Soft) delete a note and all its descendants. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
deleteId - - -string - - - - - - <optional>
- - - - - -
- - null - - optional delete identified
taskContext - - -TaskContext - - - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) generateHash() → {string}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

getAllNotePaths() → {Array.<Array.<string>>}

- - - - - - -
- Gives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles) -
- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - array of notePaths (each represented by array of noteIds constituting the particular note path) -
- - - -
-
- Type -
-
- -Array.<Array.<string>> - - -
-
- - - - - - - - - - - - - -

getAncestorNoteIds() → {Array.<string>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<string> - - -
-
- - - - - - - - - - - - - -

getAncestors() → {Array.<BNote>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BNote> - - -
-
- - - - - - - - - - - - - -

getAttachmentById() → {BAttachment|null}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttachment -| - -null - - -
-
- - - - - - - - - - - - - -

getAttachmentByTitle() → {BAttachment}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttachment - - -
-
- - - - - - - - - - - - - -

getAttachments() → {Array.<BAttachment>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BAttachment> - - -
-
- - - - - - - - - - - - - -

getAttachmentsByRole() → {Array.<BAttachment>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BAttachment> - - -
-
- - - - - - - - - - - - - -

getAttribute(type, name) → {BAttribute}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
type - - -string - - - - attribute type (label, relation, etc.)
name - - -string - - - - attribute name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- attribute of the given type and name. If there are more such attributes, first is returned. - Returns null if there's no such attribute belonging to this note. -
- - - -
-
- Type -
-
- -BAttribute - - -
-
- - - - - - - - - - - - - -

getAttributeValue(type, name) → {string|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
type - - -string - - - - attribute type (label, relation, etc.)
name - - -string - - - - attribute name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- attribute value of given type and name or null if no such attribute exists. -
- - - -
-
- Type -
-
- -string -| - -null - - -
-
- - - - - - - - - - - - - -

getAttributes(typeopt, nameopt) → {Array.<BAttribute>}

- - - - - - -
- Beware that the method must not create a copy of the array, but actually returns its internal array -(for performance reasons) -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
type - - -string - - - - - - <optional>
- - - - - -
(optional) attribute type to filter
name - - -string - - - - - - <optional>
- - - - - -
(optional) attribute name to filter
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- all note's attributes, including inherited ones -
- - - -
-
- Type -
-
- -Array.<BAttribute> - - -
-
- - - - - - - - - - - - - -

getBestNotePath(hoistedNoteIdopt) → {Array.<string>}

- - - - - - -
- Returns a note path considered to be the "best" -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
hoistedNoteId - - -string - - - - - - <optional>
- - - - - -
- - 'root' - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- array of noteIds constituting the particular note path -
- - - -
-
- Type -
-
- -Array.<string> - - -
-
- - - - - - - - - - - - - -

getBestNotePathString(hoistedNoteIdopt) → {string}

- - - - - - -
- Returns a note path considered to be the "best" -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
hoistedNoteId - - -string - - - - - - <optional>
- - - - - -
- - 'root' - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- serialized note path (e.g. 'root/a1h315/js725h') -
- - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

getBranches() → {Array.<BBranch>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
Deprecated:
  • use getParentBranches() instead
- - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BBranch> - - -
-
- - - - - - - - - - - - - -

getChildBranches() → {Array.<BBranch>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BBranch> - - -
-
- - - - - - - - - - - - - -

getChildNotes() → {Array.<BNote>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BNote> - - -
-
- - - - - - - - - - - - - -

getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

getDescendantNoteIds()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
Deprecated:
  • use getSubtreeNoteIds() instead
- - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

getFlatText() → {string}

- - - - - - -
- This is used for: -- fast searching -- note similarity evaluation -
- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - returns flattened textual representation of note, prefixes and attributes -
- - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

getInheritingNotes() → {Array.<BNote>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - returns only notes which are templated, does not include their subtrees - in effect returns notes which are influenced by note's non-inheritable attributes -
- - - -
-
- Type -
-
- -Array.<BNote> - - -
-
- - - - - - - - - - - - - -

getJsonContent() → {*}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
Throws:
- - - -
- - Error in case of invalid JSON - -
- - - - - -
Returns:
- - - - -
-
- Type -
-
- -* - - -
-
- - - - - - - - - - - - - -

getJsonContentSafely() → {*|null}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- valid object or null if the content cannot be parsed as JSON -
- - - -
-
- Type -
-
- -* -| - -null - - -
-
- - - - - - - - - - - - - -

getLabel(name) → {BAttribute|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - label name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- label if it exists, null otherwise -
- - - -
-
- Type -
-
- -BAttribute -| - -null - - -
-
- - - - - - - - - - - - - -

getLabelValue(name) → {string|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - label name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- label value if label exists, null otherwise -
- - - -
-
- Type -
-
- -string -| - -null - - -
-
- - - - - - - - - - - - - -

getLabelValues(nameopt) → {Array.<string>}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - <optional>
- - - - - -
label name to filter
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- all note's label values, including inherited ones -
- - - -
-
- Type -
-
- -Array.<string> - - -
-
- - - - - - - - - - - - - -

getLabels(nameopt) → {Array.<BAttribute>}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - <optional>
- - - - - -
label name to filter
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- all note's labels (attributes with type label), including inherited ones -
- - - -
-
- Type -
-
- -Array.<BAttribute> - - -
-
- - - - - - - - - - - - - -

getOwnedAttribute() → {BAttribute}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- attribute belonging to this specific note (excludes inherited attributes) - -This method can be significantly faster than the getAttribute() -
- - - -
-
- Type -
-
- -BAttribute - - -
-
- - - - - - - - - - - - - -

getOwnedAttributeValue(type, name) → {string|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
type - - -string - - - - attribute type (label, relation, etc.)
name - - -string - - - - attribute name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- attribute value of given type and name or null if no such attribute exists. -
- - - -
-
- Type -
-
- -string -| - -null - - -
-
- - - - - - - - - - - - - -

getOwnedAttributes(typeopt, nameopt, valueopt) → {Array.<BAttribute>}

- - - - - - -
- Beware that the method must not create a copy of the array, but actually returns its internal array -(for performance reasons) -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
type - - -string -| - -null - - - - - - <optional>
- - - - - -
- - null - - (optional) attribute type to filter
name - - -string -| - -null - - - - - - <optional>
- - - - - -
- - null - - (optional) attribute name to filter
value - - -string -| - -null - - - - - - <optional>
- - - - - -
- - null - - (optional) attribute value to filter
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- note's "owned" attributes - excluding inherited ones -
- - - -
-
- Type -
-
- -Array.<BAttribute> - - -
-
- - - - - - - - - - - - - -

getOwnedLabel(name) → {BAttribute|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - label name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- label if it exists, null otherwise -
- - - -
-
- Type -
-
- -BAttribute -| - -null - - -
-
- - - - - - - - - - - - - -

getOwnedLabelValue(name) → {string|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - label name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- label value if label exists, null otherwise -
- - - -
-
- Type -
-
- -string -| - -null - - -
-
- - - - - - - - - - - - - -

getOwnedLabelValues(nameopt) → {Array.<string>}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - <optional>
- - - - - -
label name to filter
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- all note's label values, excluding inherited ones -
- - - -
-
- Type -
-
- -Array.<string> - - -
-
- - - - - - - - - - - - - -

getOwnedLabels(nameopt) → {Array.<BAttribute>}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - <optional>
- - - - - -
label name to filter
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- all note's labels (attributes with type label), excluding inherited ones -
- - - -
-
- Type -
-
- -Array.<BAttribute> - - -
-
- - - - - - - - - - - - - -

getOwnedRelation(name) → {BAttribute|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - relation name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- relation if it exists, null otherwise -
- - - -
-
- Type -
-
- -BAttribute -| - -null - - -
-
- - - - - - - - - - - - - -

getOwnedRelationValue(name) → {string|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - relation name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- relation value if relation exists, null otherwise -
- - - -
-
- Type -
-
- -string -| - -null - - -
-
- - - - - - - - - - - - - -

getOwnedRelations(nameopt) → {Array.<BAttribute>}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - <optional>
- - - - - -
relation name to filter
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- all note's relations (attributes with type relation), excluding inherited ones -
- - - -
-
- Type -
-
- -Array.<BAttribute> - - -
-
- - - - - - - - - - - - - -

getParentBranches() → {Array.<BBranch>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BBranch> - - -
-
- - - - - - - - - - - - - -

getParentNotes() → {Array.<BNote>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BNote> - - -
-
- - - - - - - - - - - - - -

(abstract, protected) getPojo()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getPojoToSave()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

getRelation(name) → {BAttribute|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - relation name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- relation if it exists, null otherwise -
- - - -
-
- Type -
-
- -BAttribute -| - -null - - -
-
- - - - - - - - - - - - - -

getRelationValue(name) → {string|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - relation name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- relation value if relation exists, null otherwise -
- - - -
-
- Type -
-
- -string -| - -null - - -
-
- - - - - - - - - - - - - -

getRelations(nameopt) → {Array.<BAttribute>}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - <optional>
- - - - - -
relation name to filter
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- all note's relations (attributes with type relation), including inherited ones -
- - - -
-
- Type -
-
- -Array.<BAttribute> - - -
-
- - - - - - - - - - - - - -

getRevisions() → {Array.<BRevision>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BRevision> - - -
-
- - - - - - - - - - - - - -

getScriptEnv() → {string|null}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- JS script environment - either "frontend" or "backend" -
- - - -
-
- Type -
-
- -string -| - -null - - -
-
- - - - - - - - - - - - - -

getSearchResultNotes() → {Array.<BNote>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BNote> - - -
-
- - - - - - - - - - - - - -

getSortedNotePathRecords(hoistedNoteIdopt) → {Array.<NotePathRecord>}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
hoistedNoteId - - -string - - - - - - <optional>
- - - - - -
- - 'root' - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<NotePathRecord> - - -
-
- - - - - - - - - - - - - -

getStrongParentBranches() → {Array.<BBranch>}

- - - - - - -
- Returns strong (as opposed to weak) parent branches. See isWeak for details. -
- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BBranch> - - -
-
- - - - - - - - - - - - - -

getSubtree() → {Object}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Object - - -
-
- - - - - - - - - - - - - -

getSubtreeNoteIds() → {Array.<string>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - includes the subtree root note as well -
- - - -
-
- Type -
-
- -Array.<string> - - -
-
- - - - - - - - - - - - - -

getSubtreeNotesIncludingTemplated() → {Array.<BNote>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BNote> - - -
-
- - - - - - - - - - - - - -

getTargetRelations() → {Array.<BAttribute>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BAttribute> - - -
-
- - - - - - - - - - - - - -

(protected) getUtcDateChanged()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

hasAncestor() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

hasAttribute(type, name, valueopt) → {boolean}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
type - - - - - - - - - -
name - - - - - - - - - -
value - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

hasChildren() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

hasLabel(name, valueopt) → {boolean}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - - - - - label name
value - - -string - - - - - - <optional>
- - - - - -
label value
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if label exists (including inherited) -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

hasOwnedAttribute(type, name, valueopt) → {boolean}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
type - - -string - - - - - - - - - - attribute type (label, relation, etc.)
name - - -string - - - - - - - - - - attribute name
value - - -string - - - - - - <optional>
- - - - - -
attribute value
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if note has an attribute with given type and name (excluding inherited) -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

hasOwnedLabel(name, valueopt) → {boolean}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - - - - - label name
value - - -string - - - - - - <optional>
- - - - - -
label value
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if label exists (excluding inherited) -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

hasOwnedRelation(name, valueopt) → {boolean}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - - - - - relation name
value - - -string - - - - - - <optional>
- - - - - -
relation value
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if relation exists (excluding inherited) -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

hasRelation(name, valueopt) → {boolean}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - - - - - relation name
value - - -string - - - - - - <optional>
- - - - - -
relation value
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if relation exists (including inherited) -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

hasStringContent() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if the note has string content (not binary) -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

isDescendantOfNote(ancestorNoteId) → {boolean}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ancestorNoteId - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - true if ancestorNoteId occurs in at least one of the note's paths -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

isHiddenCompletely()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- boolean - true if there's no non-hidden path, note is not cloned to the visible tree -
- - - - - - - - - - - - - - - -

isHtml() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if this note is HTML -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

isImage() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if this note is an image -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

isJavaScript() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if this note is JavaScript (code or attachment) -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

isJson() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if this note is of application/json content type -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

isLabelTruthy(name) → {boolean}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - label name
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if label exists (including inherited) and does not have "false" value. -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

isRoot() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if this note is the root of the note tree. Root note has "root" noteId -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

isStringNote()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
Deprecated:
  • use hasStringContent() instead
- - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

markAsDeleted(deleteIdopt)

- - - - - - -
- Mark the entity as (soft) deleted. It will be completely erased later. - -This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
deleteId - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) putEntityChange()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

removeAttribute(type, name, valueopt)

- - - - - - -
- Removes given attribute name-value pair if it exists. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
type - - -string - - - - - - - - - - attribute type (label, relation, etc.)
name - - -string - - - - - - - - - - attribute name
value - - -string - - - - - - <optional>
- - - - - -
attribute value (optional)
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

removeLabel(name, valueopt)

- - - - - - -
- Remove label name-value pair, if it exists. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - - - - - label name
value - - -string - - - - - - <optional>
- - - - - -
label value
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

removeRelation(name, valueopt)

- - - - - - -
- Remove the relation name-value pair, if it exists. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - - - - - relation name
value - - -string - - - - - - <optional>
- - - - - -
relation value (noteId)
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

save() → {this}

- - - - - - -
- Saves entity - executes SQL, but doesn't commit the transaction on its own -
- - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - - - - - -

saveAttachment(matchBy) → {BAttachment}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
matchBy - - -string - - - - - - attachmentId - - choose by which property we detect if to update an existing attachment. - Supported values are either 'attachmentId' (default) or 'title'
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttachment - - -
-
- - - - - - - - - - - - - -

saveRevision() → {BRevision|null}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BRevision -| - -null - - -
-
- - - - - - - - - - - - - -

setAttribute(type, name, valueopt)

- - - - - - -
- Update's given attribute's value or creates it if it doesn't exist -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
type - - -string - - - - - - - - - - attribute type (label, relation, etc.)
name - - -string - - - - - - - - - - attribute name
value - - -string - - - - - - <optional>
- - - - - -
attribute value (optional)
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

setContent(content, optsopt)

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
content - - - - - - - -
opts - - -object - - - - - - <optional>
- - - - - -
-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
forceSave - - -object - - - - - - <optional>
- - - - - -
- - false - - will also save this BNote entity
forceFrontendReload - - -object - - - - - - <optional>
- - - - - -
- - false - - override frontend heuristics on when to reload, instruct to reload
- -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

setLabel(name, valueopt)

- - - - - - -
- Update's given label's value or creates it if it doesn't exist -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - - - - - label name
value - - -string - - - - - - <optional>
- - - - - -
label value
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

setRelation(name, value)

- - - - - - -
- Update's given relation's value or creates it if it doesn't exist -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - relation name
value - - -string - - - - relation value (noteId)
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

toggleAttribute(type, enabled, name, valueopt)

- - - - - - -
- Based on enabled, the attribute is either set or removed. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
type - - -string - - - - - - - - - - attribute type ('relation', 'label' etc.)
enabled - - -boolean - - - - - - - - - - toggle On or Off
name - - -string - - - - - - - - - - attribute name
value - - -string - - - - - - <optional>
- - - - - -
attribute value (optional)
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

toggleLabel(enabled, name, valueopt)

- - - - - - -
- Based on enabled, label is either set or removed. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
enabled - - -boolean - - - - - - - - - - toggle On or Off
name - - -string - - - - - - - - - - label name
value - - -string - - - - - - <optional>
- - - - - -
label value (optional)
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

toggleRelation(enabled, name, valueopt)

- - - - - - -
- Based on enabled, relation is either set or removed. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
enabled - - -boolean - - - - - - - - - - toggle On or Off
name - - -string - - - - - - - - - - relation name
value - - -string - - - - - - <optional>
- - - - - -
relation value (noteId)
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/BOption.html b/docs/backend_api/BOption.html deleted file mode 100644 index b4b687d1f..000000000 --- a/docs/backend_api/BOption.html +++ /dev/null @@ -1,1545 +0,0 @@ - - - - - JSDoc: Class: BOption - - - - - - - - - - -
- -

Class: BOption

- - - - - - -
- -
- -

BOption()

- -
Option represents a name-value pair, either directly configurable by the user or some system property.
- - -
- -
-
- - - - -

Constructor

- - - -

new BOption()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -

Extends

- - - - - - - - - - - - - - - - - - - - -

Members

- - - -

(protected) becca

- - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

isSynced :boolean

- - - - - - -
Type:
-
    -
  • - -boolean - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

name :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateModified :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

value :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -

Methods

- - - - - - - -

(protected) _getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

(protected) _setContent()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) beforeSaving()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) generateHash() → {string}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

(abstract, protected) getPojo()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getPojoToSave()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getUtcDateChanged()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

markAsDeleted(deleteIdopt)

- - - - - - -
- Mark the entity as (soft) deleted. It will be completely erased later. - -This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
deleteId - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) putEntityChange()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

save() → {this}

- - - - - - -
- Saves entity - executes SQL, but doesn't commit the transaction on its own -
- - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/BRecentNote.html b/docs/backend_api/BRecentNote.html deleted file mode 100644 index 323352d8e..000000000 --- a/docs/backend_api/BRecentNote.html +++ /dev/null @@ -1,1477 +0,0 @@ - - - - - JSDoc: Class: BRecentNote - - - - - - - - - - -
- -

Class: BRecentNote

- - - - - - -
- -
- -

BRecentNote()

- -
RecentNote represents recently visited note.
- - -
- -
-
- - - - -

Constructor

- - - -

new BRecentNote()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -

Extends

- - - - - - - - - - - - - - - - - - - - -

Members

- - - -

(protected) becca

- - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

noteId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

notePath :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateCreated :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -

Methods

- - - - - - - -

(protected) _getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

(protected) _setContent()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) beforeSaving()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) generateHash() → {string}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

(abstract, protected) getPojo()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getPojoToSave()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getUtcDateChanged()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

markAsDeleted(deleteIdopt)

- - - - - - -
- Mark the entity as (soft) deleted. It will be completely erased later. - -This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
deleteId - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) putEntityChange()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

save() → {this}

- - - - - - -
- Saves entity - executes SQL, but doesn't commit the transaction on its own -
- - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/BRevision.html b/docs/backend_api/BRevision.html deleted file mode 100644 index 0cadc592a..000000000 --- a/docs/backend_api/BRevision.html +++ /dev/null @@ -1,3243 +0,0 @@ - - - - - JSDoc: Class: BRevision - - - - - - - - - - -
- -

Class: BRevision

- - - - - - -
- -
- -

BRevision()

- -
Revision represents a snapshot of note's title and content at some point in the past. -It's used for seamless note versioning.
- - -
- -
-
- - - - -

Constructor

- - - -

new BRevision()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -

Extends

- - - - - - - - - - - - - - - - - - - - -

Members

- - - -

(protected) becca

- - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

blobId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

contentLength :int

- - - - - - -
Type:
-
    -
  • - -int - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

dateCreated :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

dateLastEdited :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

isProtected :boolean

- - - - - - -
Type:
-
    -
  • - -boolean - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

mime :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

noteId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

revisionId :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

title :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

type :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateCreated :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateLastEdited :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

utcDateModified :string

- - - - - - -
Type:
-
    -
  • - -string - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -

Methods

- - - - - - - -

(protected) _getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

(protected) _setContent()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) beforeSaving()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) generateHash() → {string}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

getAttachmentById() → {BAttachment|null}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttachment -| - -null - - -
-
- - - - - - - - - - - - - -

getAttachmentByTitle() → {BAttachment}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttachment - - -
-
- - - - - - - - - - - - - -

getAttachments() → {Array.<BAttachment>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BAttachment> - - -
-
- - - - - - - - - - - - - -

getAttachmentsByRole() → {Array.<BAttachment>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BAttachment> - - -
-
- - - - - - - - - - - - - -

getContent() → {string|Buffer}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -Buffer - - -
-
- - - - - - - - - - - - - -

getJsonContent() → {*}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
Throws:
- - - -
- - Error in case of invalid JSON - -
- - - - - -
Returns:
- - - - -
-
- Type -
-
- -* - - -
-
- - - - - - - - - - - - - -

getJsonContentSafely() → {*|null}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- valid object or null if the content cannot be parsed as JSON -
- - - -
-
- Type -
-
- -* -| - -null - - -
-
- - - - - - - - - - - - - -

(abstract, protected) getPojo()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getPojoToSave()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) getUtcDateChanged()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

hasStringContent() → {boolean}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- true if the note has string content (not binary) -
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - - - - - - - - - -

markAsDeleted(deleteIdopt)

- - - - - - -
- Mark the entity as (soft) deleted. It will be completely erased later. - -This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
deleteId - - - - <optional>
- - - - - -
- - null - -
- - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(protected) putEntityChange()

- - - - - - - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

save() → {this}

- - - - - - -
- Saves entity - executes SQL, but doesn't commit the transaction on its own -
- - - - - - - - - - - - - -
- - - - - - - - -
Overrides:
-
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - - - - - -

setContent(content, optsopt)

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
content - - - - - - - -
opts - - -object - - - - - - <optional>
- - - - - -
-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
forceSave - - -object - - - - - - <optional>
- - - - - -
- - false - - will also save this BRevision entity
- -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/BackendScriptApi.html b/docs/backend_api/BackendScriptApi.html deleted file mode 100644 index 8aebca767..000000000 --- a/docs/backend_api/BackendScriptApi.html +++ /dev/null @@ -1,9164 +0,0 @@ - - - - - JSDoc: Class: BackendScriptApi - - - - - - - - - - -
- -

Class: BackendScriptApi

- - - - - - -
- -
- -

BackendScriptApi()

- - -
- -
-
- - - - - - -

new BackendScriptApi()

- - - - - - -
-

This is the main backend API interface for scripts. All the properties and methods are published in the "api" object -available in the JS backend notes. You can use e.g. api.log(api.startNote.title);

-
- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -

Members

- - - -

__private

- - - - -
- This object contains "at your risk" and "no BC guarantees" objects for advanced use cases. -
- - - - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
becca - - -Becca - - - - provides access to the backend in-memory object graph, see https://github.com/zadam/trilium/blob/master/src/becca/becca.js
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

axios :axios

- - - - -
- Axios library for HTTP requests. See https://axios-http.com for documentation -
- - - -
Type:
-
    -
  • - -axios - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - -
Deprecated:
  • use native (browser compatible) fetch() instead
- - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

currentNote :BNote

- - - - -
- Note where the script is currently executing. Don't mix this up with the concept of active note -
- - - -
Type:
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

dayjs :dayjs

- - - - -
- day.js library for date manipulation. See https://day.js.org for documentation -
- - - -
Type:
-
    -
  • - -dayjs - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

originEntity :AbstractBeccaEntity

- - - - -
- Entity whose event triggered this execution -
- - - -
Type:
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

sql :module:sql

- - - - -
- sql -
- - - -
Type:
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

startNote :BNote

- - - - -
- Note where the script started executing -
- - - -
Type:
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

xml2js :xml2js

- - - - -
- xml2js library for XML parsing. See https://github.com/Leonidas-from-XIV/node-xml2js for documentation -
- - - -
Type:
-
    -
  • - -xml2js - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -

Methods

- - - - - - - -

backupNow(backupName) → {Promise}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
backupName - - -string - - - - If the backupName is e.g. "now", then the backup will be written to "backup-now.db" file
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - resolves once the backup is finished -
- - - -
-
- Type -
-
- -Promise - - -
-
- - - - - - - - - - - - - -

createDataNote(parentNoteId, title, content) → {Object}

- - - - - - -
- Create data note - data in this context means object serializable to JSON. Created note will be of type 'code' and -JSON MIME type. See also createNewNote() for more options. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
parentNoteId - - -string - - - -
title - - -string - - - -
content - - -object - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- object having "note" and "branch" keys representing respective objects -
- - - -
-
- Type -
-
- -Object - - -
-
- - - - - - - - - - - - - -

createNewNote(params) → {Object}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
params - - -object - - - - -
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
parentNoteId - - -string - - - - - - - - - - - -
title - - -string - - - - - - - - - - - -
content - - -string -| - -Buffer - - - - - - - - - - - -
type - - -NoteType - - - - - - - - - - - - text, code, file, image, search, book, relationMap, canvas
mime - - -string - - - - - - <optional>
- - - - - -
- - value is derived from default mimes for type
isProtected - - -boolean - - - - - - <optional>
- - - - - -
- - false - -
isExpanded - - -boolean - - - - - - <optional>
- - - - - -
- - false - -
prefix - - -string - - - - - - <optional>
- - - - - -
- - '' - -
notePosition - - -int - - - - - - <optional>
- - - - - -
- - default is last existing notePosition in a parent + 10
- -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- object contains newly created entities note and branch -
- - - -
-
- Type -
-
- -Object - - -
-
- - - - - - - - - - - - - -

createNote(parentNoteId, title, contentopt, extraOptionsopt) → {Object}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
parentNoteId - - -string - - - - - - - - - - - - create new note under this parent
title - - -string - - - - - - - - - - - -
content - - -string - - - - - - <optional>
- - - - - -
- - "" - -
extraOptions - - -object - - - - - - <optional>
- - - - - -
- - {} - - -
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
json - - -boolean - - - - - - <optional>
- - - - - -
- - false - - should the note be JSON
isProtected - - -boolean - - - - - - <optional>
- - - - - -
- - false - - should the note be protected
type - - -string - - - - - - <optional>
- - - - - -
- - 'text' - - note type
mime - - -string - - - - - - <optional>
- - - - - -
- - 'text/html' - - MIME type of the note
attributes - - -Array.<object> - - - - - - <optional>
- - - - - -
- - [] - - attributes to be created for this note -
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
type - - -AttributeType - - - - - - - - - - attribute type - label, relation etc.
name - - -string - - - - - - - - - - attribute name
value - - -string - - - - - - <optional>
- - - - - -
attribute value
- -
- -
- - - - - - -
- - - - - - - - - - - - - - - - -
Deprecated:
  • please use createTextNote() with similar API for simpler use cases or createNewNote() for more complex needs
- - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- object contains newly created entities note and branch -
- - - -
-
- Type -
-
- -Object - - -
-
- - - - - - - - - - - - - -

createOrUpdateLauncher(opts) → {Object}

- - - - - - -
- Creates a new launcher to the launchbar. If the launcher (id) already exists, it will be updated. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
opts - - -object - - - - -
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
id - - -string - - - - - - - - - - - - id of the launcher, only alphanumeric at least 6 characters long
type - - -"note" -| - -"script" -| - -"customWidget" - - - - - - - - - - - - one of - * "note" - activating the launcher will navigate to the target note (specified in targetNoteId param) - * "script" - activating the launcher will execute the script (specified in scriptNoteId param) - * "customWidget" - the launcher will be rendered with a custom widget (specified in widgetNoteId param)
title - - -string - - - - - - - - - - - -
isVisible - - -boolean - - - - - - <optional>
- - - - - -
- - false - - if true, will be created in the "Visible launchers", otherwise in "Available launchers"
icon - - -string - - - - - - <optional>
- - - - - -
- - name of the boxicon to be used (e.g. "bx-time")
keyboardShortcut - - -string - - - - - - <optional>
- - - - - -
- - will activate the target note/script upon pressing, e.g. "ctrl+e"
targetNoteId - - -string - - - - - - <optional>
- - - - - -
- - for type "note"
scriptNoteId - - -string - - - - - - <optional>
- - - - - -
- - for type "script"
widgetNoteId - - -string - - - - - - <optional>
- - - - - -
- - for type "customWidget"
- -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Object - - -
-
- - - - - - - - - - - - - -

createTextNote(parentNoteId, title, content) → {Object}

- - - - - - -
- Create text note. See also createNewNote() for more options. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
parentNoteId - - -string - - - -
title - - -string - - - -
content - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - object having "note" and "branch" keys representing respective objects -
- - - -
-
- Type -
-
- -Object - - -
-
- - - - - - - - - - - - - -

ensureNoteIsAbsentFromParent(noteId, parentNoteId) → {void}

- - - - - - -
- If there's a branch between note and parent note, remove it. Otherwise, do nothing. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
noteId - - -string - - - -
parentNoteId - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -void - - -
-
- - - - - - - - - - - - - -

ensureNoteIsPresentInParent(noteId, parentNoteId, prefix) → {Object}

- - - - - - -
- If there's no branch between note and parent note, create one. Otherwise, do nothing. Returns the new or existing branch. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
noteId - - -string - - - -
parentNoteId - - -string - - - -
prefix - - -string - - - - if branch is created between note and parent note, set this prefix
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Object - - -
-
- - - - - - - - - - - - - -

escapeHtml(string) → {string}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
string - - -string - - - - to escape
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- escaped string -
- - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

exportSubtreeToZipFile(noteId, format, zipFilePath) → {Promise.<void>}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
noteId - - -string - - - -
format - - -string - - - - either 'html' or 'markdown'
zipFilePath - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Promise.<void> - - -
-
- - - - - - - - - - - - - -

getAppInfo() → {Object|*}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - object representing basic info about running Trilium version -
- - - -
-
- Type -
-
- -Object -| - -* - - -
-
- - - - - - - - - - - - - -

getAttachment(attachmentId) → {BAttachment|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
attachmentId - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttachment -| - -null - - -
-
- - - - - - - - - - - - - -

getAttribute(attributeId) → {BAttribute|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
attributeId - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttribute -| - -null - - -
-
- - - - - - - - - - - - - -

getAttribute(attributeId) → {BAttribute|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
attributeId - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BAttribute -| - -null - - -
-
- - - - - - - - - - - - - -

getBranch(branchId) → {BBranch|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
branchId - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BBranch -| - -null - - -
-
- - - - - - - - - - - - - -

getDayNote(date, rootNoteopt) → {BNote|null}

- - - - - - -
- Returns day note for given date. If such note doesn't exist, it is created. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
date - - -string - - - - - - - - - - in YYYY-MM-DD format
rootNote - - -BNote - - - - - - <optional>
- - - - - -
specify calendar root note, normally leave empty to use the default calendar
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

getEtapiToken(etapiTokenId) → {BEtapiToken|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
etapiTokenId - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BEtapiToken -| - -null - - -
-
- - - - - - - - - - - - - -

getEtapiTokens() → {Array.<BEtapiToken>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BEtapiToken> - - -
-
- - - - - - - - - - - - - -

getInstanceName() → {string|null}

- - - - - - -
- Instance name identifies particular Trilium instance. It can be useful for scripts -if some action needs to happen on only one specific instance. -
- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -string -| - -null - - -
-
- - - - - - - - - - - - - -

getMonthNote(date, rootNoteopt) → {BNote|null}

- - - - - - -
- Returns month note for given date. If such a note doesn't exist, it is created. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
date - - -string - - - - - - - - - - in YYYY-MM format
rootNote - - -BNote - - - - - - <optional>
- - - - - -
specify calendar root note, normally leave empty to use the default calendar
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

getNote(noteId) → {BNote|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
noteId - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

getNoteWithLabel(name, valueopt) → {BNote|null}

- - - - - - -
- Retrieves first note with given label name & value -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - - - - - attribute name
value - - -string - - - - - - <optional>
- - - - - -
attribute value
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

getNotesWithLabel(name, valueopt) → {Array.<BNote>}

- - - - - - -
- Retrieves notes with given label name & value -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
name - - -string - - - - - - - - - - attribute name
value - - -string - - - - - - <optional>
- - - - - -
attribute value
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BNote> - - -
-
- - - - - - - - - - - - - -

getOption(optionName) → {BOption|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionName - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BOption -| - -null - - -
-
- - - - - - - - - - - - - -

getOptions() → {Array.<BOption>}

- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BOption> - - -
-
- - - - - - - - - - - - - -

getRevision(revisionId) → {BRevision|null}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
revisionId - - -string - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BRevision -| - -null - - -
-
- - - - - - - - - - - - - -

getRootCalendarNote() → {BNote|null}

- - - - - - -
- Returns root note of the calendar. -
- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

getTodayNote(rootNoteopt) → {BNote|null}

- - - - - - -
- Returns today's day note. If such note doesn't exist, it is created. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
rootNote - - -BNote - - - - - - <optional>
- - - - - -
specify calendar root note, normally leave empty to use the default calendar
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

getWeekNote(date, optionsopt, rootNoteopt) → {BNote|null}

- - - - - - -
- Returns note for the first date of the week of the given date. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
date - - -string - - - - - - - - - - in YYYY-MM-DD format
options - - -object - - - - - - <optional>
- - - - - -
-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
startOfTheWeek - - -string - - - - - - <optional>
- - - - - -
- - monday - - either "monday" (default) or "sunday"
- -
rootNote - - -BNote - - - - - - <optional>
- - - - - -
specify calendar root note, normally leave empty to use the default calendar
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

getYearNote(year, rootNoteopt) → {BNote|null}

- - - - - - -
- Returns year note for given year. If such a note doesn't exist, it is created. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
year - - -string - - - - - - - - - - in YYYY format
rootNote - - -BNote - - - - - - <optional>
- - - - - -
specify calendar root note, normally leave empty to use the default calendar
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

log(message) → {void}

- - - - - - -
- Log given message to trilium logs and log pane in UI -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
message - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -void - - -
-
- - - - - - - - - - - - - -

randomString(length) → {string}

- - - - - - -
- Return randomly generated string of given length. This random string generation is NOT cryptographically secure. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
length - - -int - - - - of the string
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- random string -
- - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -

runOnFrontend(script, params) → {undefined}

- - - - - - -
- Executes given anonymous function on the frontend(s). -Internally, this serializes the anonymous function into string and sends it to frontend(s) via WebSocket. -Note that there can be multiple connected frontend instances (e.g. in different tabs). In such case, all -instances execute the given function. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
script - - -string - - - - script to be executed on the frontend
params - - -Array.<?> - - - - list of parameters to the anonymous function to be sent to frontend
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - no return value is provided. -
- - - -
-
- Type -
-
- -undefined - - -
-
- - - - - - - - - - - - - -

runOutsideOfSync(callback) → {Promise}

- - - - - - -
- Sync process can make data intermittently inconsistent. Scripts which require strong data consistency -can use this function to wait for a possible sync process to finish and prevent new sync process from starting -while it is running. - -Because this is an async process, the inner callback doesn't have automatic transaction handling, so in case -you need to make some DB changes, you need to surround your call with api.transactional(...) -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
callback - - -function - - - - function to be executed while sync process is not running
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - resolves once the callback is finished (callback is awaited) -
- - - -
-
- Type -
-
- -Promise - - -
-
- - - - - - - - - - - - - -

searchForNote(query, searchParamsopt) → {BNote|null}

- - - - - - -
- This is a powerful search method - you can search by attributes and their values, e.g.: -"#dateModified =* MONTH AND #log". See https://github.com/zadam/trilium/wiki/Search for full documentation for all options -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
query - - -string - - - - - - - - - -
searchParams - - -Object - - - - - - <optional>
- - - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -BNote -| - -null - - -
-
- - - - - - - - - - - - - -

searchForNotes(query, searchParamsopt) → {Array.<BNote>}

- - - - - - -
- This is a powerful search method - you can search by attributes and their values, e.g.: -"#dateModified =* MONTH AND #log". See https://github.com/zadam/trilium/wiki/Search for full documentation for all options -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
query - - -string - - - - - - - - - -
searchParams - - -Object - - - - - - <optional>
- - - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Array.<BNote> - - -
-
- - - - - - - - - - - - - -

setNoteToParent(noteId, prefix, parentNoteId) → {void}

- - - - - - -
- This method finds note by its noteId and prefix and either sets it to the given parentNoteId -or removes the branch (if parentNoteId is not given). - -This method looks similar to toggleNoteInParent() but differs because we're looking up branch by prefix. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
noteId - - -string - - - -
prefix - - -string - - - -
parentNoteId - - -string -| - -null - - - -
- - - - - - -
- - - - - - - - - - - - - - - - -
Deprecated:
  • this method is pretty confusing and serves specialized purpose only
- - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -void - - -
-
- - - - - - - - - - - - - -

sortNotes(parentNoteId, sortConfigopt) → {void}

- - - - - - -
- Sort child notes of a given note. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
parentNoteId - - -string - - - - - - - - - - this note's child notes will be sorted
sortConfig - - -object - - - - - - <optional>
- - - - - -
-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
sortBy - - -string - - - - - - <optional>
- - - - - -
- - title - - 'title', 'dateCreated', 'dateModified' or a label name - See https://github.com/zadam/trilium/wiki/Sorting for details.
reverse - - -boolean - - - - - - <optional>
- - - - - -
- - false - -
foldersFirst - - -boolean - - - - - - <optional>
- - - - - -
- - false - -
- -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -void - - -
-
- - - - - - - - - - - - - -

toggleNoteInParent(present, noteId, parentNoteId, prefix) → {void}

- - - - - - -
- Based on the value, either create or remove branch between note and parent note. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
present - - -boolean - - - - true if we want the branch to exist, false if we want it gone
noteId - - -string - - - -
parentNoteId - - -string - - - -
prefix - - -string - - - - if branch is created between note and parent note, set this prefix
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -void - - -
-
- - - - - - - - - - - - - -

transactional(func) → {any}

- - - - - - -
- This functions wraps code which is supposed to be running in transaction. If transaction already -exists, then we'll use that transaction. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
func - - -function - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- result of func callback -
- - - -
-
- Type -
-
- -any - - -
-
- - - - - - - - - - - - - -

unescapeHtml(string) → {string}

- - - - - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
string - - -string - - - - to unescape
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- unescaped string -
- - - -
-
- Type -
-
- -string - - -
-
- - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/assets/hierarchy.js b/docs/backend_api/assets/hierarchy.js new file mode 100644 index 000000000..7836cb59e --- /dev/null +++ b/docs/backend_api/assets/hierarchy.js @@ -0,0 +1 @@ +window.hierarchyData = "eJylk91uwyAMhd+Fa7cjdGl+XmWqIiCugkqgAmfSVOXd52y72GUibpA4Fuezjf0SKUbKov9QNxAJ7x4tuRhYeQm1HUHPKHox4l0vngSIhwuj6CvVgliS55D1OmfMbwat1QMGcuQwD9pkStrS8E//Ov/5nCeaPZv9vGUPyuNpMz79ChyYnB8TBs6skVB1ElTXwuXawPtVQn2R0HUKKlm3UFWqvq0gGlmUr9FE2k4zCzuzZCYnVgxNziyE+5nciDKm8dHsx3HPC3FJBzvtB/IHlwGR9NMNFB8Y9lN5pMqoIR75RJ7eMlx8bnt6YFJ5VcqICS1fhmN1bstZiv10+UCp6/oNzPWfkA==" \ No newline at end of file diff --git a/docs/backend_api/assets/highlight.css b/docs/backend_api/assets/highlight.css new file mode 100644 index 000000000..e16c26876 --- /dev/null +++ b/docs/backend_api/assets/highlight.css @@ -0,0 +1,50 @@ +:root { + --light-hl-0: #795E26; + --dark-hl-0: #DCDCAA; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #0000FF; + --dark-hl-2: #569CD6; + --light-hl-3: #A31515; + --dark-hl-3: #CE9178; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +pre, code { background: var(--code-background); } diff --git a/docs/backend_api/assets/icons.js b/docs/backend_api/assets/icons.js new file mode 100644 index 000000000..58882d76d --- /dev/null +++ b/docs/backend_api/assets/icons.js @@ -0,0 +1,18 @@ +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); + } + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/docs/backend_api/assets/icons.svg b/docs/backend_api/assets/icons.svg new file mode 100644 index 000000000..50ad5799d --- /dev/null +++ b/docs/backend_api/assets/icons.svg @@ -0,0 +1 @@ +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/backend_api/assets/main.js b/docs/backend_api/assets/main.js new file mode 100644 index 000000000..4f59cd955 --- /dev/null +++ b/docs/backend_api/assets/main.js @@ -0,0 +1,60 @@ +"use strict"; +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse"}; +"use strict";(()=>{var De=Object.create;var le=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ne=Object.getOwnPropertyNames;var Ve=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var qe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var je=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ne(e))!Be.call(t,i)&&i!==n&&le(t,i,{get:()=>e[i],enumerable:!(r=Fe(e,i))||r.enumerable});return t};var $e=(t,e,n)=>(n=t!=null?De(Ve(t)):{},je(e||!t||!t.__esModule?le(n,"default",{value:t,enumerable:!0}):n,t));var pe=qe((de,he)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,c],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[c+1]*i[d+1],c+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}s.str.length==1&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof de=="object"?he.exports=n():e.lunr=n()}(this,function(){return t})})()});window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse"};var ce=[];function G(t,e){ce.push({selector:e,constructor:t})}var J=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){ce.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!ze(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function ze(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var ue=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var ge=$e(pe(),1);async function H(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}async function fe(t,e){if(!window.searchData)return;let n=await H(window.searchData);t.data=n,t.index=ge.Index.load(n.index),e.classList.remove("loading"),e.classList.add("ready")}function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:document.documentElement.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{fe(e,t)}),fe(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{re(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),We(t,i,r,e)}function We(t,e,n,r){n.addEventListener("input",ue(()=>{Ue(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Je(e,t):i.key=="ArrowUp"?(me(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(me(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),re(t))})}function re(t){t.classList.remove("has-focus")}function Ue(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ye(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${ye(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=c+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function me(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Je(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),re(e)}}function ye(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ne(t.substring(s,o)),`${ne(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ne(t.substring(s))),i.join("")}var Ge={"&":"&","<":"<",">":">","'":"'",'"':"""};function ne(t){return t.replace(/[&<>"'"]/g,e=>Ge[e])}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var A="mousedown",Ee="mousemove",B="mouseup",X={x:0,y:0},xe=!1,ie=!1,Xe=!1,D=!1,Le=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Le?"is-mobile":"not-mobile");Le&&"ontouchstart"in document.documentElement&&(Xe=!0,A="touchstart",Ee="touchmove",B="touchend");document.addEventListener(A,t=>{ie=!0,D=!1;let e=A=="touchstart"?t.targetTouches[0]:t;X.y=e.pageY||0,X.x=e.pageX||0});document.addEventListener(Ee,t=>{if(ie&&!D){let e=A=="touchstart"?t.targetTouches[0]:t,n=X.x-(e.pageX||0),r=X.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{ie=!1});document.addEventListener("click",t=>{xe&&(t.preventDefault(),t.stopImmediatePropagation(),xe=!1)});var Y=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(A,n=>this.onDocumentPointerDown(n)),document.addEventListener(B,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var se;try{se=localStorage}catch{se={getItem(){return null},setItem(){}}}var C=se;var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var Z=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=C.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){C.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var oe=new Map,ae=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;C.setItem(this.key,e.toString())}},K=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(oe.has(i))s=oe.get(i);else{let o=C.getItem(i),a=o?o==="true":this.el.open;s=new ae(i,a),oe.set(i,s)}s.add(this.el)}};function Se(t){let e=C.getItem("tsd-theme")||"os";t.value=e,we(e),t.addEventListener("change",()=>{C.setItem("tsd-theme",t.value),we(t.value)})}function we(t){document.documentElement.dataset.theme=t}var ee;function Ce(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Te),Te())}async function Te(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await H(window.navigationData);ee=document.documentElement.dataset.base,ee.endsWith("/")||(ee+="/"),t.innerHTML="";for(let n of e)Ie(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ie(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',ke(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let c of t.children)Ie(c,l,i)}else ke(t,r,t.class)}function ke(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=ee+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else{let r=e.appendChild(document.createElement("span"));r.innerHTML='',r.appendChild(document.createElement("span")).textContent=t.text}}var te=document.documentElement.dataset.base;te.endsWith("/")||(te+="/");function Pe(){document.querySelector(".tsd-full-hierarchy")?Ye():document.querySelector(".tsd-hierarchy")&&Ze()}function Ye(){document.addEventListener("click",r=>{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=tt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function Ze(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Qe),Qe())}async function Qe(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await H(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),Ke(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function Ke(t,e,n){let r=e.roots.filter(i=>et(e,i,n));for(let i of r)t.appendChild(Oe(e,i,n))}function Oe(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let l=t.reflections[a],c=s.appendChild(document.createElement("a"));c.textContent=l.name,c.href=te+l.url,c.className=l.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=te+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let l=Oe(t,a,n,r);l&&o.appendChild(l)}}return r.delete(e),s}function et(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function tt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.setAttribute("viewBox","0 0 24 24"),t.setAttribute("fill","none"),t.innerHTML='',t}G(Y,"a[data-toggle]");G(K,".tsd-accordion");G(Z,".tsd-filter-item input[type=checkbox]");var _e=document.getElementById("tsd-theme");_e&&Se(_e);var nt=new J;Object.defineProperty(window,"app",{value:nt});ve();Ce();Pe();})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/backend_api/assets/navigation.js b/docs/backend_api/assets/navigation.js new file mode 100644 index 000000000..52ef90345 --- /dev/null +++ b/docs/backend_api/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "eJytlltLwzAYhv9Lr8XDxNPuJu5OnOhARCSkaaTBrqnJt6mI/9006yHdIf0qYVej7/vkSZZ+7OUnAv4F0TiKOWP0iOcgQHAdHUQsFVmieB6NX5oQjTUoyoDYNLHpb5MtKKTm8UImy4zrI+epYZGdrcMUFpmpvos8icaj3esl/I0uM2hXYBnVGrtC1e6udDK6/H39PWj3TQEoSxem07sRJxtU3+WipZWIl8BRzutocOUKizOOMxn3y5apsJ6WiFRUNGcpQtLmAmuumThRDrQQBOS7WazX1gmHVXbBOO9cYi5smQpraok4RVmAkIhTXefCalZMnKjizDQJ7kidcFhlF4z1XgmNOuI6Gdq4oqJ0lfzUvaZlCCU5acb8g/xssSIHrt4o20PutDbWOTt3ZCf1SB5Ib0o++LWZo0O4Vd6LtDNvELRu+LDTci7Ny7E0BN1p+fB3ctgBV3kfcmZf/CHQpuHDPtiXc6hvp+XHr9+kYfCmg7rJ8+/CGW9gvvXc4rKwQT6+ujg5G238glhwne1jTm5vZ0/TG3I3m0/J/Pl++tjSV1QJGu8bHNvN7lqnIzOR3JmkuVoJtvc/ekyZucQJ0UyJAoi51dsDrEaQ7fD/pm27RR9658i1+3N295F5fM3TYIIla7+R+fwBbqmgig==" \ No newline at end of file diff --git a/docs/backend_api/assets/search.js b/docs/backend_api/assets/search.js new file mode 100644 index 000000000..e707e53f0 --- /dev/null +++ b/docs/backend_api/assets/search.js @@ -0,0 +1 @@ +window.searchData = "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"; \ No newline at end of file diff --git a/docs/backend_api/assets/style.css b/docs/backend_api/assets/style.css new file mode 100644 index 000000000..7f80f3dc2 --- /dev/null +++ b/docs/backend_api/assets/style.css @@ -0,0 +1,1610 @@ +@layer typedoc { + :root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: #222; + --light-color-text-aside: #6e6e6e; + + --light-color-icon-background: var(--light-color-background); + --light-color-icon-text: var(--light-color-text); + + --light-color-comment-tag-text: var(--light-color-text); + --light-color-comment-tag: var(--light-color-background); + + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: #9f5f30; + --light-color-ts-method: #be3989; + --light-color-ts-reference: #ff4d82; + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var( + --light-color-ts-constructor + ); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: #c73c3c; + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-color-alert-note: #0969d9; + --light-color-alert-tip: #1a7f37; + --light-color-alert-important: #8250df; + --light-color-alert-warning: #9a6700; + --light-color-alert-caution: #cf222e; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-icon-text: var(--dark-color-text); + + --dark-color-comment-tag-text: var(--dark-color-text); + --dark-color-comment-tag: var(--dark-color-background); + + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: #ff984d; + --dark-color-ts-method: #ff4db8; + --dark-color-ts-reference: #ff4d82; + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: #ff6060; + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-color-alert-note: #0969d9; + --dark-color-alert-tip: #1a7f37; + --dark-color-alert-important: #8250df; + --dark-color-alert-warning: #9a6700; + --dark-color-alert-caution: #cf222e; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; + } + + @media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var( + --light-color-background-secondary + ); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + + --color-icon-background: var(--light-color-icon-background); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-alert-note: var(--light-color-alert-note); + --color-alert-tip: var(--light-color-alert-tip); + --color-alert-important: var(--light-color-alert-important); + --color-alert-warning: var(--light-color-alert-warning); + --color-alert-caution: var(--light-color-alert-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + } + + @media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var( + --dark-color-background-secondary + ); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + + --color-icon-background: var(--dark-color-icon-background); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-alert-note: var(--dark-color-alert-note); + --color-alert-tip: var(--dark-color-alert-tip); + --color-alert-important: var(--dark-color-alert-important); + --color-alert-warning: var(--dark-color-alert-warning); + --color-alert-caution: var(--dark-color-alert-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + } + + html { + color-scheme: var(--color-scheme); + } + + body { + margin: 0; + } + + :root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-note: var(--light-color-note); + --color-tip: var(--light-color-tip); + --color-important: var(--light-color-important); + --color-warning: var(--light-color-warning); + --color-caution: var(--light-color-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + + :root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-note: var(--dark-color-note); + --color-tip: var(--dark-color-tip); + --color-important: var(--dark-color-important); + --color-warning: var(--dark-color-warning); + --color-caution: var(--dark-color-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + + *:focus-visible, + .tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); + } + + .always-visible, + .always-visible .tsd-signatures { + display: inherit !important; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1.2; + } + + h1 { + font-size: 1.875rem; + margin: 0.67rem 0; + } + + h2 { + font-size: 1.5rem; + margin: 0.83rem 0; + } + + h3 { + font-size: 1.25rem; + margin: 1rem 0; + } + + h4 { + font-size: 1.05rem; + margin: 1.33rem 0; + } + + h5 { + font-size: 1rem; + margin: 1.5rem 0; + } + + h6 { + font-size: 0.875rem; + margin: 2.33rem 0; + } + + dl, + menu, + ol, + ul { + margin: 1em 0; + } + + dd { + margin: 0 0 0 34px; + } + + .container { + max-width: 1700px; + padding: 0 2rem; + } + + /* Footer */ + footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; + } + footer > p { + margin: 0 1em; + } + + .container-main { + margin: 0 auto; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); + } + + @keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } + } + @keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } + } + @keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } + } + @keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } + } + body { + background: var(--color-background); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); + } + + a { + color: var(--color-link); + text-decoration: none; + } + a:hover { + text-decoration: underline; + } + a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; + } + a.tsd-anchor-link { + color: var(--color-text); + } + + code, + pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; + } + + pre { + position: relative; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); + margin-bottom: 8px; + } + pre code { + padding: 0; + font-size: 100%; + } + pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; + } + pre:hover > button, + pre > button.visible { + opacity: 1; + } + + blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; + } + + .tsd-typography { + line-height: 1.333em; + } + .tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; + } + .tsd-typography .tsd-index-panel h3, + .tsd-index-panel .tsd-typography h3, + .tsd-typography h4, + .tsd-typography h5, + .tsd-typography h6 { + font-size: 1em; + } + .tsd-typography h5, + .tsd-typography h6 { + font-weight: normal; + } + .tsd-typography p, + .tsd-typography ul, + .tsd-typography ol { + margin: 1em 0; + } + .tsd-typography table { + border-collapse: collapse; + border: none; + } + .tsd-typography td, + .tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); + } + .tsd-typography thead, + .tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); + } + + .tsd-alert { + padding: 8px 16px; + margin-bottom: 16px; + border-left: 0.25em solid var(--alert-color); + } + .tsd-alert blockquote > :last-child, + .tsd-alert > :last-child { + margin-bottom: 0; + } + .tsd-alert-title { + color: var(--alert-color); + display: inline-flex; + align-items: center; + } + .tsd-alert-title span { + margin-left: 4px; + } + + .tsd-alert-note { + --alert-color: var(--color-alert-note); + } + .tsd-alert-tip { + --alert-color: var(--color-alert-tip); + } + .tsd-alert-important { + --alert-color: var(--color-alert-important); + } + .tsd-alert-warning { + --alert-color: var(--color-alert-warning); + } + .tsd-alert-caution { + --alert-color: var(--color-alert-caution); + } + + .tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); + } + .tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; + } + .tsd-breadcrumb a:hover { + text-decoration: underline; + } + .tsd-breadcrumb li { + display: inline; + } + .tsd-breadcrumb li:after { + content: " / "; + } + + .tsd-comment-tags { + display: flex; + flex-direction: column; + } + dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; + } + dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; + } + dl.tsd-comment-tag-group dd { + margin: 0; + } + code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; + } + h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; + } + + dl.tsd-comment-tag-group dd:before, + dl.tsd-comment-tag-group dd:after { + content: " "; + } + dl.tsd-comment-tag-group dd pre, + dl.tsd-comment-tag-group dd:after { + clear: both; + } + dl.tsd-comment-tag-group p { + margin: 0; + } + + .tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; + } + .tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; + } + + .tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; + } + .tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; + } + .tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + } + .tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; + } + .tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; + } + .tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; + } + .tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); + } + .tsd-checkbox-background { + fill: var(--color-accent); + } + input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); + } + + .settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; + } + + .tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; + } + + .tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; + } + + .tsd-hierarchy h4 label:hover span { + text-decoration: underline; + } + + .tsd-hierarchy { + list-style: square; + margin: 0; + } + .tsd-hierarchy-target { + font-weight: bold; + } + .tsd-hierarchy-toggle { + color: var(--color-link); + cursor: pointer; + } + + .tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); + } + .tsd-full-hierarchy, + .tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; + } + .tsd-full-hierarchy ul { + padding-left: 1.5rem; + } + .tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-full-hierarchy svg[data-dropdown] { + cursor: pointer; + } + .tsd-full-hierarchy svg[data-dropdown="false"] { + transform: rotate(-90deg); + } + .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul { + display: none; + } + + .tsd-panel-group.tsd-index-group { + margin-bottom: 0; + } + .tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; + } + @media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } + } + @media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } + } + .tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; + } + + .tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; + } + + .tsd-anchor { + position: relative; + top: -100px; + } + + .tsd-member { + position: relative; + } + .tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; + } + + .tsd-navigation.settings { + margin: 1rem 0; + } + .tsd-navigation > a, + .tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; + } + .tsd-navigation a, + .tsd-navigation summary > span, + .tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; + } + .tsd-navigation a.current, + .tsd-page-navigation a.current { + background: var(--color-active-menu-item); + } + .tsd-navigation a:hover, + .tsd-page-navigation a:hover { + text-decoration: underline; + } + .tsd-navigation ul, + .tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; + } + .tsd-navigation li, + .tsd-page-navigation li { + padding: 0; + max-width: 100%; + } + .tsd-navigation .tsd-nav-link { + display: none; + } + .tsd-nested-navigation { + margin-left: 3rem; + } + .tsd-nested-navigation > li > details { + margin-left: -1.5rem; + } + .tsd-small-nested-navigation { + margin-left: 1.5rem; + } + .tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; + } + + .tsd-page-navigation-section { + margin-left: 10px; + } + .tsd-page-navigation-section > summary { + padding: 0.25rem; + } + .tsd-page-navigation-section > div { + margin-left: 20px; + } + .tsd-page-navigation ul { + padding-left: 1.75rem; + } + + #tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; + } + #tsd-sidebar-links a:last-of-type { + margin-bottom: 0; + } + + a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ + } + .tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ + } + .tsd-accordion-summary, + .tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; + } + .tsd-accordion-summary a { + width: calc(100% - 1.5rem); + } + .tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; + } + .tsd-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; + vertical-align: text-top; + } + /* + We need to be careful to target the arrow indicating whether the accordion + is open, but not any other SVGs included in the details element. +*/ + .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h1 > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h2 > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h3 > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h4 > svg:first-child { + transform: rotate(-90deg); + } + .tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; + } + .tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; + } + + .tsd-no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; + } + .tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; + } + + .tsd-panel { + margin-bottom: 2.5rem; + } + .tsd-panel.tsd-member { + margin-bottom: 4rem; + } + .tsd-panel:empty { + display: none; + } + .tsd-panel > h1, + .tsd-panel > h2, + .tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; + } + .tsd-panel > h1.tsd-before-signature, + .tsd-panel > h2.tsd-before-signature, + .tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; + } + + .tsd-panel-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group details { + margin: 2rem 0; + } + .tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; + } + + #tsd-search { + transition: background-color 0.2s; + } + #tsd-search .title { + position: relative; + z-index: 2; + } + #tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; + } + #tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); + } + #tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; + } + #tsd-search .field input, + #tsd-search .title, + #tsd-toolbar-links a { + transition: opacity 0.2s; + } + #tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + } + #tsd-search .results li { + background-color: var(--color-background); + line-height: initial; + padding: 4px; + } + #tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); + } + #tsd-search .results li.state { + display: none; + } + #tsd-search .results li.current:not(.no-results), + #tsd-search .results li:hover:not(.no-results) { + background-color: var(--color-accent); + } + #tsd-search .results a { + display: flex; + align-items: center; + padding: 0.25rem; + box-sizing: border-box; + } + #tsd-search .results a:before { + top: 10px; + } + #tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; + } + #tsd-search.has-focus { + background-color: var(--color-accent); + } + #tsd-search.has-focus .field input { + top: 0; + opacity: 1; + } + #tsd-search.has-focus .title, + #tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; + } + #tsd-search.has-focus .results { + visibility: visible; + } + #tsd-search.loading .results li.state.loading { + display: block; + } + #tsd-search.failure .results li.state.failure { + display: block; + } + + #tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; + } + #tsd-toolbar-links a { + margin-left: 1.5rem; + } + #tsd-toolbar-links a:hover { + text-decoration: underline; + } + + .tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; + } + + .tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; + } + + .tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; + } + + .tsd-signature-type { + font-style: italic; + font-weight: normal; + } + + .tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; + } + .tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; + } + .tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; + } + .tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; + } + .tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; + } + + ul.tsd-parameter-list, + ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; + } + ul.tsd-parameter-list > li.tsd-parameter-signature, + ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; + } + ul.tsd-parameter-list h5, + ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; + } + .tsd-sources { + margin-top: 1rem; + font-size: 0.875em; + } + .tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; + } + .tsd-sources ul { + list-style: none; + padding: 0; + } + + .tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; + } + .tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; + } + .tsd-page-toolbar a.title { + font-weight: bold; + } + .tsd-page-toolbar a.title:hover { + text-decoration: underline; + } + .tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; + } + .tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; + } + .tsd-page-toolbar .table-cell:first-child { + width: 100%; + } + .tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; + } + + .tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: + opacity 0.1s, + background-color 0.2s; + vertical-align: bottom; + cursor: pointer; + } + .tsd-widget:hover { + opacity: 0.9; + } + .tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); + } + .tsd-widget.no-caption { + width: 40px; + } + .tsd-widget.no-caption:before { + margin: 0; + } + + .tsd-widget.options, + .tsd-widget.menu { + display: none; + } + input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; + } + input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; + } + + img { + max-width: 100%; + } + + .tsd-member-summary-name { + display: inline-flex; + align-items: center; + padding: 0.25rem; + text-decoration: none; + } + + .tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + color: var(--color-text); + } + + .tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; + } + + .tsd-member-summary-name:hover > .tsd-anchor-icon svg, + .tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; + } + + .deprecated { + text-decoration: line-through !important; + } + + .warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); + } + + .tsd-kind-project { + color: var(--color-ts-project); + } + .tsd-kind-module { + color: var(--color-ts-module); + } + .tsd-kind-namespace { + color: var(--color-ts-namespace); + } + .tsd-kind-enum { + color: var(--color-ts-enum); + } + .tsd-kind-enum-member { + color: var(--color-ts-enum-member); + } + .tsd-kind-variable { + color: var(--color-ts-variable); + } + .tsd-kind-function { + color: var(--color-ts-function); + } + .tsd-kind-class { + color: var(--color-ts-class); + } + .tsd-kind-interface { + color: var(--color-ts-interface); + } + .tsd-kind-constructor { + color: var(--color-ts-constructor); + } + .tsd-kind-property { + color: var(--color-ts-property); + } + .tsd-kind-method { + color: var(--color-ts-method); + } + .tsd-kind-reference { + color: var(--color-ts-reference); + } + .tsd-kind-call-signature { + color: var(--color-ts-call-signature); + } + .tsd-kind-index-signature { + color: var(--color-ts-index-signature); + } + .tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); + } + .tsd-kind-parameter { + color: var(--color-ts-parameter); + } + .tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); + } + .tsd-kind-accessor { + color: var(--color-ts-accessor); + } + .tsd-kind-get-signature { + color: var(--color-ts-get-signature); + } + .tsd-kind-set-signature { + color: var(--color-ts-set-signature); + } + .tsd-kind-type-alias { + color: var(--color-ts-type-alias); + } + + /* if we have a kind icon, don't color the text by kind */ + .tsd-kind-icon ~ span { + color: var(--color-text); + } + + * { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); + } + + *::-webkit-scrollbar { + width: 0.75rem; + } + + *::-webkit-scrollbar-track { + background: var(--color-icon-background); + } + + *::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); + } + + /* mobile */ + @media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } + } + + /* one sidebar */ + @media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } + } + @media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } + } + + /* two sidebars */ + @media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax( + 0, + 20rem + ); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } + } +} diff --git a/docs/backend_api/becca_entities_abstract_becca_entity.js.html b/docs/backend_api/becca_entities_abstract_becca_entity.js.html deleted file mode 100644 index d07a48e8f..000000000 --- a/docs/backend_api/becca_entities_abstract_becca_entity.js.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - JSDoc: Source: becca/entities/abstract_becca_entity.js - - - - - - - - - - -
- -

Source: becca/entities/abstract_becca_entity.js

- - - - - - -
-
-
"use strict";
-
-const utils = require('../../services/utils');
-const sql = require('../../services/sql');
-const entityChangesService = require('../../services/entity_changes');
-const eventService = require("../../services/events");
-const dateUtils = require("../../services/date_utils");
-const cls = require("../../services/cls");
-const log = require("../../services/log");
-const protectedSessionService = require("../../services/protected_session");
-const blobService = require("../../services/blob");
-
-let becca = null;
-
-/**
- * Base class for all backend entities.
- */
-class AbstractBeccaEntity {
-    /** @protected */
-    beforeSaving() {
-        if (!this[this.constructor.primaryKeyName]) {
-            this[this.constructor.primaryKeyName] = utils.newEntityId();
-        }
-    }
-
-    /** @protected */
-    getUtcDateChanged() {
-        return this.utcDateModified || this.utcDateCreated;
-    }
-
-    /**
-     * @protected
-     * @returns {Becca}
-     */
-    get becca() {
-        if (!becca) {
-            becca = require('../becca');
-        }
-
-        return becca;
-    }
-
-    /** @protected */
-    putEntityChange(isDeleted) {
-        entityChangesService.putEntityChange({
-            entityName: this.constructor.entityName,
-            entityId: this[this.constructor.primaryKeyName],
-            hash: this.generateHash(isDeleted),
-            isErased: false,
-            utcDateChanged: this.getUtcDateChanged(),
-            isSynced: this.constructor.entityName !== 'options' || !!this.isSynced
-        });
-    }
-
-    /**
-     * @protected
-     * @returns {string}
-     */
-    generateHash(isDeleted) {
-        let contentToHash = "";
-
-        for (const propertyName of this.constructor.hashedProperties) {
-            contentToHash += `|${this[propertyName]}`;
-        }
-
-        if (isDeleted) {
-            contentToHash += "|deleted";
-        }
-
-        return utils.hash(contentToHash).substr(0, 10);
-    }
-
-    /** @protected */
-    getPojoToSave() {
-        return this.getPojo();
-    }
-
-    /**
-     * @protected
-     * @abstract
-     */
-    getPojo() {
-        throw new Error(`Unimplemented getPojo() for entity '${this.constructor.name}'`)
-    }
-
-    /**
-     * Saves entity - executes SQL, but doesn't commit the transaction on its own
-     *
-     * @returns {this}
-     */
-    save(opts = {}) {
-        const entityName = this.constructor.entityName;
-        const primaryKeyName = this.constructor.primaryKeyName;
-
-        const isNewEntity = !this[primaryKeyName];
-
-        this.beforeSaving(opts);
-
-        const pojo = this.getPojoToSave();
-
-        sql.transactional(() => {
-            sql.upsert(entityName, primaryKeyName, pojo);
-
-            if (entityName === 'recent_notes') {
-                return;
-            }
-
-            this.putEntityChange(!!this.isDeleted);
-
-            if (!cls.isEntityEventsDisabled()) {
-                const eventPayload = {
-                    entityName,
-                    entity: this
-                };
-
-                if (isNewEntity) {
-                    eventService.emit(eventService.ENTITY_CREATED, eventPayload);
-                }
-
-                eventService.emit(eventService.ENTITY_CHANGED, eventPayload);
-            }
-        });
-
-        return this;
-    }
-
-    /** @protected */
-    _setContent(content, opts = {}) {
-        // client code asks to save entity even if blobId didn't change (something else was changed)
-        opts.forceSave = !!opts.forceSave;
-        opts.forceFrontendReload = !!opts.forceFrontendReload;
-
-        if (content === null || content === undefined) {
-            throw new Error(`Cannot set null content to ${this.constructor.primaryKeyName} '${this[this.constructor.primaryKeyName]}'`);
-        }
-
-        if (this.hasStringContent()) {
-            content = content.toString();
-        } else {
-            content = Buffer.isBuffer(content) ? content : Buffer.from(content);
-        }
-
-        const unencryptedContentForHashCalculation = this.#getUnencryptedContentForHashCalculation(content);
-
-        if (this.isProtected) {
-            if (protectedSessionService.isProtectedSessionAvailable()) {
-                content = protectedSessionService.encrypt(content);
-            } else {
-                throw new Error(`Cannot update content of blob since protected session is not available.`);
-            }
-        }
-
-        sql.transactional(() => {
-            const newBlobId = this.#saveBlob(content, unencryptedContentForHashCalculation, opts);
-            const oldBlobId = this.blobId;
-
-            if (newBlobId !== oldBlobId || opts.forceSave) {
-                this.blobId = newBlobId;
-                this.save();
-
-                if (newBlobId !== oldBlobId) {
-                    this.#deleteBlobIfNotUsed(oldBlobId);
-                }
-            }
-        });
-    }
-
-    #deleteBlobIfNotUsed(oldBlobId) {
-        if (sql.getValue("SELECT 1 FROM notes WHERE blobId = ? LIMIT 1", [oldBlobId])) {
-            return;
-        }
-
-        if (sql.getValue("SELECT 1 FROM attachments WHERE blobId = ? LIMIT 1", [oldBlobId])) {
-            return;
-        }
-
-        if (sql.getValue("SELECT 1 FROM revisions WHERE blobId = ? LIMIT 1", [oldBlobId])) {
-            return;
-        }
-
-        sql.execute("DELETE FROM blobs WHERE blobId = ?", [oldBlobId]);
-        // blobs are not marked as erased in entity_changes, they are just purged completely
-        // this is because technically every keystroke can create a new blob, and there would be just too many
-        sql.execute("DELETE FROM entity_changes WHERE entityName = 'blobs' AND entityId = ?", [oldBlobId]);
-    }
-
-    #getUnencryptedContentForHashCalculation(unencryptedContent) {
-        if (this.isProtected) {
-            // a "random" prefix makes sure that the calculated hash/blobId is different for a decrypted/encrypted content
-            const encryptedPrefixSuffix = "t$[nvQg7q)&_ENCRYPTED_?M:Bf&j3jr_";
-            return Buffer.isBuffer(unencryptedContent)
-                ? Buffer.concat([Buffer.from(encryptedPrefixSuffix), unencryptedContent])
-                : `${encryptedPrefixSuffix}${unencryptedContent}`;
-        } else {
-            return unencryptedContent;
-        }
-    }
-
-    #saveBlob(content, unencryptedContentForHashCalculation, opts = {}) {
-        /*
-         * We're using the unencrypted blob for the hash calculation, because otherwise the random IV would
-         * cause every content blob to be unique which would balloon the database size (esp. with revisioning).
-         * This has minor security implications (it's easy to infer that given content is shared between different
-         * notes/attachments), but the trade-off comes out clearly positive.
-         */
-        const newBlobId = utils.hashedBlobId(unencryptedContentForHashCalculation);
-        const blobNeedsInsert = !sql.getValue('SELECT 1 FROM blobs WHERE blobId = ?', [newBlobId]);
-
-        if (!blobNeedsInsert) {
-            return newBlobId;
-        }
-
-        const pojo = {
-            blobId: newBlobId,
-            content: content,
-            dateModified: dateUtils.localNowDateTime(),
-            utcDateModified: dateUtils.utcNowDateTime()
-        };
-
-        sql.upsert("blobs", "blobId", pojo);
-
-        // we can't reuse blobId as an entity_changes hash, because this one has to be calculatable without having
-        // access to the decrypted content
-        const hash = blobService.calculateContentHash(pojo);
-
-        entityChangesService.putEntityChange({
-            entityName: 'blobs',
-            entityId: newBlobId,
-            hash: hash,
-            isErased: false,
-            utcDateChanged: pojo.utcDateModified,
-            isSynced: true,
-            // overriding componentId will cause the frontend to think the change is coming from a different component
-            // and thus reload
-            componentId: opts.forceFrontendReload ? utils.randomString(10) : null
-        });
-
-        eventService.emit(eventService.ENTITY_CHANGED, {
-            entityName: 'blobs',
-            entity: this
-        });
-
-        return newBlobId;
-    }
-
-    /**
-     * @protected
-     * @returns {string|Buffer}
-     */
-    _getContent() {
-        const row = sql.getRow(`SELECT content FROM blobs WHERE blobId = ?`, [this.blobId]);
-
-        if (!row) {
-            throw new Error(`Cannot find content for ${this.constructor.primaryKeyName} '${this[this.constructor.primaryKeyName]}', blobId '${this.blobId}'`);
-        }
-
-        return blobService.processContent(row.content, this.isProtected, this.hasStringContent());
-    }
-
-    /**
-     * Mark the entity as (soft) deleted. It will be completely erased later.
-     *
-     * This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
-     *
-     * @param [deleteId=null]
-     */
-    markAsDeleted(deleteId = null) {
-        const entityId = this[this.constructor.primaryKeyName];
-        const entityName = this.constructor.entityName;
-
-        this.utcDateModified = dateUtils.utcNowDateTime();
-
-        sql.execute(`UPDATE ${entityName} SET isDeleted = 1, deleteId = ?, utcDateModified = ?
-                           WHERE ${this.constructor.primaryKeyName} = ?`,
-            [deleteId, this.utcDateModified, entityId]);
-
-        if (this.dateModified) {
-            this.dateModified = dateUtils.localNowDateTime();
-
-            sql.execute(`UPDATE ${entityName} SET dateModified = ? WHERE ${this.constructor.primaryKeyName} = ?`,
-                [this.dateModified, entityId]);
-        }
-
-        log.info(`Marking ${entityName} ${entityId} as deleted`);
-
-        this.putEntityChange(true);
-
-        eventService.emit(eventService.ENTITY_DELETED, { entityName, entityId, entity: this });
-    }
-
-    markAsDeletedSimple() {
-        const entityId = this[this.constructor.primaryKeyName];
-        const entityName = this.constructor.entityName;
-
-        this.utcDateModified = dateUtils.utcNowDateTime();
-
-        sql.execute(`UPDATE ${entityName} SET isDeleted = 1, utcDateModified = ?
-                           WHERE ${this.constructor.primaryKeyName} = ?`,
-            [this.utcDateModified, entityId]);
-
-        log.info(`Marking ${entityName} ${entityId} as deleted`);
-
-        this.putEntityChange(true);
-
-        eventService.emit(eventService.ENTITY_DELETED, { entityName, entityId, entity: this });
-    }
-}
-
-module.exports = AbstractBeccaEntity;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/becca_entities_battachment.js.html b/docs/backend_api/becca_entities_battachment.js.html deleted file mode 100644 index 086365423..000000000 --- a/docs/backend_api/becca_entities_battachment.js.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - JSDoc: Source: becca/entities/battachment.js - - - - - - - - - - -
- -

Source: becca/entities/battachment.js

- - - - - - -
-
-
"use strict";
-
-const utils = require('../../services/utils');
-const dateUtils = require('../../services/date_utils');
-const AbstractBeccaEntity = require("./abstract_becca_entity");
-const sql = require("../../services/sql");
-const protectedSessionService = require("../../services/protected_session");
-const log = require("../../services/log");
-
-const attachmentRoleToNoteTypeMapping = {
-    'image': 'image'
-};
-
-/**
- * Attachment represent data related/attached to the note. Conceptually similar to attributes, but intended for
- * larger amounts of data and generally not accessible to the user.
- *
- * @extends AbstractBeccaEntity
- */
-class BAttachment extends AbstractBeccaEntity {
-    static get entityName() { return "attachments"; }
-    static get primaryKeyName() { return "attachmentId"; }
-    static get hashedProperties() { return ["attachmentId", "ownerId", "role", "mime", "title", "blobId", "utcDateScheduledForErasureSince"]; }
-
-    constructor(row) {
-        super();
-
-        if (!row.ownerId?.trim()) {
-            throw new Error("'ownerId' must be given to initialize a Attachment entity");
-        } else if (!row.role?.trim()) {
-            throw new Error("'role' must be given to initialize a Attachment entity");
-        } else if (!row.mime?.trim()) {
-            throw new Error("'mime' must be given to initialize a Attachment entity");
-        } else if (!row.title?.trim()) {
-            throw new Error("'title' must be given to initialize a Attachment entity");
-        }
-
-        /** @type {string} */
-        this.attachmentId = row.attachmentId;
-        /** 
-         * either noteId or revisionId to which this attachment belongs
-         * @type {string}
-         */
-        this.ownerId = row.ownerId;
-        /** @type {string} */
-        this.role = row.role;
-        /** @type {string} */
-        this.mime = row.mime;
-        /** @type {string} */
-        this.title = row.title;
-        /** @type {int} */
-        this.position = row.position;
-        /** @type {string} */
-        this.blobId = row.blobId;
-        /** @type {boolean} */
-        this.isProtected = !!row.isProtected;
-        /** @type {string} */
-        this.dateModified = row.dateModified;
-        /** @type {string} */
-        this.utcDateModified = row.utcDateModified;
-        /** @type {string} */
-        this.utcDateScheduledForErasureSince = row.utcDateScheduledForErasureSince;
-
-        /**
-         * optionally added to the entity
-         * @type {int}
-         */
-        this.contentLength = row.contentLength;
-
-        this.decrypt();
-    }
-
-    /** @returns {BAttachment} */
-    copy() {
-        return new BAttachment({
-            ownerId: this.ownerId,
-            role: this.role,
-            mime: this.mime,
-            title: this.title,
-            blobId: this.blobId,
-            isProtected: this.isProtected
-        });
-    }
-
-    /** @returns {BNote} */
-    getNote() {
-        return this.becca.notes[this.ownerId];
-    }
-
-    /** @returns {boolean} true if the note has string content (not binary) */
-    hasStringContent() {
-        return utils.isStringNote(this.type, this.mime);
-    }
-
-    isContentAvailable() {
-        return !this.attachmentId // new attachment which was not encrypted yet
-            || !this.isProtected
-            || protectedSessionService.isProtectedSessionAvailable()
-    }
-
-    getTitleOrProtected() {
-        return this.isContentAvailable() ? this.title : '[protected]';
-    }
-
-    decrypt() {
-        if (!this.isProtected || !this.attachmentId) {
-            this.isDecrypted = true;
-            return;
-        }
-
-        if (!this.isDecrypted && protectedSessionService.isProtectedSessionAvailable()) {
-            try {
-                this.title = protectedSessionService.decryptString(this.title);
-                this.isDecrypted = true;
-            }
-            catch (e) {
-                log.error(`Could not decrypt attachment ${this.attachmentId}: ${e.message} ${e.stack}`);
-            }
-        }
-    }
-
-    /** @returns {string|Buffer}  */
-    getContent() {
-        return this._getContent();
-    }
-
-    /**
-     * @param content
-     * @param {object} [opts]
-     * @param {object} [opts.forceSave=false] - will also save this BAttachment entity
-     * @param {object} [opts.forceFrontendReload=false] - override frontend heuristics on when to reload, instruct to reload
-     */
-    setContent(content, opts) {
-        this._setContent(content, opts);
-    }
-
-    /** @returns {{note: BNote, branch: BBranch}} */
-    convertToNote() {
-        if (this.type === 'search') {
-            throw new Error(`Note of type search cannot have child notes`);
-        }
-
-        if (!this.getNote()) {
-            throw new Error("Cannot find note of this attachment. It is possible that this is note revision's attachment. " +
-                "Converting note revision's attachments to note is not (yet) supported.");
-        }
-
-        if (!(this.role in attachmentRoleToNoteTypeMapping)) {
-            throw new Error(`Mapping from attachment role '${this.role}' to note's type is not defined`);
-        }
-
-        if (!this.isContentAvailable()) { // isProtected is the same for attachment
-            throw new Error(`Cannot convert protected attachment outside of protected session`);
-        }
-
-        const noteService = require('../../services/notes');
-
-        const { note, branch } = noteService.createNewNote({
-            parentNoteId: this.ownerId,
-            title: this.title,
-            type: attachmentRoleToNoteTypeMapping[this.role],
-            mime: this.mime,
-            content: this.getContent(),
-            isProtected: this.isProtected
-        });
-
-        this.markAsDeleted();
-
-        const parentNote = this.getNote();
-
-        if (this.role === 'image' && parentNote.type === 'text') {
-            const origContent = parentNote.getContent();
-            const oldAttachmentUrl = `api/attachments/${this.attachmentId}/image/`;
-            const newNoteUrl = `api/images/${note.noteId}/`;
-
-            const fixedContent = utils.replaceAll(origContent, oldAttachmentUrl, newNoteUrl);
-
-            if (fixedContent !== origContent) {
-                parentNote.setContent(fixedContent);
-            }
-
-            noteService.asyncPostProcessContent(note, fixedContent);
-        }
-
-        return { note, branch };
-    }
-
-    getFileName() {
-        const type = this.role === 'image' ? 'image' : 'file';
-
-        return utils.formatDownloadTitle(this.title, type, this.mime);
-    }
-
-    beforeSaving() {
-        super.beforeSaving();
-
-        if (this.position === undefined || this.position === null) {
-            this.position = 10 + sql.getValue(`SELECT COALESCE(MAX(position), 0)
-                                              FROM attachments
-                                              WHERE ownerId = ?`, [this.noteId]);
-        }
-
-        this.dateModified = dateUtils.localNowDateTime();
-        this.utcDateModified = dateUtils.utcNowDateTime();
-    }
-
-    getPojo() {
-        return {
-            attachmentId: this.attachmentId,
-            ownerId: this.ownerId,
-            role: this.role,
-            mime: this.mime,
-            title: this.title,
-            position: this.position,
-            blobId: this.blobId,
-            isProtected: !!this.isProtected,
-            isDeleted: false,
-            dateModified: this.dateModified,
-            utcDateModified: this.utcDateModified,
-            utcDateScheduledForErasureSince: this.utcDateScheduledForErasureSince,
-            contentLength: this.contentLength
-        };
-    }
-
-    getPojoToSave() {
-        const pojo = this.getPojo();
-        delete pojo.contentLength;
-
-        if (pojo.isProtected) {
-            if (this.isDecrypted) {
-                pojo.title = protectedSessionService.encrypt(pojo.title);
-            }
-            else {
-                // updating protected note outside of protected session means we will keep original ciphertexts
-                delete pojo.title;
-            }
-        }
-
-        return pojo;
-    }
-}
-
-module.exports = BAttachment;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/becca_entities_battribute.js.html b/docs/backend_api/becca_entities_battribute.js.html deleted file mode 100644 index 8adb978e8..000000000 --- a/docs/backend_api/becca_entities_battribute.js.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - JSDoc: Source: becca/entities/battribute.js - - - - - - - - - - -
- -

Source: becca/entities/battribute.js

- - - - - - -
-
-
"use strict";
-
-const BNote = require('./bnote');
-const AbstractBeccaEntity = require("./abstract_becca_entity");
-const sql = require("../../services/sql");
-const dateUtils = require("../../services/date_utils");
-const promotedAttributeDefinitionParser = require("../../services/promoted_attribute_definition_parser");
-const {sanitizeAttributeName} = require("../../services/sanitize_attribute_name");
-
-
-/**
- * There are currently only two types of attributes, labels or relations.
- * @typedef {"label" | "relation"} AttributeType
- */
-
-/**
- * Attribute is an abstract concept which has two real uses - label (key - value pair)
- * and relation (representing named relationship between source and target note)
- *
- * @extends AbstractBeccaEntity
- */
-class BAttribute extends AbstractBeccaEntity {
-    static get entityName() { return "attributes"; }
-    static get primaryKeyName() { return "attributeId"; }
-    static get hashedProperties() { return ["attributeId", "noteId", "type", "name", "value", "isInheritable"]; }
-
-    constructor(row) {
-        super();
-
-        if (!row) {
-            return;
-        }
-
-        this.updateFromRow(row);
-        this.init();
-    }
-
-    updateFromRow(row) {
-        this.update([
-            row.attributeId,
-            row.noteId,
-            row.type,
-            row.name,
-            row.value,
-            row.isInheritable,
-            row.position,
-            row.utcDateModified
-        ]);
-    }
-
-    update([attributeId, noteId, type, name, value, isInheritable, position, utcDateModified]) {
-        /** @type {string} */
-        this.attributeId = attributeId;
-        /** @type {string} */
-        this.noteId = noteId;
-        /** @type {AttributeType} */
-        this.type = type;
-        /** @type {string} */
-        this.name = name;
-        /** @type {int} */
-        this.position = position;
-        /** @type {string} */
-        this.value = value || "";
-        /** @type {boolean} */
-        this.isInheritable = !!isInheritable;
-        /** @type {string} */
-        this.utcDateModified = utcDateModified;
-
-        return this;
-    }
-
-    init() {
-        if (this.attributeId) {
-            this.becca.attributes[this.attributeId] = this;
-        }
-
-        if (!(this.noteId in this.becca.notes)) {
-            // entities can come out of order in sync, create skeleton which will be filled later
-            this.becca.addNote(this.noteId, new BNote({noteId: this.noteId}));
-        }
-
-        this.becca.notes[this.noteId].ownedAttributes.push(this);
-
-        const key = `${this.type}-${this.name.toLowerCase()}`;
-        this.becca.attributeIndex[key] = this.becca.attributeIndex[key] || [];
-        this.becca.attributeIndex[key].push(this);
-
-        const targetNote = this.targetNote;
-
-        if (targetNote) {
-            targetNote.targetRelations.push(this);
-        }
-    }
-
-    validate() {
-        if (!["label", "relation"].includes(this.type)) {
-            throw new Error(`Invalid attribute type '${this.type}' in attribute '${this.attributeId}' of note '${this.noteId}'`);
-        }
-
-        if (!this.name?.trim()) {
-            throw new Error(`Invalid empty name in attribute '${this.attributeId}' of note '${this.noteId}'`);
-        }
-
-        if (this.type === 'relation' && !(this.value in this.becca.notes)) {
-            throw new Error(`Cannot save relation '${this.name}' of note '${this.noteId}' since it targets not existing note '${this.value}'.`);
-        }
-    }
-
-    get isAffectingSubtree() {
-        return this.isInheritable
-            || (this.type === 'relation' && ['template', 'inherit'].includes(this.name));
-    }
-
-    get targetNoteId() { // alias
-        return this.type === 'relation' ? this.value : undefined;
-    }
-
-    isAutoLink() {
-        return this.type === 'relation' && ['internalLink', 'imageLink', 'relationMapLink', 'includeNoteLink'].includes(this.name);
-    }
-
-    get note() {
-        return this.becca.notes[this.noteId];
-    }
-
-    get targetNote() {
-        if (this.type === 'relation') {
-            return this.becca.notes[this.value];
-        }
-    }
-
-    /**
-     * @returns {BNote|null}
-     */
-    getNote() {
-        const note = this.becca.getNote(this.noteId);
-
-        if (!note) {
-            throw new Error(`Note '${this.noteId}' of attribute '${this.attributeId}', type '${this.type}', name '${this.name}' does not exist.`);
-        }
-
-        return note;
-    }
-
-    /**
-     * @returns {BNote|null}
-     */
-    getTargetNote() {
-        if (this.type !== 'relation') {
-            throw new Error(`Attribute '${this.attributeId}' is not a relation.`);
-        }
-
-        if (!this.value) {
-            return null;
-        }
-
-        return this.becca.getNote(this.value);
-    }
-
-    /**
-     * @returns {boolean}
-     */
-    isDefinition() {
-        return this.type === 'label' && (this.name.startsWith('label:') || this.name.startsWith('relation:'));
-    }
-
-    getDefinition() {
-        return promotedAttributeDefinitionParser.parse(this.value);
-    }
-
-    getDefinedName() {
-        if (this.type === 'label' && this.name.startsWith('label:')) {
-            return this.name.substr(6);
-        } else if (this.type === 'label' && this.name.startsWith('relation:')) {
-            return this.name.substr(9);
-        } else {
-            return this.name;
-        }
-    }
-
-    get isDeleted() {
-        return !(this.attributeId in this.becca.attributes);
-    }
-
-    beforeSaving(opts = {}) {
-        if (!opts.skipValidation) {
-            this.validate();
-        }
-
-        this.name = sanitizeAttributeName(this.name);
-
-        if (!this.value) {
-            // null value isn't allowed
-            this.value = "";
-        }
-
-        if (this.position === undefined || this.position === null) {
-            const maxExistingPosition = this.getNote().getAttributes()
-                .reduce((maxPosition, attr) => Math.max(maxPosition, attr.position || 0), 0);
-
-            this.position = maxExistingPosition + 10;
-        }
-
-        if (!this.isInheritable) {
-            this.isInheritable = false;
-        }
-
-        this.utcDateModified = dateUtils.utcNowDateTime();
-
-        super.beforeSaving();
-
-        this.becca.attributes[this.attributeId] = this;
-    }
-
-    getPojo() {
-        return {
-            attributeId: this.attributeId,
-            noteId: this.noteId,
-            type: this.type,
-            name: this.name,
-            position: this.position,
-            value: this.value,
-            isInheritable: this.isInheritable,
-            utcDateModified: this.utcDateModified,
-            isDeleted: false
-        };
-    }
-
-    createClone(type, name, value, isInheritable) {
-        return new BAttribute({
-            noteId: this.noteId,
-            type: type,
-            name: name,
-            value: value,
-            position: this.position,
-            isInheritable: isInheritable,
-            utcDateModified: this.utcDateModified
-        });
-    }
-}
-
-module.exports = BAttribute;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/becca_entities_bblob.js.html b/docs/backend_api/becca_entities_bblob.js.html deleted file mode 100644 index ec5a78fb5..000000000 --- a/docs/backend_api/becca_entities_bblob.js.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - JSDoc: Source: becca/entities/bblob.js - - - - - - - - - - -
- -

Source: becca/entities/bblob.js

- - - - - - -
-
-
class BBlob {
-    static get entityName() { return "blobs"; }
-    static get primaryKeyName() { return "blobId"; }
-    static get hashedProperties() { return ["blobId", "content"]; }
-
-    constructor(row) {
-        /** @type {string} */
-        this.blobId = row.blobId;
-        /** @type {string|Buffer} */
-        this.content = row.content;
-        /** @type {int} */
-        this.contentLength = row.contentLength;
-        /** @type {string} */
-        this.dateModified = row.dateModified;
-        /** @type {string} */
-        this.utcDateModified = row.utcDateModified;
-    }
-
-    getPojo() {
-        return {
-            blobId: this.blobId,
-            content: this.content,
-            contentLength: this.contentLength,
-            dateModified: this.dateModified,
-            utcDateModified: this.utcDateModified
-        };
-    }
-}
-
-module.exports = BBlob;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/becca_entities_bbranch.js.html b/docs/backend_api/becca_entities_bbranch.js.html deleted file mode 100644 index bd629550b..000000000 --- a/docs/backend_api/becca_entities_bbranch.js.html +++ /dev/null @@ -1,333 +0,0 @@ - - - - - JSDoc: Source: becca/entities/bbranch.js - - - - - - - - - - -
- -

Source: becca/entities/bbranch.js

- - - - - - -
-
-
"use strict";
-
-const BNote = require('./bnote');
-const AbstractBeccaEntity = require("./abstract_becca_entity");
-const dateUtils = require("../../services/date_utils");
-const utils = require("../../services/utils");
-const TaskContext = require("../../services/task_context");
-const cls = require("../../services/cls");
-const log = require("../../services/log");
-
-/**
- * Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple
- * parents.
- *
- * Note that you should not rely on the branch's identity, since it can change easily with a note's move.
- * Always check noteId instead.
- *
- * @extends AbstractBeccaEntity
- */
-class BBranch extends AbstractBeccaEntity {
-    static get entityName() { return "branches"; }
-    static get primaryKeyName() { return "branchId"; }
-    // notePosition is not part of hash because it would produce a lot of updates in case of reordering
-    static get hashedProperties() { return ["branchId", "noteId", "parentNoteId", "prefix"]; }
-
-    constructor(row) {
-        super();
-
-        if (!row) {
-            return;
-        }
-
-        this.updateFromRow(row);
-        this.init();
-    }
-
-    updateFromRow(row) {
-        this.update([
-            row.branchId,
-            row.noteId,
-            row.parentNoteId,
-            row.prefix,
-            row.notePosition,
-            row.isExpanded,
-            row.utcDateModified
-        ]);
-    }
-
-    update([branchId, noteId, parentNoteId, prefix, notePosition, isExpanded, utcDateModified]) {
-        /** @type {string} */
-        this.branchId = branchId;
-        /** @type {string} */
-        this.noteId = noteId;
-        /** @type {string} */
-        this.parentNoteId = parentNoteId;
-        /** @type {string|null} */
-        this.prefix = prefix;
-        /** @type {int} */
-        this.notePosition = notePosition;
-        /** @type {boolean} */
-        this.isExpanded = !!isExpanded;
-        /** @type {string} */
-        this.utcDateModified = utcDateModified;
-
-        return this;
-    }
-
-    init() {
-        if (this.branchId) {
-            this.becca.branches[this.branchId] = this;
-        }
-
-        this.becca.childParentToBranch[`${this.noteId}-${this.parentNoteId}`] = this;
-
-        const childNote = this.childNote;
-
-        if (!childNote.parentBranches.includes(this)) {
-            childNote.parentBranches.push(this);
-        }
-
-        if (this.noteId === 'root') {
-            return;
-        }
-
-        const parentNote = this.parentNote;
-
-        if (!childNote.parents.includes(parentNote)) {
-            childNote.parents.push(parentNote);
-        }
-
-        if (!parentNote.children.includes(childNote)) {
-            parentNote.children.push(childNote);
-        }
-    }
-
-    /** @returns {BNote} */
-    get childNote() {
-        if (!(this.noteId in this.becca.notes)) {
-            // entities can come out of order in sync/import, create skeleton which will be filled later
-            this.becca.addNote(this.noteId, new BNote({noteId: this.noteId}));
-        }
-
-        return this.becca.notes[this.noteId];
-    }
-
-    /** @returns {BNote} */
-    getNote() {
-        return this.childNote;
-    }
-
-    /** @returns {BNote|undefined} - root branch will have undefined parent, all other branches have to have a parent note */
-    get parentNote() {
-        if (!(this.parentNoteId in this.becca.notes) && this.parentNoteId !== 'none') {
-            // entities can come out of order in sync/import, create skeleton which will be filled later
-            this.becca.addNote(this.parentNoteId, new BNote({noteId: this.parentNoteId}));
-        }
-
-        return this.becca.notes[this.parentNoteId];
-    }
-
-    get isDeleted() {
-        return !(this.branchId in this.becca.branches);
-    }
-
-    /**
-     * Branch is weak when its existence should not hinder deletion of its note.
-     * As a result, note with only weak branches should be immediately deleted.
-     * An example is shared or bookmarked clones - they are created automatically and exist for technical reasons,
-     * not as user-intended actions. From user perspective, they don't count as real clones and for the purpose
-     * of deletion should not act as a clone.
-     *
-     * @returns {boolean}
-     */
-    get isWeak() {
-        return ['_share', '_lbBookmarks'].includes(this.parentNoteId);
-    }
-
-    /**
-     * Delete a branch. If this is a last note's branch, delete the note as well.
-     *
-     * @param {string} [deleteId] - optional delete identified
-     * @param {TaskContext} [taskContext]
-     *
-     * @returns {boolean} - true if note has been deleted, false otherwise
-     */
-    deleteBranch(deleteId, taskContext) {
-        if (!deleteId) {
-            deleteId = utils.randomString(10);
-        }
-
-        if (!taskContext) {
-            taskContext = new TaskContext('no-progress-reporting');
-        }
-
-        taskContext.increaseProgressCount();
-
-        const note = this.getNote();
-
-        if (!taskContext.noteDeletionHandlerTriggered) {
-            const parentBranches = note.getParentBranches();
-
-            if (parentBranches.length === 1 && parentBranches[0] === this) {
-                // needs to be run before branches and attributes are deleted and thus attached relations disappear
-                const handlers = require("../../services/handlers");
-                handlers.runAttachedRelations(note, 'runOnNoteDeletion', note);
-            }
-        }
-
-        if (this.noteId === 'root'
-            || this.noteId === cls.getHoistedNoteId()) {
-
-            throw new Error("Can't delete root or hoisted branch/note");
-        }
-
-        this.markAsDeleted(deleteId);
-
-        const notDeletedBranches = note.getStrongParentBranches();
-
-        if (notDeletedBranches.length === 0) {
-            for (const weakBranch of note.getParentBranches()) {
-                weakBranch.markAsDeleted(deleteId);
-            }
-
-            for (const childBranch of note.getChildBranches()) {
-                childBranch.deleteBranch(deleteId, taskContext);
-            }
-
-            // first delete children and then parent - this will show up better in recent changes
-
-            log.info(`Deleting note '${note.noteId}'`);
-
-            this.becca.notes[note.noteId].isBeingDeleted = true;
-
-            for (const attribute of note.getOwnedAttributes().slice()) {
-                attribute.markAsDeleted(deleteId);
-            }
-
-            for (const relation of note.getTargetRelations()) {
-                relation.markAsDeleted(deleteId);
-            }
-
-            for (const attachment of note.getAttachments()) {
-                attachment.markAsDeleted(deleteId);
-            }
-
-            note.markAsDeleted(deleteId);
-
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
-    beforeSaving() {
-        if (!this.noteId || !this.parentNoteId) {
-            throw new Error(`noteId and parentNoteId are mandatory properties for Branch`);
-        }
-
-        this.branchId = `${this.parentNoteId}_${this.noteId}`;
-
-        if (this.notePosition === undefined || this.notePosition === null) {
-            let maxNotePos = 0;
-
-            for (const childBranch of this.parentNote.getChildBranches()) {
-                if (maxNotePos < childBranch.notePosition
-                    && childBranch.noteId !== '_hidden' // hidden has a very large notePosition to always stay last
-                ) {
-                    maxNotePos = childBranch.notePosition;
-                }
-            }
-
-            this.notePosition = maxNotePos + 10;
-        }
-
-        if (!this.isExpanded) {
-            this.isExpanded = false;
-        }
-
-        if (!this.prefix?.trim()) {
-            this.prefix = null;
-        }
-
-        this.utcDateModified = dateUtils.utcNowDateTime();
-
-        super.beforeSaving();
-
-        this.becca.branches[this.branchId] = this;
-    }
-
-    getPojo() {
-        return {
-            branchId: this.branchId,
-            noteId: this.noteId,
-            parentNoteId: this.parentNoteId,
-            prefix: this.prefix,
-            notePosition: this.notePosition,
-            isExpanded: this.isExpanded,
-            isDeleted: false,
-            utcDateModified: this.utcDateModified
-        };
-    }
-
-    createClone(parentNoteId, notePosition) {
-        const existingBranch = this.becca.getBranchFromChildAndParent(this.noteId, parentNoteId);
-
-        if (existingBranch) {
-            existingBranch.notePosition = notePosition;
-            return existingBranch;
-        } else {
-            return new BBranch({
-                noteId: this.noteId,
-                parentNoteId: parentNoteId,
-                notePosition: notePosition,
-                prefix: this.prefix,
-                isExpanded: this.isExpanded
-            });
-        }
-    }
-}
-
-module.exports = BBranch;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/becca_entities_betapi_token.js.html b/docs/backend_api/becca_entities_betapi_token.js.html deleted file mode 100644 index 86fdd163a..000000000 --- a/docs/backend_api/becca_entities_betapi_token.js.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - JSDoc: Source: becca/entities/betapi_token.js - - - - - - - - - - -
- -

Source: becca/entities/betapi_token.js

- - - - - - -
-
-
"use strict";
-
-const dateUtils = require('../../services/date_utils');
-const AbstractBeccaEntity = require("./abstract_becca_entity");
-
-/**
- * EtapiToken is an entity representing token used to authenticate against Trilium REST API from client applications.
- * Used by:
- * - Trilium Sender
- * - ETAPI clients
- *
- * The format user is presented with is "<etapiTokenId>_<tokenHash>". This is also called "authToken" to distinguish it
- * from tokenHash and token.
- *
- * @extends AbstractBeccaEntity
- */
-class BEtapiToken extends AbstractBeccaEntity {
-    static get entityName() { return "etapi_tokens"; }
-    static get primaryKeyName() { return "etapiTokenId"; }
-    static get hashedProperties() { return ["etapiTokenId", "name", "tokenHash", "utcDateCreated", "utcDateModified", "isDeleted"]; }
-
-    constructor(row) {
-        super();
-
-        if (!row) {
-            return;
-        }
-
-        this.updateFromRow(row);
-        this.init();
-    }
-
-    updateFromRow(row) {
-        /** @type {string} */
-        this.etapiTokenId = row.etapiTokenId;
-        /** @type {string} */
-        this.name = row.name;
-        /** @type {string} */
-        this.tokenHash = row.tokenHash;
-        /** @type {string} */
-        this.utcDateCreated = row.utcDateCreated || dateUtils.utcNowDateTime();
-        /** @type {string} */
-        this.utcDateModified = row.utcDateModified || this.utcDateCreated;
-        /** @type {boolean} */
-        this.isDeleted = !!row.isDeleted;
-
-        if (this.etapiTokenId) {
-            this.becca.etapiTokens[this.etapiTokenId] = this;
-        }
-    }
-
-    init() {
-        if (this.etapiTokenId) {
-            this.becca.etapiTokens[this.etapiTokenId] = this;
-        }
-    }
-
-    getPojo() {
-        return {
-            etapiTokenId: this.etapiTokenId,
-            name: this.name,
-            tokenHash: this.tokenHash,
-            utcDateCreated: this.utcDateCreated,
-            utcDateModified: this.utcDateModified,
-            isDeleted: this.isDeleted
-        }
-    }
-
-    beforeSaving() {
-        this.utcDateModified = dateUtils.utcNowDateTime();
-
-        super.beforeSaving();
-
-        this.becca.etapiTokens[this.etapiTokenId] = this;
-    }
-}
-
-module.exports = BEtapiToken;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/becca_entities_bnote.js.html b/docs/backend_api/becca_entities_bnote.js.html deleted file mode 100644 index 51a90a0d8..000000000 --- a/docs/backend_api/becca_entities_bnote.js.html +++ /dev/null @@ -1,1779 +0,0 @@ - - - - - JSDoc: Source: becca/entities/bnote.js - - - - - - - - - - -
- -

Source: becca/entities/bnote.js

- - - - - - -
-
-
"use strict";
-
-const protectedSessionService = require('../../services/protected_session');
-const log = require('../../services/log');
-const sql = require('../../services/sql');
-const utils = require('../../services/utils');
-const dateUtils = require('../../services/date_utils');
-const AbstractBeccaEntity = require("./abstract_becca_entity");
-const BRevision = require("./brevision");
-const BAttachment = require("./battachment");
-const TaskContext = require("../../services/task_context");
-const dayjs = require("dayjs");
-const utc = require('dayjs/plugin/utc');
-const eventService = require("../../services/events");
-dayjs.extend(utc);
-
-const LABEL = 'label';
-const RELATION = 'relation';
-
-/**
- * There are many different Note types, some of which are entirely opaque to the
- * end user. Those types should be used only for checking against, they are
- * not for direct use.
- * @typedef {"file" | "image" | "search" | "noteMap" | "launcher" | "doc" | "contentWidget" | "text" | "relationMap" | "render" | "canvas" | "mermaid" | "book" | "webView" | "code"} NoteType
- */
-
-/**
- * @typedef {Object} NotePathRecord
- * @property {boolean} isArchived
- * @property {boolean} isInHoistedSubTree
- * @property {Array<string>} notePath
- * @property {boolean} isHidden
- */
-
-/**
- * Trilium's main entity, which can represent text note, image, code note, file attachment etc.
- *
- * @extends AbstractBeccaEntity
- */
-class BNote extends AbstractBeccaEntity {
-    static get entityName() { return "notes"; }
-    static get primaryKeyName() { return "noteId"; }
-    static get hashedProperties() { return ["noteId", "title", "isProtected", "type", "mime", "blobId"]; }
-
-    constructor(row) {
-        super();
-
-        if (!row) {
-            return;
-        }
-
-        this.updateFromRow(row);
-        this.init();
-    }
-
-    updateFromRow(row) {
-        this.update([
-            row.noteId,
-            row.title,
-            row.type,
-            row.mime,
-            row.isProtected,
-            row.blobId,
-            row.dateCreated,
-            row.dateModified,
-            row.utcDateCreated,
-            row.utcDateModified
-        ]);
-    }
-
-    update([noteId, title, type, mime, isProtected, blobId, dateCreated, dateModified, utcDateCreated, utcDateModified]) {
-        // ------ Database persisted attributes ------
-
-        /** @type {string} */
-        this.noteId = noteId;
-        /** @type {string} */
-        this.title = title;
-        /** @type {NoteType} */
-        this.type = type;
-        /** @type {string} */
-        this.mime = mime;
-        /** @type {boolean} */
-        this.isProtected = !!isProtected;
-        /** @type {string} */
-        this.blobId = blobId;
-        /** @type {string} */
-        this.dateCreated = dateCreated || dateUtils.localNowDateTime();
-        /** @type {string} */
-        this.dateModified = dateModified;
-        /** @type {string} */
-        this.utcDateCreated = utcDateCreated || dateUtils.utcNowDateTime();
-        /** @type {string} */
-        this.utcDateModified = utcDateModified;
-        /**
-         * set during the deletion operation, before it is completed (removed from becca completely)
-         * @type {boolean}
-         */
-        this.isBeingDeleted = false;
-
-        // ------ Derived attributes ------
-
-        /** @type {boolean} */
-        this.isDecrypted = !this.noteId || !this.isProtected;
-
-        this.decrypt();
-
-        /** @type {string|null} */
-        this.__flatTextCache = null;
-
-        return this;
-    }
-
-    init() {
-        /** @type {BBranch[]}
-         * @private */
-        this.parentBranches = [];
-        /** @type {BNote[]}
-         * @private */
-        this.parents = [];
-        /** @type {BNote[]}
-         * @private */
-        this.children = [];
-        /** @type {BAttribute[]}
-         * @private */
-        this.ownedAttributes = [];
-
-        /** @type {BAttribute[]|null}
-         * @private */
-        this.__attributeCache = null;
-        /** @type {BAttribute[]|null}
-         * @private */
-        this.__inheritableAttributeCache = null;
-
-        /** @type {BAttribute[]}
-         * @private */
-        this.targetRelations = [];
-
-        this.becca.addNote(this.noteId, this);
-
-        /** @type {BNote[]|null}
-         * @private */
-        this.__ancestorCache = null;
-
-        // following attributes are filled during searching in the database
-
-        /**
-         * size of the content in bytes
-         * @type {int|null}
-         * @private
-         */
-        this.contentSize = null;
-        /**
-         * size of the note content, attachment contents in bytes
-         * @type {int|null}
-         * @private
-         */
-        this.contentAndAttachmentsSize = null;
-        /**
-         * size of the note content, attachment contents and revision contents in bytes
-         * @type {int|null}
-         * @private
-         */
-        this.contentAndAttachmentsAndRevisionsSize = null;
-        /**
-         * number of note revisions for this note
-         * @type {int|null}
-         * @private
-         */
-        this.revisionCount = null;
-    }
-
-    isContentAvailable() {
-        return !this.noteId // new note which was not encrypted yet
-            || !this.isProtected
-            || protectedSessionService.isProtectedSessionAvailable()
-    }
-
-    getTitleOrProtected() {
-        return this.isContentAvailable() ? this.title : '[protected]';
-    }
-
-    /** @returns {BBranch[]} */
-    getParentBranches() {
-        return this.parentBranches;
-    }
-
-    /**
-     * Returns <i>strong</i> (as opposed to <i>weak</i>) parent branches. See isWeak for details.
-     *
-     * @returns {BBranch[]}
-     */
-    getStrongParentBranches() {
-        return this.getParentBranches().filter(branch => !branch.isWeak);
-    }
-
-    /**
-     * @returns {BBranch[]}
-     * @deprecated use getParentBranches() instead
-     */
-    getBranches() {
-        return this.parentBranches;
-    }
-
-    /** @returns {BNote[]} */
-    getParentNotes() {
-        return this.parents;
-    }
-
-    /** @returns {BNote[]} */
-    getChildNotes() {
-        return this.children;
-    }
-
-    /** @returns {boolean} */
-    hasChildren() {
-        return this.children && this.children.length > 0;
-    }
-
-    /** @returns {BBranch[]} */
-    getChildBranches() {
-        return this.children.map(childNote => this.becca.getBranchFromChildAndParent(childNote.noteId, this.noteId));
-    }
-
-    /*
-     * Note content has quite special handling - it's not a separate entity, but a lazily loaded
-     * part of Note entity with its own sync. Reasons behind this hybrid design has been:
-     *
-     * - content can be quite large, and it's not necessary to load it / fill memory for any note access even if we don't need a content, especially for bulk operations like search
-     * - changes in the note metadata or title should not trigger note content sync (so we keep separate utcDateModified and entity changes records)
-     * - but to the user note content and title changes are one and the same - single dateModified (so all changes must go through Note and content is not a separate entity)
-     */
-
-    /** @returns {string|Buffer}  */
-    getContent() {
-        return this._getContent();
-    }
-
-    /**
-     * @returns {*}
-     * @throws Error in case of invalid JSON */
-    getJsonContent() {
-        const content = this.getContent();
-
-        if (!content || !content.trim()) {
-            return null;
-        }
-
-        return JSON.parse(content);
-    }
-
-    /** @returns {*|null} valid object or null if the content cannot be parsed as JSON */
-    getJsonContentSafely() {
-        try {
-            return this.getJsonContent();
-        }
-        catch (e) {
-            return null;
-        }
-    }
-
-    /**
-     * @param content
-     * @param {object} [opts]
-     * @param {object} [opts.forceSave=false] - will also save this BNote entity
-     * @param {object} [opts.forceFrontendReload=false] - override frontend heuristics on when to reload, instruct to reload
-     */
-    setContent(content, opts) {
-        this._setContent(content, opts);
-
-        eventService.emit(eventService.NOTE_CONTENT_CHANGE, { entity: this });
-    }
-
-    setJsonContent(content) {
-        this.setContent(JSON.stringify(content, null, '\t'));
-    }
-
-    get dateCreatedObj() {
-        return this.dateCreated === null ? null : dayjs(this.dateCreated);
-    }
-
-    get utcDateCreatedObj() {
-        return this.utcDateCreated === null ? null : dayjs.utc(this.utcDateCreated);
-    }
-
-    get dateModifiedObj() {
-        return this.dateModified === null ? null : dayjs(this.dateModified);
-    }
-
-    get utcDateModifiedObj() {
-        return this.utcDateModified === null ? null : dayjs.utc(this.utcDateModified);
-    }
-
-    /** @returns {boolean} true if this note is the root of the note tree. Root note has "root" noteId */
-    isRoot() {
-        return this.noteId === 'root';
-    }
-
-    /** @returns {boolean} true if this note is of application/json content type */
-    isJson() {
-        return this.mime === "application/json";
-    }
-
-    /** @returns {boolean} true if this note is JavaScript (code or attachment) */
-    isJavaScript() {
-        return (this.type === "code" || this.type === "file" || this.type === 'launcher')
-            && (this.mime.startsWith("application/javascript")
-                || this.mime === "application/x-javascript"
-                || this.mime === "text/javascript");
-    }
-
-    /** @returns {boolean} true if this note is HTML */
-    isHtml() {
-        return ["code", "file", "render"].includes(this.type)
-            && this.mime === "text/html";
-    }
-
-    /** @returns {boolean} true if this note is an image */
-    isImage() {
-        return this.type === 'image'
-            || (this.type === 'file' && this.mime?.startsWith('image/'));
-    }
-
-    /** @deprecated use hasStringContent() instead */
-    isStringNote() {
-        return this.hasStringContent();
-    }
-
-    /** @returns {boolean} true if the note has string content (not binary) */
-    hasStringContent() {
-        return utils.isStringNote(this.type, this.mime);
-    }
-
-    /** @returns {string|null} JS script environment - either "frontend" or "backend" */
-    getScriptEnv() {
-        if (this.isHtml() || (this.isJavaScript() && this.mime.endsWith('env=frontend'))) {
-            return "frontend";
-        }
-
-        if (this.type === 'render') {
-            return "frontend";
-        }
-
-        if (this.isJavaScript() && this.mime.endsWith('env=backend')) {
-            return "backend";
-        }
-
-        return null;
-    }
-
-    /**
-     * Beware that the method must not create a copy of the array, but actually returns its internal array
-     * (for performance reasons)
-     *
-     * @param {string} [type] - (optional) attribute type to filter
-     * @param {string} [name] - (optional) attribute name to filter
-     * @returns {BAttribute[]} all note's attributes, including inherited ones
-     */
-    getAttributes(type, name) {
-        this.__validateTypeName(type, name);
-        this.__ensureAttributeCacheIsAvailable();
-
-        if (type && name) {
-            return this.__attributeCache.filter(attr => attr.name === name && attr.type === type);
-        }
-        else if (type) {
-            return this.__attributeCache.filter(attr => attr.type === type);
-        }
-        else if (name) {
-            return this.__attributeCache.filter(attr => attr.name === name);
-        }
-        else {
-            return this.__attributeCache;
-        }
-    }
-
-    /** @private */
-    __ensureAttributeCacheIsAvailable() {
-        if (!this.__attributeCache) {
-            this.__getAttributes([]);
-        }
-    }
-
-    /** @private */
-    __getAttributes(path) {
-        if (path.includes(this.noteId)) {
-            return [];
-        }
-
-        if (!this.__attributeCache) {
-            const parentAttributes = this.ownedAttributes.slice();
-            const newPath = [...path, this.noteId];
-
-            // inheritable attrs on root are typically not intended to be applied to hidden subtree #3537
-            if (this.noteId !== 'root' && this.noteId !== '_hidden') {
-                for (const parentNote of this.parents) {
-                    parentAttributes.push(...parentNote.__getInheritableAttributes(newPath));
-                }
-            }
-
-            const templateAttributes = [];
-
-            for (const ownedAttr of parentAttributes) { // parentAttributes so we process also inherited templates
-                if (ownedAttr.type === 'relation' && ['template', 'inherit'].includes(ownedAttr.name)) {
-                    const templateNote = this.becca.notes[ownedAttr.value];
-
-                    if (templateNote) {
-                        templateAttributes.push(
-                            ...templateNote.__getAttributes(newPath)
-                                // template attr is used as a marker for templates, but it's not meant to be inherited
-                                .filter(attr => !(attr.type === 'label' && (attr.name === 'template' || attr.name === 'workspacetemplate')))
-                        );
-                    }
-                }
-            }
-
-            this.__attributeCache = [];
-
-            const addedAttributeIds = new Set();
-
-            for (const attr of parentAttributes.concat(templateAttributes)) {
-                if (!addedAttributeIds.has(attr.attributeId)) {
-                    addedAttributeIds.add(attr.attributeId);
-
-                    this.__attributeCache.push(attr);
-                }
-            }
-
-            this.__inheritableAttributeCache = [];
-
-            for (const attr of this.__attributeCache) {
-                if (attr.isInheritable) {
-                    this.__inheritableAttributeCache.push(attr);
-                }
-            }
-        }
-
-        return this.__attributeCache;
-    }
-
-    /**
-     * @private
-     * @returns {BAttribute[]}
-     */
-    __getInheritableAttributes(path) {
-        if (path.includes(this.noteId)) {
-            return [];
-        }
-
-        if (!this.__inheritableAttributeCache) {
-            this.__getAttributes(path); // will refresh also this.__inheritableAttributeCache
-        }
-
-        return this.__inheritableAttributeCache;
-    }
-
-    __validateTypeName(type, name) {
-        if (type && type !== 'label' && type !== 'relation') {
-            throw new Error(`Unrecognized attribute type '${type}'. Only 'label' and 'relation' are possible values.`);
-        }
-
-        if (name) {
-            const firstLetter = name.charAt(0);
-            if (firstLetter === '#' || firstLetter === '~') {
-                throw new Error(`Detect '#' or '~' in the attribute's name. In the API, attribute names should be set without these characters.`);
-            }
-        }
-    }
-
-    /**
-     * @param type
-     * @param name
-     * @param [value]
-     * @returns {boolean}
-     */
-    hasAttribute(type, name, value = null) {
-        return !!this.getAttributes().find(attr =>
-            attr.name === name
-            && (value === undefined || value === null || attr.value === value)
-            && attr.type === type
-        );
-    }
-
-    getAttributeCaseInsensitive(type, name, value) {
-        name = name.toLowerCase();
-        value = value ? value.toLowerCase() : null;
-
-        return this.getAttributes().find(
-            attr => attr.name.toLowerCase() === name
-            && (!value || attr.value.toLowerCase() === value)
-            && attr.type === type);
-    }
-
-    getRelationTarget(name) {
-        const relation = this.getAttributes().find(attr => attr.name === name && attr.type === 'relation');
-
-        return relation ? relation.targetNote : null;
-    }
-
-    /**
-     * @param {string} name - label name
-     * @param {string} [value] - label value
-     * @returns {boolean} true if label exists (including inherited)
-     */
-    hasLabel(name, value) { return this.hasAttribute(LABEL, name, value); }
-
-    /**
-     * @param {string} name - label name
-     * @returns {boolean} true if label exists (including inherited) and does not have "false" value.
-     */
-    isLabelTruthy(name) {
-        const label = this.getLabel(name);
-
-        if (!label) {
-            return false;
-        }
-
-        return label && label.value !== 'false';
-    }
-
-    /**
-     * @param {string} name - label name
-     * @param {string} [value] - label value
-     * @returns {boolean} true if label exists (excluding inherited)
-     */
-    hasOwnedLabel(name, value) { return this.hasOwnedAttribute(LABEL, name, value); }
-
-    /**
-     * @param {string} name - relation name
-     * @param {string} [value] - relation value
-     * @returns {boolean} true if relation exists (including inherited)
-     */
-    hasRelation(name, value) { return this.hasAttribute(RELATION, name, value); }
-
-    /**
-     * @param {string} name - relation name
-     * @param {string} [value] - relation value
-     * @returns {boolean} true if relation exists (excluding inherited)
-     */
-    hasOwnedRelation(name, value) { return this.hasOwnedAttribute(RELATION, name, value); }
-
-    /**
-     * @param {string} name - label name
-     * @returns {BAttribute|null} label if it exists, null otherwise
-     */
-    getLabel(name) { return this.getAttribute(LABEL, name); }
-
-    /**
-     * @param {string} name - label name
-     * @returns {BAttribute|null} label if it exists, null otherwise
-     */
-    getOwnedLabel(name) { return this.getOwnedAttribute(LABEL, name); }
-
-    /**
-     * @param {string} name - relation name
-     * @returns {BAttribute|null} relation if it exists, null otherwise
-     */
-    getRelation(name) { return this.getAttribute(RELATION, name); }
-
-    /**
-     * @param {string} name - relation name
-     * @returns {BAttribute|null} relation if it exists, null otherwise
-     */
-    getOwnedRelation(name) { return this.getOwnedAttribute(RELATION, name); }
-
-    /**
-     * @param {string} name - label name
-     * @returns {string|null} label value if label exists, null otherwise
-     */
-    getLabelValue(name) { return this.getAttributeValue(LABEL, name); }
-
-    /**
-     * @param {string} name - label name
-     * @returns {string|null} label value if label exists, null otherwise
-     */
-    getOwnedLabelValue(name) { return this.getOwnedAttributeValue(LABEL, name); }
-
-    /**
-     * @param {string} name - relation name
-     * @returns {string|null} relation value if relation exists, null otherwise
-     */
-    getRelationValue(name) { return this.getAttributeValue(RELATION, name); }
-
-    /**
-     * @param {string} name - relation name
-     * @returns {string|null} relation value if relation exists, null otherwise
-     */
-    getOwnedRelationValue(name) { return this.getOwnedAttributeValue(RELATION, name); }
-
-    /**
-     * @param {string} type - attribute type (label, relation, etc.)
-     * @param {string} name - attribute name
-     * @param {string} [value] - attribute value
-     * @returns {boolean} true if note has an attribute with given type and name (excluding inherited)
-     */
-    hasOwnedAttribute(type, name, value) {
-        return !!this.getOwnedAttribute(type, name, value);
-    }
-
-    /**
-     * @param {string} type - attribute type (label, relation, etc.)
-     * @param {string} name - attribute name
-     * @returns {BAttribute} attribute of the given type and name. If there are more such attributes, first is returned.
-     *                       Returns null if there's no such attribute belonging to this note.
-     */
-    getAttribute(type, name) {
-        const attributes = this.getAttributes();
-
-        return attributes.find(attr => attr.name === name && attr.type === type);
-    }
-
-    /**
-     * @param {string} type - attribute type (label, relation, etc.)
-     * @param {string} name - attribute name
-     * @returns {string|null} attribute value of given type and name or null if no such attribute exists.
-     */
-    getAttributeValue(type, name) {
-        const attr = this.getAttribute(type, name);
-
-        return attr ? attr.value : null;
-    }
-
-    /**
-     * @param {string} type - attribute type (label, relation, etc.)
-     * @param {string} name - attribute name
-     * @returns {string|null} attribute value of given type and name or null if no such attribute exists.
-     */
-    getOwnedAttributeValue(type, name) {
-        const attr = this.getOwnedAttribute(type, name);
-
-        return attr ? attr.value : null;
-    }
-
-    /**
-     * @param {string} [name] - label name to filter
-     * @returns {BAttribute[]} all note's labels (attributes with type label), including inherited ones
-     */
-    getLabels(name) {
-        return this.getAttributes(LABEL, name);
-    }
-
-    /**
-     * @param {string} [name] - label name to filter
-     * @returns {string[]} all note's label values, including inherited ones
-     */
-    getLabelValues(name) {
-        return this.getLabels(name).map(l => l.value);
-    }
-
-    /**
-     * @param {string} [name] - label name to filter
-     * @returns {BAttribute[]} all note's labels (attributes with type label), excluding inherited ones
-     */
-    getOwnedLabels(name) {
-        return this.getOwnedAttributes(LABEL, name);
-    }
-
-    /**
-     * @param {string} [name] - label name to filter
-     * @returns {string[]} all note's label values, excluding inherited ones
-     */
-    getOwnedLabelValues(name) {
-        return this.getOwnedAttributes(LABEL, name).map(l => l.value);
-    }
-
-    /**
-     * @param {string} [name] - relation name to filter
-     * @returns {BAttribute[]} all note's relations (attributes with type relation), including inherited ones
-     */
-    getRelations(name) {
-        return this.getAttributes(RELATION, name);
-    }
-
-    /**
-     * @param {string} [name] - relation name to filter
-     * @returns {BAttribute[]} all note's relations (attributes with type relation), excluding inherited ones
-     */
-    getOwnedRelations(name) {
-        return this.getOwnedAttributes(RELATION, name);
-    }
-
-    /**
-     * Beware that the method must not create a copy of the array, but actually returns its internal array
-     * (for performance reasons)
-     *
-     * @param {string|null} [type] - (optional) attribute type to filter
-     * @param {string|null} [name] - (optional) attribute name to filter
-     * @param {string|null} [value] - (optional) attribute value to filter
-     * @returns {BAttribute[]} note's "owned" attributes - excluding inherited ones
-     */
-    getOwnedAttributes(type = null, name = null, value = null) {
-        this.__validateTypeName(type, name);
-
-        if (type && name && value !== undefined && value !== null) {
-            return this.ownedAttributes.filter(attr => attr.name === name && attr.value === value && attr.type === type);
-        }
-        else if (type && name) {
-            return this.ownedAttributes.filter(attr => attr.name === name && attr.type === type);
-        }
-        else if (type) {
-            return this.ownedAttributes.filter(attr => attr.type === type);
-        }
-        else if (name) {
-            return this.ownedAttributes.filter(attr => attr.name === name);
-        }
-        else {
-            return this.ownedAttributes;
-        }
-    }
-
-    /**
-     * @returns {BAttribute} attribute belonging to this specific note (excludes inherited attributes)
-     *
-     * This method can be significantly faster than the getAttribute()
-     */
-    getOwnedAttribute(type, name, value = null) {
-        const attrs = this.getOwnedAttributes(type, name, value);
-
-        return attrs.length > 0 ? attrs[0] : null;
-    }
-
-    get isArchived() {
-        return this.hasAttribute('label', 'archived');
-    }
-
-    areAllNotePathsArchived() {
-        // there's a slight difference between note being itself archived and all its note paths being archived
-        // - note is archived when it itself has an archived label or inherits it
-        // - note does not have or inherit archived label, but each note path contains a note with (non-inheritable)
-        //   archived label
-
-        const bestNotePathRecord = this.getSortedNotePathRecords()[0];
-
-        if (!bestNotePathRecord) {
-            throw new Error(`No note path available for note '${this.noteId}'`);
-        }
-
-        return bestNotePathRecord.isArchived;
-    }
-
-    hasInheritableArchivedLabel() {
-        for (const attr of this.getAttributes()) {
-            if (attr.name === 'archived' && attr.type === LABEL && attr.isInheritable) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    // will sort the parents so that the non-archived are first and archived at the end
-    // this is done so that the non-archived paths are always explored as first when looking for note path
-    sortParents() {
-        this.parentBranches.sort((a, b) => {
-            if (a.parentNote?.isArchived) {
-                return 1;
-            } else if (a.parentNote?.isHiddenCompletely()) {
-                return 1;
-            } else {
-                return 0;
-            }
-        });
-
-        this.parents = this.parentBranches
-            .map(branch => branch.parentNote)
-            .filter(note => !!note);
-    }
-
-    sortChildren() {
-        if (this.children.length === 0) {
-            return;
-        }
-
-        const becca = this.becca;
-
-        this.children.sort((a, b) => {
-            const aBranch = becca.getBranchFromChildAndParent(a.noteId, this.noteId);
-            const bBranch = becca.getBranchFromChildAndParent(b.noteId, this.noteId);
-
-            return (aBranch?.notePosition - bBranch?.notePosition) || 0;
-        });
-    }
-
-    /**
-     * This is used for:
-     * - fast searching
-     * - note similarity evaluation
-     *
-     * @returns {string} - returns flattened textual representation of note, prefixes and attributes
-     */
-    getFlatText() {
-        if (!this.__flatTextCache) {
-            this.__flatTextCache = `${this.noteId} ${this.type} ${this.mime} `;
-
-            for (const branch of this.parentBranches) {
-                if (branch.prefix) {
-                    this.__flatTextCache += `${branch.prefix} `;
-                }
-            }
-
-            this.__flatTextCache += `${this.title} `;
-
-            for (const attr of this.getAttributes()) {
-                // it's best to use space as separator since spaces are filtered from the search string by the tokenization into words
-                this.__flatTextCache += `${attr.type === 'label' ? '#' : '~'}${attr.name}`;
-
-                if (attr.value) {
-                    this.__flatTextCache += `=${attr.value}`;
-                }
-
-                this.__flatTextCache += ' ';
-            }
-
-            this.__flatTextCache = utils.normalize(this.__flatTextCache);
-        }
-
-        return this.__flatTextCache;
-    }
-
-    invalidateThisCache() {
-        this.__flatTextCache = null;
-
-        this.__attributeCache = null;
-        this.__inheritableAttributeCache = null;
-        this.__ancestorCache = null;
-    }
-
-    invalidateSubTree(path = []) {
-        if (path.includes(this.noteId)) {
-            return;
-        }
-
-        this.invalidateThisCache();
-
-        if (this.children.length || this.targetRelations.length) {
-            path = [...path, this.noteId];
-        }
-
-        for (const childNote of this.children) {
-            childNote.invalidateSubTree(path);
-        }
-
-        for (const targetRelation of this.targetRelations) {
-            if (targetRelation.name === 'template' || targetRelation.name === 'inherit') {
-                const note = targetRelation.note;
-
-                if (note) {
-                    note.invalidateSubTree(path);
-                }
-            }
-        }
-    }
-
-    getRelationDefinitions() {
-        return this.getLabels()
-            .filter(l => l.name.startsWith("relation:"));
-    }
-
-    getLabelDefinitions() {
-        return this.getLabels()
-            .filter(l => l.name.startsWith("relation:"));
-    }
-
-    isInherited() {
-        return !!this.targetRelations.find(rel => rel.name === 'template' || rel.name === 'inherit');
-    }
-
-    /** @returns {BNote[]} */
-    getSubtreeNotesIncludingTemplated() {
-        const set = new Set();
-
-        function inner(note) {
-            // _hidden is not counted as subtree for the purpose of inheritance
-            if (set.has(note) || note.noteId === '_hidden') {
-                return;
-            }
-
-            set.add(note);
-
-            for (const childNote of note.children) {
-                inner(childNote);
-            }
-
-            for (const targetRelation of note.targetRelations) {
-                if (targetRelation.name === 'template' || targetRelation.name === 'inherit') {
-                    const targetNote = targetRelation.note;
-
-                    if (targetNote) {
-                        inner(targetNote);
-                    }
-                }
-            }
-        }
-
-        inner(this);
-
-        return Array.from(set);
-    }
-
-    /** @returns {BNote[]} */
-    getSearchResultNotes() {
-        if (this.type !== 'search') {
-            return [];
-        }
-
-        try {
-            const searchService = require("../../services/search/services/search");
-            const {searchResultNoteIds} = searchService.searchFromNote(this);
-
-            const becca = this.becca;
-            return searchResultNoteIds
-                .map(resultNoteId => becca.notes[resultNoteId])
-                .filter(note => !!note);
-        }
-        catch (e) {
-            log.error(`Could not resolve search note ${this.noteId}: ${e.message}`);
-            return [];
-        }
-    }
-
-    /**
-     * @returns {{notes: BNote[], relationships: Array.<{parentNoteId: string, childNoteId: string}>}}
-     */
-    getSubtree({includeArchived = true, includeHidden = false, resolveSearch = false} = {}) {
-        const noteSet = new Set();
-        const relationships = []; // list of tuples parentNoteId -> childNoteId
-
-        function resolveSearchNote(searchNote) {
-            try {
-                for (const resultNote of searchNote.getSearchResultNotes()) {
-                    addSubtreeNotesInner(resultNote, searchNote);
-                }
-            }
-            catch (e) {
-                log.error(`Could not resolve search note ${searchNote?.noteId}: ${e.message}`);
-            }
-        }
-
-        function addSubtreeNotesInner(note, parentNote = null) {
-            if (note.noteId === '_hidden' && !includeHidden) {
-                return;
-            }
-
-            if (parentNote) {
-                // this needs to happen first before noteSet check to include all clone relationships
-                relationships.push({
-                    parentNoteId: parentNote.noteId,
-                    childNoteId: note.noteId
-                });
-            }
-
-            if (noteSet.has(note)) {
-                return;
-            }
-
-            if (!includeArchived && note.isArchived) {
-                return;
-            }
-
-            noteSet.add(note);
-
-            if (note.type === 'search') {
-                if (resolveSearch) {
-                    resolveSearchNote(note);
-                }
-            }
-            else {
-                for (const childNote of note.children) {
-                    addSubtreeNotesInner(childNote, note);
-                }
-            }
-        }
-
-        addSubtreeNotesInner(this);
-
-        return {
-            notes: Array.from(noteSet),
-            relationships
-        };
-    }
-
-    /** @returns {string[]} - includes the subtree root note as well */
-    getSubtreeNoteIds({includeArchived = true, includeHidden = false, resolveSearch = false} = {}) {
-        return this.getSubtree({includeArchived, includeHidden, resolveSearch})
-            .notes
-            .map(note => note.noteId);
-    }
-
-    /** @deprecated use getSubtreeNoteIds() instead */
-    getDescendantNoteIds() {
-        return this.getSubtreeNoteIds();
-    }
-
-    get parentCount() {
-        return this.parents.length;
-    }
-
-    get childrenCount() {
-        return this.children.length;
-    }
-
-    get labelCount() {
-        return this.getAttributes().filter(attr => attr.type === 'label').length;
-    }
-
-    get ownedLabelCount() {
-        return this.ownedAttributes.filter(attr => attr.type === 'label').length;
-    }
-
-    get relationCount() {
-        return this.getAttributes().filter(attr => attr.type === 'relation' && !attr.isAutoLink()).length;
-    }
-
-    get relationCountIncludingLinks() {
-        return this.getAttributes().filter(attr => attr.type === 'relation').length;
-    }
-
-    get ownedRelationCount() {
-        return this.ownedAttributes.filter(attr => attr.type === 'relation' && !attr.isAutoLink()).length;
-    }
-
-    get ownedRelationCountIncludingLinks() {
-        return this.ownedAttributes.filter(attr => attr.type === 'relation').length;
-    }
-
-    get targetRelationCount() {
-        return this.targetRelations.filter(attr => !attr.isAutoLink()).length;
-    }
-
-    get targetRelationCountIncludingLinks() {
-        return this.targetRelations.length;
-    }
-
-    get attributeCount() {
-        return this.getAttributes().length;
-    }
-
-    get ownedAttributeCount() {
-        return this.getOwnedAttributes().length;
-    }
-
-    /** @returns {BNote[]} */
-    getAncestors() {
-        if (!this.__ancestorCache) {
-            const noteIds = new Set();
-            this.__ancestorCache = [];
-
-            for (const parent of this.parents) {
-                if (noteIds.has(parent.noteId)) {
-                    continue;
-                }
-
-                this.__ancestorCache.push(parent);
-                noteIds.add(parent.noteId);
-
-                for (const ancestorNote of parent.getAncestors()) {
-                    if (!noteIds.has(ancestorNote.noteId)) {
-                        this.__ancestorCache.push(ancestorNote);
-                        noteIds.add(ancestorNote.noteId);
-                    }
-                }
-            }
-        }
-
-        return this.__ancestorCache;
-    }
-
-    /** @returns {string[]} */
-    getAncestorNoteIds() {
-        return this.getAncestors().map(note => note.noteId);
-    }
-
-    /** @returns {boolean} */
-    hasAncestor(ancestorNoteId) {
-        for (const ancestorNote of this.getAncestors()) {
-            if (ancestorNote.noteId === ancestorNoteId) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    isInHiddenSubtree() {
-        return this.noteId === '_hidden' || this.hasAncestor('_hidden');
-    }
-
-    /** @returns {BAttribute[]} */
-    getTargetRelations() {
-        return this.targetRelations;
-    }
-
-    /** @returns {BNote[]} - returns only notes which are templated, does not include their subtrees
-     *                     in effect returns notes which are influenced by note's non-inheritable attributes */
-    getInheritingNotes() {
-        const arr = [this];
-
-        for (const targetRelation of this.targetRelations) {
-            if (targetRelation.name === 'template' || targetRelation.name === 'inherit') {
-                const note = targetRelation.note;
-
-                if (note) {
-                    arr.push(note);
-                }
-            }
-        }
-
-        return arr;
-    }
-
-    getDistanceToAncestor(ancestorNoteId) {
-        if (this.noteId === ancestorNoteId) {
-            return 0;
-        }
-
-        let minDistance = 999999;
-
-        for (const parent of this.parents) {
-            minDistance = Math.min(minDistance, parent.getDistanceToAncestor(ancestorNoteId) + 1);
-        }
-
-        return minDistance;
-    }
-
-    /** @returns {BRevision[]} */
-    getRevisions() {
-        return sql.getRows("SELECT * FROM revisions WHERE noteId = ?", [this.noteId])
-            .map(row => new BRevision(row));
-    }
-
-    /** @returns {BAttachment[]} */
-    getAttachments(opts = {}) {
-        opts.includeContentLength = !!opts.includeContentLength;
-        // from testing, it looks like calculating length does not make a difference in performance even on large-ish DB
-        // given that we're always fetching attachments only for a specific note, we might just do it always
-
-        const query = opts.includeContentLength
-            ? `SELECT attachments.*, LENGTH(blobs.content) AS contentLength
-               FROM attachments 
-               JOIN blobs USING (blobId) 
-               WHERE ownerId = ? AND isDeleted = 0 
-               ORDER BY position`
-            : `SELECT * FROM attachments WHERE ownerId = ? AND isDeleted = 0 ORDER BY position`;
-
-        return sql.getRows(query, [this.noteId])
-            .map(row => new BAttachment(row));
-    }
-
-    /** @returns {BAttachment|null} */
-    getAttachmentById(attachmentId, opts = {}) {
-        opts.includeContentLength = !!opts.includeContentLength;
-
-        const query = opts.includeContentLength
-            ? `SELECT attachments.*, LENGTH(blobs.content) AS contentLength
-               FROM attachments 
-               JOIN blobs USING (blobId) 
-               WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`
-            : `SELECT * FROM attachments WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`;
-
-        return sql.getRows(query, [this.noteId, attachmentId])
-            .map(row => new BAttachment(row))[0];
-    }
-
-    /** @returns {BAttachment[]} */
-    getAttachmentsByRole(role) {
-        return sql.getRows(`
-                SELECT attachments.*
-                FROM attachments 
-                WHERE ownerId = ? 
-                  AND role = ?
-                  AND isDeleted = 0
-                ORDER BY position`, [this.noteId, role])
-            .map(row => new BAttachment(row));
-    }
-
-    /** @returns {BAttachment} */
-    getAttachmentByTitle(title) {
-        // cannot use SQL to filter by title since it can be encrypted
-        return this.getAttachments().filter(attachment => attachment.title === title)[0];
-    }
-
-    /**
-     * Gives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles)
-     *
-     * @returns {string[][]} - array of notePaths (each represented by array of noteIds constituting the particular note path)
-     */
-    getAllNotePaths() {
-        if (this.noteId === 'root') {
-            return [['root']];
-        }
-
-        const parentNotes = this.getParentNotes();
-
-        const notePaths = parentNotes.length === 1
-            ? parentNotes[0].getAllNotePaths() // optimization for the most common case
-            : parentNotes.flatMap(parentNote => parentNote.getAllNotePaths());
-
-        for (const notePath of notePaths) {
-            notePath.push(this.noteId);
-        }
-
-        return notePaths;
-    }
-
-    /**
-     * @param {string} [hoistedNoteId='root']
-     * @return {Array<NotePathRecord>}
-     */
-    getSortedNotePathRecords(hoistedNoteId = 'root') {
-        const isHoistedRoot = hoistedNoteId === 'root';
-
-        const notePaths = this.getAllNotePaths().map(path => ({
-            notePath: path,
-            isInHoistedSubTree: isHoistedRoot || path.includes(hoistedNoteId),
-            isArchived: path.some(noteId => this.becca.notes[noteId].isArchived),
-            isHidden: path.includes('_hidden')
-        }));
-
-        notePaths.sort((a, b) => {
-            if (a.isInHoistedSubTree !== b.isInHoistedSubTree) {
-                return a.isInHoistedSubTree ? -1 : 1;
-            } else if (a.isArchived !== b.isArchived) {
-                return a.isArchived ? 1 : -1;
-            } else if (a.isHidden !== b.isHidden) {
-                return a.isHidden ? 1 : -1;
-            } else {
-                return a.notePath.length - b.notePath.length;
-            }
-        });
-
-        return notePaths;
-    }
-
-    /**
-     * Returns a note path considered to be the "best"
-     *
-     * @param {string} [hoistedNoteId='root']
-     * @return {string[]} array of noteIds constituting the particular note path
-     */
-    getBestNotePath(hoistedNoteId = 'root') {
-        return this.getSortedNotePathRecords(hoistedNoteId)[0]?.notePath;
-    }
-
-    /**
-     * Returns a note path considered to be the "best"
-     *
-     * @param {string} [hoistedNoteId='root']
-     * @return {string} serialized note path (e.g. 'root/a1h315/js725h')
-     */
-    getBestNotePathString(hoistedNoteId = 'root') {
-        const notePath = this.getBestNotePath(hoistedNoteId);
-
-        return notePath?.join("/");
-    }
-
-    /**
-     * @return boolean - true if there's no non-hidden path, note is not cloned to the visible tree
-     */
-    isHiddenCompletely() {
-        if (this.noteId === 'root') {
-            return false;
-        }
-
-        for (const parentNote of this.parents) {
-            if (parentNote.noteId === 'root') {
-                return false;
-            } else if (parentNote.noteId === '_hidden') {
-                continue;
-            } else if (!parentNote.isHiddenCompletely()) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * @param ancestorNoteId
-     * @returns {boolean} - true if ancestorNoteId occurs in at least one of the note's paths
-     */
-    isDescendantOfNote(ancestorNoteId) {
-        const notePaths = this.getAllNotePaths();
-
-        return notePaths.some(path => path.includes(ancestorNoteId));
-    }
-
-    /**
-     * Update's given attribute's value or creates it if it doesn't exist
-     *
-     * @param {string} type - attribute type (label, relation, etc.)
-     * @param {string} name - attribute name
-     * @param {string} [value] - attribute value (optional)
-     */
-    setAttribute(type, name, value) {
-        const attributes = this.getOwnedAttributes();
-        const attr = attributes.find(attr => attr.type === type && attr.name === name);
-
-        value = value?.toString() || "";
-
-        if (attr) {
-            if (attr.value !== value) {
-                attr.value = value;
-                attr.save();
-            }
-        }
-        else {
-            const BAttribute = require("./battribute");
-
-            new BAttribute({
-                noteId: this.noteId,
-                type: type,
-                name: name,
-                value: value
-            }).save();
-        }
-    }
-
-    /**
-     * Removes given attribute name-value pair if it exists.
-     *
-     * @param {string} type - attribute type (label, relation, etc.)
-     * @param {string} name - attribute name
-     * @param {string} [value] - attribute value (optional)
-     */
-    removeAttribute(type, name, value) {
-        const attributes = this.getOwnedAttributes();
-
-        for (const attribute of attributes) {
-            if (attribute.type === type && attribute.name === name && (value === undefined || value === attribute.value)) {
-                attribute.markAsDeleted();
-            }
-        }
-    }
-
-    /**
-     * Adds a new attribute to this note. The attribute is saved and returned.
-     * See addLabel, addRelation for more specific methods.
-     *
-     * @param {string} type - attribute type (label / relation)
-     * @param {string} name - name of the attribute, not including the leading ~/#
-     * @param {string} [value] - value of the attribute - text for labels, target note ID for relations; optional.
-     * @param {boolean} [isInheritable=false]
-     * @param {int|null} [position]
-     * @returns {BAttribute}
-     */
-    addAttribute(type, name, value = "", isInheritable = false, position = null) {
-        const BAttribute = require("./battribute");
-
-        return new BAttribute({
-            noteId: this.noteId,
-            type: type,
-            name: name,
-            value: value,
-            isInheritable: isInheritable,
-            position: position
-        }).save();
-    }
-
-    /**
-     * Adds a new label to this note. The label attribute is saved and returned.
-     *
-     * @param {string} name - name of the label, not including the leading #
-     * @param {string} [value] - text value of the label; optional
-     * @param {boolean} [isInheritable=false]
-     * @returns {BAttribute}
-     */
-    addLabel(name, value = "", isInheritable = false) {
-        return this.addAttribute(LABEL, name, value, isInheritable);
-    }
-
-    /**
-     * Adds a new relation to this note. The relation attribute is saved and
-     * returned.
-     *
-     * @param {string} name - name of the relation, not including the leading ~
-     * @param {string} targetNoteId
-     * @param {boolean} [isInheritable=false]
-     * @returns {BAttribute}
-     */
-    addRelation(name, targetNoteId, isInheritable = false) {
-        return this.addAttribute(RELATION, name, targetNoteId, isInheritable);
-    }
-
-    /**
-     * Based on enabled, the attribute is either set or removed.
-     *
-     * @param {string} type - attribute type ('relation', 'label' etc.)
-     * @param {boolean} enabled - toggle On or Off
-     * @param {string} name - attribute name
-     * @param {string} [value] - attribute value (optional)
-     */
-    toggleAttribute(type, enabled, name, value) {
-        if (enabled) {
-            this.setAttribute(type, name, value);
-        }
-        else {
-            this.removeAttribute(type, name, value);
-        }
-    }
-
-    /**
-     * Based on enabled, label is either set or removed.
-     *
-     * @param {boolean} enabled - toggle On or Off
-     * @param {string} name - label name
-     * @param {string} [value] - label value (optional)
-     */
-    toggleLabel(enabled, name, value) { return this.toggleAttribute(LABEL, enabled, name, value); }
-
-    /**
-     * Based on enabled, relation is either set or removed.
-     *
-     * @param {boolean} enabled - toggle On or Off
-     * @param {string} name - relation name
-     * @param {string} [value] - relation value (noteId)
-     */
-    toggleRelation(enabled, name, value) { return this.toggleAttribute(RELATION, enabled, name, value); }
-
-    /**
-     * Update's given label's value or creates it if it doesn't exist
-     *
-     * @param {string} name - label name
-     * @param {string} [value] - label value
-     */
-    setLabel(name, value) { return this.setAttribute(LABEL, name, value); }
-
-    /**
-     * Update's given relation's value or creates it if it doesn't exist
-     *
-     * @param {string} name - relation name
-     * @param {string} value - relation value (noteId)
-     */
-    setRelation(name, value) { return this.setAttribute(RELATION, name, value); }
-
-    /**
-     * Remove label name-value pair, if it exists.
-     *
-     * @param {string} name - label name
-     * @param {string} [value] - label value
-     */
-    removeLabel(name, value) { return this.removeAttribute(LABEL, name, value); }
-
-    /**
-     * Remove the relation name-value pair, if it exists.
-     *
-     * @param {string} name - relation name
-     * @param {string} [value] - relation value (noteId)
-     */
-    removeRelation(name, value) { return this.removeAttribute(RELATION, name, value); }
-
-    searchNotesInSubtree(searchString) {
-        const searchService = require("../../services/search/services/search");
-
-        return searchService.searchNotes(searchString);
-    }
-
-    searchNoteInSubtree(searchString) {
-        return this.searchNotesInSubtree(searchString)[0];
-    }
-
-    /**
-     * @param parentNoteId
-     * @returns {{success: boolean, message: string, branchId: string, notePath: string}}
-     */
-    cloneTo(parentNoteId) {
-        const cloningService = require("../../services/cloning");
-
-        const branch = this.becca.getNote(parentNoteId).getParentBranches()[0];
-
-        return cloningService.cloneNoteToBranch(this.noteId, branch.branchId);
-    }
-
-    isEligibleForConversionToAttachment(opts = {autoConversion: false}) {
-        if (this.type !== 'image' || !this.isContentAvailable() || this.hasChildren() || this.getParentBranches().length !== 1) {
-            return false;
-        }
-
-        const targetRelations = this.getTargetRelations().filter(relation => relation.name === 'imageLink');
-
-        if (opts.autoConversion && targetRelations.length === 0) {
-            return false;
-        } else if (targetRelations.length > 1) {
-            return false;
-        }
-
-        const parentNote = this.getParentNotes()[0]; // at this point note can have only one parent
-        const referencingNote = targetRelations[0]?.getNote();
-
-        if (referencingNote && parentNote !== referencingNote) {
-            return false;
-        } else if (parentNote.type !== 'text' || !parentNote.isContentAvailable()) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Some notes are eligible for conversion into an attachment of its parent, note must have these properties:
-     * - it has exactly one target relation
-     * - it has a relation from its parent note
-     * - it has no children
-     * - it has no clones
-     * - the parent is of type text
-     * - both notes are either unprotected or user is in protected session
-     *
-     * Currently, works only for image notes.
-     *
-     * In the future, this functionality might get more generic and some of the requirements relaxed.
-     *
-     * @params {Object} [opts]
-     * @params {bolean} [opts.autoConversion=false} if true, the action is not triggered by user, but e.g. by migration,
-     *                                              and only perfect candidates will be migrated
-     *
-     * @returns {BAttachment|null} - null if note is not eligible for conversion
-     */
-    convertToParentAttachment(opts = {autoConversion: false}) {
-        if (!this.isEligibleForConversionToAttachment(opts)) {
-            return null;
-        }
-
-        const content = this.getContent();
-
-        const parentNote = this.getParentNotes()[0];
-        const attachment = parentNote.saveAttachment({
-            role: 'image',
-            mime: this.mime,
-            title: this.title,
-            content: content
-        });
-
-        let parentContent = parentNote.getContent();
-
-        const oldNoteUrl = `api/images/${this.noteId}/`;
-        const newAttachmentUrl = `api/attachments/${attachment.attachmentId}/image/`;
-
-        const fixedContent = utils.replaceAll(parentContent, oldNoteUrl, newAttachmentUrl);
-
-        parentNote.setContent(fixedContent);
-
-        const noteService = require("../../services/notes");
-        noteService.asyncPostProcessContent(parentNote, fixedContent); // to mark an unused attachment for deletion
-
-        this.deleteNote();
-
-        return attachment;
-    }
-
-    /**
-     * (Soft) delete a note and all its descendants.
-     *
-     * @param {string} [deleteId=null] - optional delete identified
-     * @param {TaskContext} [taskContext]
-     */
-    deleteNote(deleteId = null, taskContext = null) {
-        if (this.isDeleted) {
-            return;
-        }
-
-        if (!deleteId) {
-            deleteId = utils.randomString(10);
-        }
-
-        if (!taskContext) {
-            taskContext = new TaskContext('no-progress-reporting');
-        }
-
-        // needs to be run before branches and attributes are deleted and thus attached relations disappear
-        const handlers = require("../../services/handlers");
-        handlers.runAttachedRelations(this, 'runOnNoteDeletion', this);
-        taskContext.noteDeletionHandlerTriggered = true;
-
-        for (const branch of this.getParentBranches()) {
-            branch.deleteBranch(deleteId, taskContext);
-        }
-    }
-
-    decrypt() {
-        if (this.isProtected && !this.isDecrypted && protectedSessionService.isProtectedSessionAvailable()) {
-            try {
-                this.title = protectedSessionService.decryptString(this.title);
-                this.__flatTextCache = null;
-
-                this.isDecrypted = true;
-            }
-            catch (e) {
-                log.error(`Could not decrypt note ${this.noteId}: ${e.message} ${e.stack}`);
-            }
-        }
-    }
-
-    isLaunchBarConfig() {
-        return this.type === 'launcher' || ['_lbRoot', '_lbAvailableLaunchers', '_lbVisibleLaunchers'].includes(this.noteId);
-    }
-
-    isOptions() {
-        return this.noteId.startsWith("_options");
-    }
-
-    get isDeleted() {
-        // isBeingDeleted is relevant only in the transition period when the deletion process has begun, but not yet
-        // finished (note is still in becca)
-        return !(this.noteId in this.becca.notes) || this.isBeingDeleted;
-    }
-
-    /**
-     * @returns {BRevision|null}
-     */
-    saveRevision() {
-        return sql.transactional(() => {
-            let noteContent = this.getContent();
-
-            const revision = new BRevision({
-                noteId: this.noteId,
-                // title and text should be decrypted now
-                title: this.title,
-                type: this.type,
-                mime: this.mime,
-                isProtected: this.isProtected,
-                utcDateLastEdited: this.utcDateModified,
-                utcDateCreated: dateUtils.utcNowDateTime(),
-                utcDateModified: dateUtils.utcNowDateTime(),
-                dateLastEdited: this.dateModified,
-                dateCreated: dateUtils.localNowDateTime()
-            }, true);
-
-            revision.save(); // to generate revisionId, which is then used to save attachments
-
-            for (const noteAttachment of this.getAttachments()) {
-                const revisionAttachment = noteAttachment.copy();
-                revisionAttachment.ownerId = revision.revisionId;
-                revisionAttachment.setContent(noteAttachment.getContent(), {forceSave: true});
-
-                if (this.type === 'text') {
-                    // content is rewritten to point to the revision attachments
-                    noteContent = noteContent.replaceAll(`attachments/${noteAttachment.attachmentId}`,
-                        `attachments/${revisionAttachment.attachmentId}`);
-
-                    noteContent = noteContent.replaceAll(new RegExp(`href="[^"]*attachmentId=${noteAttachment.attachmentId}[^"]*"`, 'gi'),
-                        `href="api/attachments/${revisionAttachment.attachmentId}/download"`);
-                }
-            }
-
-            revision.setContent(noteContent);
-
-            return revision;
-        });
-    }
-
-    /**
-     * @param {string} matchBy - choose by which property we detect if to update an existing attachment.
- *                               Supported values are either 'attachmentId' (default) or 'title'
-     * @returns {BAttachment}
-     */
-    saveAttachment({attachmentId, role, mime, title, content, position}, matchBy = 'attachmentId') {
-        if (!['attachmentId', 'title'].includes(matchBy)) {
-            throw new Error(`Unsupported value '${matchBy}' for matchBy param, has to be either 'attachmentId' or 'title'.`);
-        }
-
-        let attachment;
-
-        if (matchBy === 'title') {
-            attachment = this.getAttachmentByTitle(title);
-        } else if (matchBy === 'attachmentId' && attachmentId) {
-            attachment = this.becca.getAttachmentOrThrow(attachmentId);
-        }
-
-        attachment = attachment || new BAttachment({
-            ownerId: this.noteId,
-            title,
-            role,
-            mime,
-            isProtected: this.isProtected,
-            position
-        });
-
-        content = content || "";
-        attachment.setContent(content, {forceSave: true});
-
-        return attachment;
-    }
-
-    getFileName() {
-        return utils.formatDownloadTitle(this.title, this.type, this.mime);
-    }
-
-    beforeSaving() {
-        super.beforeSaving();
-
-        this.becca.addNote(this.noteId, this);
-
-        this.dateModified = dateUtils.localNowDateTime();
-        this.utcDateModified = dateUtils.utcNowDateTime();
-    }
-
-    getPojo() {
-        return {
-            noteId: this.noteId,
-            title: this.title,
-            isProtected: this.isProtected,
-            type: this.type,
-            mime: this.mime,
-            blobId: this.blobId,
-            isDeleted: false,
-            dateCreated: this.dateCreated,
-            dateModified: this.dateModified,
-            utcDateCreated: this.utcDateCreated,
-            utcDateModified: this.utcDateModified
-        };
-    }
-
-    getPojoToSave() {
-        const pojo = this.getPojo();
-
-        if (pojo.isProtected) {
-            if (this.isDecrypted) {
-                pojo.title = protectedSessionService.encrypt(pojo.title);
-            }
-            else {
-                // updating protected note outside of protected session means we will keep original ciphertexts
-                delete pojo.title;
-            }
-        }
-
-        return pojo;
-    }
-}
-
-module.exports = BNote;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/becca_entities_boption.js.html b/docs/backend_api/becca_entities_boption.js.html deleted file mode 100644 index c091c565b..000000000 --- a/docs/backend_api/becca_entities_boption.js.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - JSDoc: Source: becca/entities/boption.js - - - - - - - - - - -
- -

Source: becca/entities/boption.js

- - - - - - -
-
-
"use strict";
-
-const dateUtils = require('../../services/date_utils');
-const AbstractBeccaEntity = require("./abstract_becca_entity");
-
-/**
- * Option represents a name-value pair, either directly configurable by the user or some system property.
- *
- * @extends AbstractBeccaEntity
- */
-class BOption extends AbstractBeccaEntity {
-    static get entityName() { return "options"; }
-    static get primaryKeyName() { return "name"; }
-    static get hashedProperties() { return ["name", "value"]; }
-
-    constructor(row) {
-        super();
-
-        this.updateFromRow(row);
-        this.becca.options[this.name] = this;
-    }
-
-    updateFromRow(row) {
-        /** @type {string} */
-        this.name = row.name;
-        /** @type {string} */
-        this.value = row.value;
-        /** @type {boolean} */
-        this.isSynced = !!row.isSynced;
-        /** @type {string} */
-        this.utcDateModified = row.utcDateModified;
-    }
-
-    beforeSaving() {
-        super.beforeSaving();
-
-        this.utcDateModified = dateUtils.utcNowDateTime();
-    }
-
-    getPojo() {
-        return {
-            name: this.name,
-            value: this.value,
-            isSynced: this.isSynced,
-            utcDateModified: this.utcDateModified
-        }
-    }
-}
-
-module.exports = BOption;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/becca_entities_brecent_note.js.html b/docs/backend_api/becca_entities_brecent_note.js.html deleted file mode 100644 index 5f5afd413..000000000 --- a/docs/backend_api/becca_entities_brecent_note.js.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - JSDoc: Source: becca/entities/brecent_note.js - - - - - - - - - - -
- -

Source: becca/entities/brecent_note.js

- - - - - - -
-
-
"use strict";
-
-const dateUtils = require('../../services/date_utils');
-const AbstractBeccaEntity = require("./abstract_becca_entity");
-
-/**
- * RecentNote represents recently visited note.
- *
- * @extends AbstractBeccaEntity
- */
-class BRecentNote extends AbstractBeccaEntity {
-    static get entityName() { return "recent_notes"; }
-    static get primaryKeyName() { return "noteId"; }
-
-    constructor(row) {
-        super();
-
-        /** @type {string} */
-        this.noteId = row.noteId;
-        /** @type {string} */
-        this.notePath = row.notePath;
-        /** @type {string} */
-        this.utcDateCreated = row.utcDateCreated || dateUtils.utcNowDateTime();
-    }
-
-    getPojo() {
-        return {
-            noteId: this.noteId,
-            notePath: this.notePath,
-            utcDateCreated: this.utcDateCreated
-        }
-    }
-}
-
-module.exports = BRecentNote;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/becca_entities_brevision.js.html b/docs/backend_api/becca_entities_brevision.js.html deleted file mode 100644 index dc47085b0..000000000 --- a/docs/backend_api/becca_entities_brevision.js.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - JSDoc: Source: becca/entities/brevision.js - - - - - - - - - - -
- -

Source: becca/entities/brevision.js

- - - - - - -
-
-
"use strict";
-
-const protectedSessionService = require('../../services/protected_session');
-const utils = require('../../services/utils');
-const dateUtils = require('../../services/date_utils');
-const becca = require('../becca');
-const AbstractBeccaEntity = require("./abstract_becca_entity");
-const sql = require("../../services/sql");
-const BAttachment = require("./battachment");
-
-/**
- * Revision represents a snapshot of note's title and content at some point in the past.
- * It's used for seamless note versioning.
- *
- * @extends AbstractBeccaEntity
- */
-class BRevision extends AbstractBeccaEntity {
-    static get entityName() { return "revisions"; }
-    static get primaryKeyName() { return "revisionId"; }
-    static get hashedProperties() { return ["revisionId", "noteId", "title", "isProtected", "dateLastEdited", "dateCreated",
-                                            "utcDateLastEdited", "utcDateCreated", "utcDateModified", "blobId"]; }
-
-    constructor(row, titleDecrypted = false) {
-        super();
-
-        /** @type {string} */
-        this.revisionId = row.revisionId;
-        /** @type {string} */
-        this.noteId = row.noteId;
-        /** @type {string} */
-        this.type = row.type;
-        /** @type {string} */
-        this.mime = row.mime;
-        /** @type {boolean} */
-        this.isProtected = !!row.isProtected;
-        /** @type {string} */
-        this.title = row.title;
-        /** @type {string} */
-        this.blobId = row.blobId;
-        /** @type {string} */
-        this.dateLastEdited = row.dateLastEdited;
-        /** @type {string} */
-        this.dateCreated = row.dateCreated;
-        /** @type {string} */
-        this.utcDateLastEdited = row.utcDateLastEdited;
-        /** @type {string} */
-        this.utcDateCreated = row.utcDateCreated;
-        /** @type {string} */
-        this.utcDateModified = row.utcDateModified;
-        /** @type {int} */
-        this.contentLength = row.contentLength;
-
-        if (this.isProtected && !titleDecrypted) {
-            this.title = protectedSessionService.isProtectedSessionAvailable()
-                ? protectedSessionService.decryptString(this.title)
-                : "[protected]";
-        }
-    }
-
-    getNote() {
-        return becca.notes[this.noteId];
-    }
-
-    /** @returns {boolean} true if the note has string content (not binary) */
-    hasStringContent() {
-        return utils.isStringNote(this.type, this.mime);
-    }
-
-    isContentAvailable() {
-        return !this.revisionId // new note which was not encrypted yet
-            || !this.isProtected
-            || protectedSessionService.isProtectedSessionAvailable()
-    }
-
-    /*
-     * Note revision content has quite special handling - it's not a separate entity, but a lazily loaded
-     * part of Revision entity with its own sync. The reason behind this hybrid design is that
-     * content can be quite large, and it's not necessary to load it / fill memory for any note access even
-     * if we don't need a content, especially for bulk operations like search.
-     *
-     * This is the same approach as is used for Note's content.
-     */
-
-    /** @returns {string|Buffer} */
-    getContent() {
-        return this._getContent();
-    }
-
-    /**
-     * @returns {*}
-     * @throws Error in case of invalid JSON */
-    getJsonContent() {
-        const content = this.getContent();
-
-        if (!content || !content.trim()) {
-            return null;
-        }
-
-        return JSON.parse(content);
-    }
-
-    /** @returns {*|null} valid object or null if the content cannot be parsed as JSON */
-    getJsonContentSafely() {
-        try {
-            return this.getJsonContent();
-        }
-        catch (e) {
-            return null;
-        }
-    }
-
-    /**
-     * @param content
-     * @param {object} [opts]
-     * @param {object} [opts.forceSave=false] - will also save this BRevision entity
-     */
-    setContent(content, opts) {
-        this._setContent(content, opts);
-    }
-
-    /** @returns {BAttachment[]} */
-    getAttachments() {
-        return sql.getRows(`
-                SELECT attachments.*
-                FROM attachments 
-                WHERE ownerId = ? 
-                  AND isDeleted = 0`, [this.revisionId])
-            .map(row => new BAttachment(row));
-    }
-
-    /** @returns {BAttachment|null} */
-    getAttachmentById(attachmentId, opts = {}) {
-        opts.includeContentLength = !!opts.includeContentLength;
-
-        const query = opts.includeContentLength
-            ? `SELECT attachments.*, LENGTH(blobs.content) AS contentLength
-               FROM attachments 
-               JOIN blobs USING (blobId) 
-               WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`
-            : `SELECT * FROM attachments WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`;
-
-        return sql.getRows(query, [this.revisionId, attachmentId])
-            .map(row => new BAttachment(row))[0];
-    }
-
-    /** @returns {BAttachment[]} */
-    getAttachmentsByRole(role) {
-        return sql.getRows(`
-                SELECT attachments.*
-                FROM attachments 
-                WHERE ownerId = ? 
-                  AND role = ?
-                  AND isDeleted = 0
-                ORDER BY position`, [this.revisionId, role])
-            .map(row => new BAttachment(row));
-    }
-
-    /** @returns {BAttachment} */
-    getAttachmentByTitle(title) {
-        // cannot use SQL to filter by title since it can be encrypted
-        return this.getAttachments().filter(attachment => attachment.title === title)[0];
-    }
-
-    beforeSaving() {
-        super.beforeSaving();
-
-        this.utcDateModified = dateUtils.utcNowDateTime();
-    }
-
-    getPojo() {
-        return {
-            revisionId: this.revisionId,
-            noteId: this.noteId,
-            type: this.type,
-            mime: this.mime,
-            isProtected: this.isProtected,
-            title: this.title,
-            blobId: this.blobId,
-            dateLastEdited: this.dateLastEdited,
-            dateCreated: this.dateCreated,
-            utcDateLastEdited: this.utcDateLastEdited,
-            utcDateCreated: this.utcDateCreated,
-            utcDateModified: this.utcDateModified,
-            content: this.content, // used when retrieving full note revision to frontend
-            contentLength: this.contentLength
-        };
-    }
-
-    getPojoToSave() {
-        const pojo = this.getPojo();
-        delete pojo.content; // not getting persisted
-        delete pojo.contentLength; // not getting persisted
-
-        if (pojo.isProtected) {
-            if (protectedSessionService.isProtectedSessionAvailable()) {
-                pojo.title = protectedSessionService.encrypt(this.title);
-            }
-            else {
-                // updating protected note outside of protected session means we will keep original ciphertexts
-                delete pojo.title;
-            }
-        }
-
-        return pojo;
-    }
-}
-
-module.exports = BRevision;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/classes/becca_entities_abstract_becca_entity.default.html b/docs/backend_api/classes/becca_entities_abstract_becca_entity.default.html new file mode 100644 index 000000000..70ae1b216 --- /dev/null +++ b/docs/backend_api/classes/becca_entities_abstract_becca_entity.default.html @@ -0,0 +1,29 @@ +default | trilium

Base class for all backend entities.

+

Type Parameters

Hierarchy (View Summary)

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • opts: ContentOpts = {}

    Returns void

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    +

    Parameters

    • deleteId: null | string = null

    Returns void

diff --git a/docs/backend_api/classes/becca_entities_battachment.default.html b/docs/backend_api/classes/becca_entities_battachment.default.html new file mode 100644 index 000000000..382811e3c --- /dev/null +++ b/docs/backend_api/classes/becca_entities_battachment.default.html @@ -0,0 +1,56 @@ +default | trilium

Attachment represent data related/attached to the note. Conceptually similar to attributes, but intended for +larger amounts of data and generally not accessible to the user.

+

Hierarchy (View Summary)

Constructors

Properties

attachmentId?: string
blobId?: string
contentLength?: number

optionally added to the entity

+
dateCreated?: string
dateModified?: string
isDecrypted?: boolean
isProtected?: boolean
isSynced?: boolean
mime: string
noteId?: number
ownerId: string

either noteId or revisionId to which this attachment belongs

+
position?: number
role: string
title: string
type?: "file" | "image"
utcDateCreated: string
utcDateModified?: string
utcDateScheduledForErasureSince?: null | string

Accessors

Methods

  • Returns {
        attachmentId: undefined | string;
        blobId: undefined | string;
        contentLength: undefined | number;
        dateModified: undefined | string;
        isDeleted: boolean;
        isProtected: boolean;
        mime: string;
        ownerId: string;
        position: undefined | number;
        role: string;
        title: undefined | string;
        utcDateModified: undefined | string;
        utcDateScheduledForErasureSince: undefined | null | string;
    }

  • Returns {
        attachmentId: undefined | string;
        blobId: undefined | string;
        contentLength: undefined | number;
        dateModified: undefined | string;
        isDeleted: boolean;
        isProtected: boolean;
        mime: string;
        ownerId: string;
        position: undefined | number;
        role: string;
        title: undefined | string;
        utcDateModified: undefined | string;
        utcDateScheduledForErasureSince: undefined | null | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    +

    Parameters

    • deleteId: null | string = null

    Returns void

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • Optionalopts: ContentOpts

    Returns void

diff --git a/docs/backend_api/classes/becca_entities_battribute.default.html b/docs/backend_api/classes/becca_entities_battribute.default.html new file mode 100644 index 000000000..a34359a10 --- /dev/null +++ b/docs/backend_api/classes/becca_entities_battribute.default.html @@ -0,0 +1,53 @@ +default | trilium

Attribute is an abstract concept which has two real uses - label (key - value pair) +and relation (representing named relationship between source and target note)

+

Hierarchy (View Summary)

Constructors

Properties

attributeId: string
blobId?: string
dateCreated?: string
dateModified?: string
isInheritable: boolean
isProtected?: boolean
isSynced?: boolean
name: string
noteId: string
position: number
utcDateCreated: string
utcDateModified?: string
value: string

Accessors

Methods

  • Returns {
        attributeId: string;
        isDeleted: boolean;
        isInheritable: boolean;
        name: string;
        noteId: string;
        position: number;
        type: AttributeType;
        utcDateModified: undefined | string;
        value: string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    +

    Parameters

    • deleteId: null | string = null

    Returns void

diff --git a/docs/backend_api/classes/becca_entities_bblob.default.html b/docs/backend_api/classes/becca_entities_bblob.default.html new file mode 100644 index 000000000..2f692516b --- /dev/null +++ b/docs/backend_api/classes/becca_entities_bblob.default.html @@ -0,0 +1,34 @@ +default | trilium

Base class for all backend entities.

+

Hierarchy (View Summary)

Constructors

Properties

blobId?: string
content: string | Buffer<ArrayBufferLike>
contentLength: number
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Returns {
        blobId: undefined | string;
        content: null | string | Buffer<ArrayBufferLike>;
        contentLength: number;
        dateModified: undefined | string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    +

    Parameters

    • deleteId: null | string = null

    Returns void

diff --git a/docs/backend_api/classes/becca_entities_bbranch.default.html b/docs/backend_api/classes/becca_entities_bbranch.default.html new file mode 100644 index 000000000..6f6aa797e --- /dev/null +++ b/docs/backend_api/classes/becca_entities_bbranch.default.html @@ -0,0 +1,57 @@ +default | trilium

Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple +parents.

+

Note that you should not rely on the branch's identity, since it can change easily with a note's move. +Always check noteId instead.

+

Hierarchy (View Summary)

Constructors

Properties

blobId?: string
branchId?: string
dateCreated?: string
dateModified?: string
isExpanded: boolean
isProtected?: boolean
isSynced?: boolean
noteId: string
notePosition: number
parentNoteId: string
prefix: null | string
utcDateCreated: string
utcDateModified?: string

Accessors

  • get isWeak(): boolean
  • Branch is weak when its existence should not hinder deletion of its note. +As a result, note with only weak branches should be immediately deleted. +An example is shared or bookmarked clones - they are created automatically and exist for technical reasons, +not as user-intended actions. From user perspective, they don't count as real clones and for the purpose +of deletion should not act as a clone.

    +

    Returns boolean

Methods

  • Delete a branch. If this is a last note's branch, delete the note as well.

    +

    Parameters

    • OptionaldeleteId: string

      optional delete identified

      +
    • OptionaltaskContext: TaskContext

    Returns boolean

    true if note has been deleted, false otherwise

    +
  • Returns {
        branchId: undefined | string;
        isDeleted: boolean;
        isExpanded: boolean;
        noteId: string;
        notePosition: number;
        parentNoteId: string;
        prefix: null | string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    +

    Parameters

    • deleteId: null | string = null

    Returns void

diff --git a/docs/backend_api/classes/becca_entities_betapi_token.default.html b/docs/backend_api/classes/becca_entities_betapi_token.default.html new file mode 100644 index 000000000..7811fc953 --- /dev/null +++ b/docs/backend_api/classes/becca_entities_betapi_token.default.html @@ -0,0 +1,42 @@ +default | trilium

EtapiToken is an entity representing token used to authenticate against Trilium REST API from client applications. +Used by:

+
    +
  • Trilium Sender
  • +
  • ETAPI clients
  • +
+

The format user is presented with is "_". This is also called "authToken" to distinguish it +from tokenHash and token.

+

Hierarchy (View Summary)

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
etapiTokenId?: string
isProtected?: boolean
isSynced?: boolean
name: string
tokenHash: string
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Returns {
        etapiTokenId: undefined | string;
        isDeleted: boolean;
        name: string;
        tokenHash: string;
        utcDateCreated: string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    +

    Parameters

    • deleteId: null | string = null

    Returns void

diff --git a/docs/backend_api/classes/becca_entities_bnote.default.html b/docs/backend_api/classes/becca_entities_bnote.default.html new file mode 100644 index 000000000..74e685829 --- /dev/null +++ b/docs/backend_api/classes/becca_entities_bnote.default.html @@ -0,0 +1,347 @@ +default | trilium

Trilium's main entity, which can represent text note, image, code note, file attachment etc.

+

Hierarchy (View Summary)

Constructors

Properties

Accessors

Methods

__validateTypeName +_getContent +_setContent +addAttribute +addLabel +addRelation +areAllNotePathsArchived +beforeSaving +cloneTo +convertToParentAttachment +decrypt +deleteNote +eraseExcessRevisionSnapshots +generateHash +getAllNotePaths +getAncestorNoteIds +getAncestors +getAttachmentById +getAttachmentByTitle +getAttachments +getAttachmentsByRole +getAttribute +getAttributeCaseInsensitive +getAttributes +getAttributeValue +getBestNotePath +getBestNotePathString +getBranches +getChildBranches +getChildNotes +getContent +getDescendantNoteIds +getDistanceToAncestor +getFileName +getFlatText +getInheritingNotes +getJsonContent +getJsonContentSafely +getLabel +getLabelDefinitions +getLabels +getLabelValue +getLabelValues +getOwnedAttribute +getOwnedAttributes +getOwnedAttributeValue +getOwnedLabel +getOwnedLabels +getOwnedLabelValue +getOwnedLabelValues +getOwnedRelation +getOwnedRelations +getOwnedRelationValue +getParentBranches +getParentNotes +getPojo +getPojoToSave +getRelation +getRelationDefinitions +getRelations +getRelationTarget +getRelationValue +getRevisions +getScriptEnv +getSearchResultNotes +getSortedNotePathRecords +getStrongParentBranches +getSubtree +getSubtreeNoteIds +getSubtreeNotesIncludingTemplated +getTargetRelations +getTitleOrProtected +getUtcDateChanged +hasAncestor +hasAttribute +hasChildren +hasInheritableArchivedLabel +hasLabel +hasOwnedAttribute +hasOwnedLabel +hasOwnedRelation +hasRelation +hasStringContent +init +invalidateSubTree +invalidateThisCache +isContentAvailable +isDescendantOfNote +isEligibleForConversionToAttachment +isHiddenCompletely +isHtml +isImage +isInherited +isInHiddenSubtree +isJavaScript +isJson +isLabelTruthy +isLaunchBarConfig +isOptions +isRoot +isStringNote +markAsDeleted +markAsDeletedSimple +putEntityChange +removeAttribute +removeLabel +removeRelation +save +saveAttachment +saveRevision +searchNoteInSubtree +searchNotesInSubtree +setAttribute +setContent +setJsonContent +setLabel +setRelation +sortChildren +sortParents +toggleAttribute +toggleLabel +toggleRelation +update +updateFromRow +

Constructors

Properties

__flatTextCache: null | string
blobId?: string
children: default[]
contentAndAttachmentsAndRevisionsSize: null | number

size of the note content, attachment contents and revision contents in bytes

+
contentAndAttachmentsSize: null | number

size of the note content, attachment contents in bytes

+
contentSize: null | number

size of the content in bytes

+
dateCreated?: string
dateModified?: string
isBeingDeleted: boolean

set during the deletion operation, before it is completed (removed from becca completely).

+
isDecrypted: boolean
isProtected?: boolean
isSynced?: boolean
mime: string
noteId: string
ownedAttributes: default[]
parentBranches: default[]
parents: default[]
revisionCount: null | number

number of note revisions for this note

+
targetRelations: default[]
title: string
type:
    | "search"
    | "file"
    | "text"
    | "code"
    | "relationMap"
    | "render"
    | "book"
    | "mermaid"
    | "canvas"
    | "image"
    | "noteMap"
    | "launcher"
    | "doc"
    | "contentWidget"
    | "webView"
    | "mindMap"
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Parameters

    • Optionaltype: null | string
    • Optionalname: null | string

    Returns void

  • Adds a new attribute to this note. The attribute is saved and returned. +See addLabel, addRelation for more specific methods.

    +

    Parameters

    • type: AttributeType

      attribute type (label / relation)

      +
    • name: string

      name of the attribute, not including the leading ~/#

      +
    • value: string = ""

      value of the attribute - text for labels, target note ID for relations; optional.

      +
    • isInheritable: boolean = false
    • position: null | number = null

    Returns default

  • Adds a new label to this note. The label attribute is saved and returned.

    +

    Parameters

    • name: string

      name of the label, not including the leading #

      +
    • value: string = ""

      text value of the label; optional

      +
    • isInheritable: boolean = false

    Returns default

  • Adds a new relation to this note. The relation attribute is saved and +returned.

    +

    Parameters

    • name: string

      name of the relation, not including the leading ~

      +
    • targetNoteId: string
    • isInheritable: boolean = false

    Returns default

  • Some notes are eligible for conversion into an attachment of its parent, note must have these properties:

    +
      +
    • it has exactly one target relation
    • +
    • it has a relation from its parent note
    • +
    • it has no children
    • +
    • it has no clones
    • +
    • the parent is of type text
    • +
    • both notes are either unprotected or user is in protected session
    • +
    +

    Currently, works only for image notes.

    +

    In the future, this functionality might get more generic and some of the requirements relaxed.

    +

    Parameters

    • opts: ConvertOpts = ...

    Returns null | default

    null if note is not eligible for conversion

    +
  • (Soft) delete a note and all its descendants.

    +

    Parameters

    • deleteId: null | string = null

      optional delete identified

      +
    • taskContext: null | TaskContext = null

    Returns void

  • Gives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles)

    +

    Returns string[][]

    array of notePaths (each represented by array of noteIds constituting the particular note path)

    +
  • Parameters

    • type: string

      attribute type (label, relation, etc.)

      +
    • name: string

      attribute name

      +

    Returns null | default

    attribute of the given type and name. If there are more such attributes, first is returned. +Returns null if there's no such attribute belonging to this note.

    +
  • Parameters

    • type: string
    • name: string
    • Optionalvalue: null | string

    Returns undefined | default

  • Beware that the method must not create a copy of the array, but actually returns its internal array +(for performance reasons)

    +

    Parameters

    • Optionaltype: string

      (optional) attribute type to filter

      +
    • Optionalname: string

      (optional) attribute name to filter

      +

    Returns default[]

    all note's attributes, including inherited ones

    +
  • Parameters

    • type: string

      attribute type (label, relation, etc.)

      +
    • name: string

      attribute name

      +

    Returns null | string

    attribute value of given type and name or null if no such attribute exists.

    +
  • Returns a note path considered to be the "best"

    +

    Parameters

    • hoistedNoteId: string = 'root'

    Returns string[]

    array of noteIds constituting the particular note path

    +
  • Returns a note path considered to be the "best"

    +

    Parameters

    • hoistedNoteId: string = 'root'

    Returns string

    serialized note path (e.g. 'root/a1h315/js725h')

    +
  • Note content has quite special handling - it's not a separate entity, but a lazily loaded +part of Note entity with its own sync. Reasons behind this hybrid design has been:

    +
      +
    • content can be quite large, and it's not necessary to load it / fill memory for any note access even if we don't need a content, especially for bulk operations like search
    • +
    • changes in the note metadata or title should not trigger note content sync (so we keep separate utcDateModified and entity changes records)
    • +
    • but to the user note content and title changes are one and the same - single dateModified (so all changes must go through Note and content is not a separate entity)
    • +
    +

    Returns string | Buffer<ArrayBufferLike>

  • This is used for:

    +
      +
    • fast searching
    • +
    • note similarity evaluation
    • +
    +

    Returns string

      +
    • returns flattened textual representation of note, prefixes and attributes
    • +
    +
  • Returns default[]

    returns only notes which are templated, does not include their subtrees +in effect returns notes which are influenced by note's non-inheritable attributes

    +
  • Returns any

    valid object or null if the content cannot be parsed as JSON

    +
  • Parameters

    • Optionalname: string

      label name to filter

      +

    Returns default[]

    all note's labels (attributes with type label), including inherited ones

    +
  • Parameters

    • name: string

      label name

      +

    Returns null | string

    label value if label exists, null otherwise

    +
  • Parameters

    • name: string

      label name to filter

      +

    Returns string[]

    all note's label values, including inherited ones

    +
  • Parameters

    • type: string
    • name: string
    • value: null | string = null

    Returns null | default

    attribute belonging to this specific note (excludes inherited attributes)

    +

    This method can be significantly faster than the getAttribute()

    +
  • Beware that the method must not create a copy of the array, but actually returns its internal array +(for performance reasons)

    +

    Parameters

    • type: null | string = null

      (optional) attribute type to filter

      +
    • name: null | string = null

      (optional) attribute name to filter

      +
    • value: null | string = null

      (optional) attribute value to filter

      +

    Returns default[]

    note's "owned" attributes - excluding inherited ones

    +
  • Parameters

    • type: string

      attribute type (label, relation, etc.)

      +
    • name: string

      attribute name

      +

    Returns null | string

    attribute value of given type and name or null if no such attribute exists.

    +
  • Parameters

    • name: string

      label name to filter

      +

    Returns default[]

    all note's labels (attributes with type label), excluding inherited ones

    +
  • Parameters

    • name: string

      label name

      +

    Returns null | string

    label value if label exists, null otherwise

    +
  • Parameters

    • name: string

      label name to filter

      +

    Returns string[]

    all note's label values, excluding inherited ones

    +
  • Parameters

    • Optionalname: null | string

      relation name to filter

      +

    Returns default[]

    all note's relations (attributes with type relation), excluding inherited ones

    +
  • Parameters

    • name: string

      relation name

      +

    Returns null | string

    relation value if relation exists, null otherwise

    +
  • Parameters

    • Optionalname: string

      relation name to filter

      +

    Returns default[]

    all note's relations (attributes with type relation), including inherited ones

    +
  • Parameters

    • name: string

      relation name

      +

    Returns null | string

    relation value if relation exists, null otherwise

    +
  • Returns null | "frontend" | "backend"

    JS script environment - either "frontend" or "backend"

    +
  • Parameters

    • hoistedNoteId: string = 'root'

    Returns NotePathRecord[]

  • Parameters

    • __namedParameters: { includeArchived?: boolean; includeHidden?: boolean; resolveSearch?: boolean } = {}

    Returns { notes: default[]; relationships: Relationship[] }

  • Parameters

    • __namedParameters: { includeArchived?: boolean; includeHidden?: boolean; resolveSearch?: boolean } = {}

    Returns string[]

    includes the subtree root note as well

    +
  • Parameters

    • type: string
    • name: string
    • value: null | string = null

    Returns boolean

  • Parameters

    • name: string

      label name

      +
    • Optionalvalue: string

      label value

      +

    Returns boolean

    true if label exists (including inherited)

    +
  • Parameters

    • type: string
    • name: string

      attribute name

      +
    • Optionalvalue: string

      attribute value

      +

    Returns boolean

    true if note has an attribute with given type and name (excluding inherited)

    +
  • Parameters

    • name: string

      label name

      +
    • Optionalvalue: string

      label value

      +

    Returns boolean

    true if label exists (excluding inherited)

    +
  • Parameters

    • name: string

      relation name

      +
    • Optionalvalue: string

      relation value

      +

    Returns boolean

    true if relation exists (excluding inherited)

    +
  • Parameters

    • name: string

      relation name

      +
    • Optionalvalue: string

      relation value

      +

    Returns boolean

    true if relation exists (including inherited)

    +
  • Parameters

    • ancestorNoteId: string

    Returns boolean

    true if ancestorNoteId occurs in at least one of the note's paths

    +
  • Parameters

    • opts: ConvertOpts = ...

    Returns boolean

  • Returns boolean

    boolean - true if there's no non-hidden path, note is not cloned to the visible tree

    +
  • Parameters

    • name: string

      label name

      +

    Returns boolean

    true if label exists (including inherited) and does not have "false" value.

    +
  • Returns boolean

    true if this note is the root of the note tree. Root note has "root" noteId

    +
  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    +

    Parameters

    • deleteId: null | string = null

    Returns void

  • Removes given attribute name-value pair if it exists.

    +

    Parameters

    • type: string

      attribute type (label, relation, etc.)

      +
    • name: string

      attribute name

      +
    • Optionalvalue: string

      attribute value (optional)

      +

    Returns void

  • Remove label name-value pair, if it exists.

    +

    Parameters

    • name: string

      label name

      +
    • Optionalvalue: string

      label value

      +

    Returns void

  • Remove the relation name-value pair, if it exists.

    +

    Parameters

    • name: string

      relation name

      +
    • Optionalvalue: string

      relation value (noteId)

      +

    Returns void

  • Parameters

    • __namedParameters: AttachmentRow
    • matchBy: string = 'attachmentId'

      choose by which property we detect if to update an existing attachment. +Supported values are either 'attachmentId' (default) or 'title'

      +

    Returns default

  • Update's given attribute's value or creates it if it doesn't exist

    +

    Parameters

    • type: AttributeType

      attribute type (label, relation, etc.)

      +
    • name: string

      attribute name

      +
    • Optionalvalue: string

      attribute value (optional)

      +

    Returns void

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • opts: ContentOpts = {}

    Returns void

  • Update's given label's value or creates it if it doesn't exist

    +

    Parameters

    • name: string

      label name

      +
    • Optionalvalue: string

      label value

      +

    Returns void

  • Update's given relation's value or creates it if it doesn't exist

    +

    Parameters

    • name: string

      relation name

      +
    • Optionalvalue: string

      relation value (noteId)

      +

    Returns void

  • Based on enabled, the attribute is either set or removed.

    +

    Parameters

    • type: AttributeType

      attribute type ('relation', 'label' etc.)

      +
    • enabled: boolean

      toggle On or Off

      +
    • name: string

      attribute name

      +
    • Optionalvalue: string

      attribute value (optional)

      +

    Returns void

  • Based on enabled, label is either set or removed.

    +

    Parameters

    • enabled: boolean

      toggle On or Off

      +
    • name: string

      label name

      +
    • Optionalvalue: string

      label value (optional)

      +

    Returns void

  • Based on enabled, relation is either set or removed.

    +

    Parameters

    • enabled: boolean

      toggle On or Off

      +
    • name: string

      relation name

      +
    • Optionalvalue: string

      relation value (noteId)

      +

    Returns void

diff --git a/docs/backend_api/classes/becca_entities_boption.default.html b/docs/backend_api/classes/becca_entities_boption.default.html new file mode 100644 index 000000000..e8f01a50c --- /dev/null +++ b/docs/backend_api/classes/becca_entities_boption.default.html @@ -0,0 +1,34 @@ +default | trilium

Option represents a name-value pair, either directly configurable by the user or some system property.

+

Hierarchy (View Summary)

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
name: string
utcDateCreated: string
utcDateModified?: string
value: string

Accessors

Methods

  • Returns {
        isSynced: undefined | boolean;
        name: string;
        utcDateModified: undefined | string;
        value: string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    +

    Parameters

    • deleteId: null | string = null

    Returns void

diff --git a/docs/backend_api/classes/becca_entities_brecent_note.default.html b/docs/backend_api/classes/becca_entities_brecent_note.default.html new file mode 100644 index 000000000..716fc9814 --- /dev/null +++ b/docs/backend_api/classes/becca_entities_brecent_note.default.html @@ -0,0 +1,34 @@ +default | trilium

RecentNote represents recently visited note.

+

Hierarchy (View Summary)

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
noteId: string
notePath: string
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    +

    Parameters

    • deleteId: null | string = null

    Returns void

diff --git a/docs/backend_api/classes/becca_entities_brevision.default.html b/docs/backend_api/classes/becca_entities_brevision.default.html new file mode 100644 index 000000000..42a0b64e5 --- /dev/null +++ b/docs/backend_api/classes/becca_entities_brevision.default.html @@ -0,0 +1,57 @@ +default | trilium

Revision represents a snapshot of note's title and content at some point in the past. +It's used for seamless note versioning.

+

Hierarchy (View Summary)

Constructors

Properties

blobId?: string
content?: string | Buffer<ArrayBufferLike>
contentLength?: number
dateCreated?: string
dateLastEdited?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
mime: string
noteId: string
revisionId?: string
title: string
type: string
utcDateCreated: string
utcDateLastEdited?: string
utcDateModified?: string

Accessors

Methods

  • Returns {
        blobId: undefined | string;
        content: undefined | string | Buffer<ArrayBufferLike>;
        contentLength: undefined | number;
        dateCreated: undefined | string;
        dateLastEdited: undefined | string;
        isProtected: undefined | boolean;
        mime: string;
        noteId: string;
        revisionId: undefined | string;
        title: undefined | string;
        type: string;
        utcDateCreated: string;
        utcDateLastEdited: undefined | string;
        utcDateModified: undefined | string;
    }

  • Returns {
        blobId: undefined | string;
        content: undefined | string | Buffer<ArrayBufferLike>;
        contentLength: undefined | number;
        dateCreated: undefined | string;
        dateLastEdited: undefined | string;
        isProtected: undefined | boolean;
        mime: string;
        noteId: string;
        revisionId: undefined | string;
        title: undefined | string;
        type: string;
        utcDateCreated: string;
        utcDateLastEdited: undefined | string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    +

    Parameters

    • deleteId: null | string = null

    Returns void

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • opts: ContentOpts = {}

    Returns void

diff --git a/docs/backend_api/fonts/OpenSans-Bold-webfont.eot b/docs/backend_api/fonts/OpenSans-Bold-webfont.eot deleted file mode 100644 index 5d20d916338a5890a033952e2e07ba7380f5a7d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19544 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 diff --git a/docs/backend_api/fonts/OpenSans-Bold-webfont.svg b/docs/backend_api/fonts/OpenSans-Bold-webfont.svg deleted file mode 100644 index 3ed7be4bc..000000000 --- a/docs/backend_api/fonts/OpenSans-Bold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/backend_api/fonts/OpenSans-Bold-webfont.woff b/docs/backend_api/fonts/OpenSans-Bold-webfont.woff deleted file mode 100644 index 1205787b0ed50db71ebd4f8a7f85d106721ff258..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22432 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 ig3W - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/backend_api/fonts/OpenSans-BoldItalic-webfont.woff b/docs/backend_api/fonts/OpenSans-BoldItalic-webfont.woff deleted file mode 100644 index ed760c0628b6a0026041f5b8bba466a0471fd2e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23048 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/backend_api/fonts/OpenSans-Italic-webfont.woff b/docs/backend_api/fonts/OpenSans-Italic-webfont.woff deleted file mode 100644 index ff652e64356b538c001423b6aedefcf1ee66cd17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23188 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 diff --git a/docs/backend_api/fonts/OpenSans-Light-webfont.svg b/docs/backend_api/fonts/OpenSans-Light-webfont.svg deleted file mode 100644 index 11a472ca8..000000000 --- a/docs/backend_api/fonts/OpenSans-Light-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/backend_api/fonts/OpenSans-Light-webfont.woff b/docs/backend_api/fonts/OpenSans-Light-webfont.woff deleted file mode 100644 index e786074813a27d0a7a249047832988d5bf0fe756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22248 zcmZsh1B_-}@aEgLZQHi(Y1_7KW7@WDOqPg|;+~g#c zTn|MF2_RsgpQU~Rg!-RNT>BsYzy1HaBqY@2fq;N3epI~wFj1RzkQ5V__|b-ce1ac{ zfboIAB$X6Zf3!m&Ah2Q}Am}`LXG{@E)n6h&KoF5XF+o366qrO7DylNF00BY5{rLJn z7#4V@A(_}2IsRz2Klw#KKp-%vH*Cr#?yf{Xb&!5yn10}+rURcbceJqk(S&|_y#3h3 z7+7y%3nQ1GTm-(K7^wdZl7+38`HvGnn`na|ZCO>gXKYf5#e%Pm@MS-(3 z^8E2tq<-><{sR;j#M$1+&g@6C{E0dHIb*DcNj9~kgNrK=keb?$_WDx~4Q1c$gXgoLPPM$A|b23vuQ89}D~g&=h~s?0Y}FgUqqZGapfmNBxwIuVFm(k ze2_5J1XP7GNR!Ub>HZ>jTD#<+>v|6A@Ps=rubqHZd2a9KgyVR&^O181UPYR$*uv^8jHMb|3VJelk8s&^2FN|ruFH*b0P-=Pxx z)n&d4)334G1?Ye~Q~-z$@yO0)EPiZm>;@5h&oDPs1QBS&9@GP>1JDlZFdytO5p0Mf z0mF?w6vH4nRycA8NUE&3+j`oFx2aVo;#l_bC3x_^QC zOIwCIWC%j+h!TDPjSlof`zj7nbHRVUC^89-V-ah|_Am14(ubnMne6_`PxvYvvpOVTMneb_yNnzE-NHsp$uk~E4o=th_|)1p<|5PC5H40YZHHZK-0b~`fdbVqJ0;h^LkIPchf2cz+yFG$aT z@DGbUJX0g2nIZ6P_yO?_upuT84MViLL9EyzcI!?A&RvR4?ajT7?&c*9@UShNC>D%g zbkUyp_`i6o+|@2C0Lra`zc3u!ksLzWwU(G7!V%!{ad_BVPb}tVi}J+a_!{n}qp>W~|28eomjC7^3R6XCBh(RU@wByCnk>!cCyG+VX=Bte zYU%#}!v9H8K*;?#<#4raxn*02CxZ3@H1hlPE*zzH|+~{B8@12|ap3}yg zAn`i=x1~J2YI*7A(S3-RGo}N{t(H0vi%hWoWf7SK=H3~n^NR^NGyzFG!35uS?VmGs z#O~2+m3{oxh>~A|GwHKj@^xCC#?&r*Wd@ku3Sl}MJ}=oDv{v)e=O*)`catXcw6a6> zIjNhA|EiRtXtcUS98TojtJQHI(4JQ*w%MFEdJ5Egiqjt%+9a|YTLDGxJw*yNDujmh z)?FRVkId@D`hL}`kNE24COmcC*q>vkgmXm55o|RadVe`=#EQN1zdKBpc;j2o)BKNC zG0P(>k~Ou}`%wH4-VYVy!*$z!?x_E{!;B-1#|#afobI8Ge#_L+O&BRjGs;Yx&rM3x zjhi$W8Uj}ty?hf&8Ja*dF}=RMQ!zn-y}pA;H&BhK{mq$r5Q9KKf{oSc_r?k$iG}kv z%mTM;MhZa-0U6?jFo#ft2ncUC1Vrq?gQEU^#*umh`o+TH2?A7PfrI^Xm;QGK^F+fX zBSSMoqudeess4T{#KKHQmJ;UPJwxMtb8{1OGb3YTum1jr?I2;|te_xa&`4}J{E*xr zv}*^9ww3@ZI5<3Mxi1*F*n44Tx~H0rz!VTrRv|@MiU!hiGAPzM z)@~MdW*``9Cx{_ZV?$G;i=(sC{mtDiEEEiMOk{MFtdxxOx>gk zSUl#;Xsk>n=^=XQszVLN8Ya#Jk-0kWM3t3pZ+oPx4x4{`?pGATLnQP00v=u-aleR#fDQRn(B-T3VH;M z;RhWOM2;`%!_}Jo3IIKf_y_>qW9?{w0RiIlM#A+3eqSd>6Z?Iw#)o+F0^cf)3N zDwrP&rN?5jq8V`~*29CU1=A~`bN$Cl_^#D=MBQ@yKq^@K9G@PVmbb`3DS17UUEQwR zgB@ccR;mc<6vv}>=S-BkJgRak5QW>h_pdQ&fXIGKeV^J2wKZ96+?JC!MOJslJ+%h4 zCi&JGsk)qImX-WbIA^f9LxU1P1d!@slSWa*6O?Y@3VETD2BF3d<4QFTN2!`8N~=OJ zlZntTPK?ZkP~pINtQaclB&4~*o9!%Zg)l5}P9@cC)VDk8a^ksZf|Ra7y|CktZQN^o zQ?3%CktiemUZdt##(_{7QHjuwDjt&a-;!jhtN~{+L!+f}Lma-mD&J^}JS|+jbyKcp zQ(c~RlbE+nh?m3{^BUt&p!`=h(-y(FDyLlQJ~G_~n#t@)P0l*+hXU-HA(dMVskz(; zQ)0hFh;EUe07{m$PW8(R=2F>#sM*|tk)dqs(p3B?;o)BBXllm3``+>70q2HM^Shfm z=g*0S5?lWK%5)*cruPOap=EkReE%|C$%xU3v;k>9XWUn2!*+MJfb^*l(zc5oy z6I@_r`Z&~4Tf+{b#lG-R8a3V(Nqk<7ito0vLKA@Yy&T1eH&z;zch#h;i|S#u)poOY z>Ta;5&3YDI`fv9%% zVtRy)z*h_1cGTi))g8RZm+i%`Idzga1P(TF&jWxVtp< z>@d>ppQ%o3ICIHhOwl>5v{!ta`vE5TFZJ!11?yK|lsnT^M^Vek6@EDPP-=Ov$cR-n zY8k}Vl;R7dh;}qH0>_CESncrP4g@zuYn$QILT@ZwSmN-)mL8-ADQZ3Rot6oYTY_pE zz=`L6^o=VicT}XJQ|c#`XH|8vzbmAjezSe0kxc5@slb8i#d({bnmSJ9!Nmyu@&NmE zr-Z`D1L|v*<`yo3_OlQoI-&fW)URpgPUZ=$I5YXz>_CRU6AoCl+O~ZW@0H0d(Z4*9 zll@%w33A-q4b1w|TqeglzX1j9ak{rIWJm4dK>^1?7il%Y-WDuKCcxaVI74fLhX_M% zaE#|S0dfl8eekd`hgz4GIn%0yb&0VweNJdNY=3F5=j zu<(A@2HXV1`td-Me{ zI_AYB-$W}FhJ_e0o+R# zu}kX=W$X-v;%pDfM-j0L%?)OdEP4}{SdE(5_fLc)u($byLdm)uB8CGaGtmb1NdPm= z&k%V%0wdAe^zbe8Ed^HgbDKmZpdoUJFm5wLDPVt4C7>;G$$*aJG4r<6o$O!gfXnv$ zK>n3c?ayTMGm!v)e*+pClbdwnc_Zj&Vg zoqc~>63J~>*HxdNRfQ|5NI>OM#gTz1OQjzNxn4HwAftZeK6lgk0W8{uZguXu`vub0 zM!V3t8%t;H4fEga2(o8Q?o;N`=-~+#vPu#$^XO3(k-((eba@~@OM9R=W63ISU$A3| zfc8p5RSJ`!f@P^>zE-L zfs7xqH~Z2or}b&!Iu+CtIK))LB}?KHDN-QdG6fuPQ%5%{$W(C!W7UTx!(hIY0t_5~ z@h_cuY-{_B9iEM98GWtOJ-8UJ=+LT-J8*U*? zPW3>S2*!yhD!19sO8Pbt12uIj7NXJgrtWZ$oeCsTN-gCq(US=63_AmvDpE=XqrMDD zm~3!vG7lMyC76D--aUT^(U+Tpw2ygfPpP#Tzw z$44<#KlWvtc(CKqnhU8!Kna3>pZoOI8Ev)%p5Jiu*{f={`DVB8URD1WH|MMY(0e*R zzTcHjRw^4eJ)$ZWGT3HGr~#MFqJI0k*4>Cj*zD{E^_r1-<~8TP5;k~ir=keIo_ zn*v6uM`V~7DIrg?eTm#<%o{PXIL>s71X;`WAb4ceXzPrYj9giy3Q4pxd7@dmZd!8k zB7J!_DLp+qJ^gex4o32&qs05Y?bc#XWz%6wPvxmpz91vc%jgP1e%1gi;ZhtgpV37J z4_A-91eII|nU6)&Y zz3!wb8hAq=^6Bqi*yzu3fe`?SUQ)32Fu4Qk7L z`x|N+oVB~%rT(Z-tVPTYz`^y`5S^q(QQHW-7GvHhD3wOvxOo9Cpaow*D_}?Nr0q6n z9WLW3d*$596R1}xR%_cJ+&xJusal(KaEQ(vRhtUg!wig?pqtjob6Q_4 ztpUCx!jHArozN&Cu0&a?VwRpeg=x(31!fLw`guS*o#Q!Oy#7k-qquDj*oMWloTJss zD!lDeyF*&XonFn1&MvsM<4Vq1_#v8i{_br_Z4+J%hXzDgb{r1p3~muE>gm9Ia)N^m zK%c!D{xoq^-fYyau3rcrp@-fg{*CH>?#r;~4=(tcH%2BLCmsqcL-k&a9l%4-XG+4W zBq6}*JgyIfy%$3HfPeP7UHW-RYbj@?{}c={8{Q^%yQMmw13nqi}YfxaMbnU?~=&EhEX}?q2+W?;Jp6n<-Xgu z@j_{Q*Vp@f_U$UGI2ZIsrgrc-OTsvo|`gfwB; z(H3*?K|#_0Ki}}1YuQdkEXXOdrI5fx+?!ut=Q&vFH%q@_JA0^Psb&5{=&xntl`ME= zXahZ1EuPQj`BCO~EK#0H?0MupDabeZAQsOSlqlh7SI}9auAa;(Tnk|VH09pMRJbiA zC2(B=W!p@I$+k`X7Qffta_<|~=dmuvn)$EyvNo}$ zRl*owvJQWW)8Z$wGAPT;xp&Fkvpp)iMzB&L;etoFX&E&+`_W*$r&6zlg{I&y3TR!0 z`Q!;b1${&@M%=qchdD87Z1ESXmYad*=PN+HU%4JvbL-jXeEIk7NI5R&C4cL|)v1s9 zzxa>6vUWlA(QP*(h4}6Jxv1t;RG#CWo8c_@19!fLo3BCP(pB}|3Df*IzHC~2k*^Ku zJispq5|Jnp)kKz9=na8Q8|QQsU^62lqbH`WMf1^GQxV-BU(!OI2OrxN5JnsgC;Q2@ zz|=hLxgxtbHf~BtZNs`Yl%uq0XIU`Ya0W_WM2IBpK6TQ*8mf0N=UQzHL=Y#f-+Jbz z=}IW@AP?fUO1@$hl61q!W9$S9;O!tt7^z&BiF?svC`7`-v`LgC8*?q~w{cO+10bmc zY)|<}g?>K%Z@A=(dA(Py4uS!nZ9Z=gMfKnuN47}j{{9yiVHZ>5;Oo~Hp8G-)5Pq(@ z1?0*JBWWag`kREzWVtC7BPvCVXwf9+QWUU0YXQ!n7xU~l(2 zh05vNlM~OPAR#bGCjTh48Q(fmF2b~Aax`U*>eLRbErBV-U2DTlbAe!+STzdY?bt^U zK`*4wRhm2&!8@1*k|Gu8Q;h=8=oBtPy#+a(o}HJCMTjh6OeA5hvcH{C z*@3Ky#>A)x1_H~Cg~&nztYY>Te2aeZ3$jfPpAnup*axUM;zY=pSZeV>qI( z&tG1HkEf%afc$DNPJ+!pUJEYCqkQCW3j&K6_>tA|vBAZpdOekT8Jx&7 zY;1=fr-OS4!h~3%8{*R|Jq3}vB6Ythd`)G}RX}JG*;%GyXK4_|Z({f_z(vk^=2HKR z4JTD#`7vM7jEb(Xd21UW`*CZ|r4yP@ynws~%ROkm?y`iO*kO}gSb51(0m0hRgeKH4 zmRTp@u!JraX?Uv6o~oJ8!>uYJw-(X?;|5JghxwOFjVQvCr zY6&H$eFT(Pa`P(pkqFD{!Kr+e|5xc3hX6OtKXUOp7 znuXKkkO%7CI?k`HtsSnFEU_uNM+eW0B@f0m5;%G?+pXsQro`Z*=BPdo1n=vLd&v4l8CF9 zV0W^2#C>wZ6LuwgC4;gdzJnEW$w%`Cx|<*ziZIA8oL^|;)u$eS9zgDb{-waB@(FktCfk<#uJ+(_hdS1{njaOdGRm-aTahyQpxjENsLmov z8xaM?hwMx5znb589ckN`8NvohPx0`+TpSG(fs@XHtkS=dv2_;+>}jRSG_W{vk%;@0 zZ@}K>Awd?g8X)UPJAF&&uHLY;p{f^t+g(bhfH+ z_to=UD666OD1w&l3PQn+_eu*;j~ci&o%e5p2ghlI?uqR6@VLB68l70_yXkLYiR=;i z;)XLh7SH-S-FYan(WMBQ7o*#t6iHALZm?1bR>vjEv@qM^ShrJ6ZuKBfqn~j38Q-2M zFaj2lNhGIAq(pveA?)v_3Pnug#qAYw0!Ds|p?z|sReA|mK;un~S>-|224H>S&#n9ujyxHe#H=^^v^jer7uF@a{Km!Ia7QwgLbiD;&-aii0 z;>vEqC5*al^N7~_a#vZvFkg*k&G&#d?&U@~Kh`(XJYBcsi3@jRaa-su)fB9Cc6m-9 zyp%i|VT^?!P&>5lO7)g{i^^{^D;qH4hOjh?B36W2TnVyH0giZZbB+4Q|Ci&p+ZBKxR=M`+o{4tR) z8>ydcce|0jjAmg45(Y@w+?a4`i0XErsxhoRtZfE97rI6TzY`e{=u)40AD=!QJP_Cx zM%WbvzLrG2b0VBJydG4o$RsZhC3vw&i(`zVl9W)4-vLGb4sGeQa6D6Jy?Z_lzw^>@ z;BhU<7^T&?>OWm2-n}0GeqX*8eE*FQ^ugG@eAa)s-0FO7-S*(Sy?8QeFx=Vk=1ddt zlKl73c_nI~+4axVYx=iad%R`U#j?*4O?*E1Yf6x>ie_AB7((|0w(*6V>Hv&310p_) z)_qh|7GiUoQ)dr%s88VjJBPWX7Po?68k9;%-$vy0`Hf6$xx&6Q`BdO3aJqaEpqxtM zGG_eyW8>YRI4iZ?(m;gd57~t+_4ls9P7V@66T9YAb7O1#&_XB*MO%RaX*`IC1#>)M z(H1|$aDv*7gN0`W zqt=Ie7n&3_m#o8Q_?|o(=wso8=5krCytVyFx|PF(=63~Gx_lIM9}}+c*GVLuR3;rq zZ4Lh8>qx-CK05zs0$!RIW=H5N{au|EC`U}L+ZQun;t!#a559R)onif@dlv&3>+ZKd zE9>e%m)1Q%;JTy2xetFhyiJ)+&uNz-wau8 zz_;-n8KNyGB0nj;Cp4*U^n^6dVm}sk&-2OK8qyMfZqSW0RFfto(H4%!RuO0z%Fv=v z9efGU$11^3VT}E}9Lukj=TQolt?+Q(B^+2FTLir%%CXYR7UXS8C4#EEe7do&8%>D0 z8X2kXO@bZ$qF`l|cS-D{ixA~c>d=STOi(mKND5uy$CKlq##-w&fVfszIjH3pA0`H^ZV+2KFE_@sup#w2(AG zf%xAkB^@mDEe4{uNOazu+hItOCzP4O5@RP`K|%q+rw!O z!H)IkK^I28db11P^EnMk42OIc>&dK9cj>#pN8IYFY6Lv^!-s(T*UGX6@OHMDqqYFX zBM4DbN&q3Em)#8mt#b)&B9r!Ss-ik5SGs+?@ka7gio@1yD+e)Z*$HhjEWX-~i^>NF$HDN;aItgzp zID3c$M{M0Yn<4La`%Z5-VrJTuq!uG;^>2*~$xJ3c=M3cqxKrxhJ?{L@4)xAk#HkvLzEZ9KtnL5ZRQp8LA_wJ)d2*IUIa4 z={O(a*y-P%E}oBPuKa;1u6Mp-HGgfn-h*`9x4Y;d8g8N@IL%dF4L)mc@62pyD?q-I z`6e_u7ah|m$Jk-Xues6EA=5~;r~{Kmu#i!lqr|uu#>F~~NRCR1hcb_I4_H|z=kO!* zbrxMi|s7(SJ zfm%O~{cinj(qFx6cJC1!aedCf>mK&yw7Sky3KZWpO3w5B@;$$*+69r&eaO>v+JoMH zuS>tT>VR=nW0WDlG)doLWM6;x0p6qhw)I1Ps zB=qy(NR&bP@s|5OU^|g8D=7QRDRYEp7H`Ox1eL#rxK&AP5xV5vP45GlGfrW5%hoxK zp&q|{?FO%)QPH^Maa-(z*q7S1bm(|>{8toCUxexQDSyM^moj0>yI$&iOxGp-1Wkd;DP4S#1s#_hlBOW@K@Ua7=rSx$edN?TXaqc7g7 zMR3wls5#UKe>%B5I^jy{aA@hePO4^8wDNTsiG<0{tn(ln7G!)6=4^GH>LhHne_I+- ze?s6n_@j7g)9LdTJ>6tPMJN=RV|yoX0Yq(321Mf!XcF?*qP9%BbhEd<2=X}e>YT@> zk(SFQI}SPY65R+_QCDFpnG0J%Jl?f~W-HJOy2@XtI8dQlVfdMUX@B0r3(fjVFtpn8 zcUsKOb3R{ii|_-yE|*{mW&^>SS`b@c^Yyx4*4GUJj2e*uox~js_qC$S!Y7A9MgY)^ zwTZZzs_nClP2#+Tk(;LZrb+xfu=$`xi$CEB>4fEXZ zhwS{X>qenS7P%$3pdk!6~*{&ra9AUEj!OPDNhKTSn=rtb?3sA+uRSLLo@GdFv zx_^8`QpKtLq-vtOXWZ=(Rckrz@n%>dXh8xdB zrUkb@U()D(2m`FwMHM&oy^X)?;(FyL)9o}H&cAqNh`)LzWy{s&YHKr=i=W3TMKQNk zRWwvo1)3VU0uI^olJ$5bF{M78MvPk(v2IucqH%MXTEq&qM7kyuwu)u6QWo5=;;qrp zu?M_@fy+=*FAvDQU2{)vV+LkXg)P`}a5e(^*L>0izdZ8@qg#jA%~tl96ZoVNA1Ao$ zKh^QEdNl>}x5MA#qelk(W?n?HUjD}Ki|lUn(0FQMbj}iMmd=rKx6Km!j%2Mqv#YKD zGmov(h#CQQn*?wwEM~<-tlEYAdeF2{V6+`&AJX(7Z>H<8L~Zs`E+sK!8!v+RFv=J* zO1@Yp&{w&6HZ;>*D~huZU9&+stg(%>Taq|HiF#(+VUNh`@yr-f_)BGqI~Y&-#~O2q zdu4ErtT7%K7{@G;1=d_e`%;}R%43%?duX7l5`+R-xql`E&sRL+i;~tl@^+_d(Ntq5 z0Un?;%?pd~eEl+erU2hCQ3k9-X-znf2w6+eLh(E9rRL>0HUOa%5u)tNM#>Jt|!C?p`|_6TxQks9@<`VO4#wXVqq-rM!Hx zZmH@qupLwoY&)X9#WSQlEBT%+{PYj}a~gWHih6)ytIzx{!~NbbZ`~t#7cNcU(IbyF zcoZ!Ig4Gui?YWo76tF*wZU&szjXe>H_zTSe^(p~gPG(#S?aJ?Ed+KT{^O$xCa_4(h zZSL6*QIwjX$Y)3q)k{J}{_PMXORXO=>ELbih@khU6UKX|S^H@?xosksM0(VhBWr(} zv(PbRwMIdC7s+dKBlv+Xl#+Q%9V@4fhQBYcz-2q+^=u7XXU7c%eAX}_(iclkHuin!lv@BTG$Wi!8$U#XoKf*| zl4TS&*yF-ok0=ieojDGkIIZt%s?BN}Ff&MeXC=<&@D?kYgLz^5De3e2`(Db^dJtsv z?w(U7)Mx`?bJ9Cy<+RgW255s^{HqGd&%p%@LU~es{b+kQJC@DGtyA=7VmpV$~YN61m@T45ibeRM8 z2d$Fr34ErPihf3i?VB-@H$9{4M%I1aXBxH9e^sClSnkzrcn}4NM$9$(Rw8^7ZQ2%U z>imHtmnU{MmM;xVPQ9wvW(5xVzIs{4YzjcHKz3iyr}#_hjaBrz66~&$M9C&l=-_E) zZvV6}+S^@SnerEAZON#E$$M_$In!Ogg2{>hjBb22)c+VxTGImVD4@%u2 z6>_+gkpDbvAM#T4eaz_iq;0bw%-=+dO8E3wD^CW1|eRuKhFXko2*ZB(PG620YiH01S!m;&$I zNOQYn>t9z8XRi2lzlY(+H^qp?5Qd{*>OUBw55r*fl*FXW#V(zpxMP(asc=W}sj(na zNU$t0o3U9S?I`dAYYC|%GfTA>J-&ZCBg*SedYTaW447Z%A63&1o&hPm`rIuS@uKx} zhy*!JRkQpie>WE`e%*JzTR`;XSH9}&`LCYW@3^hnL}H#BXGXp!TL@*m1EpjD%T0wf z-~sxOOGI4R8=SwZnGH&|5p9O(sLe*?2=wN zqtrZL7Ua;g;kEOc0dfmaB z-)z6s#Tgqwig}yp+hZ&TW}zbpfh<>$F9BjhC|q7fH9*fWInarN6kzY3wu(x)p>DwD za)8UmGawASc|51*Fy+LprKpQT?+6eN(9hyu8z$ZKo;|R+uFhIq`?%x%=3)xSsxSOE zbHMau_w?A=_R2`vIxYE^4{^)=I=rqce_5fsLzefC4xNwLM$pzeJGa62Cu5&m{nR|c zVZCMcjzE>&=cIH6Z<~%!0H==)rR(~4_Y=dJ`k&oGvxV%AbUxEg94k?`CXfx4q^YGU z)T&<~N%XQr#eTo$Y^5xzWB=e&E;7^yZ^W^SvbFL{^6>qt*4AR@7rh>$xxy+8u)&6%W?^H~>bCA^;k(h^y+f}OTS70Tk#)8=idqwdbE1TS$3m;CGJ>b;{}Esk_4!pG`X`&NmCqh0m{ zZ}R>JEUw8Ar2<-2c35iR*mDkg8KpUMw&eyHvlQiVxisa~WpU9j1HYr2IxWNYbCVC3 z%vJ29ZQY0m*Y*{(r$o|XnG-)3_&fsPmZBwy>bCwS7Ylqo$=T)#070;5`qB2#&Qf}$MB z*3uCS(m)9kR>T^O)??H6J|3TQ=SgmBPSUxH zDYz*oY9L)>(@LKFI}>^ZF4)S|Fh!msu|o!NIYC{-7+4@$L>QXJm_EHun$a1!0gssr zY*5_Jyhx(+?v#iJ^VTETbs3jHLTBS4u6V?-T_EL85BA%i~VK#{Txp?m4cO!+RTZQZ6ue{V_?mHA_^9o@mT8L|y!L8aqkVfZHx3Mz?0S9f9a& z0k(3iahK-pGxn*c<_GcF7W6-UWz!ofT5?9onsS(;#=14z$7Yvbmv?slG8qGtvPfO~ z`uyiJyaFDB&V6i!di(sYa>BFo|7r?`kJ(x<8b#cbs8~M4;b>kHsc4PP`#uN7k+kv&&R)!UP$$3y+cjQ#;vTtCJ5#PD+K?l#wUB~rR8_4&Mg?_T2A#Lr zgWMNzf{?cJ}&>|#YYuvTCd+(Pt z;7qb_jsCsPIbXbQCdMkm-?eyks@kwk@-h$_tI@F0wm8=(qQz!%cNO*A9Isp0PJ^uQ z7{tE{6MgKc5`628J9!_Rt2=8WVS|&<8Q}ZXuwpv(BE7Q9N3_*p^>`-9QS;|mIj;Bn zYxs1LGTMbO!03H3+v9Sx=o6-_R5p#M1NbDO8~^h+HVd8zu+$r2u!c_rH_6y4!P2%- zJk(uf&Gc-zc}7+(eWb&?db+H`18Z|h&(zZc#fq!*VgQtO0izW&i#oBvB5RPJX{fe6 zGi|U43NRXGBt;?Fl$<;kj%u>zXr`I4#sG+^cp)iS&oDA3CI&`2O8Ov$b}oYY1WXKE zOl;%&AZqhtD|1kq{lY53flc4UYIy!DfD?+P&aYPc?@F4qFCI9wC=9p>74~N`UEC3E zwum~%U#p?P1wU!%#;X*^ssY3s-B^hN#pZra-Lekvlf_7r=Ig=E$VUGA}D%w zVXm+SCbh^qLzwiAb(m2&Zkph5oqn>2?6Wxps_xVFVq#iyBcnSg^@ObR+A=#aB)s)$l6GV1(yF=YvQKl@}3G3W(B6psOU1Km(^4?Xt zsC?N@=kS-6)O6TOxPW|JK^R7XMC9)e{N|z%+U7$8{g}tWG?} zriZRAO5+?Got7Rb4e*qhs(r&UY-KHls+8Tc@4Xua((PODW3A%S6Vwb=7FK(e=uCI=kb3)ghd-C7bF}DqdFA z7YCY(bd$eE?=qME{OmfteSwrm<{tP;Ax)9MgfEtX(lBja)I<%HIP0ZOg9L(ET!7RO zsxOkv_&MPtk6$8m84p})n{=q{o>P-iumUG>4!P56D%SA0L@-rZi>1;;VK)F<8wa?^ z(0OCuUG+7XDya@V4T`A5@r+aG^`yPX8}oUJ+qRQAt(V%UJ&AZe(6{(HQdiL9DYqw1 zMIP;1*2H`}vSh8Z1IA|YlMWU`O*Dk|Go^VOgG&n>V^V-V%}+Pe9(g;K4Kc&cj$~j> z=9d<-e=C->`9&EP>#FE1lCwyF9R9Q@zg5PihtXY*^_aZplXQ@6by0DwJcuPLwoy@2 zz=ftITno80y<_91Oc-`(4KmG7aaG6j>YrV8fw@p-TMTIK1mr8 zgUTd$4%pZ4E?f2hjefX2C~f2FvXSqh=0w?-hv&LA48yCsRI6u z#;+KXQqZ=I?L&tBPuwY@dXsG~kWqGz9gOK>nY#;7gMy8HE_k8N=)%^3)9?O86Hp&G zeze(Qe*48_-64`$@d=2E&)}YGBSQ+9aE!-cW0>+L!#$Hye8Api+Z0?rCpWVI0|j7Z zd^@Urbc00Yfq&9x8=m`|gFrio;GCQV!U{FT>6+uql&6rooH4BkyFBF!cf!UHqz$kberT==L9GjtR-~Q0?{F zp}0v>6yQC%(rrq}a>jl>9lv-sJJ#&=T$&OWE2*U$y_~#k6B|m9HuchL=ck+`?S`n( zwg@6sKGBsW%G3Y$pN7MX`NEa&kI-ZJOfc?37~MAG&JR-o;J{sh_%>y2g57#rsI^@b zHLK-MsY8cEFY4v_*MG6S;PS1(KGz6bJ0kGw@*VxL6tv4QB&YmSe5p(^E(RW!OPQhx ztcERhi>@qtoq~-QF*mv8n-h`V32p-+_P%Z!h`UyhAb{g^)p#cC2DvWP-=19tpYeJ& zl^WDxM!BZcKSD}-iaEJ$o&CGx_V2cA{E#gNTElLk0Al{qipaGE9g z2X5fUKmPM@d%XRRp1*T@dEUdRyH^E6&N?Pt!~%h9SmmG>hR-|;X#6X^IGbLFkofko z#UTU+(DowTyl=Au{1Pifn|am=!b?9x>Xl>^#Ytwif`2fVTtkb3| z|G*YC^;Fj`xPlBZi7U6Hga=psiQsOT|@+=^|uK&P}dJV3^kE8x%#Un-hk??^x?bh?CYhug4t!^h4sz}>3;shar^q&uKP zPJv=ey4BhVLHET2^1}zh6AN z*OhE}<4fdO9_U{w*FZMHE9|*Xho{e7& z=lRlxLy_xsVt_QM!?}!yso14GDQ5t+EY03?C7q4EXXD{$A}mC5OLNP@xIXW|CoZ$Y zczguK={i2d#E@C5s$(~n~+>${Awf;*MGVz#*F@YiO5m+seK^5aj zoO8C~a8sx2%afg9W=#-&jr1gQdEHy&E@8ZO|47HBJm~*@3(#iY%1_S(ChPOj59$LN zD&L&aRdiM%39nMnQR@)Lkmf0o6gQKl4pxSN;U|zaIzFq}+B%zm=Mo85AQHcERm2pW z7qF(|{hABE#MIvIw0Z?icyqr1lFs$A|Aq|m#p1tfJ1xGp(Yl*DXAE$5ENqZ^XNii} zzXof%D5JdgGi@Kol78Jyd0NyMYQ19ScGH4(t8Jzp)VKRP&{z0zY@_hM0s$8O={9r0 zkMklxvtdZdiR~L0z zeh1fiy*aL!mnib(xFVv6ZV=a6-J=jLe^^LYo)5mEbFJ0?EIkJG({>e7O^y%#olw-{cW<7B#=y!t!A=Yv0P4e zuwen!=pSpn3Iqk3;qxS?rHVG=GB^EtB6k7JkTBQFD2V2no?YqQ+Dq0$O#b!k-!2CJ zKJBr7qIyF6G56={**W)5I-C3UBM(n`ecMZWUfKD=%e1R@PJ183Z@vVfq?khFD~}Gn zuc+sUenXa5EqG9y_RW1yzV+^bljn6k<-PqFbFiFdFQ?4ZnD)!7W?quT{>r`r!iyXkN2}RSVbmejUye_Xhu4_ zsM-4cUF^2dtAN%kGCp3B5y(uiie7OY?+10Wx&YCyaH=Qh2HAX1EiyskhtTYdO_Z)> z*AuY#M$s>qQjE)`T93EduG^X^>?G3qP>YR{Lr9dFk+nX^I*hu<^KQn!HDs~Ri3R? zZ2)nxXcvNZz|8Hy)o`2F$Z(5w@&kvC!AB4`=FWcyw~%9sKgKOFA;$eDaXS`C$gTU5 z;+#Soav{M+D0b$nVb?C$Fy1g<4Lt{dCnX_11VKwMH{&?sKI@2MbELkTgP=oV3(J+4 z0bo%@0;UG7tArWnifoo3#0QVoCG;5~v(+dxn6hLC5p0+c1w*fNB1=S)d5a#OH{izm zvY~@`)oYy461n-RqY2D{#jyDV{iN2I(c&|hDP*ZJ$ZP^hp$Z=(XK9o^c^*7baEDCV zmj;)<{FN&{ZJa}LJY3N(LgHgxDbXoxUeo5ZrFksQZ0HfZd$o1K%celcXcxrJ(LVj= zr@!h0UK13!{;7T1mcu)q71kXJ&UEQhUM8X~_@!khoA3JTZ+14{736hD6&nkUxzCR_xCeC<_Z%mzroa0)I>C>!j^vFqzuQLwUj1h}qnBSJ&^pRLg#;_GlL>S8{YRKYC2_ zSi{`eSs({5@p88wbW3>!HsfwDd3PXu$V7e(&=|-opF;l?m`$4k57E^vqo?;RnxS3L zzJ^#U+zZ!1J*=|n2jG!*@kgunymnkWs_iuV+c_l}O#!>h+|OpbtzcFX1q_Cg_$)dx zqmMO}l%KG+mU31_o}>}HtO zNzG`t-P3-QK6G@`r;pW38#kOT=zZ*AeTehH<2`49=e2(XWO{TrAF;pi#nC-G_a4~3 z=ZLs@{mv-5YK!yErMIjIj&|O?65MR+{_C&#)IH7r?Bf5v{_MA3e*4SoZ2F$G*4|wm zYVXaL{-U38>ScF+p(=(e#F(=Wmd{z}Z@1g^zzPFi@grfj>_G+0-Di>Y>tl3#7|z>l zTRR3Vykn3}Adj!z<8(M!V;bujjCQ-c?9xFmWEZW>YAD;;f8m5_v-^wRmF_OR@iptD z<~d{7k?i&2CxTC2%6m>dYEp1=g7=dRBdv22!K<`FyU9XWEck95KmJDcrEMHsR5ZA} zchO*J*Z3Q57(aIIyfGz%2bZXWhj6;$alKR0TO^iogrG~LXlO?9YwcN1!@zVjw|$gOD<_nGmzhY>SNGl(Byn zBS@Ji_zg6Mr#5sdNh*ob%0sBV5hCjwv=18F$ZlIxAy&4g8K{mTqucnWIH1gALN;1W z)`)P<0lAF>9=F_q6|g%Zts#@G-NqE>E!z1}4Up5Q+XmzhogKoT)0{tITL9 zByPOf44~7?c_kbD)!(27#tWO+UcJ1FH7%9e+I5D1Gh*Pt5fuXlRM2y^^<%3?jvLGS zVlSPO++>&D7fV=IqK$VY+Tc5Gt!%;v2s2J~i~O#}O7`!E@cZfcFIJggvzUwFDDMk3 z&a@pJh7v+Y5!g&3K7Szed83CE4qT~al`!Z-w6f{cj)IFL2`Y?GwYhYV){U24UP>Bb^|f$QZRQ6G&JVipGu+jRRy! zEU}<4_4zIn2#P-66^>#Kt0eqnMUsO5h6j-Jv{X+@azZ?7$+PjXfA$Y8kWSDkLZ5|1 zpRKr@%zZN(sLw+Z!JF?-&o98=?c5tG>4JCXmsxOLqoN3hwSGze+W)}H5i76#Qv0sc zp6#NzeSZd|d|Y$i;Eda)xflOa(G=4+y5ggs`i@PFW%u7yqz`Va04wCBW>yc-&w(xU zE6L6GObp8fto%NCGZ@V+`sH;PzOm!rFpEhN*#(pO-wAFdQ;aFb9gS?Zv!*+1cnojo zMziJx!Ruy0ZanXKF7OJ_v-%@y`GnS-mc@$2r$1XJtqTC=yRsqL@#amQ+5<{be5I3-v3r878>y?4{nXVNZd*`jE%&?i$~ZO?wdq} zvRY1N`!|v8nt^<`454g$-=x|j!6Zb1S;RcRjOn{18qPYS?ZO?xPOu0&z|ybRQTTN> za`1K$ewnP9O@jX3bG2$jS}O0__Zb~!25w6(!)+MHZOhIf%tgcay;MNkk;9a<7^cpDb-bM^v^XeB23N;e5%OdNay15`_p2)(ZrX^_sh zrva_fKt==OGym6^9#o^#B59=Hi=t6t5~3cJsL(cE=UDhZ8Dr+Slc=c3N)j3AEH%kg zU`RxSQHDmi61+q_3}v|1ggKTRQg~ zNQ5Z(lA=taBytLvJou*(?LReS;?)U@FjGcZ5W_HNM~)6V&BE==u=Wq}H(^8@={}uw zCZYCEl8A`5=TJ(nD^MKC`xy28WBgKfOCa?dSC&i2{{!xrcAR+HV_;-pU|^J-B{kuW zXFR{nR|a_w1`s%VRs0By{sUCK86W2MHC!a}%qo-Ek$2(yg&&^6|@0Z-78KPY*-)JKHh z-Z8%q(a{{MlOQQ}Z3-Q~$F(DB7$vC=m2tAfeQ#reIUl49gl=I*(yViyY_pD6sM<4A zXZZj7CKU{%tTrW%6=|Vv+9*I+)fmy}*j}-VvFow7aTsx=actxG$7#Zu zz}d!mjq@Lu7?%@Q9#;?739cX9cHBkW$9TASqIjx!*6>{6mE!f_&EuWLyNCA%?+-pX zJ`27Sz9alm{Br~h1eye{2u2C661*fNB9tQ3B6LldPuNR%iSR!WE0H#lQ=%-QMxu41 z>qI|@$%rM1wTPV(=K(?!@d@G&Btj%+Nt}@klB|*ZC6y-CC$&N9jI@VzlJqp`L(>0b z0%U4r4#{%JD#?b(R>-cBy&@+h=Os5o?t{FHyoY>={0jL?^8XYZ6lN%#Q23#!p%|uE zr?^bJ$pIZDTrJ}Ijx`zRMEUr}LD(NT#~X;E3D@n?Wb~%! z9n!m@f6TziAj4pe!4*Rh98k&7z|hVx%CO9Ej^P2rJ4Rwg0Y*heQ;fC&;W?uh#w0003r z0cQXN00DT~om0y$1VI!%Jw4u!AR-nby|kEVJtGpa^NL3%BnTEZt!IoG^N^kv;S;QU zft3Y+!q!Jv`3R?O-@!0Qq*B$VZryw8o_nhS4C5I#tYi;>kTb>>Cb^4o0)x0wY-0_# zij#2hqPPR&)~Mo6Ojs$!UAVK>6nA6FdR5$qxkS^yABTyY;sN4&#e>+jlZuBhVjn0T zMz38~{D?6-Qv3wZzQ!_2C~`)eS12G4htucYCkjx<87`^Kc%9Jd;DIv>4;jw1q6|{B zuF|_szY2LAED?u{HmfiEb<|jcE!ql14t8j-p+S^;=ila85$ELa8MnaGK)mx@Lwcq; ze`j#8$oLW&j24rn_h&@wt$T7;Lo+rUuJANjnjGm*9PMr>$!h8tNezsKs@!l&TOG&W zYUYblN4zfiJrZju*%`J-GK;%ZlG_5Ym~O@UGF61)o97z5*S$dv->ccaM@COX>pZ48 zE@ZeoZ;cK#))iEx=YQiOYCRKG1*v+GzHtX!;jFScIZ;y(C9(eVPdXy{nMy5?$ERPs zYmG54^lN9cyutf1?+-3laxU_;(!$xGC5Ls^aRr;~{EGY$Zrd04@mBVEa>VYN93p*R zo>+~p4N>NB%*t7od1W!jb(Y`ezc=#+t4Fo!004N}ZO~P0({T{M@$YS2+qt{rPXGV5 z>xQ?i#oe93R)MjNjsn98u7Qy72Ekr{;2QJ+2yVei;2DPp;1#;{#~b(Z$z5`nyCaI0 z_~XUP|KbNoltdGaff$UKFcV80@g$H)63L{HN*d{8kVzKVW(;E)$9N_%kx5Ku3R9WJbY?J++~YA1c*r9@hQIfWCp_f@ zzVOd>@{;Ggz|UvCvWYnan9DqBsbe4Y%%_1Mjf7ahLKg9f#VnzTr7UL|7unBBRON ztxB8Ht}IhJl;z5Q^PCYiHCNN(ya8V*SW{iq=#P|iPei-YVKcZx!TRRJt@iP_BKw5Z zl~$$A+;Xk>&S-A)R2moUsumK}PumdA-uop!jAWOIa z4pB?622)yCurwR6C|O`;Ac|F3umUAvumMG5BVw=uBSf+b0R}3v3 diff --git a/docs/backend_api/fonts/OpenSans-LightItalic-webfont.eot b/docs/backend_api/fonts/OpenSans-LightItalic-webfont.eot deleted file mode 100644 index 8f445929ffb03b50e98c2a2f7d831a0cb1b276a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20535 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 Z%0#`NexefPFV?Xj51H#Y#AC7WXn+Jg($4?@ diff --git a/docs/backend_api/fonts/OpenSans-LightItalic-webfont.svg b/docs/backend_api/fonts/OpenSans-LightItalic-webfont.svg deleted file mode 100644 index 431d7e354..000000000 --- a/docs/backend_api/fonts/OpenSans-LightItalic-webfont.svg +++ /dev/null @@ -1,1835 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/backend_api/fonts/OpenSans-LightItalic-webfont.woff b/docs/backend_api/fonts/OpenSans-LightItalic-webfont.woff deleted file mode 100644 index 43e8b9e6cc061ff17fd2903075cbde12715512b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23400 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
- -

Global

- - - - - - -
- -
- -

- - -
- -
-
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Members

- - - -

api :BackendScriptApi

- - - - -
- An instance of the frontend api available globally. -
- - - -
Type:
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - -

Type Definitions

- - - -

AttributeType

- - - - -
- There are currently only two types of attributes, labels or relations. -
- - - -
Type:
-
    -
  • - -"label" -| - -"relation" - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

NotePathRecord

- - - - - - -
Type:
-
    -
  • - -Object - - -
  • -
- - - - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
isArchived - - -boolean - - - -
isInHoistedSubTree - - -boolean - - - -
notePath - - -Array.<string> - - - -
isHidden - - -boolean - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

NoteType

- - - - -
- There are many different Note types, some of which are entirely opaque to the -end user. Those types should be used only for checking against, they are -not for direct use. -
- - - -
Type:
-
    -
  • - -"file" -| - -"image" -| - -"search" -| - -"noteMap" -| - -"launcher" -| - -"doc" -| - -"contentWidget" -| - -"text" -| - -"relationMap" -| - -"render" -| - -"canvas" -| - -"mermaid" -| - -"book" -| - -"webView" -| - -"code" - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - -

int

- - - - -
- A whole number -
- - - -
Type:
-
    -
  • - -number - - -
  • -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/hierarchy.html b/docs/backend_api/hierarchy.html new file mode 100644 index 000000000..b2ea24957 --- /dev/null +++ b/docs/backend_api/hierarchy.html @@ -0,0 +1 @@ +trilium
diff --git a/docs/backend_api/index.html b/docs/backend_api/index.html index f3c647a2b..612058e6f 100644 --- a/docs/backend_api/index.html +++ b/docs/backend_api/index.html @@ -1,65 +1,87 @@ - - - - - JSDoc: Home +trilium

trilium

TriliumNext Notes

Docker Pulls GitHub Downloads (all assets, all releases)

+

English | Chinese | Russian | Japanese | Italian | Spanish

+

TriliumNext Notes is an open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.

+

See screenshots for quick overview:

+

Trilium Screenshot

+

The original Trilium project is in maintenance mode

+

There are no special migration steps to migrate from a zadam/Trilium instance to a TriliumNext/Notes instance. Just upgrade your Trilium instance to the latest version and install TriliumNext/Notes as usual

+

Versions up to and including v0.90.4 are compatible with the latest zadam/trilium version of v0.63.7. Any later versions of TriliumNext have their sync versions incremented.

+

Feel free to join our official conversations. We would love to hear what features, suggestions, or issues you may have!

+
    +
  • Matrix (For synchronous discussions) +
      +
    • The General Matrix room is also bridged to XMPP
    • +
    +
  • +
  • Github Discussions (For Asynchronous discussions)
  • +
  • Wiki (For common how-to questions and user guides)
  • +
+ +

✨ Check out the following third-party resources/communities for more TriliumNext related goodies:

+ +

To use TriliumNext on your desktop machine (Linux, MacOS, and Windows) you have a few options:

+
    +
  • Download the binary release for your platform from the latest release page, unzip the package and run the trilium executable.
  • +
  • Access TriliumNext via the web interface of a server installation (see below) +
      +
    • Currently only the latest versions of Chrome & Firefox are supported (and tested).
    • +
    +
  • +
  • (Coming Soon) TriliumNext will also be provided as a Flatpak
  • +
+

Currently when running TriliumNext/Notes on MacOS, you may get the following error:

+
+

Apple could not verify "TriliumNext Notes" is free of malware and may harm your Mac or compromise your privacy.

+
+

You will need to run the command on your shell to resolve the error (documented here):

+
xattr -c "/path/to/Trilium Next.app"
+
- - - - - - +

To use TriliumNext on a mobile device:

+
    +
  • Use a mobile web browser to access the mobile interface of a server installation (see below)
  • +
  • Use of a mobile app is not yet supported (see here) to track mobile improvements.
  • +
+

To install TriliumNext on your own server (including via Docker from Dockerhub) follow the server installation docs.

+

See wiki for complete list of documentation pages.

+

You can also read Patterns of personal knowledge base to get some inspiration on how you might use TriliumNext.

+
git clone https://github.com/TriliumNext/Notes.git
cd Notes
npm install
npm run start-server +
- - -
- -

Home

- - - - - - - - -

- - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - - - \ No newline at end of file +

Head on over to our Docs repo

+
    +
  • CKEditor 5 - best WYSIWYG editor on the market, very interactive and listening team
  • +
  • FancyTree - very feature rich tree library without real competition. TriliumNext Notes would not be the same without it.
  • +
  • CodeMirror - code editor with support for huge amount of languages
  • +
  • jsPlumb - visual connectivity library without competition. Used in relation maps and link maps
  • +
+

You can support the original Trilium developer using GitHub Sponsors, PayPal or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). +Support for the TriliumNext organization will be possible in the near future.

+

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

+
diff --git a/docs/backend_api/interfaces/becca_entities_rows.AttachmentRow.html b/docs/backend_api/interfaces/becca_entities_rows.AttachmentRow.html new file mode 100644 index 000000000..b50d16189 --- /dev/null +++ b/docs/backend_api/interfaces/becca_entities_rows.AttachmentRow.html @@ -0,0 +1,14 @@ +AttachmentRow | trilium
interface AttachmentRow {
    attachmentId?: string;
    blobId?: string;
    content?: string | Buffer<ArrayBufferLike>;
    contentLength?: number;
    dateModified?: string;
    isProtected?: boolean;
    mime: string;
    ownerId?: string;
    position?: number;
    role: string;
    title: string;
    utcDateModified?: string;
    utcDateScheduledForErasureSince?: string;
}

Properties

attachmentId?: string
blobId?: string
content?: string | Buffer<ArrayBufferLike>
contentLength?: number
dateModified?: string
isProtected?: boolean
mime: string
ownerId?: string
position?: number
role: string
title: string
utcDateModified?: string
utcDateScheduledForErasureSince?: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.AttributeRow.html b/docs/backend_api/interfaces/becca_entities_rows.AttributeRow.html new file mode 100644 index 000000000..13232fc56 --- /dev/null +++ b/docs/backend_api/interfaces/becca_entities_rows.AttributeRow.html @@ -0,0 +1,9 @@ +AttributeRow | trilium
interface AttributeRow {
    attributeId?: string;
    isInheritable?: boolean;
    name: string;
    noteId?: string;
    position?: null | number;
    type: AttributeType;
    utcDateModified?: string;
    value?: string;
}

Properties

attributeId?: string
isInheritable?: boolean
name: string
noteId?: string
position?: null | number
utcDateModified?: string
value?: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.BlobRow.html b/docs/backend_api/interfaces/becca_entities_rows.BlobRow.html new file mode 100644 index 000000000..f5a23e08a --- /dev/null +++ b/docs/backend_api/interfaces/becca_entities_rows.BlobRow.html @@ -0,0 +1,6 @@ +BlobRow | trilium
interface BlobRow {
    blobId: string;
    content: string | Buffer<ArrayBufferLike>;
    contentLength: number;
    dateModified: string;
    utcDateModified: string;
}

Properties

blobId: string
content: string | Buffer<ArrayBufferLike>
contentLength: number
dateModified: string
utcDateModified: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.BranchRow.html b/docs/backend_api/interfaces/becca_entities_rows.BranchRow.html new file mode 100644 index 000000000..b5225a135 --- /dev/null +++ b/docs/backend_api/interfaces/becca_entities_rows.BranchRow.html @@ -0,0 +1,9 @@ +BranchRow | trilium
interface BranchRow {
    branchId?: string;
    isDeleted?: boolean;
    isExpanded?: boolean;
    noteId: string;
    notePosition?: null | number;
    parentNoteId: string;
    prefix?: null | string;
    utcDateModified?: string;
}

Properties

branchId?: string
isDeleted?: boolean
isExpanded?: boolean
noteId: string
notePosition?: null | number
parentNoteId: string
prefix?: null | string
utcDateModified?: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.EtapiTokenRow.html b/docs/backend_api/interfaces/becca_entities_rows.EtapiTokenRow.html new file mode 100644 index 000000000..6a8afd207 --- /dev/null +++ b/docs/backend_api/interfaces/becca_entities_rows.EtapiTokenRow.html @@ -0,0 +1,7 @@ +EtapiTokenRow | trilium
interface EtapiTokenRow {
    etapiTokenId?: string;
    isDeleted?: boolean;
    name: string;
    tokenHash: string;
    utcDateCreated?: string;
    utcDateModified?: string;
}

Properties

etapiTokenId?: string
isDeleted?: boolean
name: string
tokenHash: string
utcDateCreated?: string
utcDateModified?: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.NoteRow.html b/docs/backend_api/interfaces/becca_entities_rows.NoteRow.html new file mode 100644 index 000000000..e1ec0ca59 --- /dev/null +++ b/docs/backend_api/interfaces/becca_entities_rows.NoteRow.html @@ -0,0 +1,14 @@ +NoteRow | trilium
interface NoteRow {
    blobId: string;
    content?: string | Buffer<ArrayBufferLike>;
    dateCreated: string;
    dateModified: string;
    deleteId: string;
    isDeleted: boolean;
    isProtected: boolean;
    mime: string;
    noteId: string;
    title: string;
    type:
        | "search"
        | "file"
        | "text"
        | "code"
        | "relationMap"
        | "render"
        | "book"
        | "mermaid"
        | "canvas"
        | "image"
        | "noteMap"
        | "launcher"
        | "doc"
        | "contentWidget"
        | "webView"
        | "mindMap";
    utcDateCreated: string;
    utcDateModified: string;
}

Properties

blobId: string
content?: string | Buffer<ArrayBufferLike>
dateCreated: string
dateModified: string
deleteId: string
isDeleted: boolean
isProtected: boolean
mime: string
noteId: string
title: string
type:
    | "search"
    | "file"
    | "text"
    | "code"
    | "relationMap"
    | "render"
    | "book"
    | "mermaid"
    | "canvas"
    | "image"
    | "noteMap"
    | "launcher"
    | "doc"
    | "contentWidget"
    | "webView"
    | "mindMap"
utcDateCreated: string
utcDateModified: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.OptionRow.html b/docs/backend_api/interfaces/becca_entities_rows.OptionRow.html new file mode 100644 index 000000000..951402e00 --- /dev/null +++ b/docs/backend_api/interfaces/becca_entities_rows.OptionRow.html @@ -0,0 +1,11 @@ +OptionRow | trilium

Database representation of an option.

+

Options are key-value pairs that are used to store information such as user preferences (for example +the current theme, sync server information), but also information about the state of the application).

+
interface OptionRow {
    isSynced: boolean;
    name: string;
    utcDateModified?: string;
    value: string;
}

Properties

isSynced: boolean

true if the value should be synced across multiple instances (e.g. locale) or false if it should be local-only (e.g. theme).

+
name: string

The name of the option.

+
utcDateModified?: string
value: string

The value of the option.

+
diff --git a/docs/backend_api/interfaces/becca_entities_rows.RecentNoteRow.html b/docs/backend_api/interfaces/becca_entities_rows.RecentNoteRow.html new file mode 100644 index 000000000..d7458d9da --- /dev/null +++ b/docs/backend_api/interfaces/becca_entities_rows.RecentNoteRow.html @@ -0,0 +1,4 @@ +RecentNoteRow | trilium
interface RecentNoteRow {
    noteId: string;
    notePath: string;
    utcDateCreated?: string;
}

Properties

noteId: string
notePath: string
utcDateCreated?: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.RevisionRow.html b/docs/backend_api/interfaces/becca_entities_rows.RevisionRow.html new file mode 100644 index 000000000..a6a5402d3 --- /dev/null +++ b/docs/backend_api/interfaces/becca_entities_rows.RevisionRow.html @@ -0,0 +1,14 @@ +RevisionRow | trilium
interface RevisionRow {
    blobId?: string;
    contentLength?: number;
    dateCreated: string;
    dateLastEdited?: string;
    isProtected?: boolean;
    mime: string;
    noteId: string;
    revisionId?: string;
    title: string;
    type: string;
    utcDateCreated: string;
    utcDateLastEdited?: string;
    utcDateModified: string;
}

Properties

blobId?: string
contentLength?: number
dateCreated: string
dateLastEdited?: string
isProtected?: boolean
mime: string
noteId: string
revisionId?: string
title: string
type: string
utcDateCreated: string
utcDateLastEdited?: string
utcDateModified: string
diff --git a/docs/backend_api/media/README-ZH_CN.md b/docs/backend_api/media/README-ZH_CN.md new file mode 100644 index 000000000..f6aa860b1 --- /dev/null +++ b/docs/backend_api/media/README-ZH_CN.md @@ -0,0 +1,97 @@ +# TriliumNext Notes + +[English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) + +TriliumNext Notes 是一个层次化的笔记应用程序,专注于建立大型个人知识库。请参阅[屏幕截图](https://triliumnext.github.io/Docs/Wiki/screenshot-tour)以快速了解: + +Trilium Screenshot + +## ⚠️ 为什么选择TriliumNext? + +[原始的Trilium项目目前处于维护模式](https://github.com/zadam/trilium/issues/4620) + +## 🗭 与我们讨论 + +欢迎加入我们的官方讨论和社区。我们专注于Trilium的开发,乐于听取您对功能、建议或问题的意见! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org)(用于同步讨论) +- [Github Discussions](https://github.com/TriliumNext/Notes/discussions)(用于异步讨论) +- [Wiki](https://triliumnext.github.io/Docs/)(用于常见操作问题和用户指南) + +上面链接的两个房间是镜像的,所以您可以在任意平台上使用XMPP或者Matrix来和我们交流。 + +### 非官方社区 + +[Trilium Rocks](https://discord.gg/aqdX9mXX4r) + +## 🎁 特性 + +* 笔记可以排列成任意深的树。单个笔记可以放在树中的多个位置(请参阅[克隆](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* 丰富的所见即所得笔记编辑功能,包括带有 Markdown [自动格式化功能的](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat)表格,图像和[数学公式](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support) +* 支持编辑[使用源代码的笔记](https://triliumnext.github.io/Docs/Wiki/code-notes),包括语法高亮显示 +* 笔记之间快速[导航](https://triliumnext.github.io/Docs/Wiki/note-navigation),全文搜索和[提升笔记](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* 无缝[笔记版本控制](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* 笔记[属性](https://triliumnext.github.io/Docs/Wiki/attributes)可用于笔记组织,查询和高级[脚本编写](https://triliumnext.github.io/Docs/Wiki/scripts) +* [同步](https://triliumnext.github.io/Docs/Wiki/synchronization)与自托管同步服务器 + * 有一个[第三方提供的同步服务器托管服务](https://trilium.cc/paid-hosting) +* 公开地[分享](https://triliumnext.github.io/Docs/Wiki/sharing)(发布)笔记到互联网 +* 具有按笔记粒度的强大的[笔记加密](https://triliumnext.github.io/Docs/Wiki/protected-notes) +* 使用自带的 Excalidraw 来绘制图表(笔记类型“画布”) +* [关系图](https://triliumnext.github.io/Docs/Wiki/relation-map)和[链接图](https://triliumnext.github.io/Docs/Wiki/link-map),用于可视化笔记及其关系 +* [脚本](https://triliumnext.github.io/Docs/Wiki/scripts) - 请参阅[高级功能展示](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* 可用于自动化的 [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) +* 在拥有超过 10 万条笔记时仍能保持良好的可用性和性能 +* 针对智能手机和平板电脑进行优化的[用于移动设备的前端](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) +* [夜间主题](https://triliumnext.github.io/Docs/Wiki/themes) +* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) 和 [Markdown 导入导出](https://triliumnext.github.io/Docs/Wiki/markdown)功能 +* 使用[网页剪藏](https://triliumnext.github.io/Docs/Wiki/web-clipper)轻松保存互联网上的内容 + +✨ 查看以下第三方资源,获取更多关于TriliumNext的好东西: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium):提供第三方主题、脚本、插件等资源的列表。 +- [TriliumRocks!](https://trilium.rocks/):提供教程、指南等更多内容。 + +## 🏗 构建 + +Trilium 可以用作桌面应用程序(Linux 和 Windows)或服务器(Linux)上托管的 Web 应用程序。虽然有 macOS 版本的桌面应用程序,但它[不受支持](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support)。 + +* 如果要在桌面上使用 Trilium,请从[最新版本](https://github.com/TriliumNext/Notes/releases/latest)下载适用于您平台的二进制版本,解压缩该软件包并运行`trilium`可执行文件。 +* 如果要在服务器上安装 Trilium,请参考[此页面](https://triliumnext.github.io/Docs/Wiki/server-installation)。 + * 当前仅支持(测试过)最近发布的 Chrome 和 Firefox 浏览器。 + +Trilium 也提供 Flatpak: + +[](https://flathub.org/apps/details/com.github.zadam.trilium) + +## 📝 文档 + +[有关文档页面的完整列表,请参见 Wiki。](https://triliumnext.github.io/Docs/) + +* [Wiki 的中文翻译版本](https://github.com/baddate/trilium/wiki/) + +您还可以阅读[个人知识库模式](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge),以获取有关如何使用 Trilium 的灵感。 + +## 💻 贡献 + + +或者克隆本仓库到本地,并运行 + +```shell +npm install +npm run start-server +``` + +## 👏 致谢 + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - 市面上最好的所见即所得编辑器,拥有互动性强且聆听能力强的团队 +* [FancyTree](https://github.com/mar10/fancytree) - 一个非常丰富的关于树的库,强大到没有对手。没有它,Trilium Notes 将不会如此。 +* [CodeMirror](https://github.com/codemirror/CodeMirror) - 支持大量语言的代码编辑器 +* [jsPlumb](https://github.com/jsplumb/jsplumb) - 强大的可视化连接库。用于[关系图](https://triliumnext.github.io/Docs/Wiki/relation-map)和[链接图](https://triliumnext.github.io/Docs/Wiki/link-map) + +## 🤝 捐赠 + +你可以通过 GitHub Sponsors,[PayPal](https://paypal.me/za4am) 或者比特币 (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2) 来捐赠。 + +## 🔑 许可证 + +本程序是自由软件:你可以再发布本软件和/或修改本软件,只要你遵循 Free Software Foundation 发布的 GNU Affero General Public License 的第三版或者任何(由你选择)更晚的版本。 diff --git a/docs/backend_api/media/README.es.md b/docs/backend_api/media/README.es.md new file mode 100644 index 000000000..a2ea94144 --- /dev/null +++ b/docs/backend_api/media/README.es.md @@ -0,0 +1,106 @@ +# TriliumNext Notes + +[English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) + +TriliumNext Notes es una aplicación de toma de notas jerárquicas multi-plataforma y de código libre con un enfoque en la construcción de grandes bases de conocimiento personal. + +Vea estas [capturas de pantalla](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) para un vistazo rápido: + +Trilium Screenshot + +## ⚠️ ¿Por qué usar TriliumNext? + +[El proyecto Trilium original está en modo de mantenimiento](https://github.com/zadam/trilium/issues/4620) + +### ¿Cómo migrar desde Trilium? + +No hay pasos de migración especiales para migrar de una instancia de zadam/Trilium a una instancia de TriliumNext/Notes. Simplemente actualice su instancia de Trilium a la última versión e [instale TriliumNext/Notes como de costumbre](#-Instalación) + +## 💬 Discuta con nosotros + +Siéntase libre de unirse a nuestras conversaciones oficiales. ¡Nos encantaría escuchar de las características, sugerencias o problemas que pueda tener! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (Para discusiones síncronas) + - La sala `General` es replicada a [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Discusiones de GitHub](https://github.com/TriliumNext/Notes/discussions) (Para discusiones asíncronas) +- [Wiki](https://triliumnext.github.io/Docs/) (Para preguntas frecuentes y guías de usuario) + +## 🎁 Características + +- Las notas pueden ser acomodadas en un árbol de profundidad arbitraria. Una sola nota puede ser colocada en múltiples lugares del árbol (vea [clonar](https://triliumnext.github.io/Docs/Wiki/cloning-notes) +- Edición de notas WYSIWYG enriquecida que incluye, por ejemplo, tablas, imágenes y [matemáticas](https://triliumnext.github.io/Docs/Wiki/text-notes) con [autoformato](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) markdown +- Soporte para editar [notas con código fuente](https://triliumnext.github.io/Docs/Wiki/code-notes), incluyendo resaltado de sintaxis +- Rápida y sencilla [navegación entre notas](https://triliumnext.github.io/Docs/Wiki/note-navigation), búsqueda de texto completo y [elevación de notas](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +- [Versionado de notas](https://triliumnext.github.io/Docs/Wiki/note-revisions) sutil +- Los [atributos](https://triliumnext.github.io/Docs/Wiki/attributes) de las notas pueden utilizarse para organización, realizar consultas y [scripts](https://triliumnext.github.io/Docs/Wiki/scripts) avanzados +- [Sincronización](https://triliumnext.github.io/Docs/Wiki/synchronization) con servidor de sincronización propio + - existe un [servicio de terceros para alojar el servidor de sincronización](https://trilium.cc/paid-hosting) +- [Compartir](https://triliumnext.github.io/Docs/Wiki/sharing) (publicar) notas al Internet público +- Fuerte [encriptación de notas](https://triliumnext.github.io/Docs/Wiki/protected-notes) con granularidad para cada nota +- Esbozo de diagramas con Excalidraw incorporado (tipo de nota «canvas») +- [Mapas de relaciones]() y [mapas de enlaces](https://triliumnext.github.io/Docs/Wiki/link-map) para visualizar las notas y sus relaciones +- [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - vea [casos de uso avanzados](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +- [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) para automatización +- Escala bien tanto en uso como en rendimiento a partir de 100,000 notas +- [Interfaz móvil](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) optimizada para teléfonos inteligentes y tabletas +- [Tema nocturno](https://triliumnext.github.io/Docs/Wiki/themes) +- Importación y exportación de [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) y [Markdown](https://triliumnext.github.io/Docs/Wiki/markdown) +- [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) para guardar fácilmente contenido web + +✨ Consulte los/las siguientes recursos/comunidades de terceros para obtener más información sobre complementos para TriliumNext: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) para temas, scripts, plugins y más de terceros. +- [TriliumRocks!](https://trilium.rocks/) para tutoriales, guías y mucho más. + +## 🏗 Instalación + +### Escritorio + +Para usar TriliumNext en su máquina de escritorio (Linux, MacOS y Windows) tiene algunas opciones: + +- Descargue la versión binaria para su plataforma desde la [página de lanzamientos](https://github.com/TriliumNext/Notes/releases/latest), descomprima el paquete y ejecute el ejecutable `trilium`. +- Acceda a TriliumNext a través de la interfaz web de una instalación de servidor (ver más abajo) + - Actualmente solo las últimas versiones de Chrome y Firefox son compatibles (y están probadas). +- (Próximamente) TriliumNext también se proporcionará como un Flatpak + +### Móvil + +Para usar TriliumNext en un dispositivo móvil: + +- Utilice un navegador web móvil para acceder a la interfaz móvil de una instalación de servidor (ver más abajo) +- El uso de una aplicación móvil aún no está soportado ([vea aquí](https://github.com/TriliumNext/Notes/issues/72)) para seguir las mejoras móviles. + +### Servidor + +Para instalar TriliumNext en su servidor (incluyendo vía Docker desde [Dockerhub](https://hub.docker.com/r/triliumnext/notes)) siga la [documentación de instalación de servidor](https://triliumnext.github.io/Docs/Wiki/server-installation). + +## 📝 Documentación + +[Vea la Wiki para la lista completa de páginas de documentación.](https://triliumnext.github.io/Docs) + +También puede leer [Patrones para una base de conocimiento personal](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) para obtener un poco de inspiración de como podría usar TriliumNext. + +## 💻 Contribuir + +Clone localmente y ejecute + +```shell +npm install +npm run start-server +``` + +## 👏 Reconocimientos + +- [CKEditor 5](https://github.com/ckeditor/ckeditor5) - el mejor editor WYSIWYG en el mercado, equipo muy interactivo y atento +- [FancyTree](https://github.com/mar10/fancytree) - biblioteca de árbol muy rica en funciones sin competencia real. TriliumNext Notes no sería lo mismo sin esta. +- [CodeMirror](https://github.com/codemirror/CodeMirror) - editor de código con soporte para una gran cantidad de lenguajes +- [jsPlumb](https://github.com/jsplumb/jsplumb) - biblioteca de conectividad visual sin competencia. Usado en [mapas de relación](https://triliumnext.github.io/Docs/Wiki/Relation-map) y [mapas de enlace](https://triliumnext.github.io/Docs/Wiki/Link-map) + +## 🤝 Soporte + +Puede apoyar al desarrollador original de Trilium usando GitHub Sponsors, [PayPal](https://paypal.me/za4am) o Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). +Apoyo para la organización TriliumNext será posible en un futuro próximo. + +## 🔑 Licencia + +Este programa es software libre: puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de Affero GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a su elección) cualquier versión posterior. diff --git a/docs/backend_api/media/README.it.md b/docs/backend_api/media/README.it.md new file mode 100644 index 000000000..a778230c7 --- /dev/null +++ b/docs/backend_api/media/README.it.md @@ -0,0 +1,93 @@ +# TriliumNext Notes + +[English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) + +TriliumNext Notes è un'applicazione per appunti ad organizzazione gerarchica, studiata per la costruzione di archivi di conoscenza personali di grandi dimensioni. + +Vedi [fotografie](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) per una panoramica veloce: + +Trilium Screenshot + +## ⚠️ Perchè TriliumNext? +[Il progetto originale Trilium è in modalità di manutenzione](https://github.com/zadam/trilium/issues/4620) + +## 🗭 Discuti con noi +Sentiti libero di unirti alle nostre discussioni ufficiali e alla nostra comunità. Siamo concentrati sullo sviluppo di Trilium e ci piacerebbe sapere quali funzioni, suggerimenti o eventuali problemi hai! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (Per discussioni sincrone) +- [Discussioni Github](https://github.com/TriliumNext/Notes/discussions) (Per discussioni asincrone) +- [Wiki](https://triliumnext.github.io/Docs/) (Per le domande più comuni e le guide per l'utente) + +Le due stanze linkate sopra sono connesse e contengono gli stessi messaggi, quindi puoi usare XMPP o Matrix da qualsiasi client tu preferisca, praticamente su qualsiasi piattaforma! +### Comunità non ufficiali + +[Trilium Rocks](https://discord.gg/aqdX9mXX4r) +## 🎁 Funzionalità + +* Gli appunti possono essere organizzati in un albero di profondità arbitraria. Un singolo appunto può essere collocato in più posti nell'albero (vedi [clonazione](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Ricco editor visuale (WYSIWYG), con supporto -tra l'altro- per tabelle, immagini ed [espressioni matematiche](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support) e con [formattazione automatica](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) per markdown +* Supporto per la modifica di [appunti con codice sorgente](https://triliumnext.github.io/Docs/Wiki/code-notes), con evidenziazione della sintassi +* [Navigazione veloce](https://triliumnext.github.io/Docs/Wiki/note-navigation) tra gli appunti, ricerca testuale completa e [fissaggio degli appunti](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* Supporto integrato ed automatico per le [revisioni degli appunti](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* Gli [attributi](https://triliumnext.github.io/Docs/Wiki/attributes) degli appunti possono essere utilizzati per l'organizzazione, per l'interrogazione e per lo scripting avanzato (prorgrammazione). +* [Sincronizzazione](https://triliumnext.github.io/Docs/Wiki/synchronization) con un server di sincronizzazione auto-ospitato + * c'è un [servizio di terze parti per ospitare server di sincronizzazione](https://trilium.cc/paid-hosting) +* [Condivisione](https://triliumnext.github.io/Docs/Wiki/sharing) (pubblicazione) di appunti sull'internet pubblico +* Robusta [crittografia](https://triliumnext.github.io/Docs/Wiki/protected-notes) configurabile singolarmente per ogni appunto +* Disegno di diagrammi con Excalidraw (tipo di appunto "canvas") +* [Mappe relazionali](https://triliumnext.github.io/Docs/Wiki/relation-map) e [mappe di collegamenti](https://triliumnext.github.io/Docs/Wiki/link-map) per visualizzare gli appunti e le loro relazioni +* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - vedi [Esempi avanzati](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [API REST](https://triliumnext.github.io/Docs/Wiki/etapi) per l'automazione +* Si adatta bene sia in termini di usabilità che di prestazioni fino ad oltre 100 000 appunti +* Interfaccia utente ottimizzata per il [mobile](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) (smartphone e tablet) +* [Tema Notturno](https://triliumnext.github.io/Docs/Wiki/themes) +* Supporto per importazione ed esportazione da e per [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) e [Markdown import](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) per il salvataggio facile di contenuti web + +✨ Dai un'occhiata alle seguenti risorse di terze parti per scoprire altre bellezze legate a TriliumNext: + +-[awesome-trilium](https://github.com/Nriver/awesome-trilium) per temi, script, plugin e altro di terze parti. +- [TriliumRocks!](https://trilium.rocks/) per tutorial, guide e molto altro. +## 🏗 Rilasci + + +Trilium è fornito come applicazione desktop (Linux e Windows) o come applicazione web ospitata sul tuo server (Linux). La versione desktop per Mac OS è disponibile, ma [non è supportata](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support). + +* Se vuoi usare Trilium sul tuo desktop, scarica il rilascio binario per la tua piattaforma dall'[ultimo rilascio](https://github.com/TriliumNext/Notes/releases/latest), decomprimi l'archivio e avvia l'eseguibile ```trilium```. +* Se vuoi installare Trilium su un server, segui [questa pagina](https://triliumnext.github.io/Docs/Wiki/server-installation). + * Per ora solo Chrome e Firefox sono i browser supportati (testati). + +TriliumNext sarà fornito anche come Flatpak: + + + +## 📝 Documentazione + +[Vedi la wiki per una lista completa delle pagine di documentazione.](https://triliumnext.github.io/Docs/) + +Puoi anche leggere ["Patterns of personal knowledge base"](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) per avere un'ispirazione su come potresti utilizzare Trilium. + +## 💻 Contribuire + +Clona localmente ed esegui + +```shell +npm install +npm run start-server +``` + +## 👏 Riconoscimenti + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - miglior editor visuale (WYSIWYG) sul mercato, squadra di sviluppo attenta e reattiva +* [FancyTree](https://github.com/mar10/fancytree) - libreria per alberi molto ricca di funzionalità, senza pari. Trilium Notes non sarebbe lo stesso senza di essa. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - editor di codice con supporto per un'enorme quantità di linguaggi. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - libreria per la connettività visuale senza pari. Utilizzata per [mappe relazionali](https://triliumnext.github.io/Docs/Wiki/relation-map) e [mappe di collegamenti](https://triliumnext.github.io/Docs/Wiki/link-map). + +## 🤝 Supporto + +Puoi sostenere lo sviluppatore originale di Trilium utilizzando gli sponsor di GitHub, [PayPal](https://paypal.me/za4am) o Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). +Il supporto all'organizzazione TriliumNext sarà possibile nel prossimo futuro. + +## 🔑 Licenza + +Questo programma è software libero: è possibile redistribuirlo e/o modificarlo nei termini della GNU Affero General Public License come pubblicata dalla Free Software Foundation, sia la versione 3 della Licenza, o (a propria scelta) qualsiasi versione successiva. diff --git a/docs/backend_api/media/README.ja.md b/docs/backend_api/media/README.ja.md new file mode 100644 index 000000000..110b779c5 --- /dev/null +++ b/docs/backend_api/media/README.ja.md @@ -0,0 +1,73 @@ +# TriliumNext Notes + +[English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) + +Trilium Notes は、大規模な個人知識ベースの構築に焦点を当てた、階層型ノートアプリケーションです。概要は[スクリーンショット](https://triliumnext.github.io/Docs/Wiki/screenshot-tour)をご覧ください: + +Trilium Screenshot + +## 🎁 特徴 + +* ノートは、任意の深さのツリーに配置できます。単一のノートをツリー内の複数の場所に配置できます ([cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes) を参照) +* マークダウン[オートフォーマット](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat)による、表、画像、[数学](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support)などの豊富な WYSIWYG ノート編集機能 +* シンタックスハイライトを含む[ソースコード付きノート](https://triliumnext.github.io/Docs/Wiki/code-notes)の編集をサポート +* [ノート間のナビゲーション](https://triliumnext.github.io/Docs/Wiki/note-navigation)、全文検索、[ノートホイスト](https://triliumnext.github.io/Docs/Wiki/note-hoisting)が高速かつ簡単に行えます +* シームレスな[ノートのバージョン管理](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* ノート[属性](https://triliumnext.github.io/Docs/Wiki/Attributes)は、ノート整理、クエリ、高度な[スクリプト](https://triliumnext.github.io/Docs/Wiki/scripts)に使用できます +* 自己ホスト型同期サーバーとの[同期](https://triliumnext.github.io/Docs/Wiki/synchronization) + * [同期サーバーをホストするサードパーティ・サービス](https://trilium.cc/paid-hosting)があります +* 公開インターネットへのノートの[共有](https://triliumnext.github.io/Docs/Wiki/sharing)(公開) +* ノートごとの粒度を持つ強力な[ノート暗号化](https://triliumnext.github.io/Docs/Wiki/protected-notes) +* 組み込みの Excalidraw を使用した図のスケッチ (ノート タイプ"キャンバス") +* ノートとその関係を可視化するための[関係図](https://triliumnext.github.io/Docs/Wiki/relation-map)と[リンクマップ](https://triliumnext.github.io/Docs/Wiki/link-map) +* [スクリプティング](https://triliumnext.github.io/Docs/Wiki/scripts) - [高度なショーケース](https://triliumnext.github.io/Docs/Wiki/advanced-showcases)を参照 +* 自動化のための [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) +* ユーザビリティとパフォーマンスの両方で 100 000 ノート以上に拡張可能 +* スマートフォンとタブレット向けのタッチ最適化[モバイルフロントエンド](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) +* [ナイトテーマ](https://triliumnext.github.io/Docs/Wiki/themes) +* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) と [Markdown のインポートとエクスポート](https://triliumnext.github.io/Docs/Wiki/Markdown) +* Web コンテンツを簡単に保存するための [Web クリッパー](https://triliumnext.github.io/Docs/Wiki/web-clipper) + +サードパーティのテーマ、スクリプト、プラグインなどは、 [awesome-trilium](https://github.com/Nriver/awesome-trilium) をチェックしてください。 + +## 🏗 ビルド + +Trilium は、デスクトップアプリケーション(Linux、Windows)またはサーバー上でホストされるウェブアプリケーション(Linux)として提供されます。 Mac OS のデスクトップビルドも利用可能ですが、 [unsupported](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support) となっています。 + +* デスクトップで Trilium を使用したい場合は、 [latest release](https://github.com/TriliumNext/Notes/releases/latest) からお使いのプラットフォームのバイナリリリースをダウンロードし、パッケージを解凍して ``trilium`` の実行ファイルを実行してください。 +* サーバーに Trilium をインストールする場合は、[このページ](https://triliumnext.github.io/Docs/Wiki/server-installation)に従ってください。 + * 現在、対応(動作確認)しているブラウザは、最近の Chrome と Firefox のみです。 + +Trilium は Flatpak としても提供されます: + +[](https://flathub.org/apps/details/com.github.zadam.trilium) + +## 📝 ドキュメント + +[ドキュメントページの全リストはwikiをご覧ください。](https://triliumnext.github.io/Docs/) + +また、[個人的な知識基盤のパターン](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge)を読むと、 Trilium の使い方のヒントを得ることができます。 + +## 💻 コントリビュート + +または、ローカルにクローンして実行 + +```shell +npm install +npm run start-server +``` + +## 📢 シャウトアウト + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - 市場で最高の WYSIWYG エディター、非常にインタラクティブで聞き上手なチーム +* [FancyTree](https://github.com/mar10/fancytree) - 真の競争相手がいない、非常に機能豊富なツリーライブラリです。 Trilium Notes は、これなしでは成り立たないでしょう。 +* [CodeMirror](https://github.com/codemirror/CodeMirror) - 膨大な数の言語をサポートするコードエディタ +* [jsPlumb](https://github.com/jsplumb/jsplumb) - 競合のないビジュアルコネクティビティライブラリです。[関係図](https://triliumnext.github.io/Docs/Wiki/relation-map)、[リンク図](https://triliumnext.github.io/Docs/Wiki/link-map)で使用。 + +## 🤝 サポート + +GitHub スポンサー、[PayPal](https://paypal.me/za4am)もしくは Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2) にて Trilium をサポートすることができます。 + +## 🔑 ライセンス + +このプログラムはフリーソフトウェアです:フリーソフトウェア財団が発行した GNU Affero General Public License のバージョン3、またはそれ以降のバージョンのいずれかに従って、再配布および/または改変することができます。 diff --git a/docs/backend_api/media/README.md b/docs/backend_api/media/README.md new file mode 100644 index 000000000..1800f667e --- /dev/null +++ b/docs/backend_api/media/README.md @@ -0,0 +1,126 @@ +# TriliumNext Notes + +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/notes) ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/triliumnext/notes/total) + +[English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) + +TriliumNext Notes is an open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases. + +See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for quick overview: + +Trilium Screenshot + +## ⚠️ Why TriliumNext? + +[The original Trilium project is in maintenance mode](https://github.com/zadam/trilium/issues/4620) + +### Migrating from Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to a TriliumNext/Notes instance. Just upgrade your Trilium instance to the latest version and [install TriliumNext/Notes as usual](#-installation) + +Versions up to and including [v0.90.4](https://github.com/TriliumNext/Notes/releases/tag/v0.90.4) are compatible with the latest zadam/trilium version of [v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later versions of TriliumNext have their sync versions incremented. + +## 💬 Discuss with us + +Feel free to join our official conversations. We would love to hear what features, suggestions, or issues you may have! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous discussions) + - The `General` Matrix room is also bridged to [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Notes/discussions) (For Asynchronous discussions) +- [Wiki](https://triliumnext.github.io/Docs/) (For common how-to questions and user guides) + +## 🎁 Features + +* Notes can be arranged into arbitrarily deep tree. Single note can be placed into multiple places in the tree (see [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Rich WYSIWYG note editing including e.g. tables, images and [math](https://triliumnext.github.io/Docs/Wiki/text-notes) with markdown [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* Support for editing [notes with source code](https://triliumnext.github.io/Docs/Wiki/code-notes), including syntax highlighting +* Fast and easy [navigation between notes](https://triliumnext.github.io/Docs/Wiki/note-navigation), full text search and [note hoisting](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* Seamless [note versioning](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* Note [attributes](https://triliumnext.github.io/Docs/Wiki/attributes) can be used for note organization, querying and advanced [scripting](https://triliumnext.github.io/Docs/Wiki/scripts) +* [Synchronization](https://triliumnext.github.io/Docs/Wiki/synchronization) with self-hosted sync server + * there's a [3rd party service for hosting synchronisation server](https://trilium.cc/paid-hosting) +* [Sharing](https://triliumnext.github.io/Docs/Wiki/sharing) (publishing) notes to public internet +* Strong [note encryption](https://triliumnext.github.io/Docs/Wiki/protected-notes) with per-note granularity +* Sketching diagrams with built-in Excalidraw (note type "canvas") +* [Relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map) and [link maps](https://triliumnext.github.io/Docs/Wiki/link-map) for visualizing notes and their relations +* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - see [Advanced showcases](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) for automation +* Scales well in both usability and performance upwards of 100 000 notes +* Touch optimized [mobile frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) for smartphones and tablets +* [Night theme](https://triliumnext.github.io/Docs/Wiki/themes) +* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) and [Markdown import & export](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) for easy saving of web content + +✨ Check out the following third-party resources/communities for more TriliumNext related goodies: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party themes, scripts, plugins and more. +- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more. + +## 🏗 Installation + +### Desktop + +To use TriliumNext on your desktop machine (Linux, MacOS, and Windows) you have a few options: + +* Download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Notes/releases/latest), unzip the package and run the ```trilium``` executable. +* Access TriliumNext via the web interface of a server installation (see below) + * Currently only the latest versions of Chrome & Firefox are supported (and tested). +* (Coming Soon) TriliumNext will also be provided as a Flatpak + +#### MacOS +Currently when running TriliumNext/Notes on MacOS, you may get the following error: +> Apple could not verify "TriliumNext Notes" is free of malware and may harm your Mac or compromise your privacy. + +You will need to run the command on your shell to resolve the error (documented [here](https://github.com/TriliumNext/Notes/issues/329#issuecomment-2287164137)): + +```bash +xattr -c "/path/to/Trilium Next.app" +``` + +### Mobile + +To use TriliumNext on a mobile device: + +* Use a mobile web browser to access the mobile interface of a server installation (see below) +* Use of a mobile app is not yet supported ([see here](https://github.com/TriliumNext/Notes/issues/72)) to track mobile improvements. + +### Server + +To install TriliumNext on your own server (including via Docker from [Dockerhub](https://hub.docker.com/r/triliumnext/notes)) follow [the server installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + +## 📝 Documentation + +[See wiki for complete list of documentation pages.](https://triliumnext.github.io/Docs) + +You can also read [Patterns of personal knowledge base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) to get some inspiration on how you might use TriliumNext. + +## 💻 Contribute + +### Code + +```shell +git clone https://github.com/TriliumNext/Notes.git +cd Notes +npm install +npm run start-server +``` + +### Documentation + +Head on over to our [Docs repo](https://github.com/TriliumNext/Docs) + +## 👏 Shoutouts + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - best WYSIWYG editor on the market, very interactive and listening team +* [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. TriliumNext Notes would not be the same without it. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library without competition. Used in [relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) + +## 🤝 Support + +You can support the original Trilium developer using GitHub Sponsors, [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). +Support for the TriliumNext organization will be possible in the near future. + +## 🔑 License + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. diff --git a/docs/backend_api/media/README.ru.md b/docs/backend_api/media/README.ru.md new file mode 100644 index 000000000..d78738915 --- /dev/null +++ b/docs/backend_api/media/README.ru.md @@ -0,0 +1,59 @@ +# TriliumNext Notes + +[English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) + +Trilium Notes – это приложение для заметок с иерархической структурой, ориентированное на создание больших персональных баз знаний. Для быстрого ознакомления посмотрите [скриншот-тур](https://triliumnext.github.io/Docs/Wiki/screenshot-tour): + +Trilium Screenshot + +## 🎁 Возможности + +* Заметки можно расположить в виде дерева произвольной глубины. Отдельную заметку можно разместить в нескольких местах дерева (см. [клонирование](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Продвинутый визуальный редактор (WYSIWYG) позволяет работать с таблицами, изображениями, [формулами](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support) и разметкой markdown, имеет [автоформатирование](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* Редактирование [заметок с исходным кодом](https://triliumnext.github.io/Docs/Wiki/code-notes), включая подсветку синтаксиса +* Быстрая и простая [навигация между заметками](https://triliumnext.github.io/Docs/Wiki/note-navigation), полнотекстовый поиск и [выделение заметок](https://triliumnext.github.io/Docs/Wiki/note-hoisting) в отдельный блок +* Бесшовное [версионирование заметки](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* Специальные [атрибуты](https://triliumnext.github.io/Docs/Wiki/attributes) позволяют гибко организовать структуру, используются для поиска и продвинутого [скриптинга](https://triliumnext.github.io/Docs/Wiki/scripts) +* [Синхронизация](https://triliumnext.github.io/Docs/Wiki/synchronization) заметок со своим сервером +* Надёжное [шифрование](https://triliumnext.github.io/Docs/Wiki/protected-notes) с детализацией по каждой заметке +* [Карты связей](https://triliumnext.github.io/Docs/Wiki/relation-map) и [карты ссылок](https://triliumnext.github.io/Docs/Wiki/link-map) для визуализации их взяимосвязей +* [Скрипты](https://triliumnext.github.io/Docs/Wiki/scripts) - см. [продвинутые примеры](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* Хорошо масштабируется, как по удобству использования, так и по производительности до 100000 заметок +* Оптимизированный [мобильный фронтенд](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) смартфонов и планшетов +* [Темная тема](https://triliumnext.github.io/Docs/Wiki/themes) +* Импорт и экпорт [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) и данных в [markdown](https://triliumnext.github.io/Docs/Wiki/markdown) формате +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) для удобного сохранения веб-контента + +## 🏗 Сборки + +Trilium предоставляется в виде десктопного приложения (Linux и Windows) или веб-приложения, размещенного на вашем сервере (Linux). Доступна сборка Mac OS, но она [не поддерживается](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support). + +* Если вы хотите использовать Trilium на десктопе, скачайте архив для своей платформы со страницы [релизов](https://github.com/TriliumNext/Notes/releases/latest), распакуйте и запустите исполняемый файл ```trilium```. +* Если вы хотите установить Trilium на сервере, следуйте этой [инструкции](https://triliumnext.github.io/Docs/Wiki/server-installation). + * В данный момент поддерживаются (протестированы) последние версии браузеров Chrome и Firefox. + +## 📝 Документация + +[Полный список страниц документации доступен в Wiki.](https://triliumnext.github.io/Docs/) + +Вы также можете ознакомиться с [шаблонами персональных баз знаний](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge), чтобы получить представление о том, как можно использовать Trilium. + +## 💻 Участвуйте в разработке + +Или склонируйте на своё устройство и запустите + +```shell +npm install +npm run start-server +``` + +## 👏 Благодарности + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - лучший WYSIWYG редактор, очень активная и внимательная команда. +* [FancyTree](https://github.com/mar10/fancytree) - многофункциональная библиотека для создания древовидных структур. Вне конкуренции. Без него Trilium Notes не были бы таким. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - редактор кода с поддержкой огромного количество языков. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - библиотека для визуализации связей. Вне конкуренции. Используется в [картах связей](https://triliumnext.github.io/Docs/Wiki/relation-map) и [картах ссылок](https://triliumnext.github.io/Docs/Wiki/link-map). + +## 🔑 Лицензия + +Эта программа является бесплатным программным обеспечением: вы можете распространять и/или изменять ее в соответствии с условиями GNU Affero General Public License, опубликованной Free Software Foundation, либо версии 3 Лицензии, либо (по вашему выбору) любой более поздней версии. diff --git a/docs/backend_api/module-sql.html b/docs/backend_api/module-sql.html deleted file mode 100644 index e254a5b39..000000000 --- a/docs/backend_api/module-sql.html +++ /dev/null @@ -1,1309 +0,0 @@ - - - - - JSDoc: Module: sql - - - - - - - - - - -
- -

Module: sql

- - - - - - -
- -
- -
- -
-
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - -

Methods

- - - - - - - -

(static) execute(query, paramsopt)

- - - - - - -
- Execute SQL -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
query - - -string - - - - - - - - - - SQL query with ? used as parameter placeholder
params - - -Array.<object> - - - - - - <optional>
- - - - - -
array of params if needed
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

(static) getColumn(query, paramsopt) → {Array.<object>}

- - - - - - -
- Get a first column in an array. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
query - - -string - - - - - - - - - - SQL query with ? used as parameter placeholder
params - - -Array.<object> - - - - - - <optional>
- - - - - -
array of params if needed
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - array of first column of all returned rows -
- - - -
-
- Type -
-
- -Array.<object> - - -
-
- - - - - - - - - - - - - -

(static) getMap(query, paramsopt) → {object}

- - - - - - -
- Get a map of first column mapping to second column. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
query - - -string - - - - - - - - - - SQL query with ? used as parameter placeholder
params - - -Array.<object> - - - - - - <optional>
- - - - - -
array of params if needed
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - map of first column to second column -
- - - -
-
- Type -
-
- -object - - -
-
- - - - - - - - - - - - - -

(static) getRow(query, paramsopt) → {object}

- - - - - - -
- Get first returned row. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
query - - -string - - - - - - - - - - SQL query with ? used as parameter placeholder
params - - -Array.<object> - - - - - - <optional>
- - - - - -
array of params if needed
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - map of column name to column value -
- - - -
-
- Type -
-
- -object - - -
-
- - - - - - - - - - - - - -

(static) getRows(query, paramsopt) → {Array.<object>}

- - - - - - -
- Get all returned rows. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
query - - -string - - - - - - - - - - SQL query with ? used as parameter placeholder
params - - -Array.<object> - - - - - - <optional>
- - - - - -
array of params if needed
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- - array of all rows, each row is a map of column name to column value -
- - - -
-
- Type -
-
- -Array.<object> - - -
-
- - - - - - - - - - - - - -

(static) getValue(query, paramsopt)

- - - - - - -
- Get single value from the given query - first column from first returned row. -
- - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
query - - -string - - - - - - - - - - SQL query with ? used as parameter placeholder
params - - -Array.<object> - - - - - - <optional>
- - - - - -
array of params if needed
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - - - -
Returns:
- - -
- [object] - single value -
- - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
- - - - - - - \ No newline at end of file diff --git a/docs/backend_api/modules.html b/docs/backend_api/modules.html new file mode 100644 index 000000000..9474eb0f2 --- /dev/null +++ b/docs/backend_api/modules.html @@ -0,0 +1 @@ +trilium
diff --git a/docs/backend_api/modules/becca_entities_abstract_becca_entity.html b/docs/backend_api/modules/becca_entities_abstract_becca_entity.html new file mode 100644 index 000000000..0f74e1eca --- /dev/null +++ b/docs/backend_api/modules/becca_entities_abstract_becca_entity.html @@ -0,0 +1 @@ +becca/entities/abstract_becca_entity | trilium

Module becca/entities/abstract_becca_entity

Classes

default
diff --git a/docs/backend_api/modules/becca_entities_battachment.html b/docs/backend_api/modules/becca_entities_battachment.html new file mode 100644 index 000000000..3aaf18d5b --- /dev/null +++ b/docs/backend_api/modules/becca_entities_battachment.html @@ -0,0 +1 @@ +becca/entities/battachment | trilium

Module becca/entities/battachment

Classes

default
diff --git a/docs/backend_api/modules/becca_entities_battribute.html b/docs/backend_api/modules/becca_entities_battribute.html new file mode 100644 index 000000000..c0c8afd9e --- /dev/null +++ b/docs/backend_api/modules/becca_entities_battribute.html @@ -0,0 +1 @@ +becca/entities/battribute | trilium

Module becca/entities/battribute

Classes

default
diff --git a/docs/backend_api/modules/becca_entities_bblob.html b/docs/backend_api/modules/becca_entities_bblob.html new file mode 100644 index 000000000..753ea4928 --- /dev/null +++ b/docs/backend_api/modules/becca_entities_bblob.html @@ -0,0 +1 @@ +becca/entities/bblob | trilium

Module becca/entities/bblob

Classes

default
diff --git a/docs/backend_api/modules/becca_entities_bbranch.html b/docs/backend_api/modules/becca_entities_bbranch.html new file mode 100644 index 000000000..91127d8c0 --- /dev/null +++ b/docs/backend_api/modules/becca_entities_bbranch.html @@ -0,0 +1 @@ +becca/entities/bbranch | trilium

Module becca/entities/bbranch

Classes

default
diff --git a/docs/backend_api/modules/becca_entities_betapi_token.html b/docs/backend_api/modules/becca_entities_betapi_token.html new file mode 100644 index 000000000..f15402d96 --- /dev/null +++ b/docs/backend_api/modules/becca_entities_betapi_token.html @@ -0,0 +1 @@ +becca/entities/betapi_token | trilium

Module becca/entities/betapi_token

Classes

default
diff --git a/docs/backend_api/modules/becca_entities_bnote.html b/docs/backend_api/modules/becca_entities_bnote.html new file mode 100644 index 000000000..69812731d --- /dev/null +++ b/docs/backend_api/modules/becca_entities_bnote.html @@ -0,0 +1 @@ +becca/entities/bnote | trilium

Module becca/entities/bnote

Classes

default
diff --git a/docs/backend_api/modules/becca_entities_boption.html b/docs/backend_api/modules/becca_entities_boption.html new file mode 100644 index 000000000..c4a31d7fc --- /dev/null +++ b/docs/backend_api/modules/becca_entities_boption.html @@ -0,0 +1 @@ +becca/entities/boption | trilium

Module becca/entities/boption

Classes

default
diff --git a/docs/backend_api/modules/becca_entities_brecent_note.html b/docs/backend_api/modules/becca_entities_brecent_note.html new file mode 100644 index 000000000..b05f29ca6 --- /dev/null +++ b/docs/backend_api/modules/becca_entities_brecent_note.html @@ -0,0 +1 @@ +becca/entities/brecent_note | trilium

Module becca/entities/brecent_note

Classes

default
diff --git a/docs/backend_api/modules/becca_entities_brevision.html b/docs/backend_api/modules/becca_entities_brevision.html new file mode 100644 index 000000000..13307b607 --- /dev/null +++ b/docs/backend_api/modules/becca_entities_brevision.html @@ -0,0 +1 @@ +becca/entities/brevision | trilium

Module becca/entities/brevision

Classes

default
diff --git a/docs/backend_api/modules/becca_entities_rows.html b/docs/backend_api/modules/becca_entities_rows.html new file mode 100644 index 000000000..83ab95bdc --- /dev/null +++ b/docs/backend_api/modules/becca_entities_rows.html @@ -0,0 +1 @@ +becca/entities/rows | trilium
diff --git a/docs/backend_api/modules/services_backend_script_api.html b/docs/backend_api/modules/services_backend_script_api.html new file mode 100644 index 000000000..94a7273cf --- /dev/null +++ b/docs/backend_api/modules/services_backend_script_api.html @@ -0,0 +1 @@ +services/backend_script_api | trilium

Module services/backend_script_api

Variables

default
diff --git a/docs/backend_api/modules/services_sql.html b/docs/backend_api/modules/services_sql.html new file mode 100644 index 000000000..f845ae612 --- /dev/null +++ b/docs/backend_api/modules/services_sql.html @@ -0,0 +1 @@ +services/sql | trilium

Module services/sql

Variables

default
diff --git a/docs/backend_api/scripts/linenumber.js b/docs/backend_api/scripts/linenumber.js deleted file mode 100644 index 4354785ce..000000000 --- a/docs/backend_api/scripts/linenumber.js +++ /dev/null @@ -1,25 +0,0 @@ -/*global document */ -(() => { - const source = document.getElementsByClassName('prettyprint source linenums'); - let i = 0; - let lineNumber = 0; - let lineId; - let lines; - let totalLines; - let anchorHash; - - if (source && source[0]) { - anchorHash = document.location.hash.substring(1); - lines = source[0].getElementsByTagName('li'); - totalLines = lines.length; - - for (; i < totalLines; i++) { - lineNumber++; - lineId = `line${lineNumber}`; - lines[i].id = lineId; - if (lineId === anchorHash) { - lines[i].className += ' selected'; - } - } - } -})(); diff --git a/docs/backend_api/scripts/prettify/Apache-License-2.0.txt b/docs/backend_api/scripts/prettify/Apache-License-2.0.txt deleted file mode 100644 index d64569567..000000000 --- a/docs/backend_api/scripts/prettify/Apache-License-2.0.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/docs/backend_api/scripts/prettify/lang-css.js b/docs/backend_api/scripts/prettify/lang-css.js deleted file mode 100644 index 041e1f590..000000000 --- a/docs/backend_api/scripts/prettify/lang-css.js +++ /dev/null @@ -1,2 +0,0 @@ -PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", -/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/docs/backend_api/scripts/prettify/prettify.js b/docs/backend_api/scripts/prettify/prettify.js deleted file mode 100644 index eef5ad7e6..000000000 --- a/docs/backend_api/scripts/prettify/prettify.js +++ /dev/null @@ -1,28 +0,0 @@ -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), -l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= -!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p - - - - JSDoc: Source: services/backend_script_api.js - - - - - - - - - - -
- -

Source: services/backend_script_api.js

- - - - - - -
-
-
const log = require('./log');
-const noteService = require('./notes');
-const sql = require('./sql');
-const utils = require('./utils');
-const attributeService = require('./attributes');
-const dateNoteService = require('./date_notes');
-const treeService = require('./tree');
-const config = require('./config');
-const axios = require('axios');
-const dayjs = require('dayjs');
-const xml2js = require('xml2js');
-const cloningService = require('./cloning');
-const appInfo = require('./app_info');
-const searchService = require('./search/services/search');
-const SearchContext = require("./search/search_context");
-const becca = require("../becca/becca");
-const ws = require("./ws");
-const SpacedUpdate = require("./spaced_update");
-const specialNotesService = require("./special_notes");
-const branchService = require("./branches");
-const exportService = require("./export/zip");
-const syncMutex = require("./sync_mutex");
-const backupService = require("./backup");
-const optionsService = require("./options");
-
-
-/**
- * A whole number
- * @typedef {number} int
- */
-
-/**
- * An instance of the frontend api available globally.
- * @global
- * @var {BackendScriptApi} api
- */
-
-/**
- * <p>This is the main backend API interface for scripts. All the properties and methods are published in the "api" object
- * available in the JS backend notes. You can use e.g. <code>api.log(api.startNote.title);</code></p>
- *
- * @constructor
- */
-function BackendScriptApi(currentNote, apiParams) {
-    /**
-     * Note where the script started executing
-     * @type {BNote}
-     */
-    this.startNote = apiParams.startNote;
-    /**
-     * Note where the script is currently executing. Don't mix this up with the concept of active note
-     * @type {BNote}
-     */
-    this.currentNote = currentNote;
-    /**
-     * Entity whose event triggered this execution
-     * @type {AbstractBeccaEntity}
-     */
-    this.originEntity = apiParams.originEntity;
-
-    for (const key in apiParams) {
-        this[key] = apiParams[key];
-    }
-
-    /**
-     * Axios library for HTTP requests. See {@link https://axios-http.com} for documentation
-     * @type {axios}
-     * @deprecated use native (browser compatible) fetch() instead
-     */
-    this.axios = axios;
-    /**
-     * day.js library for date manipulation. See {@link https://day.js.org} for documentation
-     * @type {dayjs}
-     */
-    this.dayjs = dayjs;
-    /**
-     * xml2js library for XML parsing. See {@link https://github.com/Leonidas-from-XIV/node-xml2js} for documentation
-     * @type {xml2js}
-     */
-    this.xml2js = xml2js;
-
-    /**
-     * Instance name identifies particular Trilium instance. It can be useful for scripts
-     * if some action needs to happen on only one specific instance.
-     *
-     * @returns {string|null}
-     */
-    this.getInstanceName = () => config.General ? config.General.instanceName : null;
-
-    /**
-     * @method
-     * @param {string} noteId
-     * @returns {BNote|null}
-     */
-    this.getNote = noteId => becca.getNote(noteId);
-
-    /**
-     * @method
-     * @param {string} branchId
-     * @returns {BBranch|null}
-     */
-    this.getBranch = branchId => becca.getBranch(branchId);
-
-    /**
-     * @method
-     * @param {string} attributeId
-     * @returns {BAttribute|null}
-     */
-    this.getAttribute = attributeId => becca.getAttribute(attributeId);
-
-    /**
-     * @method
-     * @param {string} attachmentId
-     * @returns {BAttachment|null}
-     */
-    this.getAttachment = attachmentId => becca.getAttachment(attachmentId);
-
-    /**
-     * @method
-     * @param {string} revisionId
-     * @returns {BRevision|null}
-     */
-    this.getRevision = revisionId => becca.getRevision(revisionId);
-
-    /**
-     * @method
-     * @param {string} etapiTokenId
-     * @returns {BEtapiToken|null}
-     */
-    this.getEtapiToken = etapiTokenId => becca.getEtapiToken(etapiTokenId);
-
-    /**
-     * @method
-     * @returns {BEtapiToken[]}
-     */
-    this.getEtapiTokens = () => becca.getEtapiTokens();
-
-    /**
-     * @method
-     * @param {string} optionName
-     * @returns {BOption|null}
-     */
-    this.getOption = optionName => becca.getOption(optionName);
-
-    /**
-     * @method
-     * @returns {BOption[]}
-     */
-    this.getOptions = () => optionsService.getOptions();
-
-    /**
-     * @method
-     * @param {string} attributeId
-     * @returns {BAttribute|null}
-     */
-    this.getAttribute = attributeId => becca.getAttribute(attributeId);
-
-    /**
-     * This is a powerful search method - you can search by attributes and their values, e.g.:
-     * "#dateModified =* MONTH AND #log". See {@link https://github.com/zadam/trilium/wiki/Search} for full documentation for all options
-     *
-     * @method
-     * @param {string} query
-     * @param {Object} [searchParams]
-     * @returns {BNote[]}
-     */
-    this.searchForNotes = (query, searchParams = {}) => {
-        if (searchParams.includeArchivedNotes === undefined) {
-            searchParams.includeArchivedNotes = true;
-        }
-
-        if (searchParams.ignoreHoistedNote === undefined) {
-            searchParams.ignoreHoistedNote = true;
-        }
-
-        const noteIds = searchService.findResultsWithQuery(query, new SearchContext(searchParams))
-            .map(sr => sr.noteId);
-
-        return becca.getNotes(noteIds);
-    };
-
-    /**
-     * This is a powerful search method - you can search by attributes and their values, e.g.:
-     * "#dateModified =* MONTH AND #log". See {@link https://github.com/zadam/trilium/wiki/Search} for full documentation for all options
-     *
-     * @method
-     * @param {string} query
-     * @param {Object} [searchParams]
-     * @returns {BNote|null}
-     */
-    this.searchForNote = (query, searchParams = {}) => {
-        const notes = this.searchForNotes(query, searchParams);
-
-        return notes.length > 0 ? notes[0] : null;
-    };
-
-    /**
-     * Retrieves notes with given label name & value
-     *
-     * @method
-     * @param {string} name - attribute name
-     * @param {string} [value] - attribute value
-     * @returns {BNote[]}
-     */
-    this.getNotesWithLabel = attributeService.getNotesWithLabel;
-
-    /**
-     * Retrieves first note with given label name & value
-     *
-     * @method
-     * @param {string} name - attribute name
-     * @param {string} [value] - attribute value
-     * @returns {BNote|null}
-     */
-    this.getNoteWithLabel = attributeService.getNoteWithLabel;
-
-    /**
-     * If there's no branch between note and parent note, create one. Otherwise, do nothing. Returns the new or existing branch.
-     *
-     * @method
-     * @param {string} noteId
-     * @param {string} parentNoteId
-     * @param {string} prefix - if branch is created between note and parent note, set this prefix
-     * @returns {{branch: BBranch|null}}
-     */
-    this.ensureNoteIsPresentInParent = cloningService.ensureNoteIsPresentInParent;
-
-    /**
-     * If there's a branch between note and parent note, remove it. Otherwise, do nothing.
-     *
-     * @method
-     * @param {string} noteId
-     * @param {string} parentNoteId
-     * @returns {void}
-     */
-    this.ensureNoteIsAbsentFromParent = cloningService.ensureNoteIsAbsentFromParent;
-
-    /**
-     * Based on the value, either create or remove branch between note and parent note.
-     *
-     * @method
-     * @param {boolean} present - true if we want the branch to exist, false if we want it gone
-     * @param {string} noteId
-     * @param {string} parentNoteId
-     * @param {string} prefix - if branch is created between note and parent note, set this prefix
-     * @returns {void}
-     */
-    this.toggleNoteInParent = cloningService.toggleNoteInParent;
-
-    /**
-     * Create text note. See also createNewNote() for more options.
-     *
-     * @method
-     * @param {string} parentNoteId
-     * @param {string} title
-     * @param {string} content
-     * @returns {{note: BNote, branch: BBranch}} - object having "note" and "branch" keys representing respective objects
-     */
-    this.createTextNote = (parentNoteId, title, content = '') => noteService.createNewNote({
-        parentNoteId,
-        title,
-        content,
-        type: 'text'
-    });
-
-    /**
-     * Create data note - data in this context means object serializable to JSON. Created note will be of type 'code' and
-     * JSON MIME type. See also createNewNote() for more options.
-     *
-     * @method
-     * @param {string} parentNoteId
-     * @param {string} title
-     * @param {object} content
-     * @returns {{note: BNote, branch: BBranch}} object having "note" and "branch" keys representing respective objects
-     */
-    this.createDataNote = (parentNoteId, title, content = {}) => noteService.createNewNote({
-        parentNoteId,
-        title,
-        content: JSON.stringify(content, null, '\t'),
-        type: 'code',
-        mime: 'application/json'
-    });
-
-    /**
-     * @method
-     *
-     * @param {object} params
-     * @param {string} params.parentNoteId
-     * @param {string} params.title
-     * @param {string|Buffer} params.content
-     * @param {NoteType} params.type - text, code, file, image, search, book, relationMap, canvas
-     * @param {string} [params.mime] - value is derived from default mimes for type
-     * @param {boolean} [params.isProtected=false]
-     * @param {boolean} [params.isExpanded=false]
-     * @param {string} [params.prefix='']
-     * @param {int} [params.notePosition] - default is last existing notePosition in a parent + 10
-     * @returns {{note: BNote, branch: BBranch}} object contains newly created entities note and branch
-     */
-    this.createNewNote = noteService.createNewNote;
-
-    /**
-     * @method
-     * @deprecated please use createTextNote() with similar API for simpler use cases or createNewNote() for more complex needs
-     *
-     * @param {string} parentNoteId - create new note under this parent
-     * @param {string} title
-     * @param {string} [content=""]
-     * @param {object} [extraOptions={}]
-     * @param {boolean} [extraOptions.json=false] - should the note be JSON
-     * @param {boolean} [extraOptions.isProtected=false] - should the note be protected
-     * @param {string} [extraOptions.type='text'] - note type
-     * @param {string} [extraOptions.mime='text/html'] - MIME type of the note
-     * @param {object[]} [extraOptions.attributes=[]] - attributes to be created for this note
-     * @param {AttributeType} extraOptions.attributes.type - attribute type - label, relation etc.
-     * @param {string} extraOptions.attributes.name - attribute name
-     * @param {string} [extraOptions.attributes.value] - attribute value
-     * @returns {{note: BNote, branch: BBranch}} object contains newly created entities note and branch
-     */
-    this.createNote = (parentNoteId, title, content = "", extraOptions= {}) => {
-        extraOptions.parentNoteId = parentNoteId;
-        extraOptions.title = title;
-
-        const parentNote = becca.getNote(parentNoteId);
-
-        // code note type can be inherited, otherwise "text" is the default
-        extraOptions.type = parentNote.type === 'code' ? 'code' : 'text';
-        extraOptions.mime = parentNote.type === 'code' ? parentNote.mime : 'text/html';
-
-        if (extraOptions.json) {
-            extraOptions.content = JSON.stringify(content || {}, null, '\t');
-            extraOptions.type = 'code';
-            extraOptions.mime = 'application/json';
-        }
-        else {
-            extraOptions.content = content;
-        }
-
-        return sql.transactional(() => {
-            const {note, branch} = noteService.createNewNote(extraOptions);
-
-            for (const attr of extraOptions.attributes || []) {
-                attributeService.createAttribute({
-                    noteId: note.noteId,
-                    type: attr.type,
-                    name: attr.name,
-                    value: attr.value,
-                    isInheritable: !!attr.isInheritable
-                });
-            }
-
-            return {note, branch};
-        });
-    };
-
-    this.logMessages = {};
-    this.logSpacedUpdates = {};
-
-    /**
-     * Log given message to trilium logs and log pane in UI
-     *
-     * @method
-     * @param message
-     * @returns {void}
-     */
-    this.log = message => {
-        log.info(message);
-
-        const {noteId} = this.startNote;
-
-        this.logMessages[noteId] = this.logMessages[noteId] || [];
-        this.logSpacedUpdates[noteId] = this.logSpacedUpdates[noteId] || new SpacedUpdate(() => {
-            const messages = this.logMessages[noteId];
-            this.logMessages[noteId] = [];
-
-            ws.sendMessageToAllClients({
-                type: 'api-log-messages',
-                noteId,
-                messages
-            });
-        }, 100);
-
-        this.logMessages[noteId].push(message);
-        this.logSpacedUpdates[noteId].scheduleUpdate();
-    };
-
-    /**
-     * Returns root note of the calendar.
-     *
-     * @method
-     * @returns {BNote|null}
-     */
-    this.getRootCalendarNote = dateNoteService.getRootCalendarNote;
-
-    /**
-     * Returns day note for given date. If such note doesn't exist, it is created.
-     *
-     * @method
-     * @param {string} date in YYYY-MM-DD format
-     * @param {BNote} [rootNote] - specify calendar root note, normally leave empty to use the default calendar
-     * @returns {BNote|null}
-     */
-    this.getDayNote = dateNoteService.getDayNote;
-
-    /**
-     * Returns today's day note. If such note doesn't exist, it is created.
-     *
-     * @method
-     * @param {BNote} [rootNote] - specify calendar root note, normally leave empty to use the default calendar
-     * @returns {BNote|null}
-     */
-    this.getTodayNote = dateNoteService.getTodayNote;
-
-    /**
-     * Returns note for the first date of the week of the given date.
-     *
-     * @method
-     * @param {string} date in YYYY-MM-DD format
-     * @param {object} [options]
-     * @param {string} [options.startOfTheWeek=monday] - either "monday" (default) or "sunday"
-     * @param {BNote} [rootNote] - specify calendar root note, normally leave empty to use the default calendar
-     * @returns {BNote|null}
-     */
-    this.getWeekNote = dateNoteService.getWeekNote;
-
-    /**
-     * Returns month note for given date. If such a note doesn't exist, it is created.
-     *
-     * @method
-     * @param {string} date in YYYY-MM format
-     * @param {BNote} [rootNote] - specify calendar root note, normally leave empty to use the default calendar
-     * @returns {BNote|null}
-     */
-    this.getMonthNote = dateNoteService.getMonthNote;
-
-    /**
-     * Returns year note for given year. If such a note doesn't exist, it is created.
-     *
-     * @method
-     * @param {string} year in YYYY format
-     * @param {BNote} [rootNote] - specify calendar root note, normally leave empty to use the default calendar
-     * @returns {BNote|null}
-     */
-    this.getYearNote = dateNoteService.getYearNote;
-
-    /**
-     * Sort child notes of a given note.
-     *
-     * @method
-     * @param {string} parentNoteId - this note's child notes will be sorted
-     * @param {object} [sortConfig]
-     * @param {string} [sortConfig.sortBy=title] - 'title', 'dateCreated', 'dateModified' or a label name
-     *                                See {@link https://github.com/zadam/trilium/wiki/Sorting} for details.
-     * @param {boolean} [sortConfig.reverse=false]
-     * @param {boolean} [sortConfig.foldersFirst=false]
-     * @returns {void}
-     */
-    this.sortNotes = (parentNoteId, sortConfig = {}) => treeService.sortNotes(
-        parentNoteId,
-        sortConfig.sortBy || "title",
-        !!sortConfig.reverse,
-        !!sortConfig.foldersFirst
-    );
-
-    /**
-     * This method finds note by its noteId and prefix and either sets it to the given parentNoteId
-     * or removes the branch (if parentNoteId is not given).
-     *
-     * This method looks similar to toggleNoteInParent() but differs because we're looking up branch by prefix.
-     *
-     * @method
-     * @deprecated this method is pretty confusing and serves specialized purpose only
-     * @param {string} noteId
-     * @param {string} prefix
-     * @param {string|null} parentNoteId
-     * @returns {void}
-     */
-    this.setNoteToParent = treeService.setNoteToParent;
-
-    /**
-     * This functions wraps code which is supposed to be running in transaction. If transaction already
-     * exists, then we'll use that transaction.
-     *
-     * @method
-     * @param {function} func
-     * @returns {any} result of func callback
-     */
-    this.transactional = sql.transactional;
-
-    /**
-     * Return randomly generated string of given length. This random string generation is NOT cryptographically secure.
-     *
-     * @method
-     * @param {int} length of the string
-     * @returns {string} random string
-     */
-    this.randomString = utils.randomString;
-
-    /**
-     * @method
-     * @param {string} string to escape
-     * @returns {string} escaped string
-     */
-    this.escapeHtml = utils.escapeHtml;
-
-    /**
-     * @method
-     * @param {string} string to unescape
-     * @returns {string} unescaped string
-     */
-    this.unescapeHtml = utils.unescapeHtml;
-
-    /**
-     * sql
-     * @type {module:sql}
-     */
-    this.sql = sql;
-
-    /**
-     * @method
-     * @returns {{syncVersion, appVersion, buildRevision, dbVersion, dataDirectory, buildDate}|*} - object representing basic info about running Trilium version
-     */
-    this.getAppInfo = () => appInfo;
-
-    /**
-     * Creates a new launcher to the launchbar. If the launcher (id) already exists, it will be updated.
-     *
-     * @method
-     * @param {object} opts
-     * @param {string} opts.id - id of the launcher, only alphanumeric at least 6 characters long
-     * @param {"note" | "script" | "customWidget"} opts.type - one of
-     *                          * "note" - activating the launcher will navigate to the target note (specified in targetNoteId param)
-     *                          * "script" -  activating the launcher will execute the script (specified in scriptNoteId param)
-     *                          * "customWidget" - the launcher will be rendered with a custom widget (specified in widgetNoteId param)
-     * @param {string} opts.title
-     * @param {boolean} [opts.isVisible=false] - if true, will be created in the "Visible launchers", otherwise in "Available launchers"
-     * @param {string} [opts.icon] - name of the boxicon to be used (e.g. "bx-time")
-     * @param {string} [opts.keyboardShortcut] - will activate the target note/script upon pressing, e.g. "ctrl+e"
-     * @param {string} [opts.targetNoteId] - for type "note"
-     * @param {string} [opts.scriptNoteId] - for type "script"
-     * @param {string} [opts.widgetNoteId] - for type "customWidget"
-     * @returns {{note: BNote}}
-     */
-    this.createOrUpdateLauncher = opts => {
-        if (!opts.id) { throw new Error("ID is a mandatory parameter for api.createOrUpdateLauncher(opts)"); }
-        if (!opts.id.match(/[a-z0-9]{6,1000}/i)) { throw new Error(`ID must be an alphanumeric string at least 6 characters long.`); }
-        if (!opts.type) { throw new Error("Launcher Type is a mandatory parameter for api.createOrUpdateLauncher(opts)"); }
-        if (!["note", "script", "customWidget"].includes(opts.type)) { throw new Error(`Given launcher type '${opts.type}'`); }
-        if (!opts.title?.trim()) { throw new Error("Title is a mandatory parameter for api.createOrUpdateLauncher(opts)"); }
-        if (opts.type === 'note' && !opts.targetNoteId) { throw new Error("targetNoteId is mandatory for launchers of type 'note'"); }
-        if (opts.type === 'script' && !opts.scriptNoteId) { throw new Error("scriptNoteId is mandatory for launchers of type 'script'"); }
-        if (opts.type === 'customWidget' && !opts.widgetNoteId) { throw new Error("widgetNoteId is mandatory for launchers of type 'customWidget'"); }
-
-        const parentNoteId = opts.isVisible ? '_lbVisibleLaunchers' : '_lbAvailableLaunchers';
-        const noteId = 'al_' + opts.id;
-
-        const launcherNote =
-            becca.getNote(noteId) ||
-            specialNotesService.createLauncher({
-                noteId: noteId,
-                parentNoteId: parentNoteId,
-                launcherType: opts.type,
-            }).note;
-
-        if (launcherNote.title !== opts.title) {
-            launcherNote.title = opts.title;
-            launcherNote.save();
-        }
-
-        if (launcherNote.getParentBranches().length === 1) {
-            const branch = launcherNote.getParentBranches()[0];
-
-            if (branch.parentNoteId !== parentNoteId) {
-                branchService.moveBranchToNote(branch, parentNoteId);
-            }
-        }
-
-        if (opts.type === 'note') {
-            launcherNote.setRelation('target', opts.targetNoteId);
-        } else if (opts.type === 'script') {
-            launcherNote.setRelation('script', opts.scriptNoteId);
-        } else if (opts.type === 'customWidget') {
-            launcherNote.setRelation('widget', opts.widgetNoteId);
-        } else {
-            throw new Error(`Unrecognized launcher type '${opts.type}'`);
-        }
-
-        if (opts.keyboardShortcut) {
-            launcherNote.setLabel('keyboardShortcut', opts.keyboardShortcut);
-        } else {
-            launcherNote.removeLabel('keyboardShortcut');
-        }
-
-        if (opts.icon) {
-            launcherNote.setLabel('iconClass', `bx ${opts.icon}`);
-        } else {
-            launcherNote.removeLabel('iconClass');
-        }
-
-        return {note: launcherNote};
-    };
-
-    /**
-     * @method
-     * @param {string} noteId
-     * @param {string} format - either 'html' or 'markdown'
-     * @param {string} zipFilePath
-     * @returns {Promise<void>}
-     */
-    this.exportSubtreeToZipFile = async (noteId, format, zipFilePath) => await exportService.exportToZipFile(noteId, format, zipFilePath);
-
-    /**
-     * Executes given anonymous function on the frontend(s).
-     * Internally, this serializes the anonymous function into string and sends it to frontend(s) via WebSocket.
-     * Note that there can be multiple connected frontend instances (e.g. in different tabs). In such case, all
-     * instances execute the given function.
-     *
-     * @method
-     * @param {string} script - script to be executed on the frontend
-     * @param {Array.<?>} params - list of parameters to the anonymous function to be sent to frontend
-     * @returns {undefined} - no return value is provided.
-     */
-    this.runOnFrontend = async (script, params = []) => {
-        if (typeof script === "function") {
-            script = script.toString();
-        }
-
-        ws.sendMessageToAllClients({
-            type: 'execute-script',
-            script: script,
-            params: prepareParams(params),
-            startNoteId: this.startNote.noteId,
-            currentNoteId: this.currentNote.noteId,
-            originEntityName: "notes", // currently there's no other entity on the frontend which can trigger event
-            originEntityId: this.originEntity?.noteId || null
-        });
-
-        function prepareParams(params) {
-            if (!params) {
-                return params;
-            }
-
-            return params.map(p => {
-                if (typeof p === "function") {
-                    return `!@#Function: ${p.toString()}`;
-                }
-                else {
-                    return p;
-                }
-            });
-        }
-    };
-
-    /**
-     * Sync process can make data intermittently inconsistent. Scripts which require strong data consistency
-     * can use this function to wait for a possible sync process to finish and prevent new sync process from starting
-     * while it is running.
-     *
-     * Because this is an async process, the inner callback doesn't have automatic transaction handling, so in case
-     * you need to make some DB changes, you need to surround your call with api.transactional(...)
-     *
-     * @method
-     * @param {function} callback - function to be executed while sync process is not running
-     * @returns {Promise} - resolves once the callback is finished (callback is awaited)
-     */
-    this.runOutsideOfSync = syncMutex.doExclusively;
-
-    /**
-     * @method
-     * @param {string} backupName - If the backupName is e.g. "now", then the backup will be written to "backup-now.db" file
-     * @returns {Promise} - resolves once the backup is finished
-     */
-    this.backupNow = backupService.backupNow;
-
-    /**
-     * This object contains "at your risk" and "no BC guarantees" objects for advanced use cases.
-     *
-     * @property {Becca} becca - provides access to the backend in-memory object graph, see {@link https://github.com/zadam/trilium/blob/master/src/becca/becca.js}
-     */
-    this.__private = {
-        becca
-    }
-}
-
-module.exports = BackendScriptApi;
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/services_sql.js.html b/docs/backend_api/services_sql.js.html deleted file mode 100644 index d4d7461bc..000000000 --- a/docs/backend_api/services_sql.js.html +++ /dev/null @@ -1,436 +0,0 @@ - - - - - JSDoc: Source: services/sql.js - - - - - - - - - - -
- -

Source: services/sql.js

- - - - - - -
-
-
"use strict";
-
-/**
- * @module sql
- */
-
-const log = require('./log');
-const Database = require('better-sqlite3');
-const dataDir = require('./data_dir');
-const cls = require('./cls');
-const fs = require("fs-extra");
-
-const dbConnection = new Database(dataDir.DOCUMENT_PATH);
-dbConnection.pragma('journal_mode = WAL');
-
-const LOG_ALL_QUERIES = false;
-
-[`exit`, `SIGINT`, `SIGUSR1`, `SIGUSR2`, `SIGTERM`].forEach(eventType => {
-    process.on(eventType, () => {
-        if (dbConnection) {
-            // closing connection is especially important to fold -wal file into the main DB file
-            // (see https://sqlite.org/tempfiles.html for details)
-            dbConnection.close();
-        }
-    });
-});
-
-function insert(tableName, rec, replace = false) {
-    const keys = Object.keys(rec || {});
-    if (keys.length === 0) {
-        log.error(`Can't insert empty object into table ${tableName}`);
-        return;
-    }
-
-    const columns = keys.join(", ");
-    const questionMarks = keys.map(p => "?").join(", ");
-
-    const query = `INSERT
-    ${replace ? "OR REPLACE" : ""} INTO
-    ${tableName}
-    (
-    ${columns}
-    )
-    VALUES (${questionMarks})`;
-
-    const res = execute(query, Object.values(rec));
-
-    return res ? res.lastInsertRowid : null;
-}
-
-function replace(tableName, rec) {
-    return insert(tableName, rec, true);
-}
-
-function upsert(tableName, primaryKey, rec) {
-    const keys = Object.keys(rec || {});
-    if (keys.length === 0) {
-        log.error(`Can't upsert empty object into table ${tableName}`);
-        return;
-    }
-
-    const columns = keys.join(", ");
-
-    const questionMarks = keys.map(colName => `@${colName}`).join(", ");
-
-    const updateMarks = keys.map(colName => `${colName} = @${colName}`).join(", ");
-
-    const query = `INSERT INTO ${tableName} (${columns}) VALUES (${questionMarks}) 
-                   ON CONFLICT (${primaryKey}) DO UPDATE SET ${updateMarks}`;
-
-    for (const idx in rec) {
-        if (rec[idx] === true || rec[idx] === false) {
-            rec[idx] = rec[idx] ? 1 : 0;
-        }
-    }
-
-    execute(query, rec);
-}
-
-const statementCache = {};
-
-function stmt(sql) {
-    if (!(sql in statementCache)) {
-        statementCache[sql] = dbConnection.prepare(sql);
-    }
-
-    return statementCache[sql];
-}
-
-function getRow(query, params = []) {
-    return wrap(query, s => s.get(params));
-}
-
-function getRowOrNull(query, params = []) {
-    const all = getRows(query, params);
-
-    return all.length > 0 ? all[0] : null;
-}
-
-function getValue(query, params = []) {
-    return wrap(query, s => s.pluck().get(params));
-}
-
-// smaller values can result in better performance due to better usage of statement cache
-const PARAM_LIMIT = 100;
-
-function getManyRows(query, params) {
-    let results = [];
-
-    while (params.length > 0) {
-        const curParams = params.slice(0, Math.min(params.length, PARAM_LIMIT));
-        params = params.slice(curParams.length);
-
-        const curParamsObj = {};
-
-        let j = 1;
-        for (const param of curParams) {
-            curParamsObj['param' + j++] = param;
-        }
-
-        let i = 1;
-        const questionMarks = curParams.map(() => ":param" + i++).join(",");
-        const curQuery = query.replace(/\?\?\?/g, questionMarks);
-
-        const statement = curParams.length === PARAM_LIMIT
-            ? stmt(curQuery)
-            : dbConnection.prepare(curQuery);
-
-        const subResults = statement.all(curParamsObj);
-        results = results.concat(subResults);
-    }
-
-    return results;
-}
-
-function getRows(query, params = []) {
-    return wrap(query, s => s.all(params));
-}
-
-function getRawRows(query, params = []) {
-    return wrap(query, s => s.raw().all(params));
-}
-
-function iterateRows(query, params = []) {
-    if (LOG_ALL_QUERIES) {
-        console.log(query);
-    }
-
-    return stmt(query).iterate(params);
-}
-
-function getMap(query, params = []) {
-    const map = {};
-    const results = getRawRows(query, params);
-
-    for (const row of results) {
-        map[row[0]] = row[1];
-    }
-
-    return map;
-}
-
-function getColumn(query, params = []) {
-    return wrap(query, s => s.pluck().all(params));
-}
-
-function execute(query, params = []) {
-    return wrap(query, s => s.run(params));
-}
-
-function executeMany(query, params) {
-    if (LOG_ALL_QUERIES) {
-        console.log(query);
-    }
-
-    while (params.length > 0) {
-        const curParams = params.slice(0, Math.min(params.length, PARAM_LIMIT));
-        params = params.slice(curParams.length);
-
-        const curParamsObj = {};
-
-        let j = 1;
-        for (const param of curParams) {
-            curParamsObj['param' + j++] = param;
-        }
-
-        let i = 1;
-        const questionMarks = curParams.map(() => ":param" + i++).join(",");
-        const curQuery = query.replace(/\?\?\?/g, questionMarks);
-
-        dbConnection.prepare(curQuery).run(curParamsObj);
-    }
-}
-
-function executeScript(query) {
-    if (LOG_ALL_QUERIES) {
-        console.log(query);
-    }
-
-    return dbConnection.exec(query);
-}
-
-function wrap(query, func) {
-    const startTimestamp = Date.now();
-    let result;
-
-    if (LOG_ALL_QUERIES) {
-        console.log(query);
-    }
-
-    try {
-        result = func(stmt(query));
-    }
-    catch (e) {
-        if (e.message.includes("The database connection is not open")) {
-            // this often happens on killing the app which puts these alerts in front of user
-            // in these cases error should be simply ignored.
-            console.log(e.message);
-
-            return null;
-        }
-
-        throw e;
-    }
-
-    const milliseconds = Date.now() - startTimestamp;
-
-    if (milliseconds >= 20 && !cls.isSlowQueryLoggingDisabled()) {
-        if (query.includes("WITH RECURSIVE")) {
-            log.info(`Slow recursive query took ${milliseconds}ms.`);
-        }
-        else {
-            log.info(`Slow query took ${milliseconds}ms: ${query.trim().replace(/\s+/g, " ")}`);
-        }
-    }
-
-    return result;
-}
-
-function transactional(func) {
-    try {
-        const ret = dbConnection.transaction(func).deferred();
-
-        if (!dbConnection.inTransaction) { // i.e. transaction was really committed (and not just savepoint released)
-            require('./ws').sendTransactionEntityChangesToAllClients();
-        }
-
-        return ret;
-    }
-    catch (e) {
-        const entityChangeIds = cls.getAndClearEntityChangeIds();
-
-        if (entityChangeIds.length > 0) {
-            log.info("Transaction rollback dirtied the becca, forcing reload.");
-
-            require('../becca/becca_loader').load();
-        }
-
-        // the maxEntityChangeId has been incremented during failed transaction, need to recalculate
-        require('./entity_changes').recalculateMaxEntityChangeId();
-
-        throw e;
-    }
-}
-
-function fillParamList(paramIds, truncate = true) {
-    if (paramIds.length === 0) {
-        return;
-    }
-
-    if (truncate) {
-        execute("DELETE FROM param_list");
-    }
-
-    paramIds = Array.from(new Set(paramIds));
-
-    if (paramIds.length > 30000) {
-        fillParamList(paramIds.slice(30000), false);
-
-        paramIds = paramIds.slice(0, 30000);
-    }
-
-    // doing it manually to avoid this showing up on the sloq query list
-    const s = stmt(`INSERT INTO param_list VALUES ${paramIds.map(paramId => `(?)`).join(',')}`);
-
-    s.run(paramIds);
-}
-
-async function copyDatabase(targetFilePath) {
-    try {
-        fs.unlinkSync(targetFilePath);
-    } catch (e) {
-    } // unlink throws exception if the file did not exist
-
-    await dbConnection.backup(targetFilePath);
-}
-
-function disableSlowQueryLogging(cb) {
-    const orig = cls.isSlowQueryLoggingDisabled();
-
-    try {
-        cls.disableSlowQueryLogging(true);
-
-        return cb();
-    }
-    finally {
-        cls.disableSlowQueryLogging(orig);
-    }
-}
-
-module.exports = {
-    dbConnection,
-    insert,
-    replace,
-
-    /**
-     * Get single value from the given query - first column from first returned row.
-     *
-     * @method
-     * @param {string} query - SQL query with ? used as parameter placeholder
-     * @param {object[]} [params] - array of params if needed
-     * @returns [object] - single value
-     */
-    getValue,
-
-    /**
-     * Get first returned row.
-     *
-     * @method
-     * @param {string} query - SQL query with ? used as parameter placeholder
-     * @param {object[]} [params] - array of params if needed
-     * @returns {object} - map of column name to column value
-     */
-    getRow,
-    getRowOrNull,
-
-    /**
-     * Get all returned rows.
-     *
-     * @method
-     * @param {string} query - SQL query with ? used as parameter placeholder
-     * @param {object[]} [params] - array of params if needed
-     * @returns {object[]} - array of all rows, each row is a map of column name to column value
-     */
-    getRows,
-    getRawRows,
-    iterateRows,
-    getManyRows,
-
-    /**
-     * Get a map of first column mapping to second column.
-     *
-     * @method
-     * @param {string} query - SQL query with ? used as parameter placeholder
-     * @param {object[]} [params] - array of params if needed
-     * @returns {object} - map of first column to second column
-     */
-    getMap,
-
-    /**
-     * Get a first column in an array.
-     *
-     * @method
-     * @param {string} query - SQL query with ? used as parameter placeholder
-     * @param {object[]} [params] - array of params if needed
-     * @returns {object[]} - array of first column of all returned rows
-     */
-    getColumn,
-
-    /**
-     * Execute SQL
-     *
-     * @method
-     * @param {string} query - SQL query with ? used as parameter placeholder
-     * @param {object[]} [params] - array of params if needed
-     */
-    execute,
-    executeMany,
-    executeScript,
-    transactional,
-    upsert,
-    fillParamList,
-    copyDatabase,
-    disableSlowQueryLogging
-};
-
-
-
- - - - -
- - - -
- - - - - - - diff --git a/docs/backend_api/styles/jsdoc-default.css b/docs/backend_api/styles/jsdoc-default.css deleted file mode 100644 index 7d1729dc9..000000000 --- a/docs/backend_api/styles/jsdoc-default.css +++ /dev/null @@ -1,358 +0,0 @@ -@font-face { - font-family: 'Open Sans'; - font-weight: normal; - font-style: normal; - src: url('../fonts/OpenSans-Regular-webfont.eot'); - src: - local('Open Sans'), - local('OpenSans'), - url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'), - url('../fonts/OpenSans-Regular-webfont.woff') format('woff'), - url('../fonts/OpenSans-Regular-webfont.svg#open_sansregular') format('svg'); -} - -@font-face { - font-family: 'Open Sans Light'; - font-weight: normal; - font-style: normal; - src: url('../fonts/OpenSans-Light-webfont.eot'); - src: - local('Open Sans Light'), - local('OpenSans Light'), - url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'), - url('../fonts/OpenSans-Light-webfont.woff') format('woff'), - url('../fonts/OpenSans-Light-webfont.svg#open_sanslight') format('svg'); -} - -html -{ - overflow: auto; - background-color: #fff; - font-size: 14px; -} - -body -{ - font-family: 'Open Sans', sans-serif; - line-height: 1.5; - color: #4d4e53; - background-color: white; -} - -a, a:visited, a:active { - color: #0095dd; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -header -{ - display: block; - padding: 0px 4px; -} - -tt, code, kbd, samp { - font-family: Consolas, Monaco, 'Andale Mono', monospace; -} - -.class-description { - font-size: 130%; - line-height: 140%; - margin-bottom: 1em; - margin-top: 1em; -} - -.class-description:empty { - margin: 0; -} - -#main { - float: left; - width: 70%; -} - -article dl { - margin-bottom: 40px; -} - -article img { - max-width: 100%; -} - -section -{ - display: block; - background-color: #fff; - padding: 12px 24px; - border-bottom: 1px solid #ccc; - margin-right: 30px; -} - -.variation { - display: none; -} - -.signature-attributes { - font-size: 60%; - color: #aaa; - font-style: italic; - font-weight: lighter; -} - -nav -{ - display: block; - float: right; - margin-top: 28px; - width: 30%; - box-sizing: border-box; - border-left: 1px solid #ccc; - padding-left: 16px; -} - -nav ul { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif; - font-size: 100%; - line-height: 17px; - padding: 0; - margin: 0; - list-style-type: none; -} - -nav ul a, nav ul a:visited, nav ul a:active { - font-family: Consolas, Monaco, 'Andale Mono', monospace; - line-height: 18px; - color: #4D4E53; -} - -nav h3 { - margin-top: 12px; -} - -nav li { - margin-top: 6px; -} - -footer { - display: block; - padding: 6px; - margin-top: 12px; - font-style: italic; - font-size: 90%; -} - -h1, h2, h3, h4 { - font-weight: 200; - margin: 0; -} - -h1 -{ - font-family: 'Open Sans Light', sans-serif; - font-size: 48px; - letter-spacing: -2px; - margin: 12px 24px 20px; -} - -h2, h3.subsection-title -{ - font-size: 30px; - font-weight: 700; - letter-spacing: -1px; - margin-bottom: 12px; -} - -h3 -{ - font-size: 24px; - letter-spacing: -0.5px; - margin-bottom: 12px; -} - -h4 -{ - font-size: 18px; - letter-spacing: -0.33px; - margin-bottom: 12px; - color: #4d4e53; -} - -h5, .container-overview .subsection-title -{ - font-size: 120%; - font-weight: bold; - letter-spacing: -0.01em; - margin: 8px 0 3px 0; -} - -h6 -{ - font-size: 100%; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; - font-style: italic; -} - -table -{ - border-spacing: 0; - border: 0; - border-collapse: collapse; -} - -td, th -{ - border: 1px solid #ddd; - margin: 0px; - text-align: left; - vertical-align: top; - padding: 4px 6px; - display: table-cell; -} - -thead tr -{ - background-color: #ddd; - font-weight: bold; -} - -th { border-right: 1px solid #aaa; } -tr > th:last-child { border-right: 1px solid #ddd; } - -.ancestors, .attribs { color: #999; } -.ancestors a, .attribs a -{ - color: #999 !important; - text-decoration: none; -} - -.clear -{ - clear: both; -} - -.important -{ - font-weight: bold; - color: #950B02; -} - -.yes-def { - text-indent: -1000px; -} - -.type-signature { - color: #aaa; -} - -.name, .signature { - font-family: Consolas, Monaco, 'Andale Mono', monospace; -} - -.details { margin-top: 14px; border-left: 2px solid #DDD; } -.details dt { width: 120px; float: left; padding-left: 10px; padding-top: 6px; } -.details dd { margin-left: 70px; } -.details ul { margin: 0; } -.details ul { list-style-type: none; } -.details li { margin-left: 30px; padding-top: 6px; } -.details pre.prettyprint { margin: 0 } -.details .object-value { padding-top: 0; } - -.description { - margin-bottom: 1em; - margin-top: 1em; -} - -.code-caption -{ - font-style: italic; - font-size: 107%; - margin: 0; -} - -.source -{ - border: 1px solid #ddd; - width: 80%; - overflow: auto; -} - -.prettyprint.source { - width: inherit; -} - -.source code -{ - font-size: 100%; - line-height: 18px; - display: block; - padding: 4px 12px; - margin: 0; - background-color: #fff; - color: #4D4E53; -} - -.prettyprint code span.line -{ - display: inline-block; -} - -.prettyprint.linenums -{ - padding-left: 70px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.prettyprint.linenums ol -{ - padding-left: 0; -} - -.prettyprint.linenums li -{ - border-left: 3px #ddd solid; -} - -.prettyprint.linenums li.selected, -.prettyprint.linenums li.selected * -{ - background-color: lightyellow; -} - -.prettyprint.linenums li * -{ - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.params .name, .props .name, .name code { - color: #4D4E53; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 100%; -} - -.params td.description > p:first-child, -.props td.description > p:first-child -{ - margin-top: 0; - padding-top: 0; -} - -.params td.description > p:last-child, -.props td.description > p:last-child -{ - margin-bottom: 0; - padding-bottom: 0; -} - -.disabled { - color: #454545; -} diff --git a/docs/backend_api/styles/prettify-jsdoc.css b/docs/backend_api/styles/prettify-jsdoc.css deleted file mode 100644 index 5a2526e37..000000000 --- a/docs/backend_api/styles/prettify-jsdoc.css +++ /dev/null @@ -1,111 +0,0 @@ -/* JSDoc prettify.js theme */ - -/* plain text */ -.pln { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* string content */ -.str { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a keyword */ -.kwd { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a comment */ -.com { - font-weight: normal; - font-style: italic; -} - -/* a type name */ -.typ { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a literal value */ -.lit { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* punctuation */ -.pun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp open bracket */ -.opn { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp close bracket */ -.clo { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a markup tag name */ -.tag { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute name */ -.atn { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute value */ -.atv { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a declaration */ -.dec { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a variable name */ -.var { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a function name */ -.fun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} diff --git a/docs/backend_api/styles/prettify-tomorrow.css b/docs/backend_api/styles/prettify-tomorrow.css deleted file mode 100644 index b6f92a78d..000000000 --- a/docs/backend_api/styles/prettify-tomorrow.css +++ /dev/null @@ -1,132 +0,0 @@ -/* Tomorrow Theme */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* Pretty printing styles. Used with prettify.js. */ -/* SPAN elements with the classes below are added by prettyprint. */ -/* plain text */ -.pln { - color: #4d4d4c; } - -@media screen { - /* string content */ - .str { - color: #718c00; } - - /* a keyword */ - .kwd { - color: #8959a8; } - - /* a comment */ - .com { - color: #8e908c; } - - /* a type name */ - .typ { - color: #4271ae; } - - /* a literal value */ - .lit { - color: #f5871f; } - - /* punctuation */ - .pun { - color: #4d4d4c; } - - /* lisp open bracket */ - .opn { - color: #4d4d4c; } - - /* lisp close bracket */ - .clo { - color: #4d4d4c; } - - /* a markup tag name */ - .tag { - color: #c82829; } - - /* a markup attribute name */ - .atn { - color: #f5871f; } - - /* a markup attribute value */ - .atv { - color: #3e999f; } - - /* a declaration */ - .dec { - color: #f5871f; } - - /* a variable name */ - .var { - color: #c82829; } - - /* a function name */ - .fun { - color: #4271ae; } } -/* Use higher contrast and text-weight for printable form. */ -@media print, projection { - .str { - color: #060; } - - .kwd { - color: #006; - font-weight: bold; } - - .com { - color: #600; - font-style: italic; } - - .typ { - color: #404; - font-weight: bold; } - - .lit { - color: #044; } - - .pun, .opn, .clo { - color: #440; } - - .tag { - color: #006; - font-weight: bold; } - - .atn { - color: #404; } - - .atv { - color: #060; } } -/* Style */ -/* -pre.prettyprint { - background: white; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 12px; - line-height: 1.5; - border: 1px solid #ccc; - padding: 10px; } -*/ - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; } - -/* IE indents via margin-left */ -li.L0, -li.L1, -li.L2, -li.L3, -li.L4, -li.L5, -li.L6, -li.L7, -li.L8, -li.L9 { - /* */ } - -/* Alternate shading for lines */ -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { - /* */ } diff --git a/docs/backend_api/types/becca_entities_rows.AttributeType.html b/docs/backend_api/types/becca_entities_rows.AttributeType.html new file mode 100644 index 000000000..26f515f7b --- /dev/null +++ b/docs/backend_api/types/becca_entities_rows.AttributeType.html @@ -0,0 +1 @@ +AttributeType | trilium
AttributeType: "label" | "relation" | "label-definition" | "relation-definition"
diff --git a/docs/backend_api/types/becca_entities_rows.NoteType.html b/docs/backend_api/types/becca_entities_rows.NoteType.html new file mode 100644 index 000000000..f509dd66e --- /dev/null +++ b/docs/backend_api/types/becca_entities_rows.NoteType.html @@ -0,0 +1 @@ +NoteType | trilium
NoteType: typeof ALLOWED_NOTE_TYPES[number]
diff --git a/docs/backend_api/variables/becca_entities_rows.ALLOWED_NOTE_TYPES.html b/docs/backend_api/variables/becca_entities_rows.ALLOWED_NOTE_TYPES.html new file mode 100644 index 000000000..57d702701 --- /dev/null +++ b/docs/backend_api/variables/becca_entities_rows.ALLOWED_NOTE_TYPES.html @@ -0,0 +1,4 @@ +ALLOWED_NOTE_TYPES | trilium

Variable ALLOWED_NOTE_TYPESConst

ALLOWED_NOTE_TYPES: readonly [
    "file",
    "image",
    "search",
    "noteMap",
    "launcher",
    "doc",
    "contentWidget",
    "text",
    "relationMap",
    "render",
    "canvas",
    "mermaid",
    "book",
    "webView",
    "code",
    "mindMap",
] = ...

There are many different Note types, some of which are entirely opaque to the +end user. Those types should be used only for checking against, they are +not for direct use.

+
diff --git a/docs/backend_api/variables/services_backend_script_api.default.html b/docs/backend_api/variables/services_backend_script_api.default.html new file mode 100644 index 000000000..7f9939dd7 --- /dev/null +++ b/docs/backend_api/variables/services_backend_script_api.default.html @@ -0,0 +1 @@ +default | trilium
default: new (currentNote: default, apiParams: ApiParams) => Api
diff --git a/docs/backend_api/variables/services_sql.default.html b/docs/backend_api/variables/services_sql.default.html new file mode 100644 index 000000000..ccc3ed24f --- /dev/null +++ b/docs/backend_api/variables/services_sql.default.html @@ -0,0 +1,7 @@ +default | trilium
default: {
    copyDatabase: (targetFilePath: string) => Promise<void>;
    dbConnection: Database;
    disableSlowQueryLogging: <T>(cb: () => T) => T;
    execute: (query: string, params?: any) => RunResult;
    executeMany: (query: string, params: any) => void;
    executeScript: (query: string) => DatabaseType;
    fillParamList: (
        paramIds: string[] | Set<string>,
        truncate?: boolean,
    ) => void;
    getColumn: <T>(query: string, params?: any) => T[];
    getManyRows: <T>(query: string, params: any) => T[];
    getMap: <K extends string | number | symbol, V>(
        query: string,
        params?: any,
    ) => Record<K, V>;
    getRawRows: <T extends {} | unknown[]>(query: string, params?: any) => T[];
    getRow: <T>(query: string, params?: any) => T;
    getRowOrNull: <T>(query: string, params?: any) => T | null;
    getRows: <T>(query: string, params?: any) => T[];
    getValue: <T>(query: string, params?: any) => T;
    insert: <T extends {}>(
        tableName: string,
        rec: T,
        replace?: boolean,
    ) => undefined | null | number | bigint;
    iterateRows: <T>(query: string, params?: any) => IterableIterator<T>;
    rebuildIntegrationTestDatabase: () => void;
    replace: <T extends {}>(tableName: string, rec: T) => number | null;
    transactional: <T>(
        func: (statement: Statement<unknown[], unknown>) => T,
    ) => any;
    upsert: <T extends {}>(
        tableName: string,
        primaryKey: string,
        rec: T,
    ) => void;
}

Type declaration

  • copyDatabase: (targetFilePath: string) => Promise<void>
  • dbConnection: Database
  • disableSlowQueryLogging: <T>(cb: () => T) => T
  • execute: (query: string, params?: any) => RunResult

    Execute SQL

    +
  • executeMany: (query: string, params: any) => void
  • executeScript: (query: string) => DatabaseType
  • fillParamList: (paramIds: string[] | Set<string>, truncate?: boolean) => void
  • getColumn: <T>(query: string, params?: any) => T[]

    Get a first column in an array.

    +
  • getManyRows: <T>(query: string, params: any) => T[]
  • getMap: <K extends string | number | symbol, V>(
        query: string,
        params?: any,
    ) => Record<K, V>

    Get a map of first column mapping to second column.

    +
  • getRawRows: <T extends {} | unknown[]>(query: string, params?: any) => T[]
  • getRow: <T>(query: string, params?: any) => T

    Get first returned row.

    +
  • getRowOrNull: <T>(query: string, params?: any) => T | null
  • getRows: <T>(query: string, params?: any) => T[]

    Get all returned rows.

    +
  • getValue: <T>(query: string, params?: any) => T

    Get single value from the given query - first column from first returned row.

    +
  • insert: <T extends {}>(
        tableName: string,
        rec: T,
        replace?: boolean,
    ) => undefined | null | number | bigint
  • iterateRows: <T>(query: string, params?: any) => IterableIterator<T>
  • rebuildIntegrationTestDatabase: () => void
  • replace: <T extends {}>(tableName: string, rec: T) => number | null
  • transactional: <T>(func: (statement: Statement<unknown[], unknown>) => T) => any
  • upsert: <T extends {}>(tableName: string, primaryKey: string, rec: T) => void
diff --git a/package-lock.json b/package-lock.json index 9edf52313..ebc733fde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -157,6 +157,7 @@ "ts-node": "10.9.2", "tslib": "2.8.1", "tsx": "4.19.2", + "typedoc": "0.27.4", "typescript": "5.7.2", "webpack": "5.97.1", "webpack-cli": "5.1.4" @@ -2588,6 +2589,17 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, + "node_modules/@gerrit0/mini-shiki": { + "version": "1.24.3", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.24.3.tgz", + "integrity": "sha512-odxt2MTJvlT5NUmGOPXz5OW4D8SFL2+KeXBkmjVtdOXfA5aRZX6jgP/17jp6wu2r3KdW0wx3Bk5HDehgeV1Yng==", + "dev": true, + "dependencies": { + "@shikijs/engine-oniguruma": "^1.24.2", + "@shikijs/types": "^1.24.2", + "@shikijs/vscode-textmate": "^9.3.0" + } + }, "node_modules/@highlightjs/cdn-assets": { "version": "11.10.0", "resolved": "https://registry.npmjs.org/@highlightjs/cdn-assets/-/cdn-assets-11.10.0.tgz", @@ -3474,6 +3486,32 @@ "node": ">=18" } }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.2.tgz", + "integrity": "sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.24.2", + "@shikijs/vscode-textmate": "^9.3.0" + } + }, + "node_modules/@shikijs/types": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.2.tgz", + "integrity": "sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==", + "dev": true, + "dependencies": { + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz", + "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==", + "dev": true + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -3970,6 +4008,15 @@ "@types/node": "*" } }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/html": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/html/-/html-1.0.4.tgz", @@ -4325,6 +4372,12 @@ "integrity": "sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==", "dev": true }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true + }, "node_modules/@types/ws": { "version": "8.5.13", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", @@ -12672,6 +12725,12 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "node_modules/lzma-native": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-8.0.5.tgz", @@ -16893,6 +16952,52 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typedoc": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.4.tgz", + "integrity": "sha512-wXPQs1AYC2Crk+1XFpNuutLIkNWleokZf1UNf/X8w9KsMnirkvT+LzxTXDvfF6ug3TSLf3Xu5ZXRKGfoXPX7IA==", + "dev": true, + "dependencies": { + "@gerrit0/mini-shiki": "^1.24.0", + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "yaml": "^2.6.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", @@ -17682,6 +17787,18 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index 474cf08fb..b7a267f6a 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,8 @@ "qstart-electron": "npm run switch-electron && npm run start-electron", "switch-server": "rimraf ./node_modules/better-sqlite3 && npm install", "switch-electron": "npx electron-rebuild", - "build-backend-docs": "rimraf ./docs/backend_api && ./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/backend_api src/becca/entities/*.js src/services/backend_script_api.js src/services/sql.js", - "build-frontend-docs": "rimraf ./docs/frontend_api && ./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/app/entities/*.js src/public/app/services/frontend_script_api.js src/public/app/widgets/basic_widget.js src/public/app/widgets/note_context_aware_widget.js src/public/app/widgets/right_panel_widget.js", + "build-backend-docs": "rimraf ./docs/backend_api && typedoc ./docs/backend_api src/becca/entities/*.ts src/services/backend_script_api.ts src/services/sql.ts", + "build-frontend-docs": "rimraf ./docs/frontend_api && jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/app/entities/*.js src/public/app/services/frontend_script_api.js src/public/app/widgets/basic_widget.js src/public/app/widgets/note_context_aware_widget.js src/public/app/widgets/right_panel_widget.js", "build-docs": "npm run build-backend-docs && npm run build-frontend-docs", "webpack": "cross-env node --import ./loader-register.js node_modules/webpack/bin/webpack.js -c webpack.config.ts", "test-jasmine": "cross-env TRILIUM_DATA_DIR=./data-test tsx ./node_modules/jasmine/bin/jasmine.js", @@ -197,6 +197,7 @@ "ts-node": "10.9.2", "tslib": "2.8.1", "tsx": "4.19.2", + "typedoc": "0.27.4", "typescript": "5.7.2", "webpack": "5.97.1", "webpack-cli": "5.1.4" diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 000000000..4ecad5a1f --- /dev/null +++ b/typedoc.json @@ -0,0 +1,8 @@ +{ + "outputs": [ + { + "name": "html", + "path": "./docs/backend_api" + } + ] +} \ No newline at end of file From 02ce82eaf5133c671797ba6b3890ff10358a8d84 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Dec 2024 18:47:19 +0200 Subject: [PATCH 4/4] chore(backend-docs): solve a few warnings --- ...ntities_abstract_becca_entity.default.html | 8 +- .../becca_entities_battachment.default.html | 14 +- .../becca_entities_battribute.default.html | 8 +- .../classes/becca_entities_bblob.default.html | 8 +- .../becca_entities_bbranch.default.html | 14 +- .../becca_entities_betapi_token.default.html | 8 +- .../classes/becca_entities_bnote.default.html | 144 +++++++++--------- .../becca_entities_boption.default.html | 8 +- .../becca_entities_brecent_note.default.html | 8 +- .../becca_entities_brevision.default.html | 16 +- .../becca_entities_rows.AttachmentRow.html | 4 +- .../becca_entities_rows.AttributeRow.html | 4 +- .../becca_entities_rows.BlobRow.html | 4 +- .../becca_entities_rows.BranchRow.html | 4 +- .../becca_entities_rows.EtapiTokenRow.html | 4 +- .../becca_entities_rows.NoteRow.html | 4 +- .../becca_entities_rows.OptionRow.html | 8 +- .../becca_entities_rows.RecentNoteRow.html | 4 +- .../becca_entities_rows.RevisionRow.html | 4 +- .../becca_entities_rows.AttributeType.html | 2 +- .../types/becca_entities_rows.NoteType.html | 2 +- ...ecca_entities_rows.ALLOWED_NOTE_TYPES.html | 2 +- .../services_backend_script_api.default.html | 2 +- .../variables/services_sql.default.html | 12 +- src/services/sql.ts | 6 - 25 files changed, 148 insertions(+), 154 deletions(-) diff --git a/docs/backend_api/classes/becca_entities_abstract_becca_entity.default.html b/docs/backend_api/classes/becca_entities_abstract_becca_entity.default.html index 70ae1b216..4ae0766fe 100644 --- a/docs/backend_api/classes/becca_entities_abstract_becca_entity.default.html +++ b/docs/backend_api/classes/becca_entities_abstract_becca_entity.default.html @@ -1,5 +1,5 @@ default | trilium

Base class for all backend entities.

-

Type Parameters

Hierarchy (View Summary)

Constructors

Type Parameters

Hierarchy (View Summary)

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • opts: ContentOpts = {}

    Returns void

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • opts: ContentOpts = {}

    Returns void

  • Mark the entity as (soft) deleted. It will be completely erased later.

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    -

    Parameters

    • deleteId: null | string = null

    Returns void

+

Parameters

  • deleteId: null | string = null

Returns void

)CdQ3F!eKyF|9D2V!F-rhUpJ8J+l7g0OBBVM#THTI&O8)>EGR%u6Gd9D9pm5!S}%&6DxW}^f|7=Y zPoO3(pTZY#?(7(|!5}5Nn!D%DotZmlW)?smSMcEE<^aT$6gw#LlwubPI9BYTffL0! zyu-EPCnz{Y#ZR&1d{F!hr_NW!&#~mXis$jseXDo@U)-kR7sMBeUt-T&RQw9By@BF9 z3f?cpmw4m-R{RHncaC**(V--ipJ<~6LkW2fi6RVfh%vcYt9@z>&M0LBSf-Q|Et8wU zCt43_*JB)mHR71wb`K@~5Cizwp{`A2uuJ^_Bcl3k{7ree$8&@l?;^2nagS+NqCDBfkB?pJws=PbK~+A7|2 z{gCDJKI-i%m4LD$n{WIwWR|c+NRy`C1#)1sSBI7FiH6z-QkhY&Q_|%I3exQ zQ`X1M?cZH4^M&BSyr;2z$+^SZUMA*0001Z+HKHROw(}?!13=vX`$@Br+fGR zZ%e`5O6%Txi$Yrz0gF{}p>fY>OnlS0Uevf}oDXW;D{d2gcE<2)oFcV80@g$H)63L{HN*d{8kVzKVW(;E)$9N_%kx5Ku3R9WJbY?JW^G#k0Wdx>E$NBBVtKRLiL?sA*s%w`TdsNz1=+~FRNdB8&+@iBD0 zXFTC4C-8-Cwv(4U=LLQ~^Oa4^rG|OTr5?ItoaPMYxxh`%a*kVU z;HYGAjq6;IY{`*awo0DlOMw(hkrYdb(O28l;MYvSx*ChcQW4f^QL5UdE3HbqvbxB$pfSg`>Cj#;?~00;nMAg}==M6d%RaIhCe zARtS)01i=0um)3FSgr#ump{<1pq_<0a34Kp8x=7I1^|9 diff --git a/docs/backend_api/fonts/OpenSans-Regular-webfont.eot b/docs/backend_api/fonts/OpenSans-Regular-webfont.eot deleted file mode 100644 index 6bbc3cf58cb011a6b4bf3cb1612ce212608f7274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19836 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/backend_api/fonts/OpenSans-Regular-webfont.woff b/docs/backend_api/fonts/OpenSans-Regular-webfont.woff deleted file mode 100644 index e231183dce4c7b452afc9e7799586fd285e146f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22660 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 ML;wL%uV=LY00kR;TmS$7 diff --git a/docs/backend_api/global.html b/docs/backend_api/global.html deleted file mode 100644 index d3eaa43ce..000000000 --- a/docs/backend_api/global.html +++ /dev/null @@ -1,657 +0,0 @@ - - - - - JSDoc: Global - - - - - - - - - - -

diff --git a/docs/backend_api/classes/becca_entities_battachment.default.html b/docs/backend_api/classes/becca_entities_battachment.default.html index 382811e3c..f4ea26a88 100644 --- a/docs/backend_api/classes/becca_entities_battachment.default.html +++ b/docs/backend_api/classes/becca_entities_battachment.default.html @@ -1,6 +1,6 @@ default | trilium

Attachment represent data related/attached to the note. Conceptually similar to attributes, but intended for larger amounts of data and generally not accessible to the user.

-

Hierarchy (View Summary)

Constructors

Hierarchy (View Summary)

Constructors

Properties

attachmentId? blobId? contentLength? @@ -47,10 +47,10 @@ larger amounts of data and generally not accessible to the user.

save setContent updateFromRow -

Constructors

Properties

attachmentId?: string
blobId?: string
contentLength?: number

optionally added to the entity

-
dateCreated?: string
dateModified?: string
isDecrypted?: boolean
isProtected?: boolean
isSynced?: boolean
mime: string
noteId?: number
ownerId: string

either noteId or revisionId to which this attachment belongs

-
position?: number
role: string
title: string
type?: "file" | "image"
utcDateCreated: string
utcDateModified?: string
utcDateScheduledForErasureSince?: null | string

Accessors

Methods

  • Returns {
        attachmentId: undefined | string;
        blobId: undefined | string;
        contentLength: undefined | number;
        dateModified: undefined | string;
        isDeleted: boolean;
        isProtected: boolean;
        mime: string;
        ownerId: string;
        position: undefined | number;
        role: string;
        title: undefined | string;
        utcDateModified: undefined | string;
        utcDateScheduledForErasureSince: undefined | null | string;
    }

  • Returns {
        attachmentId: undefined | string;
        blobId: undefined | string;
        contentLength: undefined | number;
        dateModified: undefined | string;
        isDeleted: boolean;
        isProtected: boolean;
        mime: string;
        ownerId: string;
        position: undefined | number;
        role: string;
        title: undefined | string;
        utcDateModified: undefined | string;
        utcDateScheduledForErasureSince: undefined | null | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

Constructors

Properties

attachmentId?: string
blobId?: string
contentLength?: number

optionally added to the entity

+
dateCreated?: string
dateModified?: string
isDecrypted?: boolean
isProtected?: boolean
isSynced?: boolean
mime: string
noteId?: number
ownerId: string

either noteId or revisionId to which this attachment belongs

+
position?: number
role: string
title: string
type?: "file" | "image"
utcDateCreated: string
utcDateModified?: string
utcDateScheduledForErasureSince?: null | string

Accessors

Methods

  • Returns {
        attachmentId: undefined | string;
        blobId: undefined | string;
        contentLength: undefined | number;
        dateModified: undefined | string;
        isDeleted: boolean;
        isProtected: boolean;
        mime: string;
        ownerId: string;
        position: undefined | number;
        role: string;
        title: undefined | string;
        utcDateModified: undefined | string;
        utcDateScheduledForErasureSince: undefined | null | string;
    }

  • Returns {
        attachmentId: undefined | string;
        blobId: undefined | string;
        contentLength: undefined | number;
        dateModified: undefined | string;
        isDeleted: boolean;
        isProtected: boolean;
        mime: string;
        ownerId: string;
        position: undefined | number;
        role: string;
        title: undefined | string;
        utcDateModified: undefined | string;
        utcDateScheduledForErasureSince: undefined | null | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    -

    Parameters

    • deleteId: null | string = null

    Returns void

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • Optionalopts: ContentOpts

    Returns void

+

Parameters

  • deleteId: null | string = null

Returns void

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • Optionalopts: ContentOpts

    Returns void

diff --git a/docs/backend_api/classes/becca_entities_battribute.default.html b/docs/backend_api/classes/becca_entities_battribute.default.html index a34359a10..f5d75b8f6 100644 --- a/docs/backend_api/classes/becca_entities_battribute.default.html +++ b/docs/backend_api/classes/becca_entities_battribute.default.html @@ -1,6 +1,6 @@ default | trilium

Attribute is an abstract concept which has two real uses - label (key - value pair) and relation (representing named relationship between source and target note)

-

Hierarchy (View Summary)

Constructors

Hierarchy (View Summary)

Constructors

Properties

attributeId blobId? dateCreated? @@ -47,7 +47,7 @@ and relation (representing named relationship between source and target note)

update updateFromRow validate -

Constructors

Properties

attributeId: string
blobId?: string
dateCreated?: string
dateModified?: string
isInheritable: boolean
isProtected?: boolean
isSynced?: boolean
name: string
noteId: string
position: number
utcDateCreated: string
utcDateModified?: string
value: string

Accessors

Methods

  • Returns {
        attributeId: string;
        isDeleted: boolean;
        isInheritable: boolean;
        name: string;
        noteId: string;
        position: number;
        type: AttributeType;
        utcDateModified: undefined | string;
        value: string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

Constructors

Properties

attributeId: string
blobId?: string
dateCreated?: string
dateModified?: string
isInheritable: boolean
isProtected?: boolean
isSynced?: boolean
name: string
noteId: string
position: number
utcDateCreated: string
utcDateModified?: string
value: string

Accessors

Methods

  • Returns {
        attributeId: string;
        isDeleted: boolean;
        isInheritable: boolean;
        name: string;
        noteId: string;
        position: number;
        type: AttributeType;
        utcDateModified: undefined | string;
        value: string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    -

    Parameters

    • deleteId: null | string = null

    Returns void

+

Parameters

  • deleteId: null | string = null

Returns void

diff --git a/docs/backend_api/classes/becca_entities_bblob.default.html b/docs/backend_api/classes/becca_entities_bblob.default.html index 2f692516b..beb757b33 100644 --- a/docs/backend_api/classes/becca_entities_bblob.default.html +++ b/docs/backend_api/classes/becca_entities_bblob.default.html @@ -1,5 +1,5 @@ default | trilium

Base class for all backend entities.

-

Hierarchy (View Summary)

Constructors

Hierarchy (View Summary)

Constructors

Properties

Constructors

Properties

blobId?: string
content: string | Buffer<ArrayBufferLike>
contentLength: number
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Returns {
        blobId: undefined | string;
        content: null | string | Buffer<ArrayBufferLike>;
        contentLength: number;
        dateModified: undefined | string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

Constructors

Properties

blobId?: string
content: string | Buffer<ArrayBufferLike>
contentLength: number
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Returns {
        blobId: undefined | string;
        content: null | string | Buffer<ArrayBufferLike>;
        contentLength: number;
        dateModified: undefined | string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    -

    Parameters

    • deleteId: null | string = null

    Returns void

+

Parameters

  • deleteId: null | string = null

Returns void

diff --git a/docs/backend_api/classes/becca_entities_bbranch.default.html b/docs/backend_api/classes/becca_entities_bbranch.default.html index 6f6aa797e..dedfb0639 100644 --- a/docs/backend_api/classes/becca_entities_bbranch.default.html +++ b/docs/backend_api/classes/becca_entities_bbranch.default.html @@ -2,7 +2,7 @@ parents.

Note that you should not rely on the branch's identity, since it can change easily with a note's move. Always check noteId instead.

-

Hierarchy (View Summary)

Constructors

Hierarchy (View Summary)

Constructors

Properties

blobId? branchId? dateCreated? @@ -42,16 +42,16 @@ Always check noteId instead.

save update updateFromRow -

Constructors

Properties

blobId?: string
branchId?: string
dateCreated?: string
dateModified?: string
isExpanded: boolean
isProtected?: boolean
isSynced?: boolean
noteId: string
notePosition: number
parentNoteId: string
prefix: null | string
utcDateCreated: string
utcDateModified?: string

Accessors

  • get isWeak(): boolean
  • Branch is weak when its existence should not hinder deletion of its note. +

Constructors

Properties

blobId?: string
branchId?: string
dateCreated?: string
dateModified?: string
isExpanded: boolean
isProtected?: boolean
isSynced?: boolean
noteId: string
notePosition: number
parentNoteId: string
prefix: null | string
utcDateCreated: string
utcDateModified?: string

Accessors

  • get isWeak(): boolean
  • Branch is weak when its existence should not hinder deletion of its note. As a result, note with only weak branches should be immediately deleted. An example is shared or bookmarked clones - they are created automatically and exist for technical reasons, not as user-intended actions. From user perspective, they don't count as real clones and for the purpose of deletion should not act as a clone.

    -

    Returns boolean

Methods

  • Delete a branch. If this is a last note's branch, delete the note as well.

    +

    Returns boolean

Methods

  • Delete a branch. If this is a last note's branch, delete the note as well.

    Parameters

    • OptionaldeleteId: string

      optional delete identified

    • OptionaltaskContext: TaskContext

    Returns boolean

    true if note has been deleted, false otherwise

    -
  • Returns {
        branchId: undefined | string;
        isDeleted: boolean;
        isExpanded: boolean;
        noteId: string;
        notePosition: number;
        parentNoteId: string;
        prefix: null | string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +
  • Returns {
        branchId: undefined | string;
        isDeleted: boolean;
        isExpanded: boolean;
        noteId: string;
        notePosition: number;
        parentNoteId: string;
        prefix: null | string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    -

    Parameters

    • deleteId: null | string = null

    Returns void

+

Parameters

  • deleteId: null | string = null

Returns void

diff --git a/docs/backend_api/classes/becca_entities_betapi_token.default.html b/docs/backend_api/classes/becca_entities_betapi_token.default.html index 7811fc953..a82e30a78 100644 --- a/docs/backend_api/classes/becca_entities_betapi_token.default.html +++ b/docs/backend_api/classes/becca_entities_betapi_token.default.html @@ -6,7 +6,7 @@ Used by:

The format user is presented with is "_". This is also called "authToken" to distinguish it from tokenHash and token.

-

Hierarchy (View Summary)

Constructors

Hierarchy (View Summary)

Constructors

Properties

blobId? dateCreated? dateModified? @@ -36,7 +36,7 @@ from tokenHash and token.

putEntityChange save updateFromRow -

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
etapiTokenId?: string
isProtected?: boolean
isSynced?: boolean
name: string
tokenHash: string
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Returns {
        etapiTokenId: undefined | string;
        isDeleted: boolean;
        name: string;
        tokenHash: string;
        utcDateCreated: string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
etapiTokenId?: string
isProtected?: boolean
isSynced?: boolean
name: string
tokenHash: string
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Returns {
        etapiTokenId: undefined | string;
        isDeleted: boolean;
        name: string;
        tokenHash: string;
        utcDateCreated: string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    -

    Parameters

    • deleteId: null | string = null

    Returns void

+

Parameters

  • deleteId: null | string = null

Returns void

diff --git a/docs/backend_api/classes/becca_entities_bnote.default.html b/docs/backend_api/classes/becca_entities_bnote.default.html index 74e685829..7d34d4eba 100644 --- a/docs/backend_api/classes/becca_entities_bnote.default.html +++ b/docs/backend_api/classes/becca_entities_bnote.default.html @@ -1,5 +1,5 @@ default | trilium

Trilium's main entity, which can represent text note, image, code note, file attachment etc.

-

Hierarchy (View Summary)

Constructors

Hierarchy (View Summary)

Constructors

Properties

Constructors

Properties

__flatTextCache: null | string
blobId?: string
children: default[]
contentAndAttachmentsAndRevisionsSize: null | number

size of the note content, attachment contents and revision contents in bytes

-
contentAndAttachmentsSize: null | number

size of the note content, attachment contents in bytes

-
contentSize: null | number

size of the content in bytes

-
dateCreated?: string
dateModified?: string
isBeingDeleted: boolean

set during the deletion operation, before it is completed (removed from becca completely).

-
isDecrypted: boolean
isProtected?: boolean
isSynced?: boolean
mime: string
noteId: string
ownedAttributes: default[]
parentBranches: default[]
parents: default[]
revisionCount: null | number

number of note revisions for this note

-
targetRelations: default[]
title: string
type:
    | "search"
    | "file"
    | "text"
    | "code"
    | "relationMap"
    | "render"
    | "book"
    | "mermaid"
    | "canvas"
    | "image"
    | "noteMap"
    | "launcher"
    | "doc"
    | "contentWidget"
    | "webView"
    | "mindMap"
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Parameters

    • Optionaltype: null | string
    • Optionalname: null | string

    Returns void

  • Adds a new attribute to this note. The attribute is saved and returned. +

Constructors

Properties

__flatTextCache: null | string
blobId?: string
children: default[]
contentAndAttachmentsAndRevisionsSize: null | number

size of the note content, attachment contents and revision contents in bytes

+
contentAndAttachmentsSize: null | number

size of the note content, attachment contents in bytes

+
contentSize: null | number

size of the content in bytes

+
dateCreated?: string
dateModified?: string
isBeingDeleted: boolean

set during the deletion operation, before it is completed (removed from becca completely).

+
isDecrypted: boolean
isProtected?: boolean
isSynced?: boolean
mime: string
noteId: string
ownedAttributes: default[]
parentBranches: default[]
parents: default[]
revisionCount: null | number

number of note revisions for this note

+
targetRelations: default[]
title: string
type:
    | "search"
    | "file"
    | "text"
    | "code"
    | "relationMap"
    | "render"
    | "book"
    | "mermaid"
    | "canvas"
    | "image"
    | "noteMap"
    | "launcher"
    | "doc"
    | "contentWidget"
    | "webView"
    | "mindMap"
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Parameters

    • Optionaltype: null | string
    • Optionalname: null | string

    Returns void

  • Adds a new attribute to this note. The attribute is saved and returned. See addLabel, addRelation for more specific methods.

    Parameters

    • type: AttributeType

      attribute type (label / relation)

    • name: string

      name of the attribute, not including the leading ~/#

    • value: string = ""

      value of the attribute - text for labels, target note ID for relations; optional.

      -
    • isInheritable: boolean = false
    • position: null | number = null

    Returns default

  • Adds a new label to this note. The label attribute is saved and returned.

    +
  • isInheritable: boolean = false
  • position: null | number = null

Returns default

  • Adds a new label to this note. The label attribute is saved and returned.

    Parameters

    • name: string

      name of the label, not including the leading #

    • value: string = ""

      text value of the label; optional

      -
    • isInheritable: boolean = false

    Returns default

  • Adds a new relation to this note. The relation attribute is saved and +

  • isInheritable: boolean = false

Returns default

  • Adds a new relation to this note. The relation attribute is saved and returned.

    Parameters

    • name: string

      name of the relation, not including the leading ~

      -
    • targetNoteId: string
    • isInheritable: boolean = false

    Returns default

  • Some notes are eligible for conversion into an attachment of its parent, note must have these properties:

    +
  • targetNoteId: string
  • isInheritable: boolean = false

Returns default

  • Some notes are eligible for conversion into an attachment of its parent, note must have these properties:

    • it has exactly one target relation
    • it has a relation from its parent note
    • @@ -197,36 +197,36 @@ returned.

      Currently, works only for image notes.

      In the future, this functionality might get more generic and some of the requirements relaxed.

    Parameters

    • opts: ConvertOpts = ...

    Returns null | default

    null if note is not eligible for conversion

    -
  • (Soft) delete a note and all its descendants.

    +
  • (Soft) delete a note and all its descendants.

    Parameters

    • deleteId: null | string = null

      optional delete identified

      -
    • taskContext: null | TaskContext = null

    Returns void

  • Gives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles)

    +
  • taskContext: null | TaskContext = null

Returns void

  • Gives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles)

    Returns string[][]

    array of notePaths (each represented by array of noteIds constituting the particular note path)

    -
  • Parameters

    • type: string

      attribute type (label, relation, etc.)

    • name: string

      attribute name

    Returns null | default

    attribute of the given type and name. If there are more such attributes, first is returned. Returns null if there's no such attribute belonging to this note.

    -
  • Parameters

    • type: string
    • name: string
    • Optionalvalue: null | string

    Returns undefined | default

  • Beware that the method must not create a copy of the array, but actually returns its internal array +

  • Parameters

    • type: string
    • name: string
    • Optionalvalue: null | string

    Returns undefined | default

  • Beware that the method must not create a copy of the array, but actually returns its internal array (for performance reasons)

    Parameters

    • Optionaltype: string

      (optional) attribute type to filter

    • Optionalname: string

      (optional) attribute name to filter

    Returns default[]

    all note's attributes, including inherited ones

    -
  • Parameters

  • Parameters

    • type: string

      attribute type (label, relation, etc.)

    • name: string

      attribute name

    Returns null | string

    attribute value of given type and name or null if no such attribute exists.

    -
  • Returns a note path considered to be the "best"

    +
  • Returns a note path considered to be the "best"

    Parameters

    • hoistedNoteId: string = 'root'

    Returns string[]

    array of noteIds constituting the particular note path

    -
  • Returns a note path considered to be the "best"

    +
  • Returns a note path considered to be the "best"

    Parameters

    • hoistedNoteId: string = 'root'

    Returns string

    serialized note path (e.g. 'root/a1h315/js725h')

    -
  • Note content has quite special handling - it's not a separate entity, but a lazily loaded +

  • Note content has quite special handling - it's not a separate entity, but a lazily loaded part of Note entity with its own sync. Reasons behind this hybrid design has been:

    • content can be quite large, and it's not necessary to load it / fill memory for any note access even if we don't need a content, especially for bulk operations like search
    • changes in the note metadata or title should not trigger note content sync (so we keep separate utcDateModified and entity changes records)
    • but to the user note content and title changes are one and the same - single dateModified (so all changes must go through Note and content is not a separate entity)
    -

    Returns string | Buffer<ArrayBufferLike>

  • This is used for:

    • fast searching
    • note similarity evaluation
    • @@ -234,114 +234,114 @@ part of Note entity with its own sync. Reasons behind this hybrid design has bee

    Returns string

    • returns flattened textual representation of note, prefixes and attributes
    -
  • Returns default[]

    returns only notes which are templated, does not include their subtrees in effect returns notes which are influenced by note's non-inheritable attributes

    -
  • Returns any

    valid object or null if the content cannot be parsed as JSON

    -
  • Returns any

    valid object or null if the content cannot be parsed as JSON

    +
  • Parameters

    • Optionalname: string

      label name to filter

    Returns default[]

    all note's labels (attributes with type label), including inherited ones

    -
  • Parameters

    • name: string

      label name

    Returns null | string

    label value if label exists, null otherwise

    -
  • Parameters

    • name: string

      label name to filter

    Returns string[]

    all note's label values, including inherited ones

    -
  • Parameters

    • type: string
    • name: string
    • value: null | string = null

    Returns null | default

    attribute belonging to this specific note (excludes inherited attributes)

    +
  • Parameters

    • type: string
    • name: string
    • value: null | string = null

    Returns null | default

    attribute belonging to this specific note (excludes inherited attributes)

    This method can be significantly faster than the getAttribute()

    -
  • Beware that the method must not create a copy of the array, but actually returns its internal array +

  • Beware that the method must not create a copy of the array, but actually returns its internal array (for performance reasons)

    Parameters

    • type: null | string = null

      (optional) attribute type to filter

    • name: null | string = null

      (optional) attribute name to filter

    • value: null | string = null

      (optional) attribute value to filter

    Returns default[]

    note's "owned" attributes - excluding inherited ones

    -
  • Parameters

  • Parameters

    • type: string

      attribute type (label, relation, etc.)

    • name: string

      attribute name

    Returns null | string

    attribute value of given type and name or null if no such attribute exists.

    -
  • Parameters

    • name: string

      label name to filter

    Returns default[]

    all note's labels (attributes with type label), excluding inherited ones

    -
  • Parameters

    • name: string

      label name

    Returns null | string

    label value if label exists, null otherwise

    -
  • Parameters

    • name: string

      label name to filter

    Returns string[]

    all note's label values, excluding inherited ones

    -
  • Parameters

    • Optionalname: null | string

      relation name to filter

    Returns default[]

    all note's relations (attributes with type relation), excluding inherited ones

    -
  • Parameters

    • name: string

      relation name

    Returns null | string

    relation value if relation exists, null otherwise

    -
  • Parameters

    • Optionalname: string

      relation name to filter

    Returns default[]

    all note's relations (attributes with type relation), including inherited ones

    -
  • Parameters

    • name: string

      relation name

    Returns null | string

    relation value if relation exists, null otherwise

    -
  • Returns null | "frontend" | "backend"

    JS script environment - either "frontend" or "backend"

    -
  • Parameters

    • hoistedNoteId: string = 'root'

    Returns NotePathRecord[]

  • Parameters

    • __namedParameters: { includeArchived?: boolean; includeHidden?: boolean; resolveSearch?: boolean } = {}

    Returns { notes: default[]; relationships: Relationship[] }

  • Parameters

    • __namedParameters: { includeArchived?: boolean; includeHidden?: boolean; resolveSearch?: boolean } = {}

    Returns string[]

    includes the subtree root note as well

    -
  • Parameters

    • type: string
    • name: string
    • value: null | string = null

    Returns boolean

  • Returns null | "frontend" | "backend"

    JS script environment - either "frontend" or "backend"

    +
  • Parameters

    • hoistedNoteId: string = 'root'

    Returns NotePathRecord[]

  • Parameters

    • __namedParameters: { includeArchived?: boolean; includeHidden?: boolean; resolveSearch?: boolean } = {}

    Returns { notes: default[]; relationships: Relationship[] }

  • Parameters

    • __namedParameters: { includeArchived?: boolean; includeHidden?: boolean; resolveSearch?: boolean } = {}

    Returns string[]

    includes the subtree root note as well

    +
  • Parameters

    • type: string
    • name: string
    • value: null | string = null

    Returns boolean

  • Parameters

    • name: string

      label name

    • Optionalvalue: string

      label value

    Returns boolean

    true if label exists (including inherited)

    -
  • Parameters

  • Parameters

    • type: string
    • name: string

      attribute name

    • Optionalvalue: string

      attribute value

    Returns boolean

    true if note has an attribute with given type and name (excluding inherited)

    -
  • Parameters

    • name: string

      label name

    • Optionalvalue: string

      label value

    Returns boolean

    true if label exists (excluding inherited)

    -
  • Parameters

    • name: string

      relation name

    • Optionalvalue: string

      relation value

    Returns boolean

    true if relation exists (excluding inherited)

    -
  • Parameters

    • name: string

      relation name

    • Optionalvalue: string

      relation value

    Returns boolean

    true if relation exists (including inherited)

    -
  • Parameters

    • ancestorNoteId: string

    Returns boolean

    true if ancestorNoteId occurs in at least one of the note's paths

    -
  • Parameters

    • opts: ConvertOpts = ...

    Returns boolean

  • Returns boolean

    boolean - true if there's no non-hidden path, note is not cloned to the visible tree

    -
  • Parameters

    • ancestorNoteId: string

    Returns boolean

    true if ancestorNoteId occurs in at least one of the note's paths

    +
  • Parameters

    • opts: ConvertOpts = ...

    Returns boolean

  • Returns boolean

    boolean - true if there's no non-hidden path, note is not cloned to the visible tree

    +
  • Parameters

    • name: string

      label name

    Returns boolean

    true if label exists (including inherited) and does not have "false" value.

    -
  • Returns boolean

    true if this note is the root of the note tree. Root note has "root" noteId

    -
  • Mark the entity as (soft) deleted. It will be completely erased later.

    +
  • Returns boolean

    true if this note is the root of the note tree. Root note has "root" noteId

    +
  • Mark the entity as (soft) deleted. It will be completely erased later.

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    -

    Parameters

    • deleteId: null | string = null

    Returns void

  • Removes given attribute name-value pair if it exists.

    Parameters

    • type: string

      attribute type (label, relation, etc.)

    • name: string

      attribute name

    • Optionalvalue: string

      attribute value (optional)

      -

    Returns void

  • Remove label name-value pair, if it exists.

    +

Returns void

  • Remove label name-value pair, if it exists.

    Parameters

    • name: string

      label name

    • Optionalvalue: string

      label value

      -

    Returns void

  • Remove the relation name-value pair, if it exists.

    +

Returns void

  • Remove the relation name-value pair, if it exists.

    Parameters

    • name: string

      relation name

    • Optionalvalue: string

      relation value (noteId)

      -

    Returns void

  • Parameters

    • __namedParameters: AttachmentRow
    • matchBy: string = 'attachmentId'

      choose by which property we detect if to update an existing attachment. Supported values are either 'attachmentId' (default) or 'title'

      -

    Returns default

  • Update's given attribute's value or creates it if it doesn't exist

    +

Returns default

  • Update's given attribute's value or creates it if it doesn't exist

    Parameters

    • type: AttributeType

      attribute type (label, relation, etc.)

    • name: string

      attribute name

    • Optionalvalue: string

      attribute value (optional)

      -

    Returns void

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • opts: ContentOpts = {}

    Returns void

  • Update's given label's value or creates it if it doesn't exist

    +

Returns void

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • opts: ContentOpts = {}

    Returns void

  • Update's given label's value or creates it if it doesn't exist

    Parameters

    • name: string

      label name

    • Optionalvalue: string

      label value

      -

    Returns void

  • Update's given relation's value or creates it if it doesn't exist

    +

Returns void

  • Update's given relation's value or creates it if it doesn't exist

    Parameters

    • name: string

      relation name

    • Optionalvalue: string

      relation value (noteId)

      -

    Returns void

  • Based on enabled, the attribute is either set or removed.

    +

Returns void

  • Based on enabled, the attribute is either set or removed.

    Parameters

    • type: AttributeType

      attribute type ('relation', 'label' etc.)

    • enabled: boolean

      toggle On or Off

    • name: string

      attribute name

    • Optionalvalue: string

      attribute value (optional)

      -

    Returns void

  • Based on enabled, label is either set or removed.

    +

Returns void

  • Based on enabled, label is either set or removed.

    Parameters

    • enabled: boolean

      toggle On or Off

    • name: string

      label name

    • Optionalvalue: string

      label value (optional)

      -

    Returns void

  • Based on enabled, relation is either set or removed.

    +

Returns void

  • Based on enabled, relation is either set or removed.

    Parameters

    • enabled: boolean

      toggle On or Off

    • name: string

      relation name

    • Optionalvalue: string

      relation value (noteId)

      -

    Returns void

+

Returns void

diff --git a/docs/backend_api/classes/becca_entities_boption.default.html b/docs/backend_api/classes/becca_entities_boption.default.html index e8f01a50c..b13ceb36f 100644 --- a/docs/backend_api/classes/becca_entities_boption.default.html +++ b/docs/backend_api/classes/becca_entities_boption.default.html @@ -1,5 +1,5 @@ default | trilium

Option represents a name-value pair, either directly configurable by the user or some system property.

-

Hierarchy (View Summary)

Constructors

Hierarchy (View Summary)

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
name: string
utcDateCreated: string
utcDateModified?: string
value: string

Accessors

Methods

  • Returns {
        isSynced: undefined | boolean;
        name: string;
        utcDateModified: undefined | string;
        value: string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
name: string
utcDateCreated: string
utcDateModified?: string
value: string

Accessors

Methods

  • Returns {
        isSynced: undefined | boolean;
        name: string;
        utcDateModified: undefined | string;
        value: string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    -

    Parameters

    • deleteId: null | string = null

    Returns void

+

Parameters

  • deleteId: null | string = null

Returns void

diff --git a/docs/backend_api/classes/becca_entities_brecent_note.default.html b/docs/backend_api/classes/becca_entities_brecent_note.default.html index 716fc9814..5d536c7b8 100644 --- a/docs/backend_api/classes/becca_entities_brecent_note.default.html +++ b/docs/backend_api/classes/becca_entities_brecent_note.default.html @@ -1,5 +1,5 @@ default | trilium

RecentNote represents recently visited note.

-

Hierarchy (View Summary)

Constructors

Hierarchy (View Summary)

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
noteId: string
notePath: string
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

Constructors

Properties

blobId?: string
dateCreated?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
noteId: string
notePath: string
utcDateCreated: string
utcDateModified?: string

Accessors

Methods

  • Mark the entity as (soft) deleted. It will be completely erased later.

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    -

    Parameters

    • deleteId: null | string = null

    Returns void

+

Parameters

  • deleteId: null | string = null

Returns void

diff --git a/docs/backend_api/classes/becca_entities_brevision.default.html b/docs/backend_api/classes/becca_entities_brevision.default.html index 42a0b64e5..da201582a 100644 --- a/docs/backend_api/classes/becca_entities_brevision.default.html +++ b/docs/backend_api/classes/becca_entities_brevision.default.html @@ -1,6 +1,6 @@ default | trilium

Revision represents a snapshot of note's title and content at some point in the past. It's used for seamless note versioning.

-

Hierarchy (View Summary)

Constructors

Hierarchy (View Summary)

Constructors

Properties

blobId? content? contentLength? @@ -47,11 +47,11 @@ It's used for seamless note versioning.

save setContent updateFromRow -

Constructors

Properties

blobId?: string
content?: string | Buffer<ArrayBufferLike>
contentLength?: number
dateCreated?: string
dateLastEdited?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
mime: string
noteId: string
revisionId?: string
title: string
type: string
utcDateCreated: string
utcDateLastEdited?: string
utcDateModified?: string

Accessors

Methods

  • Returns {
        blobId: undefined | string;
        content: undefined | string | Buffer<ArrayBufferLike>;
        contentLength: undefined | number;
        dateCreated: undefined | string;
        dateLastEdited: undefined | string;
        isProtected: undefined | boolean;
        mime: string;
        noteId: string;
        revisionId: undefined | string;
        title: undefined | string;
        type: string;
        utcDateCreated: string;
        utcDateLastEdited: undefined | string;
        utcDateModified: undefined | string;
    }

  • Returns {
        blobId: undefined | string;
        content: undefined | string | Buffer<ArrayBufferLike>;
        contentLength: undefined | number;
        dateCreated: undefined | string;
        dateLastEdited: undefined | string;
        isProtected: undefined | boolean;
        mime: string;
        noteId: string;
        revisionId: undefined | string;
        title: undefined | string;
        type: string;
        utcDateCreated: string;
        utcDateLastEdited: undefined | string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    +

Constructors

Properties

blobId?: string
content?: string | Buffer<ArrayBufferLike>
contentLength?: number
dateCreated?: string
dateLastEdited?: string
dateModified?: string
isProtected?: boolean
isSynced?: boolean
mime: string
noteId: string
revisionId?: string
title: string
type: string
utcDateCreated: string
utcDateLastEdited?: string
utcDateModified?: string

Accessors

Methods

  • Returns {
        blobId: undefined | string;
        content: undefined | string | Buffer<ArrayBufferLike>;
        contentLength: undefined | number;
        dateCreated: undefined | string;
        dateLastEdited: undefined | string;
        isProtected: undefined | boolean;
        mime: string;
        noteId: string;
        revisionId: undefined | string;
        title: undefined | string;
        type: string;
        utcDateCreated: string;
        utcDateLastEdited: undefined | string;
        utcDateModified: undefined | string;
    }

  • Returns {
        blobId: undefined | string;
        content: undefined | string | Buffer<ArrayBufferLike>;
        contentLength: undefined | number;
        dateCreated: undefined | string;
        dateLastEdited: undefined | string;
        isProtected: undefined | boolean;
        mime: string;
        noteId: string;
        revisionId: undefined | string;
        title: undefined | string;
        type: string;
        utcDateCreated: string;
        utcDateLastEdited: undefined | string;
        utcDateModified: undefined | string;
    }

  • Mark the entity as (soft) deleted. It will be completely erased later.

    This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.

    -

    Parameters

    • deleteId: null | string = null

    Returns void

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • opts: ContentOpts = {}

    Returns void

+

Parameters

  • deleteId: null | string = null

Returns void

  • Parameters

    • content: string | Buffer<ArrayBufferLike>
    • opts: ContentOpts = {}

    Returns void

diff --git a/docs/backend_api/interfaces/becca_entities_rows.AttachmentRow.html b/docs/backend_api/interfaces/becca_entities_rows.AttachmentRow.html index b50d16189..e0d1e5e48 100644 --- a/docs/backend_api/interfaces/becca_entities_rows.AttachmentRow.html +++ b/docs/backend_api/interfaces/becca_entities_rows.AttachmentRow.html @@ -1,4 +1,4 @@ -AttachmentRow | trilium
interface AttachmentRow {
    attachmentId?: string;
    blobId?: string;
    content?: string | Buffer<ArrayBufferLike>;
    contentLength?: number;
    dateModified?: string;
    isProtected?: boolean;
    mime: string;
    ownerId?: string;
    position?: number;
    role: string;
    title: string;
    utcDateModified?: string;
    utcDateScheduledForErasureSince?: string;
}

Properties

attachmentId? +AttachmentRow | trilium
interface AttachmentRow {
    attachmentId?: string;
    blobId?: string;
    content?: string | Buffer<ArrayBufferLike>;
    contentLength?: number;
    dateModified?: string;
    isProtected?: boolean;
    mime: string;
    ownerId?: string;
    position?: number;
    role: string;
    title: string;
    utcDateModified?: string;
    utcDateScheduledForErasureSince?: string;
}

Properties

attachmentId?: string
blobId?: string
content?: string | Buffer<ArrayBufferLike>
contentLength?: number
dateModified?: string
isProtected?: boolean
mime: string
ownerId?: string
position?: number
role: string
title: string
utcDateModified?: string
utcDateScheduledForErasureSince?: string
+

Properties

attachmentId?: string
blobId?: string
content?: string | Buffer<ArrayBufferLike>
contentLength?: number
dateModified?: string
isProtected?: boolean
mime: string
ownerId?: string
position?: number
role: string
title: string
utcDateModified?: string
utcDateScheduledForErasureSince?: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.AttributeRow.html b/docs/backend_api/interfaces/becca_entities_rows.AttributeRow.html index 13232fc56..badc7f521 100644 --- a/docs/backend_api/interfaces/becca_entities_rows.AttributeRow.html +++ b/docs/backend_api/interfaces/becca_entities_rows.AttributeRow.html @@ -1,4 +1,4 @@ -AttributeRow | trilium
interface AttributeRow {
    attributeId?: string;
    isInheritable?: boolean;
    name: string;
    noteId?: string;
    position?: null | number;
    type: AttributeType;
    utcDateModified?: string;
    value?: string;
}

Properties

attributeId? +AttributeRow | trilium
interface AttributeRow {
    attributeId?: string;
    isInheritable?: boolean;
    name: string;
    noteId?: string;
    position?: null | number;
    type: AttributeType;
    utcDateModified?: string;
    value?: string;
}

Properties

attributeId?: string
isInheritable?: boolean
name: string
noteId?: string
position?: null | number
utcDateModified?: string
value?: string
+

Properties

attributeId?: string
isInheritable?: boolean
name: string
noteId?: string
position?: null | number
utcDateModified?: string
value?: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.BlobRow.html b/docs/backend_api/interfaces/becca_entities_rows.BlobRow.html index f5a23e08a..2f038e1c2 100644 --- a/docs/backend_api/interfaces/becca_entities_rows.BlobRow.html +++ b/docs/backend_api/interfaces/becca_entities_rows.BlobRow.html @@ -1,6 +1,6 @@ -BlobRow | trilium
interface BlobRow {
    blobId: string;
    content: string | Buffer<ArrayBufferLike>;
    contentLength: number;
    dateModified: string;
    utcDateModified: string;
}

Properties

blobId +BlobRow | trilium
interface BlobRow {
    blobId: string;
    content: string | Buffer<ArrayBufferLike>;
    contentLength: number;
    dateModified: string;
    utcDateModified: string;
}

Properties

blobId: string
content: string | Buffer<ArrayBufferLike>
contentLength: number
dateModified: string
utcDateModified: string
+

Properties

blobId: string
content: string | Buffer<ArrayBufferLike>
contentLength: number
dateModified: string
utcDateModified: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.BranchRow.html b/docs/backend_api/interfaces/becca_entities_rows.BranchRow.html index b5225a135..293f63d5e 100644 --- a/docs/backend_api/interfaces/becca_entities_rows.BranchRow.html +++ b/docs/backend_api/interfaces/becca_entities_rows.BranchRow.html @@ -1,4 +1,4 @@ -BranchRow | trilium
interface BranchRow {
    branchId?: string;
    isDeleted?: boolean;
    isExpanded?: boolean;
    noteId: string;
    notePosition?: null | number;
    parentNoteId: string;
    prefix?: null | string;
    utcDateModified?: string;
}

Properties

branchId? +BranchRow | trilium
interface BranchRow {
    branchId?: string;
    isDeleted?: boolean;
    isExpanded?: boolean;
    noteId: string;
    notePosition?: null | number;
    parentNoteId: string;
    prefix?: null | string;
    utcDateModified?: string;
}

Properties

branchId?: string
isDeleted?: boolean
isExpanded?: boolean
noteId: string
notePosition?: null | number
parentNoteId: string
prefix?: null | string
utcDateModified?: string
+

Properties

branchId?: string
isDeleted?: boolean
isExpanded?: boolean
noteId: string
notePosition?: null | number
parentNoteId: string
prefix?: null | string
utcDateModified?: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.EtapiTokenRow.html b/docs/backend_api/interfaces/becca_entities_rows.EtapiTokenRow.html index 6a8afd207..f21d78572 100644 --- a/docs/backend_api/interfaces/becca_entities_rows.EtapiTokenRow.html +++ b/docs/backend_api/interfaces/becca_entities_rows.EtapiTokenRow.html @@ -1,7 +1,7 @@ -EtapiTokenRow | trilium
interface EtapiTokenRow {
    etapiTokenId?: string;
    isDeleted?: boolean;
    name: string;
    tokenHash: string;
    utcDateCreated?: string;
    utcDateModified?: string;
}

Properties

etapiTokenId? +EtapiTokenRow | trilium
interface EtapiTokenRow {
    etapiTokenId?: string;
    isDeleted?: boolean;
    name: string;
    tokenHash: string;
    utcDateCreated?: string;
    utcDateModified?: string;
}

Properties

etapiTokenId?: string
isDeleted?: boolean
name: string
tokenHash: string
utcDateCreated?: string
utcDateModified?: string
+

Properties

etapiTokenId?: string
isDeleted?: boolean
name: string
tokenHash: string
utcDateCreated?: string
utcDateModified?: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.NoteRow.html b/docs/backend_api/interfaces/becca_entities_rows.NoteRow.html index e1ec0ca59..4a56f60b9 100644 --- a/docs/backend_api/interfaces/becca_entities_rows.NoteRow.html +++ b/docs/backend_api/interfaces/becca_entities_rows.NoteRow.html @@ -1,4 +1,4 @@ -NoteRow | trilium
interface NoteRow {
    blobId: string;
    content?: string | Buffer<ArrayBufferLike>;
    dateCreated: string;
    dateModified: string;
    deleteId: string;
    isDeleted: boolean;
    isProtected: boolean;
    mime: string;
    noteId: string;
    title: string;
    type:
        | "search"
        | "file"
        | "text"
        | "code"
        | "relationMap"
        | "render"
        | "book"
        | "mermaid"
        | "canvas"
        | "image"
        | "noteMap"
        | "launcher"
        | "doc"
        | "contentWidget"
        | "webView"
        | "mindMap";
    utcDateCreated: string;
    utcDateModified: string;
}

Properties

blobId +NoteRow | trilium
interface NoteRow {
    blobId: string;
    content?: string | Buffer<ArrayBufferLike>;
    dateCreated: string;
    dateModified: string;
    deleteId: string;
    isDeleted: boolean;
    isProtected: boolean;
    mime: string;
    noteId: string;
    title: string;
    type:
        | "search"
        | "file"
        | "text"
        | "code"
        | "relationMap"
        | "render"
        | "book"
        | "mermaid"
        | "canvas"
        | "image"
        | "noteMap"
        | "launcher"
        | "doc"
        | "contentWidget"
        | "webView"
        | "mindMap";
    utcDateCreated: string;
    utcDateModified: string;
}

Properties

blobId: string
content?: string | Buffer<ArrayBufferLike>
dateCreated: string
dateModified: string
deleteId: string
isDeleted: boolean
isProtected: boolean
mime: string
noteId: string
title: string
type:
    | "search"
    | "file"
    | "text"
    | "code"
    | "relationMap"
    | "render"
    | "book"
    | "mermaid"
    | "canvas"
    | "image"
    | "noteMap"
    | "launcher"
    | "doc"
    | "contentWidget"
    | "webView"
    | "mindMap"
utcDateCreated: string
utcDateModified: string
+

Properties

blobId: string
content?: string | Buffer<ArrayBufferLike>
dateCreated: string
dateModified: string
deleteId: string
isDeleted: boolean
isProtected: boolean
mime: string
noteId: string
title: string
type:
    | "search"
    | "file"
    | "text"
    | "code"
    | "relationMap"
    | "render"
    | "book"
    | "mermaid"
    | "canvas"
    | "image"
    | "noteMap"
    | "launcher"
    | "doc"
    | "contentWidget"
    | "webView"
    | "mindMap"
utcDateCreated: string
utcDateModified: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.OptionRow.html b/docs/backend_api/interfaces/becca_entities_rows.OptionRow.html index 951402e00..6b9427cd8 100644 --- a/docs/backend_api/interfaces/becca_entities_rows.OptionRow.html +++ b/docs/backend_api/interfaces/becca_entities_rows.OptionRow.html @@ -1,11 +1,11 @@ OptionRow | trilium

Database representation of an option.

Options are key-value pairs that are used to store information such as user preferences (for example the current theme, sync server information), but also information about the state of the application).

-
interface OptionRow {
    isSynced: boolean;
    name: string;
    utcDateModified?: string;
    value: string;
}

Properties

interface OptionRow {
    isSynced: boolean;
    name: string;
    utcDateModified?: string;
    value: string;
}

Properties

isSynced: boolean

true if the value should be synced across multiple instances (e.g. locale) or false if it should be local-only (e.g. theme).

-
name: string

The name of the option.

-
utcDateModified?: string
value: string

The value of the option.

-
+
name: string

The name of the option.

+
utcDateModified?: string
value: string

The value of the option.

+
diff --git a/docs/backend_api/interfaces/becca_entities_rows.RecentNoteRow.html b/docs/backend_api/interfaces/becca_entities_rows.RecentNoteRow.html index d7458d9da..d4fdb1f9d 100644 --- a/docs/backend_api/interfaces/becca_entities_rows.RecentNoteRow.html +++ b/docs/backend_api/interfaces/becca_entities_rows.RecentNoteRow.html @@ -1,4 +1,4 @@ -RecentNoteRow | trilium
interface RecentNoteRow {
    noteId: string;
    notePath: string;
    utcDateCreated?: string;
}

Properties

noteId +RecentNoteRow | trilium
interface RecentNoteRow {
    noteId: string;
    notePath: string;
    utcDateCreated?: string;
}

Properties

noteId: string
notePath: string
utcDateCreated?: string
+

Properties

noteId: string
notePath: string
utcDateCreated?: string
diff --git a/docs/backend_api/interfaces/becca_entities_rows.RevisionRow.html b/docs/backend_api/interfaces/becca_entities_rows.RevisionRow.html index a6a5402d3..64ed1ab21 100644 --- a/docs/backend_api/interfaces/becca_entities_rows.RevisionRow.html +++ b/docs/backend_api/interfaces/becca_entities_rows.RevisionRow.html @@ -1,4 +1,4 @@ -RevisionRow | trilium
interface RevisionRow {
    blobId?: string;
    contentLength?: number;
    dateCreated: string;
    dateLastEdited?: string;
    isProtected?: boolean;
    mime: string;
    noteId: string;
    revisionId?: string;
    title: string;
    type: string;
    utcDateCreated: string;
    utcDateLastEdited?: string;
    utcDateModified: string;
}

Properties

blobId? +RevisionRow | trilium
interface RevisionRow {
    blobId?: string;
    contentLength?: number;
    dateCreated: string;
    dateLastEdited?: string;
    isProtected?: boolean;
    mime: string;
    noteId: string;
    revisionId?: string;
    title: string;
    type: string;
    utcDateCreated: string;
    utcDateLastEdited?: string;
    utcDateModified: string;
}

Properties

blobId?: string
contentLength?: number
dateCreated: string
dateLastEdited?: string
isProtected?: boolean
mime: string
noteId: string
revisionId?: string
title: string
type: string
utcDateCreated: string
utcDateLastEdited?: string
utcDateModified: string
+

Properties

blobId?: string
contentLength?: number
dateCreated: string
dateLastEdited?: string
isProtected?: boolean
mime: string
noteId: string
revisionId?: string
title: string
type: string
utcDateCreated: string
utcDateLastEdited?: string
utcDateModified: string
diff --git a/docs/backend_api/types/becca_entities_rows.AttributeType.html b/docs/backend_api/types/becca_entities_rows.AttributeType.html index 26f515f7b..c55212d07 100644 --- a/docs/backend_api/types/becca_entities_rows.AttributeType.html +++ b/docs/backend_api/types/becca_entities_rows.AttributeType.html @@ -1 +1 @@ -AttributeType | trilium
AttributeType: "label" | "relation" | "label-definition" | "relation-definition"
+AttributeType | trilium
AttributeType: "label" | "relation" | "label-definition" | "relation-definition"
diff --git a/docs/backend_api/types/becca_entities_rows.NoteType.html b/docs/backend_api/types/becca_entities_rows.NoteType.html index f509dd66e..8352415bc 100644 --- a/docs/backend_api/types/becca_entities_rows.NoteType.html +++ b/docs/backend_api/types/becca_entities_rows.NoteType.html @@ -1 +1 @@ -NoteType | trilium
NoteType: typeof ALLOWED_NOTE_TYPES[number]
+NoteType | trilium
NoteType: typeof ALLOWED_NOTE_TYPES[number]
diff --git a/docs/backend_api/variables/becca_entities_rows.ALLOWED_NOTE_TYPES.html b/docs/backend_api/variables/becca_entities_rows.ALLOWED_NOTE_TYPES.html index 57d702701..9e0de4bf4 100644 --- a/docs/backend_api/variables/becca_entities_rows.ALLOWED_NOTE_TYPES.html +++ b/docs/backend_api/variables/becca_entities_rows.ALLOWED_NOTE_TYPES.html @@ -1,4 +1,4 @@ ALLOWED_NOTE_TYPES | trilium

Variable ALLOWED_NOTE_TYPESConst

ALLOWED_NOTE_TYPES: readonly [
    "file",
    "image",
    "search",
    "noteMap",
    "launcher",
    "doc",
    "contentWidget",
    "text",
    "relationMap",
    "render",
    "canvas",
    "mermaid",
    "book",
    "webView",
    "code",
    "mindMap",
] = ...

There are many different Note types, some of which are entirely opaque to the end user. Those types should be used only for checking against, they are not for direct use.

-
+
diff --git a/docs/backend_api/variables/services_backend_script_api.default.html b/docs/backend_api/variables/services_backend_script_api.default.html index 7f9939dd7..0411fa280 100644 --- a/docs/backend_api/variables/services_backend_script_api.default.html +++ b/docs/backend_api/variables/services_backend_script_api.default.html @@ -1 +1 @@ -default | trilium
default: new (currentNote: default, apiParams: ApiParams) => Api
+default | trilium
default: new (currentNote: default, apiParams: ApiParams) => Api
diff --git a/docs/backend_api/variables/services_sql.default.html b/docs/backend_api/variables/services_sql.default.html index ccc3ed24f..037d90e28 100644 --- a/docs/backend_api/variables/services_sql.default.html +++ b/docs/backend_api/variables/services_sql.default.html @@ -1,7 +1,7 @@ default | trilium
default: {
    copyDatabase: (targetFilePath: string) => Promise<void>;
    dbConnection: Database;
    disableSlowQueryLogging: <T>(cb: () => T) => T;
    execute: (query: string, params?: any) => RunResult;
    executeMany: (query: string, params: any) => void;
    executeScript: (query: string) => DatabaseType;
    fillParamList: (
        paramIds: string[] | Set<string>,
        truncate?: boolean,
    ) => void;
    getColumn: <T>(query: string, params?: any) => T[];
    getManyRows: <T>(query: string, params: any) => T[];
    getMap: <K extends string | number | symbol, V>(
        query: string,
        params?: any,
    ) => Record<K, V>;
    getRawRows: <T extends {} | unknown[]>(query: string, params?: any) => T[];
    getRow: <T>(query: string, params?: any) => T;
    getRowOrNull: <T>(query: string, params?: any) => T | null;
    getRows: <T>(query: string, params?: any) => T[];
    getValue: <T>(query: string, params?: any) => T;
    insert: <T extends {}>(
        tableName: string,
        rec: T,
        replace?: boolean,
    ) => undefined | null | number | bigint;
    iterateRows: <T>(query: string, params?: any) => IterableIterator<T>;
    rebuildIntegrationTestDatabase: () => void;
    replace: <T extends {}>(tableName: string, rec: T) => number | null;
    transactional: <T>(
        func: (statement: Statement<unknown[], unknown>) => T,
    ) => any;
    upsert: <T extends {}>(
        tableName: string,
        primaryKey: string,
        rec: T,
    ) => void;
}

Type declaration

  • copyDatabase: (targetFilePath: string) => Promise<void>
  • dbConnection: Database
  • disableSlowQueryLogging: <T>(cb: () => T) => T
  • execute: (query: string, params?: any) => RunResult

    Execute SQL

    -
  • executeMany: (query: string, params: any) => void
  • executeScript: (query: string) => DatabaseType
  • fillParamList: (paramIds: string[] | Set<string>, truncate?: boolean) => void
  • getColumn: <T>(query: string, params?: any) => T[]

    Get a first column in an array.

    -
  • getManyRows: <T>(query: string, params: any) => T[]
  • getMap: <K extends string | number | symbol, V>(
        query: string,
        params?: any,
    ) => Record<K, V>

    Get a map of first column mapping to second column.

    -
  • getRawRows: <T extends {} | unknown[]>(query: string, params?: any) => T[]
  • getRow: <T>(query: string, params?: any) => T

    Get first returned row.

    -
  • getRowOrNull: <T>(query: string, params?: any) => T | null
  • getRows: <T>(query: string, params?: any) => T[]

    Get all returned rows.

    -
  • getValue: <T>(query: string, params?: any) => T

    Get single value from the given query - first column from first returned row.

    -
  • insert: <T extends {}>(
        tableName: string,
        rec: T,
        replace?: boolean,
    ) => undefined | null | number | bigint
  • iterateRows: <T>(query: string, params?: any) => IterableIterator<T>
  • rebuildIntegrationTestDatabase: () => void
  • replace: <T extends {}>(tableName: string, rec: T) => number | null
  • transactional: <T>(func: (statement: Statement<unknown[], unknown>) => T) => any
  • upsert: <T extends {}>(tableName: string, primaryKey: string, rec: T) => void
+
  • executeMany: (query: string, params: any) => void
  • executeScript: (query: string) => DatabaseType
  • fillParamList: (paramIds: string[] | Set<string>, truncate?: boolean) => void
  • getColumn: <T>(query: string, params?: any) => T[]

    Get a first column in an array.

    +
  • getManyRows: <T>(query: string, params: any) => T[]
  • getMap: <K extends string | number | symbol, V>(
        query: string,
        params?: any,
    ) => Record<K, V>

    Get a map of first column mapping to second column.

    +
  • getRawRows: <T extends {} | unknown[]>(query: string, params?: any) => T[]
  • getRow: <T>(query: string, params?: any) => T

    Get first returned row.

    +
  • getRowOrNull: <T>(query: string, params?: any) => T | null
  • getRows: <T>(query: string, params?: any) => T[]

    Get all returned rows.

    +
  • getValue: <T>(query: string, params?: any) => T

    Get single value from the given query - first column from first returned row.

    +
  • insert: <T extends {}>(
        tableName: string,
        rec: T,
        replace?: boolean,
    ) => undefined | null | number | bigint
  • iterateRows: <T>(query: string, params?: any) => IterableIterator<T>
  • rebuildIntegrationTestDatabase: () => void
  • replace: <T extends {}>(tableName: string, rec: T) => number | null
  • transactional: <T>(func: (statement: Statement<unknown[], unknown>) => T) => any
  • upsert: <T extends {}>(tableName: string, primaryKey: string, rec: T) => void
  • diff --git a/src/services/sql.ts b/src/services/sql.ts index 0f1cf5ea4..d2b14c669 100644 --- a/src/services/sql.ts +++ b/src/services/sql.ts @@ -347,7 +347,6 @@ export default { /** * Get single value from the given query - first column from first returned row. * - * @method * @param query - SQL query with ? used as parameter placeholder * @param params - array of params if needed * @returns single value @@ -357,7 +356,6 @@ export default { /** * Get first returned row. * - * @method * @param query - SQL query with ? used as parameter placeholder * @param params - array of params if needed * @returns - map of column name to column value @@ -368,7 +366,6 @@ export default { /** * Get all returned rows. * - * @method * @param query - SQL query with ? used as parameter placeholder * @param params - array of params if needed * @returns - array of all rows, each row is a map of column name to column value @@ -381,7 +378,6 @@ export default { /** * Get a map of first column mapping to second column. * - * @method * @param query - SQL query with ? used as parameter placeholder * @param params - array of params if needed * @returns - map of first column to second column @@ -391,7 +387,6 @@ export default { /** * Get a first column in an array. * - * @method * @param query - SQL query with ? used as parameter placeholder * @param params - array of params if needed * @returns array of first column of all returned rows @@ -401,7 +396,6 @@ export default { /** * Execute SQL * - * @method * @param query - SQL query with ? used as parameter placeholder * @param params - array of params if needed */