define editor setting schema in `packages/frontend/core/src/modules/editor-settting/schema.ts`
e.g.
```ts
const BSEditorSettingSchema = z.object({
connector: z.object({
stroke: z
.union([
z.string(),
z.object({
dark: z.string(),
light: z.string(),
}),
])
.default('#000000'), // default is necessary
}),
});
```
schema can be defined in a nested way. EditorSetting api is in flat way:
editorSetting api:
```ts
editorSetting.settings$ === {
'connector.stroke': '#000000'
}
editorSetting.set('connector.stroke', '#000')
```
and use `expandFlattenObject` function can restore the flattened structure to a nested structure. nested structure is required by blocksuite
```ts
editorSetting.settings$.map(expandFlattenObject) === {
connector: {
stroke: '#000000'
}
}
```
23 lines
479 B
TypeScript
23 lines
479 B
TypeScript
export function unflattenObject(ob: any) {
|
|
const result: any = {};
|
|
|
|
for (const key in ob) {
|
|
if (!Object.prototype.hasOwnProperty.call(ob, key)) continue;
|
|
|
|
const keys = key.split('.');
|
|
let current = result;
|
|
|
|
for (let i = 0; i < keys.length; i++) {
|
|
const k = keys[i];
|
|
if (i === keys.length - 1) {
|
|
current[k] = ob[key];
|
|
} else {
|
|
current[k] = current[k] || {};
|
|
current = current[k];
|
|
}
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|