Cook
General
Updating the prisma schema
cd packages/engine-server
make db-gen
Note Response
- NOTE: response has been truncated in some areas with
...for sake of clarity
{
"id": "e3002a40-6571-4120-8311-c4a9af948e07",
"title": "Foo",
"vault": {
"fsPath": "/Users/kevinlin/Dropbox/Apps/Noah/vaults/people-vault"
},
"type": "note",
"desc": "",
"links": [
{
"type": "wiki",
"from": {
"fname": "foo",
"id": "e3002a40-6571-4120-8311-c4a9af948e07"
},
"original": "people.james",
"value": "people.james",
"alias": "people.james",
"pos": {
"start": 128,
"end": 155
},
"to": {
"fname": "people.james"
}
},
...
],
"fname": "foo",
"updated": 1610409926314,
"created": 1610381470060,
"parent": "af9c2275-84dd-4d86-b0a3-af9d8cd2fb08",
"children": [],
"body": "...",
"data": {},
"custom": {
"published": true
}
}
Links
Adding a new engine API
Engine apis have many touchpoints.
See Initialization to see the different components that an engine call (in this case, initialization), calls.
When you add a new API to the engine, it needs to be added in both the types and the implementations of the engine:
-
types:
-
implementation:
- Store: engine methods usually operate on the storage layer (eg. write to disk, read from disk) and so store methods often need to be updated
- Engine: actual engine implementation
- DendronApi: used by engine client to call the express server
- API Server Routes: where the server handles the call from engine client
- DendronEngineClient: Implements the call from engine client to API
- DEngineClient: wrapper around
DendronAPIthat mirrors theEngineAPI
Tune Search Results
-
checkout fuse.js from https://github.com/krisk/fuse
-
install dependencies
npm install -
build the docs
npm run docs:dev -
modify
docs/.vuepress/components/Demo/Demo.vue- example of setting custom parameters
let codify = (pattern) => { return `const options = { shouldSort: true, threshold: 0.6, location: 0, distance: 50, maxPatternLength: 32, minMatchCharLength: 2, useExtendedSearch: true, includeScore: true, keys: [ "title", ] }; const fuse = new Fuse(list, options); // Change the pattern const pattern = "${pattern}" return fuse.search(pattern)` }
Engine
#scope.common.lookup (Private)
Connecting to the engine
import { DEngineClientV2, EngineConnector } from "@dendronhq/engine-server";
let dendronEngine: DEngineClientV2;
const connector = EngineConnector.instance();
if (_.isUndefined(connector._engine)) {
return vscode.window.showInformationMessage(
"Still initializing. Please close this window and try again after Dendron has been initialized",
);
}
dendronEngine = connector.engine;
if (!engine) {
engine = this.initMarkdownEngine({ sourceUri, dendronEngine });
}
Querying notes by ID
engine.queryNote
Query notes by file name
-
note: make sure that the engine is initialized
-
with vault
import {NoteUtilsV2} from "@dendronhq/engine-server";
const maybeNode = NoteUtilsV2.getNoteByFnameV4({
fname: dirname,
notes: nodes,
vault,
});
- without vault (gets all notes with this name)
import {NoteUtilsV2} from "@dendronhq/engine-server";
const maybeNode = NoteUtilsV2.getNotesByFname({({
fname: dirname,
notes: nodes,
});
Vaults
Getting absolute path for a vault
Dendron has many vault types (Private) which means that getting the path to the vault is not as simple as path.join(wsRoot, vault.fsPath).
To get the path of the vault relative to wsRoot, use the following:
// Path of vault relative to workspace root
path.join(wsRoot, VaultUtils.getRelPath(vault))
Markdown
#scope.common.markdown (Private)
Adding a new unified plugin
Resources:
Context:
- Dendron uses remark and rehype to handle markdown and html transformations
- Dendron uses a series of processors to group unified plugins
- Dendron currently compiles markdown into output formats listed here
Steps:
- add the plugin to engine-server
- NOTE: we are still using remark12 so make sure to install the remark12 compatible version of the plugin
- instructions to add new packages here
- update
src/markdown/utils.tsin engine-server- import plugin and add it to the appropriate processor (most likely
procFull)
- import plugin and add it to the appropriate processor (most likely
- write a test for the plugin. plugin tests are located in
engine-test-utils/src/__tests__/engine-server/markdown/- example here
createProcTestsis a special function that sets up a Dendron workspace and can help you run a unified processor for multiple output formats- your test should cover every output format that your plugin affects
- best way to understand is by example, see the other tests in the same folder for additional examples of how to use this function
- write the plugin implementation
- make sure your tests pass
- its helpful to use the
matchSnapshotfunctionality that jest provides if you use thecheckVFilehelper function, this happens automatically - you can view snapshots in
__snapshots__/folder which is relative to the test
- its helpful to use the
- add a flag in
DendronConfigto toggle the plugin- by default, new plugins are opt-in
- if the plugin only affects HTML output, you can put the option in
DendronSiteConfig
- go back into
src/markdown/utils.tsand use the newly created config value- pass it in as an optional param in
proc* - conditionally add plugin in config is present
- pass it in as an optional param in
- add a test that makes sure the plugin doesn't take into affect if the config is not enabled
Notes on testing:
- when testing
transformers,processwill run over the node that is passed in to the processor - when testing
parsersandcompilers,processwill run over the text that you pass into it
Children
Backlinks