roamjs-components 1.0.0-beta.1 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "roamjs-components",
3
3
  "description": "Expansive toolset, utilities, & components for developing RoamJS extensions.",
4
- "version": "1.0.0-beta.1",
4
+ "version": "1.0.0-beta.2",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
7
7
  "scripts": {
@@ -49,20 +49,22 @@ export const createComponentRender =
49
49
  (b: HTMLButtonElement, args?: OnloadArgs): void => {
50
50
  if (b.parentElement) {
51
51
  b.parentElement.onmousedown = (e: MouseEvent) => e.stopPropagation();
52
- const blockUid = getBlockUidFromTarget(b);
53
- const possibleBlockId = b.closest(".roam-block")?.id;
54
- const blockId = possibleBlockId?.endsWith?.(blockUid)
55
- ? possibleBlockId
56
- : undefined;
57
- if (blockUid) {
58
- renderWithUnmount(
59
- <ComponentContainer blockId={blockId} className={className}>
60
- <Fc blockUid={blockUid} />
61
- </ComponentContainer>,
62
- b.parentElement,
63
- args
64
- );
65
- }
52
+ getBlockUidFromTarget(b).then((blockUid) => {
53
+ if (!b.parentElement) return;
54
+ const possibleBlockId = b.closest(".roam-block")?.id;
55
+ const blockId = possibleBlockId?.endsWith?.(blockUid)
56
+ ? possibleBlockId
57
+ : undefined;
58
+ if (blockUid) {
59
+ renderWithUnmount(
60
+ <ComponentContainer blockId={blockId} className={className}>
61
+ <Fc blockUid={blockUid} />
62
+ </ComponentContainer>,
63
+ b.parentElement,
64
+ args
65
+ );
66
+ }
67
+ });
66
68
  }
67
69
  };
68
70
 
@@ -28,23 +28,25 @@ const BlocksPanel: FieldPanel<BlocksField> = ({
28
28
  )
29
29
  )
30
30
  .then((formatUid) =>
31
- getFirstChildUidByBlockUid(formatUid)
32
- ? formatUid
33
- : (defaultValue?.length
34
- ? Promise.all(
35
- defaultValue.map((node, order) =>
36
- createBlock({
37
- node,
38
- parentUid: formatUid,
39
- order,
40
- })
31
+ getFirstChildUidByBlockUid(formatUid).then((childUid) =>
32
+ childUid
33
+ ? formatUid
34
+ : (defaultValue?.length
35
+ ? Promise.all(
36
+ defaultValue.map((node, order) =>
37
+ createBlock({
38
+ node,
39
+ parentUid: formatUid,
40
+ order,
41
+ })
42
+ )
41
43
  )
42
- )
43
- : createBlock({
44
- node: { text: " " },
45
- parentUid: formatUid,
46
- })
47
- ).then(() => formatUid)
44
+ : createBlock({
45
+ node: { text: " " },
46
+ parentUid: formatUid,
47
+ })
48
+ ).then(() => formatUid)
49
+ )
48
50
  )
49
51
  .then((uid) => {
50
52
  window.roamAlphaAPI.ui.components.renderBlock({
@@ -1,7 +1,7 @@
1
1
  import type { RoamBasicNode } from "../types/native";
2
2
  import getSettingValueFromTree from "../util/getSettingValueFromTree";
3
3
 
4
- const addKeybordTriggers = ({
4
+ const addKeybordTriggers = async ({
5
5
  triggers: inputTriggers,
6
6
  }: {
7
7
  triggers: {
@@ -12,26 +12,30 @@ const addKeybordTriggers = ({
12
12
  callback: () => void;
13
13
  }[];
14
14
  }) => {
15
- const triggers = inputTriggers.map(({ trigger, callback }) => {
16
- if (trigger instanceof RegExp) {
17
- return { trigger, callback };
18
- } else if (typeof trigger === "function") {
19
- return { callback, trigger: trigger() };
20
- } else {
21
- const triggerValue = getSettingValueFromTree({
22
- tree: trigger.tree,
23
- key: "trigger",
24
- defaultValue: trigger.defaultValue || "\\\\",
25
- })
26
- .replace(/"/g, "")
27
- .replace(/\\/g, "\\\\")
28
- .replace(/\+/g, "\\+")
29
- .trim();
15
+ const triggers = await Promise.all(
16
+ inputTriggers.map(async ({ trigger, callback }) => {
17
+ if (trigger instanceof RegExp) {
18
+ return { trigger, callback };
19
+ } else if (typeof trigger === "function") {
20
+ return { callback, trigger: trigger() };
21
+ } else {
22
+ const triggerValue = (
23
+ await getSettingValueFromTree({
24
+ tree: trigger.tree,
25
+ key: "trigger",
26
+ defaultValue: trigger.defaultValue || "\\\\",
27
+ })
28
+ )
29
+ .replace(/"/g, "")
30
+ .replace(/\\/g, "\\\\")
31
+ .replace(/\+/g, "\\+")
32
+ .trim();
30
33
 
31
- const triggerRegex = new RegExp(`${triggerValue}$`);
32
- return { callback, trigger: triggerRegex };
33
- }
34
- });
34
+ const triggerRegex = new RegExp(`${triggerValue}$`);
35
+ return { callback, trigger: triggerRegex };
36
+ }
37
+ })
38
+ );
35
39
 
36
40
  document.addEventListener("input", (e) => {
37
41
  const target = e.target as HTMLElement;
@@ -15,23 +15,24 @@ const createPageTitleObserver = ({
15
15
  "roam-article"
16
16
  )[0] as HTMLDivElement;
17
17
  if (d) {
18
- const uid = getPageUidByPageTitle(title);
19
- const attribute = `data-roamjs-${uid}`;
20
- if ((uid && url === getRoamUrl(uid)) || (log && url === getRoamUrl())) {
21
- // React's rerender crushes the old article/heading
22
- setTimeout(() => {
23
- if (!d.hasAttribute(attribute)) {
24
- d.setAttribute(attribute, "true");
25
- callback(
26
- document.getElementsByClassName(
27
- "roam-article"
28
- )[0] as HTMLDivElement
29
- );
30
- }
31
- }, 1);
32
- } else {
33
- d.removeAttribute(attribute);
34
- }
18
+ getPageUidByPageTitle(title).then((uid) => {
19
+ const attribute = `data-roamjs-${uid}`;
20
+ if ((uid && url === getRoamUrl(uid)) || (log && url === getRoamUrl())) {
21
+ // React's rerender crushes the old article/heading
22
+ setTimeout(() => {
23
+ if (!d.hasAttribute(attribute)) {
24
+ d.setAttribute(attribute, "true");
25
+ callback(
26
+ document.getElementsByClassName(
27
+ "roam-article"
28
+ )[0] as HTMLDivElement
29
+ );
30
+ }
31
+ }, 1);
32
+ } else {
33
+ d.removeAttribute(attribute);
34
+ }
35
+ });
35
36
  }
36
37
  };
37
38
  const wrapped = (e: HashChangeEvent) => listener(e.newURL);
@@ -1,9 +1,9 @@
1
1
  import getCurrentUserUid from "./getCurrentUserUid";
2
2
  import getDisplayNameByUid from "./getDisplayNameByUid";
3
3
 
4
- const getCurrentUserDisplayName = (): string => {
4
+ const getCurrentUserDisplayName = async (): Promise<string> => {
5
5
  const uid = getCurrentUserUid();
6
- return getDisplayNameByUid(uid);
6
+ return await getDisplayNameByUid(uid);
7
7
  };
8
8
 
9
9
  export default getCurrentUserDisplayName;
@@ -1387,20 +1387,24 @@ const mockRoamEnvironment = () => {
1387
1387
  // TODO - process exp
1388
1388
  return node;
1389
1389
  };
1390
- if (Array.isArray(id)) {
1391
- const [attr, val] = id;
1392
- if (attr === ":block/uid") {
1393
- return pick(graph.state[graph.uids[val]]);
1394
- } else if (attr === ":node/title") {
1395
- return pick(graph.state[graph.titles[val]]);
1396
- } else {
1397
- throw new Error(`Attr is not supported: ${attr}`);
1398
- }
1399
- } else if (typeof id === "number") {
1400
- return pick(graph.state[id]);
1401
- } else {
1402
- throw new Error(`Id is not supported: ${id}`);
1403
- }
1390
+ return Promise.resolve(
1391
+ Array.isArray(id)
1392
+ ? (() => {
1393
+ const [attr, val] = id;
1394
+ if (attr === ":block/uid") {
1395
+ return pick(graph.state[graph.uids[val]]);
1396
+ } else if (attr === ":node/title") {
1397
+ return pick(graph.state[graph.titles[val]]);
1398
+ } else {
1399
+ throw new Error(`Attr is not supported: ${attr}`);
1400
+ }
1401
+ })()
1402
+ : typeof id === "number"
1403
+ ? pick(graph.state[id])
1404
+ : (() => {
1405
+ throw new Error(`Id is not supported: ${id}`);
1406
+ })()
1407
+ );
1404
1408
  },
1405
1409
  q: (query, ..._params) => {
1406
1410
  return mockQuery({ graph, query });
@@ -17,10 +17,11 @@ const extensionDeprecatedWarning = async ({
17
17
  }): Promise<void> => {
18
18
  const configUid = await getPageUidByPageTitle(extensionId);
19
19
  const config = await getBasicTreeByParentUid(configUid);
20
- const donotShowAgainUid = getSubTree({
20
+ const donotShowAgainNode = await getSubTree({
21
21
  tree: config,
22
22
  key: "Do not show again",
23
- }).uid;
23
+ });
24
+ const donotShowAgainUid = donotShowAgainNode.uid;
24
25
  if (!donotShowAgainUid) {
25
26
  const blocks = (
26
27
  (await window.roamAlphaAPI.data.backend.q(
@@ -1,11 +1,11 @@
1
1
  import getCurrentUserEmail from "../queries/getCurrentUserEmail";
2
2
  import getToken from "./getToken";
3
3
 
4
- const getAuthorizationHeader = (service?: string) => {
5
- const token = getToken();
4
+ const getAuthorizationHeader = async (service?: string): Promise<string> => {
5
+ const token = await getToken();
6
6
  return token
7
- ? `Bearer ${window.btoa(`${getCurrentUserEmail()}:${getToken()}`)}`
8
- : getToken(service);
7
+ ? `Bearer ${window.btoa(`${getCurrentUserEmail()}:${token}`)}`
8
+ : await getToken(service);
9
9
  };
10
10
 
11
11
  export default getAuthorizationHeader;
@@ -5,7 +5,7 @@ import localStorageGet from "./localStorageGet";
5
5
  import toConfigPageName from "./toConfigPageName";
6
6
  import toFlexRegex from "./toFlexRegex";
7
7
 
8
- const getOauth = (service: string, label?: string): string => {
8
+ const getOauth = async (service: string, label?: string): Promise<string> => {
9
9
  const fromStorage = localStorageGet(`oauth-${service}`);
10
10
  if (fromStorage) {
11
11
  const accounts = JSON.parse(fromStorage) as {
@@ -18,14 +18,13 @@ const getOauth = (service: string, label?: string): string => {
18
18
  const { data, ...node } = accountNode;
19
19
  return data ? JSON.stringify({ ...JSON.parse(data), node }) : "{}";
20
20
  }
21
- const tree = getShallowTreeByParentUid(
22
- getPageUidByPageTitle(toConfigPageName(service))
23
- );
21
+ const pageUid = await getPageUidByPageTitle(toConfigPageName(service));
22
+ const tree = await getShallowTreeByParentUid(pageUid);
24
23
  const node = tree.find((s) => toFlexRegex("oauth").test(s.text.trim()));
25
24
  if (!node) {
26
25
  return "{}";
27
26
  }
28
- const nodeChildren = getShallowTreeByParentUid(node.uid);
27
+ const nodeChildren = await getShallowTreeByParentUid(node.uid);
29
28
  const index = label
30
29
  ? nodeChildren.findIndex((t) => toFlexRegex(label).test(t.text))
31
30
  : 0;
@@ -37,11 +36,11 @@ const getOauth = (service: string, label?: string): string => {
37
36
  const obj = JSON.parse(labelNode.text);
38
37
  obj.node = {
39
38
  uid: labelNode.uid,
40
- time: getEditTimeByBlockUid(labelNode.uid),
39
+ time: await getEditTimeByBlockUid(labelNode.uid),
41
40
  };
42
41
  return JSON.stringify(obj);
43
42
  }
44
- const dataNode = getShallowTreeByParentUid(labelNode.uid)[0];
43
+ const dataNode = (await getShallowTreeByParentUid(labelNode.uid))[0];
45
44
  const uid = dataNode?.uid || "";
46
45
  if (!dataNode?.text) {
47
46
  return "{}";
@@ -49,7 +48,7 @@ const getOauth = (service: string, label?: string): string => {
49
48
  const obj = JSON.parse(dataNode.text);
50
49
  obj.node = {
51
50
  uid,
52
- time: uid ? getEditTimeByBlockUid(uid) : 0,
51
+ time: uid ? await getEditTimeByBlockUid(uid) : 0,
53
52
  };
54
53
  return JSON.stringify(obj);
55
54
  };
@@ -4,7 +4,7 @@ import localStorageGet from "./localStorageGet";
4
4
  import toConfigPageName from "./toConfigPageName";
5
5
  import toFlexRegex from "./toFlexRegex";
6
6
 
7
- const getOauthAccounts = (service: string): string[] => {
7
+ const getOauthAccounts = async (service: string): Promise<string[]> => {
8
8
  const fromStorage = localStorageGet(`oauth-${service}`);
9
9
  if (fromStorage) {
10
10
  const accounts = JSON.parse(fromStorage) as {
@@ -13,14 +13,14 @@ const getOauthAccounts = (service: string): string[] => {
13
13
  }[];
14
14
  return accounts.map((a) => a.text);
15
15
  }
16
- const tree = getShallowTreeByParentUid(
17
- getPageUidByPageTitle(toConfigPageName(service))
18
- );
16
+ const pageUid = await getPageUidByPageTitle(toConfigPageName(service));
17
+ const tree = await getShallowTreeByParentUid(pageUid);
19
18
  const node = tree.find((s) => toFlexRegex("oauth").test(s.text.trim()));
20
19
  if (!node) {
21
20
  return [];
22
21
  }
23
- return getShallowTreeByParentUid(node.uid).map((t) => t.text);
22
+ const nodeChildren = await getShallowTreeByParentUid(node.uid);
23
+ return nodeChildren.map((t) => t.text);
24
24
  };
25
25
 
26
26
  export default getOauthAccounts;
@@ -2,9 +2,9 @@ import getBasicTreeByParentUid from "../queries/getBasicTreeByParentUid";
2
2
  import type { InputTextNode } from "../types";
3
3
  import toFlexRegex from "./toFlexRegex";
4
4
 
5
- const getSettingValueFromTree = ({
5
+ const getSettingValueFromTree = async ({
6
6
  parentUid = "",
7
- tree = getBasicTreeByParentUid(parentUid),
7
+ tree,
8
8
  key,
9
9
  defaultValue = "",
10
10
  }: {
@@ -12,8 +12,12 @@ const getSettingValueFromTree = ({
12
12
  tree?: InputTextNode[];
13
13
  key: string;
14
14
  defaultValue?: string;
15
- }): string => {
16
- const node = tree.find((s) => toFlexRegex(key).test(s.text.trim()));
15
+ }): Promise<string> => {
16
+ // results in type errors via `npx tsc --noEmit`
17
+ // const resolvedTree = tree || (await getBasicTreeByParentUid(parentUid));
18
+ let resolvedTree = tree;
19
+ if (!resolvedTree) resolvedTree = await getBasicTreeByParentUid(parentUid);
20
+ const node = resolvedTree.find((s) => toFlexRegex(key).test(s.text.trim()));
17
21
  const value = node?.children?.[0]
18
22
  ? node?.children?.[0].text.trim()
19
23
  : defaultValue;
@@ -3,23 +3,25 @@ import type { RoamBasicNode } from "../types/native";
3
3
  import createBlock from "../writes/createBlock";
4
4
  import toFlexRegex from "./toFlexRegex";
5
5
 
6
- const getSubTree = ({
6
+ const getSubTree = async ({
7
7
  key,
8
8
  parentUid,
9
9
  order = 0,
10
- tree = parentUid ? getBasicTreeByParentUid(parentUid) : [],
10
+ tree,
11
11
  }: {
12
12
  key: string;
13
13
  parentUid?: string;
14
14
  tree?: RoamBasicNode[];
15
15
  order?: number;
16
- }): RoamBasicNode => {
17
- const node = tree.find((s) => toFlexRegex(key).test(s.text.trim()));
16
+ }): Promise<RoamBasicNode> => {
17
+ const resolvedTree =
18
+ tree || (parentUid ? await getBasicTreeByParentUid(parentUid) : []);
19
+ const node = resolvedTree.find((s) => toFlexRegex(key).test(s.text.trim()));
18
20
  if (node) return node;
19
21
  const defaultNode = { text: "", children: [] };
20
22
  if (parentUid) {
21
23
  const uid = window.roamAlphaAPI.util.generateUID();
22
- createBlock({ node: { text: key, uid }, parentUid, order });
24
+ await createBlock({ node: { text: key, uid }, parentUid, order });
23
25
  return {
24
26
  uid,
25
27
  ...defaultNode,
@@ -3,10 +3,15 @@ import getPageUidByPageTitle from "../queries/getPageUidByPageTitle";
3
3
  import getTokenFromTree from "./getTokenFromTree";
4
4
  import localStorageGet from "./localStorageGet";
5
5
 
6
- const getToken = (service = "roamjs"): string =>
7
- localStorageGet(`token${service === "roamjs" ? "" : `-${service}`}`) ||
8
- getTokenFromTree(
9
- getBasicTreeByParentUid(getPageUidByPageTitle(`roam/js/${service}`))
6
+ const getToken = async (service = "roamjs"): Promise<string> => {
7
+ const fromStorage = localStorageGet(
8
+ `token${service === "roamjs" ? "" : `-${service}`}`
10
9
  );
10
+ if (fromStorage) return fromStorage;
11
+
12
+ const pageUid = await getPageUidByPageTitle(`roam/js/${service}`);
13
+ const tree = await getBasicTreeByParentUid(pageUid);
14
+ return getTokenFromTree(tree);
15
+ };
11
16
 
12
17
  export default getToken;
@@ -22,18 +22,18 @@ type HandleFetch = <T extends Record<string, unknown> | ArrayBuffer>(
22
22
  // ) => HandleFetchReturn<T, B>;
23
23
  ) => Promise<T>;
24
24
 
25
- const handleFetch: HandleFetch = (
25
+ const handleFetch: HandleFetch = async (
26
26
  transformArgs,
27
27
  { method, anonymous, authorization, path, href, domain, headers = {}, buffer }
28
28
  ) => {
29
29
  const url = new URL(href || `${domain || getApiUrlEnv()}/${path}`);
30
- const defaultHeaders = !anonymous
31
- ? { Authorization: authorization || getAuthorizationHeader() }
30
+ const authHeader = !anonymous
31
+ ? { Authorization: authorization || (await getAuthorizationHeader()) }
32
32
  : ({} as HeadersInit);
33
33
  return fetch(
34
34
  ...transformArgs(url, {
35
35
  method,
36
- headers: { ...defaultHeaders, ...headers },
36
+ headers: { ...authHeader, ...headers },
37
37
  })
38
38
  ).then((r) => {
39
39
  if (!r.ok) {
@@ -3,7 +3,7 @@ import createBlock from "../writes/createBlock";
3
3
  import updateBlock from "../writes/updateBlock";
4
4
  import toFlexRegex from "./toFlexRegex";
5
5
 
6
- const setInputSetting = ({
6
+ const setInputSetting = async ({
7
7
  blockUid,
8
8
  value,
9
9
  key,
@@ -14,7 +14,7 @@ const setInputSetting = ({
14
14
  key: string;
15
15
  index?: number;
16
16
  }): Promise<string> => {
17
- const tree = getBasicTreeByParentUid(blockUid);
17
+ const tree = await getBasicTreeByParentUid(blockUid);
18
18
  const keyNode = tree.find((t) => toFlexRegex(key).test(t.text));
19
19
  if (keyNode && keyNode.children.length) {
20
20
  return updateBlock({
@@ -3,7 +3,7 @@ import deleteBlock from "../writes/deleteBlock";
3
3
  import createBlock from "../writes/createBlock";
4
4
  import toFlexRegex from "./toFlexRegex";
5
5
 
6
- export const setInputSettings = ({
6
+ export const setInputSettings = async ({
7
7
  blockUid,
8
8
  values,
9
9
  key,
@@ -13,8 +13,8 @@ export const setInputSettings = ({
13
13
  values: string[];
14
14
  key: string;
15
15
  index?: number;
16
- }): void => {
17
- const tree = getBasicTreeByParentUid(blockUid);
16
+ }): Promise<void> => {
17
+ const tree = await getBasicTreeByParentUid(blockUid);
18
18
  const keyNode = tree.find((t) => toFlexRegex(key).test(t.text));
19
19
  if (keyNode) {
20
20
  keyNode.children