From 6c45779de17db0fd47783261f87d642770ff9efe Mon Sep 17 00:00:00 2001 From: sid597 Date: Mon, 22 Dec 2025 12:17:57 +0530 Subject: [PATCH 1/2] init schema to check if page and top level blocks exis --- .../roam/src/data/blockPropsSettingsConfig.ts | 3 +- apps/roam/src/utils/initBlockPropSettings.ts | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 apps/roam/src/utils/initBlockPropSettings.ts diff --git a/apps/roam/src/data/blockPropsSettingsConfig.ts b/apps/roam/src/data/blockPropsSettingsConfig.ts index 9b6b10987..54dc17ba3 100644 --- a/apps/roam/src/data/blockPropsSettingsConfig.ts +++ b/apps/roam/src/data/blockPropsSettingsConfig.ts @@ -1 +1,2 @@ -export const DG_BLOCK_PROP_SETTINGS_PAGE_TITLE ="roam/js/discourse-graph/block-prop-settings"; \ No newline at end of file +export const DG_BLOCK_PROP_SETTINGS_PAGE_TITLE ="roam/js/discourse-graph/block-prop-settings"; +export const TOP_LEVEL_BLOCK_PROP_KEYS = { featureFlags: "Feature Flags" }; \ No newline at end of file diff --git a/apps/roam/src/utils/initBlockPropSettings.ts b/apps/roam/src/utils/initBlockPropSettings.ts new file mode 100644 index 000000000..6bf7fc9e3 --- /dev/null +++ b/apps/roam/src/utils/initBlockPropSettings.ts @@ -0,0 +1,47 @@ +import { + TOP_LEVEL_BLOCK_PROP_KEYS, + DG_BLOCK_PROP_SETTINGS_PAGE_TITLE, +} from "~/data/blockPropsSettingsConfig"; +import getPageUidByPageTitle from "roamjs-components/queries/getPageUidByPageTitle"; +import getShallowTreeByParentUid from "roamjs-components/queries/getShallowTreeByParentUid"; +import { createPage, createBlock } from "roamjs-components/writes"; + +const ensurePageExists = async (pageTitle: string): Promise => { + let pageUid = getPageUidByPageTitle(pageTitle); + + if (!pageUid) { + pageUid = window.roamAlphaAPI.util.generateUID(); + await createPage({ + title: pageTitle, + uid: pageUid, + }); + } + + return pageUid; +}; + +const ensureBlocksExist = async (pageUid: string): Promise => { + const blockTexts = Object.values(TOP_LEVEL_BLOCK_PROP_KEYS); + const existingChildren = getShallowTreeByParentUid(pageUid); + const existingTexts = new Set(existingChildren.map((child) => child.text)); + + const missingBlocks = blockTexts.filter( + (blockText) => !existingTexts.has(blockText), + ); + + if (missingBlocks.length > 0) { + await Promise.all( + missingBlocks.map((blockText) => + createBlock({ + parentUid: pageUid, + node: { text: blockText }, + }), + ), + ); + } +}; + +export const initSchema = async () => { + const pageUid = await ensurePageExists(DG_BLOCK_PROP_SETTINGS_PAGE_TITLE); + await ensureBlocksExist(pageUid); +}; From 3a4dff4723acf834b1389af0e0b2cdca5b81f8db Mon Sep 17 00:00:00 2001 From: sid597 Date: Mon, 22 Dec 2025 13:02:08 +0530 Subject: [PATCH 2/2] return the list of top level blocks mapped to their uid --- apps/roam/src/utils/initBlockPropSettings.ts | 35 +++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/apps/roam/src/utils/initBlockPropSettings.ts b/apps/roam/src/utils/initBlockPropSettings.ts index 6bf7fc9e3..38f027b86 100644 --- a/apps/roam/src/utils/initBlockPropSettings.ts +++ b/apps/roam/src/utils/initBlockPropSettings.ts @@ -20,28 +20,39 @@ const ensurePageExists = async (pageTitle: string): Promise => { return pageUid; }; -const ensureBlocksExist = async (pageUid: string): Promise => { +const ensureBlocksExist = async ( + pageUid: string, +): Promise> => { const blockTexts = Object.values(TOP_LEVEL_BLOCK_PROP_KEYS); const existingChildren = getShallowTreeByParentUid(pageUid); - const existingTexts = new Set(existingChildren.map((child) => child.text)); - const missingBlocks = blockTexts.filter( - (blockText) => !existingTexts.has(blockText), - ); + const blockMap: Record = {}; + existingChildren.forEach((child) => { + blockMap[child.text] = child.uid; + }); + + const missingBlocks = blockTexts.filter((blockText) => !blockMap[blockText]); if (missingBlocks.length > 0) { - await Promise.all( - missingBlocks.map((blockText) => - createBlock({ + const createdBlocks = await Promise.all( + missingBlocks.map(async (blockText) => { + const uid = await createBlock({ parentUid: pageUid, node: { text: blockText }, - }), - ), + }); + return { text: blockText, uid }; + }), ); + + createdBlocks.forEach((block) => { + blockMap[block.text] = block.uid; + }); } + + return blockMap; }; -export const initSchema = async () => { +export const initSchema = async (): Promise> => { const pageUid = await ensurePageExists(DG_BLOCK_PROP_SETTINGS_PAGE_TITLE); - await ensureBlocksExist(pageUid); + return await ensureBlocksExist(pageUid); };