From 99248e98b5a11509339e94beb569398f8bd20cf1 Mon Sep 17 00:00:00 2001 From: Morten Olsen Date: Wed, 11 Dec 2024 12:32:23 +0100 Subject: [PATCH] prepare for client/server split --- app/.gitignore | 24 - app/index.html | 13 - app/package.json | 28 - app/src/app.tsx | 9 - app/src/main.tsx | 14 - app/src/vite-env.d.ts | 1 - app/tsconfig.app.json | 26 - app/tsconfig.json | 7 - app/tsconfig.node.json | 24 - app/vite.config.ts | 7 - packages/{platform-react => base}/.gitignore | 0 .../{platform-react => base}/package.json | 7 +- packages/base/src/exports.ts | 8 + packages/base/src/manifest/manifest.ts | 36 + .../{platform-react => base}/tsconfig.json | 3 +- packages/client/.gitignore | 2 + packages/client/package.json | 20 + packages/client/src/client/client.ts | 20 + .../{platform-react => client}/src/exports.ts | 0 packages/client/src/plugin/plugin.ts | 14 + packages/client/tsconfig.json | 9 + packages/plainidx/package.json | 1 + packages/plainidx/src/editor/editor.panels.ts | 39 - .../plainidx/src/editor/editor.renders.ts | 32 - packages/plainidx/src/editor/editor.ts | 33 - .../plainidx/src/editor/editor.workspace.ts | 26 - packages/plainidx/src/exports.ts | 12 +- .../plainidx/src/plugins/plugin/plugin.api.ts | 18 - .../plainidx/src/plugins/plugin/plugin.ts | 146 ++-- packages/plainidx/src/plugins/plugins.ts | 110 ++- .../src/document/document.context.ts | 10 - .../src/document/document.hooks.ts | 57 -- .../src/document/document.provider.tsx | 14 - .../platform-react/src/panels/panels.hooks.ts | 21 - .../src/panels/panels.panel.tsx | 19 - .../src/plaindb/plaindb.context.ts | 11 - .../src/plaindb/plaindb.hooks.ts | 12 - .../src/plaindb/plaindb.provider.tsx | 19 - .../src/workspace/workspace.hooks.ts | 35 - packages/plugin-core/package.json | 11 + packages/plugin-core/src/core.ts | 89 --- packages/plugin-core/src/exports.ts | 3 +- packages/plugin-core/src/manifest.ts | 31 + .../plugin-core/src/migrations/migrations.ts | 12 +- packages/plugin-core/src/plugin.ts | 39 + packages/plugin-markdown/src/exports.ts | 3 +- packages/plugin-markdown/src/manifest.ts | 14 + packages/plugin-markdown/src/markdown.ts | 106 ++- packages/tests/src/documents.test.ts | 40 +- pnpm-lock.yaml | 668 +----------------- tsconfig.json | 6 +- 51 files changed, 409 insertions(+), 1500 deletions(-) delete mode 100644 app/.gitignore delete mode 100644 app/index.html delete mode 100644 app/package.json delete mode 100644 app/src/app.tsx delete mode 100644 app/src/main.tsx delete mode 100644 app/src/vite-env.d.ts delete mode 100644 app/tsconfig.app.json delete mode 100644 app/tsconfig.json delete mode 100644 app/tsconfig.node.json delete mode 100644 app/vite.config.ts rename packages/{platform-react => base}/.gitignore (100%) rename packages/{platform-react => base}/package.json (67%) create mode 100644 packages/base/src/exports.ts create mode 100644 packages/base/src/manifest/manifest.ts rename packages/{platform-react => base}/tsconfig.json (72%) create mode 100644 packages/client/.gitignore create mode 100644 packages/client/package.json create mode 100644 packages/client/src/client/client.ts rename packages/{platform-react => client}/src/exports.ts (100%) create mode 100644 packages/client/src/plugin/plugin.ts create mode 100644 packages/client/tsconfig.json delete mode 100644 packages/plainidx/src/editor/editor.panels.ts delete mode 100644 packages/plainidx/src/editor/editor.renders.ts delete mode 100644 packages/plainidx/src/editor/editor.ts delete mode 100644 packages/plainidx/src/editor/editor.workspace.ts delete mode 100644 packages/plainidx/src/plugins/plugin/plugin.api.ts delete mode 100644 packages/platform-react/src/document/document.context.ts delete mode 100644 packages/platform-react/src/document/document.hooks.ts delete mode 100644 packages/platform-react/src/document/document.provider.tsx delete mode 100644 packages/platform-react/src/panels/panels.hooks.ts delete mode 100644 packages/platform-react/src/panels/panels.panel.tsx delete mode 100644 packages/platform-react/src/plaindb/plaindb.context.ts delete mode 100644 packages/platform-react/src/plaindb/plaindb.hooks.ts delete mode 100644 packages/platform-react/src/plaindb/plaindb.provider.tsx delete mode 100644 packages/platform-react/src/workspace/workspace.hooks.ts delete mode 100644 packages/plugin-core/src/core.ts create mode 100644 packages/plugin-core/src/manifest.ts create mode 100644 packages/plugin-core/src/plugin.ts create mode 100644 packages/plugin-markdown/src/manifest.ts diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/app/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/app/index.html b/app/index.html deleted file mode 100644 index e4b78ea..0000000 --- a/app/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + React + TS - - -
- - - diff --git a/app/package.json b/app/package.json deleted file mode 100644 index 7852b6a..0000000 --- a/app/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "app", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "@plainidx/plainidx": "workspace:*", - "@plainidx/react": "workspace:*", - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "@eslint/js": "^9.15.0", - "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.1", - "@vitejs/plugin-react-swc": "^3.5.0", - "globals": "^15.12.0", - "typescript": "~5.6.2", - "typescript-eslint": "^8.15.0", - "vite": "^6.0.1" - } -} diff --git a/app/src/app.tsx b/app/src/app.tsx deleted file mode 100644 index 884d492..0000000 --- a/app/src/app.tsx +++ /dev/null @@ -1,9 +0,0 @@ -const App = () => { - return ( -
-

Hello World

-
- ); -}; - -export { App }; diff --git a/app/src/main.tsx b/app/src/main.tsx deleted file mode 100644 index d414582..0000000 --- a/app/src/main.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; -import { App } from './app.tsx'; - -const root = document.createElement('div'); -if (!root) { - throw new Error('Root element not found'); -} - -createRoot(root).render( - - - , -); diff --git a/app/src/vite-env.d.ts b/app/src/vite-env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/app/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/app/tsconfig.app.json b/app/tsconfig.app.json deleted file mode 100644 index 358ca9b..0000000 --- a/app/tsconfig.app.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["src"] -} diff --git a/app/tsconfig.json b/app/tsconfig.json deleted file mode 100644 index 1ffef60..0000000 --- a/app/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] -} diff --git a/app/tsconfig.node.json b/app/tsconfig.node.json deleted file mode 100644 index db0becc..0000000 --- a/app/tsconfig.node.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "target": "ES2022", - "lib": ["ES2023"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/app/vite.config.ts b/app/vite.config.ts deleted file mode 100644 index 2328e17..0000000 --- a/app/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react-swc' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/packages/platform-react/.gitignore b/packages/base/.gitignore similarity index 100% rename from packages/platform-react/.gitignore rename to packages/base/.gitignore diff --git a/packages/platform-react/package.json b/packages/base/package.json similarity index 67% rename from packages/platform-react/package.json rename to packages/base/package.json index ab36939..2acf8e2 100644 --- a/packages/platform-react/package.json +++ b/packages/base/package.json @@ -1,5 +1,5 @@ { - "name": "@plainidx/react", + "name": "@plainidx/base", "version": "1.0.0", "type": "module", "main": "dist/exports.js", @@ -11,11 +11,10 @@ }, "devDependencies": { "@plainidx/configs": "workspace:*", - "@types/node": "^22.10.1", - "@types/react": "^19.0.1", "typescript": "^5.7.2" }, "dependencies": { - "@plainidx/plainidx": "workspace:*" + "nanoid": "^5.0.9", + "zod": "^3.24.0" } } diff --git a/packages/base/src/exports.ts b/packages/base/src/exports.ts new file mode 100644 index 0000000..9d1f48b --- /dev/null +++ b/packages/base/src/exports.ts @@ -0,0 +1,8 @@ +export { z } from 'zod'; +export { + type Manifest, + type ManifestBackendAction, + type ManifestBackendActions, + type ManifestBackend, + type ManifestFrontend, +} from './manifest/manifest.js'; diff --git a/packages/base/src/manifest/manifest.ts b/packages/base/src/manifest/manifest.ts new file mode 100644 index 0000000..d7d0610 --- /dev/null +++ b/packages/base/src/manifest/manifest.ts @@ -0,0 +1,36 @@ +import { ZodSchema } from 'zod'; + +type ManifestBackendAction = { + input: ZodSchema; + output: ZodSchema; +}; + +type ManifestBackendActions = Record; + +type ManifestBackend = { + main: string; + actions: ManifestBackendActions; +}; + +type ManifestFrontend = { + main: string; +}; + +type Manifest = { + id: string; + name: string; + version: string; + description?: string; + icon?: string; + config: ZodSchema; + frontend?: ManifestFrontend; + backend?: ManifestBackend; +}; + +export { + type Manifest, + type ManifestBackendAction, + type ManifestBackendActions, + type ManifestBackend, + type ManifestFrontend, +}; diff --git a/packages/platform-react/tsconfig.json b/packages/base/tsconfig.json similarity index 72% rename from packages/platform-react/tsconfig.json rename to packages/base/tsconfig.json index fd5de53..bec448f 100644 --- a/packages/platform-react/tsconfig.json +++ b/packages/base/tsconfig.json @@ -1,8 +1,7 @@ { "extends": "@plainidx/configs/tsconfig.json", "compilerOptions": { - "outDir": "dist", - "jsx": "react" + "outDir": "dist" }, "include": [ "src" diff --git a/packages/client/.gitignore b/packages/client/.gitignore new file mode 100644 index 0000000..b0a5c34 --- /dev/null +++ b/packages/client/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/packages/client/package.json b/packages/client/package.json new file mode 100644 index 0000000..2767b54 --- /dev/null +++ b/packages/client/package.json @@ -0,0 +1,20 @@ +{ + "name": "@plainidx/client", + "version": "1.0.0", + "type": "module", + "main": "dist/exports.js", + "files": [ + "dist" + ], + "scripts": { + "build": "tsc --build" + }, + "devDependencies": { + "@plainidx/configs": "workspace:*", + "typescript": "^5.7.2" + }, + "dependencies": { + "@plainidx/base": "workspace:*", + "nanoid": "^5.0.9" + } +} diff --git a/packages/client/src/client/client.ts b/packages/client/src/client/client.ts new file mode 100644 index 0000000..320f501 --- /dev/null +++ b/packages/client/src/client/client.ts @@ -0,0 +1,20 @@ +import { Manifest } from '@plainidx/base'; +import { Plugin } from '../plugin/plugin.js'; + +type ClientOptions = { + transport: unknown; +}; + +class Client { + #options: ClientOptions; + + constructor(options: ClientOptions) { + this.#options = options; + } + + public getPlugin = (manifest: TManifest) => { + return undefined as unknown as Plugin; + }; +} + +export { Client }; diff --git a/packages/platform-react/src/exports.ts b/packages/client/src/exports.ts similarity index 100% rename from packages/platform-react/src/exports.ts rename to packages/client/src/exports.ts diff --git a/packages/client/src/plugin/plugin.ts b/packages/client/src/plugin/plugin.ts new file mode 100644 index 0000000..039ce30 --- /dev/null +++ b/packages/client/src/plugin/plugin.ts @@ -0,0 +1,14 @@ +import { Manifest, ManifestBackend, z } from '@plainidx/base'; + +type Plugin = { + manifest: TManifest; + actions: TManifest['backend'] extends ManifestBackend + ? { + [TKey in keyof TManifest['backend']['actions']]: ( + input: z.infer, + ) => Promise>; + } + : Record; +}; + +export { Plugin }; diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json new file mode 100644 index 0000000..bec448f --- /dev/null +++ b/packages/client/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@plainidx/configs/tsconfig.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": [ + "src" + ] +} diff --git a/packages/plainidx/package.json b/packages/plainidx/package.json index 08e65e2..1c8a293 100644 --- a/packages/plainidx/package.json +++ b/packages/plainidx/package.json @@ -11,6 +11,7 @@ }, "devDependencies": { "@plainidx/configs": "workspace:*", + "@plainidx/base": "workspace:*", "@types/node": "^22.10.1", "@types/react": "^19.0.1", "typescript": "^5.7.2" diff --git a/packages/plainidx/src/editor/editor.panels.ts b/packages/plainidx/src/editor/editor.panels.ts deleted file mode 100644 index 67cc1d3..0000000 --- a/packages/plainidx/src/editor/editor.panels.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { EventEmitter } from '../utils/eventemitter.js'; - -type EditorPanel = { - name: string; - icon: string; - component: React.ComponentType; -}; - -type EditorPanelsEvents = { - change: () => void; -}; - -class EditorPanels extends EventEmitter { - #panels: Map; - - constructor() { - super(); - this.#panels = new Map(); - } - - public get panels() { - return this.#panels; - } - - public add(id: string, panel: EditorPanel) { - this.#panels.set(id, panel); - this.emit('change'); - return () => { - this.#panels.delete(id); - this.emit('change'); - }; - } - - public get(id: string) { - return this.#panels.get(id); - } -} - -export { EditorPanels }; diff --git a/packages/plainidx/src/editor/editor.renders.ts b/packages/plainidx/src/editor/editor.renders.ts deleted file mode 100644 index 2ddbb9f..0000000 --- a/packages/plainidx/src/editor/editor.renders.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Document } from '../documents/documents.document.js'; -import { EventEmitter } from '../utils/eventemitter.js'; - -type EditorRender = { - supports: (document: Document) => boolean; - name: string; - component: React.ComponentType; -}; - -type EditorRendersEvents = { - change: () => void; -}; - -class EditorRenders extends EventEmitter { - #renders: EditorRender[] = []; - - public add = (render: EditorRender) => { - this.#renders.push(render); - this.emit('change'); - - return () => { - this.#renders = this.#renders.filter((r) => r !== render); - this.emit('change'); - }; - }; - - public getByDocument = (document: Document) => { - return this.#renders.filter((r) => r.supports(document)); - }; -} - -export { EditorRenders }; diff --git a/packages/plainidx/src/editor/editor.ts b/packages/plainidx/src/editor/editor.ts deleted file mode 100644 index 6899a00..0000000 --- a/packages/plainidx/src/editor/editor.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { EventEmitter } from '../utils/eventemitter.js'; -import { EditorPanels } from './editor.panels.js'; -import { EditorRenders } from './editor.renders.js'; -import { EditorWorkspace } from './editor.workspace.js'; - -type EditorEvents = Record; - -class Editor extends EventEmitter { - #workspace: EditorWorkspace; - #renders: EditorRenders; - #panels: EditorPanels; - - constructor() { - super(); - this.#workspace = new EditorWorkspace(); - this.#renders = new EditorRenders(); - this.#panels = new EditorPanels(); - } - - public get workspace() { - return this.#workspace; - } - - public get renders() { - return this.#renders; - } - - public get panels() { - return this.#panels; - } -} - -export { Editor }; diff --git a/packages/plainidx/src/editor/editor.workspace.ts b/packages/plainidx/src/editor/editor.workspace.ts deleted file mode 100644 index 4fffa08..0000000 --- a/packages/plainidx/src/editor/editor.workspace.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Document } from '../documents/documents.document.js'; -import { EventEmitter } from '../utils/eventemitter.js'; - -type WorkspaceEvents = { - change: () => void; -}; - -class EditorWorkspace extends EventEmitter { - #documents: Set = new Set(); - - public get documents() { - return [...this.#documents]; - } - - public openDocument(document: Document) { - this.#documents.add(document); - this.emit('change'); - } - - public closeDocument(document: Document) { - this.#documents.delete(document); - this.emit('change'); - } -} - -export { EditorWorkspace }; diff --git a/packages/plainidx/src/exports.ts b/packages/plainidx/src/exports.ts index a656faa..a86c4ad 100644 --- a/packages/plainidx/src/exports.ts +++ b/packages/plainidx/src/exports.ts @@ -2,11 +2,15 @@ export { PlainDB } from './plainidx/plainidx.js'; export { FileSystem } from './filesystem/filesystem.js'; export { Documents } from './documents/documents.js'; export { Document } from './documents/documents.document.js'; -export { createActionApiRoute } from './plugins/plugin/plugin.api.js'; export { Plugins } from './plugins/plugins.js'; -export { Plugin } from './plugins/plugin/plugin.js'; +export { createPlugin } from './plugins/plugin/plugin.js'; export { Databases, DatabaseMigration } from './databases/databases.js'; +export { + type Manifest, + type ManifestBackendAction, + type ManifestBackendActions, + type ManifestBackend, + type ManifestFrontend, +} from '@plainidx/base'; export * from 'zod'; export { type Knex as Database } from 'knex'; -export { Editor } from './editor/editor.js'; -export { EditorWorkspace } from './editor/editor.workspace.js'; diff --git a/packages/plainidx/src/plugins/plugin/plugin.api.ts b/packages/plainidx/src/plugins/plugin/plugin.api.ts deleted file mode 100644 index e159d13..0000000 --- a/packages/plainidx/src/plugins/plugin/plugin.api.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { z, ZodSchema } from 'zod'; - -type PluginActionApi = Record< - string, - { - input?: ZodSchema; - output?: ZodSchema; - handle?: (input: any) => Promise; - } ->; - -const createActionApiRoute = (options: { - input?: TInput; - output?: TOutput; - handle?: (input: z.infer) => Promise>; -}) => options satisfies PluginActionApi[string]; - -export { type PluginActionApi, createActionApiRoute }; diff --git a/packages/plainidx/src/plugins/plugin/plugin.ts b/packages/plainidx/src/plugins/plugin/plugin.ts index dba7cca..f77bd4d 100644 --- a/packages/plainidx/src/plugins/plugin/plugin.ts +++ b/packages/plainidx/src/plugins/plugin/plugin.ts @@ -1,110 +1,50 @@ +import { z } from 'zod'; import { Document, Documents } from '../../documents/documents.js'; -import { DatabaseMigration, Databases } from '../../databases/databases.js'; -import { EventEmitter } from '../../utils/eventemitter.js'; -import { Plugins } from '../plugins.js'; -import { z, ZodSchema } from 'zod'; -import { PluginActionApi } from './plugin.api.js'; -import { Editor } from '../../editor/editor.js'; +import { DatabaseMigration } from '../../databases/databases.js'; +import { Knex } from 'knex'; +import { Manifest, ManifestBackend } from '@plainidx/base'; -type PluginOptions = { - plugins: Plugins; +type Plugin = TManifest['backend'] extends ManifestBackend + ? { + backend: true; + manifest: TManifest; + actions: { + [TKey in keyof TManifest['backend']['actions']]: ( + input: z.infer, + ) => Promise>; + }; + process?: (document: Document) => Promise; + load?: () => Promise; + unload?: () => Promise; + } + : { + backend: false; + manifest: TManifest; + }; + +type PluginFactoryOptions = { + config: z.infer; documents: Documents; - databases: Databases; - configs: { - local?: TLocalConfig; - shared?: TSharedConfig; - }; + getPlugin: (manifest: TManifest) => Promise>; + getDb: (name: string, migrations: DatabaseMigration[]) => Promise; }; -type PluginEvents = { - configChange: (config: unknown) => void; -}; +type BackendPluginFactory = (( + options: PluginFactoryOptions, +) => Plugin) & { manifest: TManifest }; -abstract class Plugin< - TLocalConfig extends ZodSchema = ZodSchema, - TSharedConfig extends ZodSchema = ZodSchema, - TActions extends PluginActionApi = PluginActionApi, -> extends EventEmitter { - #options: PluginOptions; +const createPlugin = ( + manifest: TManifest, + implementation: (options: PluginFactoryOptions) => Omit, 'manifest' | 'backend'>, +): BackendPluginFactory => + Object.assign( + (options: PluginFactoryOptions): Plugin => + ({ + ...implementation(options), + manifest, + backend: !!manifest.backend, + }) as Plugin, + { manifest }, + ); - constructor(options: PluginOptions) { - super(); - this.#options = options; - } - - public get documents(): Documents { - return this.#options.documents; - } - - public readonly configSchemas?: { - local?: TLocalConfig; - shared?: TSharedConfig; - }; - - public getDB = async (name: string, migrations: DatabaseMigration[]) => { - const { databases } = this.#options; - const scopedName = `plugins:${this.name}:${name}`; - return databases.get({ name: scopedName, migrations }); - }; - - public get configs(): { - local?: z.infer; - shared?: z.infer; - } { - return this.#options.configs; - } - - public setConfigs = async (configs: { local?: z.infer; shared?: z.infer }) => { - this.#options.configs = configs; - await this.emit('configChange', configs); - }; - - public abstract readonly name: string; - public actions?: TActions; - public onLoad?: () => Promise; - public onUnload?: () => Promise; - public onLoaded?: () => Promise; - public process?: (document: Document) => Promise; - public setupUI?: (editor: Editor) => Promise; - - /*public getPlugin = async (plugin: new (...args: any) => T): Promise< - T['api'] extends (...args: any[]) => infer R ? R : never - > => { - const { plugins } = this.#options; - const instance = await plugins.get(plugin); - return instance.api?.() as any; - }*/ - - public action = async , TAction extends keyof TPlugin['actions']>( - plugin: new (...args: any[]) => TPlugin, - action: TAction, - input: Exclude[TAction]['input'], undefined> extends ZodSchema - ? z.infer[TAction]['input'], undefined>> - : undefined, - ): Promise< - Exclude[TAction]['output'], undefined> extends ZodSchema - ? z.infer[TAction]['output'], undefined>> - : undefined - > => { - const { plugins } = this.#options; - const instance = await plugins.get(plugin); - const { actions } = instance; - if (!actions) { - throw new Error(`Plugin ${plugin.name} does not have actions`); - } - const actionDef = actions[action]; - if (!actionDef) { - throw new Error(`Plugin ${plugin.name} does not have action ${String(action)}`); - } - actionDef.input?.parse(input); - return (await actionDef.handle?.(input)) as any; - }; -} - -type PluginConstructor< - TLocalConfig extends ZodSchema = ZodSchema, - TSharedConfig extends ZodSchema = ZodSchema, - T extends Plugin = Plugin, -> = new (options: PluginOptions) => T; - -export { Plugin, type PluginOptions, type PluginConstructor }; +export { type Plugin, type BackendPluginFactory as PluginFactory, createPlugin }; diff --git a/packages/plainidx/src/plugins/plugins.ts b/packages/plainidx/src/plugins/plugins.ts index eb7dfde..c7cbce0 100644 --- a/packages/plainidx/src/plugins/plugins.ts +++ b/packages/plainidx/src/plugins/plugins.ts @@ -1,9 +1,8 @@ import { Document } from '../documents/documents.document.js'; import { Documents } from '../documents/documents.js'; import { Databases } from '../databases/databases.js'; -import { Plugin, PluginConstructor } from './plugin/plugin.js'; -import { z, ZodSchema } from 'zod'; -import { Editor } from '../editor/editor.js'; +import { Plugin, PluginFactory } from './plugin/plugin.js'; +import { Manifest } from '@plainidx/base'; type PluginsOptions = { documents: Documents; @@ -12,7 +11,7 @@ type PluginsOptions = { class Plugins { #options: PluginsOptions; - #plugins: Map; + #plugins: Map>; constructor(options: PluginsOptions) { this.#options = options; @@ -22,35 +21,20 @@ class Plugins { #onSave = async (document: Document) => { for (const plugin of this.#plugins.values()) { - await plugin.process?.(document); + if (plugin.backend) { + await plugin?.process?.(document); + } } }; - #load = async (plugins: Plugin[]) => { - await Promise.all(plugins.map((plugin) => plugin.onLoad?.())); - plugins.forEach((plugin) => plugin.onLoaded?.()); - }; - - #saveConfig = async (plugin: Plugin) => { - const document = await this.#options.documents.get(`.db/plugins/${plugin.name}/config.json`); - document.data = Buffer.from(JSON.stringify(plugin.configs)); - await document.save(); - }; - - public setupUI = (editor: Editor) => { - for (const plugin of this.#plugins.values()) { - plugin.setupUI?.(editor); + public get = async (manifest: TManifest): Promise> => { + if (!this.#plugins.has(manifest.id)) { + throw new Error(`Plugin ${manifest.id} is not loaded`); } + return this.#plugins.get(manifest.id) as Plugin; }; - public get = async (plugin: PluginConstructor): Promise => { - if (!this.#plugins.has(plugin)) { - await this.add([plugin]); - } - return this.#plugins.get(plugin) as T; - }; - - public add = async (plugins: PluginConstructor[]) => { + public add = async (plugins: PluginFactory[]) => { const { documents, databases } = this.#options; const configs = await Promise.all( plugins.map(async (plugin) => { @@ -58,58 +42,52 @@ class Plugins { return JSON.parse(document.data.toString() || '{}'); }), ); - const instances = plugins.map( - (Plugin, i) => - new Plugin({ - plugins: this, + const instances = await Promise.all( + plugins.map(async (plugin, i) => { + const instance = plugin({ + config: configs[i], documents, - databases, - configs: configs[i], - }), + getPlugin: this.get, + getDb: async (name, migrations) => { + return databases.get({ + name: `plugins/${plugin.manifest.id}/${name}`, + migrations, + }); + }, + }); + return instance as Plugin; + }), ); - await this.#load(instances); - for (let i = 0; i < plugins.length; i++) { - const instance = instances[i]; - const plugin = plugins[i]; - instance.on('configChange', this.#saveConfig.bind(null, instance)); - this.#plugins.set(plugin, instance); + for (const instance of instances) { + this.#plugins.set(instance.manifest.id, instance); } + await Promise.all( + instances.map(async (instance) => { + if ('load' in instance) { + await instance.load?.(); + } + }), + ); }; public process = async (document: Document) => { for (const plugin of this.#plugins.values()) { - await plugin.process?.(document); + if (plugin.backend) { + await plugin?.process?.(document); + } } }; public unload = async () => { - await Promise.all(this.#plugins.values().map((plugin) => plugin.onUnload?.())); + await Promise.all( + this.#plugins.values().map((plugin) => { + if (plugin.backend) { + return plugin.unload?.(); + } + }), + ); this.#plugins = new Map(); }; - - public action = async , TAction extends keyof TPlugin['actions']>( - plugin: new (...args: any[]) => TPlugin, - action: TAction, - input: Exclude[TAction]['input'], undefined> extends ZodSchema - ? z.infer[TAction]['input'], undefined>> - : undefined, - ): Promise< - Exclude[TAction]['output'], undefined> extends ZodSchema - ? z.infer[TAction]['output'], undefined>> - : undefined - > => { - const instance = await this.get(plugin); - const { actions } = instance; - if (!actions) { - throw new Error(`Plugin ${plugin.name} does not have actions`); - } - const actionDef = actions[action]; - if (!actionDef) { - throw new Error(`Plugin ${plugin.name} does not have action ${String(action)}`); - } - actionDef.input?.parse(input); - return actionDef.handle?.(input) as any; - }; } export { Plugins }; diff --git a/packages/platform-react/src/document/document.context.ts b/packages/platform-react/src/document/document.context.ts deleted file mode 100644 index 08e282a..0000000 --- a/packages/platform-react/src/document/document.context.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Document } from '@plainidx/plainidx'; -import React from 'react'; - -type DocumentContextType = { - document: Document; -}; - -const DocumentContext = React.createContext(undefined); - -export { DocumentContext }; diff --git a/packages/platform-react/src/document/document.hooks.ts b/packages/platform-react/src/document/document.hooks.ts deleted file mode 100644 index 0b43678..0000000 --- a/packages/platform-react/src/document/document.hooks.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { useCallback, useContext, useEffect, useState } from 'react'; -import { DocumentContext } from './document.context.js'; -import { usePlainDB } from '../plaindb/plaindb.hooks.js'; - -const useDocument = () => { - const context = useContext(DocumentContext); - if (!context) { - throw new Error('useDocument must be used within a DocumentProvider'); - } - - return context.document; -}; - -const useDocumentRenders = () => { - const { editor } = usePlainDB(); - const document = useDocument(); - - const [current, setCurrent] = useState(editor.renders.getByDocument(document)); - - useEffect(() => { - const listen = () => { - setCurrent(editor.renders.getByDocument(document)); - }; - editor.renders.on('change', listen); - return () => { - editor.renders.off('change', listen); - }; - }, [editor.renders, document, setCurrent]); - - return current; -}; - -const useDocumentValue = () => { - const document = useDocument(); - const [current, setCurrent] = useState(document.data); - - const setValue = useCallback( - (newValue: Buffer) => { - document.data = newValue; - }, - [document], - ); - - useEffect(() => { - const listen = () => { - setCurrent(document.data); - }; - document.on('change', listen); - return () => { - document.off('change', listen); - }; - }, [document, setCurrent]); - - return [current, setValue] as const; -}; - -export { useDocument, useDocumentValue, useDocumentRenders }; diff --git a/packages/platform-react/src/document/document.provider.tsx b/packages/platform-react/src/document/document.provider.tsx deleted file mode 100644 index 5b81575..0000000 --- a/packages/platform-react/src/document/document.provider.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; -import { Document } from '@plainidx/plainidx'; -import { DocumentContext } from './document.context.js'; - -type DocumentProviderProps = { - document: Document; - children: React.ReactNode; -}; - -const DocumentProvider = ({ document, children }: DocumentProviderProps) => { - return {children}; -}; - -export { DocumentProvider }; diff --git a/packages/platform-react/src/panels/panels.hooks.ts b/packages/platform-react/src/panels/panels.hooks.ts deleted file mode 100644 index 0eb5879..0000000 --- a/packages/platform-react/src/panels/panels.hooks.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useEffect, useState } from 'react'; -import { usePlainDB } from '../plaindb/plaindb.hooks.js'; - -const usePanel = (id: string) => { - const { editor } = usePlainDB(); - const [panel, setPanel] = useState(editor.panels.get(id)); - - useEffect(() => { - const update = () => { - setPanel(editor.panels.get(id)); - }; - editor.panels.on('change', update); - return () => { - editor.panels.off('change', update); - }; - }, [editor, id]); - - return panel; -}; - -export { usePanel }; diff --git a/packages/platform-react/src/panels/panels.panel.tsx b/packages/platform-react/src/panels/panels.panel.tsx deleted file mode 100644 index c0ba0a6..0000000 --- a/packages/platform-react/src/panels/panels.panel.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import { usePanel } from './panels.hooks.js'; - -type PanelProps = { - id: string; -}; - -const Panel = ({ id }: PanelProps) => { - const panel = usePanel(id); - - if (!panel) { - return null; - } - - const Component = panel.component; - return ; -}; - -export { Panel }; diff --git a/packages/platform-react/src/plaindb/plaindb.context.ts b/packages/platform-react/src/plaindb/plaindb.context.ts deleted file mode 100644 index 52f8252..0000000 --- a/packages/platform-react/src/plaindb/plaindb.context.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Editor, PlainDB } from '@plainidx/plainidx'; -import React from 'react'; - -type PlainDBContextType = { - db: PlainDB; - editor: Editor; -}; - -const PlainDBContext = React.createContext(undefined); - -export { PlainDBContext }; diff --git a/packages/platform-react/src/plaindb/plaindb.hooks.ts b/packages/platform-react/src/plaindb/plaindb.hooks.ts deleted file mode 100644 index fb8f0bf..0000000 --- a/packages/platform-react/src/plaindb/plaindb.hooks.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { useContext } from 'react'; -import { PlainDBContext } from './plaindb.context.js'; - -const usePlainDB = () => { - const context = useContext(PlainDBContext); - if (context === undefined) { - throw new Error('usePlainDB must be used within a PlainDBProvider'); - } - return context; -}; - -export { usePlainDB }; diff --git a/packages/platform-react/src/plaindb/plaindb.provider.tsx b/packages/platform-react/src/plaindb/plaindb.provider.tsx deleted file mode 100644 index 3989db1..0000000 --- a/packages/platform-react/src/plaindb/plaindb.provider.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React, { useMemo } from 'react'; -import { Editor, PlainDB } from '@plainidx/plainidx'; -import { PlainDBContext } from './plaindb.context.js'; - -type PlainDBProviderProps = { - children: React.ReactNode; - db: PlainDB; -}; - -const PlainDBProvider = ({ children, db }: PlainDBProviderProps) => { - const editor = useMemo(() => { - const next = new Editor(); - db.plugins.setupUI(editor); - return next; - }, [db]); - return {children}; -}; - -export { PlainDBProvider }; diff --git a/packages/platform-react/src/workspace/workspace.hooks.ts b/packages/platform-react/src/workspace/workspace.hooks.ts deleted file mode 100644 index ecf80d6..0000000 --- a/packages/platform-react/src/workspace/workspace.hooks.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { useCallback, useEffect, useState } from 'react'; -import { usePlainDB } from '../plaindb/plaindb.hooks.js'; - -const useOpenDocument = () => { - const { editor, db } = usePlainDB(); - const open = useCallback( - async (location: string) => { - const document = await db.documents.get(location); - editor.workspace.openDocument(document); - }, - [editor, db], - ); - - return open; -}; - -const useDocuments = () => { - const { editor } = usePlainDB(); - const [documents, setDocuments] = useState(editor.workspace.documents); - - useEffect(() => { - const update = () => { - setDocuments(editor.workspace.documents); - }; - - editor.workspace.on('change', update); - return () => { - editor.workspace.off('change', update); - }; - }); - - return documents; -}; - -export { useOpenDocument, useDocuments }; diff --git a/packages/plugin-core/package.json b/packages/plugin-core/package.json index 4a1b0de..a86de48 100644 --- a/packages/plugin-core/package.json +++ b/packages/plugin-core/package.json @@ -6,6 +6,17 @@ "files": [ "dist" ], + "exports": { + ".": { + "import": "./dist/exports.js" + }, + "./manifest": { + "import": "./dist/manifest.js" + }, + "./plugin": { + "import": "./dist/plugin.js" + } + }, "scripts": { "build": "tsc --build" }, diff --git a/packages/plugin-core/src/core.ts b/packages/plugin-core/src/core.ts deleted file mode 100644 index 02a6e80..0000000 --- a/packages/plugin-core/src/core.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { createActionApiRoute, type Database, Plugin, z } from '@plainidx/plainidx'; -import { migrations } from './migrations/migrations.js'; - -class CorePlugin extends Plugin { - #db?: Promise; - - public readonly name = '@builtin/core'; - - public actions = { - setTags: createActionApiRoute({ - input: z.object({ - document: z.string(), - tags: z.array(z.string()), - }), - output: z.undefined(), - handle: async ({ document, tags }) => { - await this.setTags(document, tags); - return undefined; - }, - }), - getTags: createActionApiRoute({ - output: z.array( - z.object({ - name: z.string(), - count: z.number(), - }), - ), - handle: async () => { - return this.getTags(); - }, - }), - setTitle: createActionApiRoute({ - input: z.object({ - document: z.string(), - title: z.string(), - }), - output: z.undefined(), - handle: async ({ document, title }) => { - await this.setTitle(document, title); - return undefined; - }, - }), - getTitles: createActionApiRoute({ - output: z.array( - z.object({ - document: z.string(), - title: z.string(), - }), - ), - handle: async () => { - return this.getTitles(); - }, - }), - }; - - #getDatabase = async () => { - if (!this.#db) { - this.#db = this.getDB('data', migrations); - } - return this.#db; - }; - - public getTags = async () => { - const db = await this.#getDatabase(); - return db('tags') - .select([db.raw('tag as name'), db.raw('count(document) as count')]) - .groupBy('tag'); - }; - - public setTags = async (document: string, tags: string[]) => { - const db = await this.#getDatabase(); - await db('tags').where({ document }).delete(); - if (tags.length) { - await db('tags').insert(tags.map((tag) => ({ tag, document }))); - } - }; - - public setTitle = async (document: string, title: string) => { - const db = await this.#getDatabase(); - await db('titles').where({ document }).insert({ document, title }).onConflict('document').merge(); - }; - - public getTitles = async () => { - const db = await this.#getDatabase(); - return await db('titles').select('*'); - }; -} - -export { CorePlugin }; diff --git a/packages/plugin-core/src/exports.ts b/packages/plugin-core/src/exports.ts index 201d42f..ead6614 100644 --- a/packages/plugin-core/src/exports.ts +++ b/packages/plugin-core/src/exports.ts @@ -1 +1,2 @@ -export { CorePlugin } from './core.js'; +export { core } from './plugin.js'; +export { CorePlugin } from './manifest.js'; diff --git a/packages/plugin-core/src/manifest.ts b/packages/plugin-core/src/manifest.ts new file mode 100644 index 0000000..94ad0bf --- /dev/null +++ b/packages/plugin-core/src/manifest.ts @@ -0,0 +1,31 @@ +import { Manifest, z } from '@plainidx/plainidx'; + +const CorePlugin = { + id: 'buildin-core', + name: 'Core Plugin', + version: '0.0.1', + config: z.any(), + backend: { + main: './dist/plugin.js', + actions: { + getTitles: { + input: z.object({}), + output: z.array(z.object({ location: z.string(), title: z.string() })), + }, + getTags: { + input: z.object({}), + output: z.array(z.string()), + }, + setData: { + input: z.object({ + location: z.string(), + title: z.string(), + tags: z.array(z.string()), + }), + output: z.any(), + }, + }, + }, +} satisfies Manifest; + +export { CorePlugin }; diff --git a/packages/plugin-core/src/migrations/migrations.ts b/packages/plugin-core/src/migrations/migrations.ts index 2a70080..04be340 100644 --- a/packages/plugin-core/src/migrations/migrations.ts +++ b/packages/plugin-core/src/migrations/migrations.ts @@ -5,15 +5,15 @@ const migrations: DatabaseMigration[] = [ name: 'init', up: async (db) => { await db.schema.createTable('tags', (table) => { - table.string('tag').notNullable(); - table.string('document').notNullable(); - table.primary(['tag', 'document']); - table.index('document'); - table.index('tag'); + table.string('name').notNullable(); + table.string('location').notNullable(); + table.primary(['name', 'location']); + table.index('location'); + table.index('name'); }); await db.schema.createTable('titles', (table) => { - table.string('document').primary().notNullable(); + table.string('location').primary().notNullable(); table.string('title').notNullable(); }); }, diff --git a/packages/plugin-core/src/plugin.ts b/packages/plugin-core/src/plugin.ts new file mode 100644 index 0000000..c014512 --- /dev/null +++ b/packages/plugin-core/src/plugin.ts @@ -0,0 +1,39 @@ +import { createPlugin } from '@plainidx/plainidx'; +import { CorePlugin } from './manifest.js'; +import { migrations } from './migrations/migrations.js'; + +const core = createPlugin(CorePlugin, ({ getDb }) => { + const dbPromise = getDb('data', migrations); + return { + backend: true, + actions: { + getTitles: async () => { + const db = await dbPromise; + const results = await db('titles').select(['location', 'title']); + return results; + }, + getTags: async () => { + const db = await dbPromise; + const results = await db('tags') + .select(['name', db.raw('count(*) as count')]) + .groupBy('name'); + return results; + }, + setData: async ({ location, title, tags }) => { + const db = await dbPromise; + const currentTitle = await db('titles').select('title').where({ location }).first(); + await db.transaction(async (trx) => { + await trx('tags').delete().where({ location }); + await trx('tags').insert(tags.map((tag) => ({ name: tag, location }))); + if (currentTitle) { + await trx('titles').update({ title }).where({ location }); + } else { + await trx('titles').insert({ location, title }); + } + }); + }, + }, + }; +}); + +export { core }; diff --git a/packages/plugin-markdown/src/exports.ts b/packages/plugin-markdown/src/exports.ts index fd99e7e..95799e0 100644 --- a/packages/plugin-markdown/src/exports.ts +++ b/packages/plugin-markdown/src/exports.ts @@ -1 +1,2 @@ -export { MarkdownPlugin } from './markdown.js'; +export { markdownPlugin } from './markdown.js'; +export { MarkdownPlugin } from './manifest.js'; diff --git a/packages/plugin-markdown/src/manifest.ts b/packages/plugin-markdown/src/manifest.ts new file mode 100644 index 0000000..5170809 --- /dev/null +++ b/packages/plugin-markdown/src/manifest.ts @@ -0,0 +1,14 @@ +import { Manifest, z } from '@plainidx/plainidx'; + +const MarkdownPlugin = { + id: 'markdown', + name: 'Markdown Plugin', + version: '0.0.1', + config: z.any(), + backend: { + main: './dist/plugin.js', + actions: {}, + }, +} satisfies Manifest; + +export { MarkdownPlugin }; diff --git a/packages/plugin-markdown/src/markdown.ts b/packages/plugin-markdown/src/markdown.ts index 42b0cca..70b39d7 100644 --- a/packages/plugin-markdown/src/markdown.ts +++ b/packages/plugin-markdown/src/markdown.ts @@ -1,71 +1,59 @@ -import { createActionApiRoute, Document, Plugin, z } from '@plainidx/plainidx'; -import { MarkdownAst } from './utils/markdown-ast.js'; import { CorePlugin } from '@plainidx/plugin-core'; +import { MarkdownPlugin } from './manifest.js'; +import { MarkdownAst } from './utils/markdown-ast.js'; +import { createPlugin } from '@plainidx/plainidx'; type MarkdownSubPlugin = { process: (ast: MarkdownAst) => Promise; }; -class MarkdownPlugin extends Plugin { - #subPlugins = new Set(); - - public readonly name = '@builtin/markdown'; - - public actions = { - register: createActionApiRoute({ - input: z.object({ - plugin: z.custom(), - }), - handle: async ({ plugin }) => { - this.#subPlugins.add(plugin); - }, - }), - }; - - public process = async (document: Document) => { - if (!document.location.endsWith('.md')) { - return; - } - const ast = new MarkdownAst(document.data); - - for (const plugin of this.#subPlugins) { - await plugin.process(ast); - } - - const tags: string[] = []; - let topHead = Number.MAX_SAFE_INTEGER; - let title = 'Untitles'; - - ast.visit((node) => { - if (node.type !== 'heading') { +const markdownPlugin = createPlugin(MarkdownPlugin, ({ getPlugin }) => { + const plugins: MarkdownSubPlugin[] = []; + return { + actions: {}, + process: async (document) => { + const core = await getPlugin(CorePlugin); + if (!document.location.endsWith('.md')) { return; } - if (node.depth === undefined) { - return; - } - if (node.depth < topHead) { - topHead = node.depth; - title = ast.nodeToString(node.children); - } - }); + const ast = new MarkdownAst(document.data); - await this.action(CorePlugin, 'setTitle', { - title, - document: document.location, - }); - - ast.visit((node) => { - if (node.type === 'textDirective' && node.name === 'tag') { - const body = ast.nodeToString(node.children); - tags.push(body); + for (const plugin of plugins) { + await plugin.process(ast); } - }); - document.replace(ast.toBuffer()); - await this.action(CorePlugin, 'setTags', { - tags, - document: document.location, - }); + + const tags: string[] = []; + let topHead = Number.MAX_SAFE_INTEGER; + let title = 'Untitles'; + + ast.visit((node) => { + if (node.type !== 'heading') { + return; + } + if (node.depth === undefined) { + return; + } + if (node.depth < topHead) { + topHead = node.depth; + title = ast.nodeToString(node.children); + } + }); + + ast.visit((node) => { + if (node.type === 'textDirective' && node.name === 'tag') { + const body = ast.nodeToString(node.children); + tags.push(body); + } + }); + document.replace(ast.toBuffer()); + + await core.actions.setData({ + location: document.location, + title, + tags, + }); + }, }; -} +}); -export { MarkdownPlugin }; +export { markdownPlugin }; diff --git a/packages/tests/src/documents.test.ts b/packages/tests/src/documents.test.ts index e72ed67..94fb8d3 100644 --- a/packages/tests/src/documents.test.ts +++ b/packages/tests/src/documents.test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'vitest'; -import { CorePlugin } from '@plainidx/plugin-core'; -import { MarkdownPlugin } from '@plainidx/plugin-markdown'; +import { core, CorePlugin } from '@plainidx/plugin-core'; import { PlainDB } from '../../plainidx/dist/exports.js'; import { MemoryFileSystem } from '@plainidx/fs-memory'; +import { markdownPlugin } from '@plainidx/plugin-markdown'; describe('documents', () => { it('should be able to create a document', async () => { @@ -19,34 +19,24 @@ describe('documents', () => { }), }); - await plugins.add([MarkdownPlugin]); + await plugins.add([core, markdownPlugin]); - const tags1 = await plugins.action(CorePlugin, 'getTags', undefined); + const plugin = await plugins.get(CorePlugin); - console.log('Done', tags1); + { + const tags = await plugin.actions.getTags({}); + console.log(tags); + } - const demoDocument = await documents.get('hello/world.md'); + const document = await documents.get('foo/bar.md'); - demoDocument.data = Buffer.from(` -# Hello World + document.data = Buffer.from(['# Hello World', '', ':tag[test]'].join('\n')); -:tag[hello] -`); - - await demoDocument.save(); - - const tags2 = await plugins.action(CorePlugin, 'getTags', undefined); - console.log('Done', tags2); - - demoDocument.data = Buffer.from(` -# Hello World - -:tag[world] -`); - await demoDocument.save(); - - const tags3 = await plugins.action(CorePlugin, 'getTags', undefined); - console.log('Done', tags3); + await document.save(); + { + const tags = await plugin.actions.getTags({}); + console.log(tags); + } await close(); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07a3a12..7386c6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,45 +48,37 @@ importers: specifier: ^2.1.8 version: 2.1.8(@types/node@22.10.1) - app: + packages/base: dependencies: - '@plainidx/plainidx': - specifier: workspace:* - version: link:../packages/plainidx - '@plainidx/react': - specifier: workspace:* - version: link:../packages/platform-react - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + nanoid: + specifier: ^5.0.9 + version: 5.0.9 + zod: + specifier: ^3.24.0 + version: 3.24.0 devDependencies: - '@eslint/js': - specifier: ^9.15.0 - version: 9.16.0 - '@types/react': - specifier: ^18.3.12 - version: 18.3.15 - '@types/react-dom': - specifier: ^18.3.1 - version: 18.3.3(@types/react@18.3.15) - '@vitejs/plugin-react-swc': - specifier: ^3.5.0 - version: 3.7.2(vite@6.0.3(@types/node@22.10.1)) - globals: - specifier: ^15.12.0 - version: 15.13.0 + '@plainidx/configs': + specifier: workspace:* + version: link:../configs typescript: - specifier: ~5.6.2 - version: 5.6.3 - typescript-eslint: - specifier: ^8.15.0 - version: 8.18.0(eslint@9.16.0)(typescript@5.6.3) - vite: - specifier: ^6.0.1 - version: 6.0.3(@types/node@22.10.1) + specifier: ^5.7.2 + version: 5.7.2 + + packages/client: + dependencies: + '@plainidx/base': + specifier: workspace:* + version: link:../base + nanoid: + specifier: ^5.0.9 + version: 5.0.9 + devDependencies: + '@plainidx/configs': + specifier: workspace:* + version: link:../configs + typescript: + specifier: ^5.7.2 + version: 5.7.2 packages/configs: {} @@ -137,25 +129,9 @@ importers: specifier: ^3.24.0 version: 3.24.0 devDependencies: - '@plainidx/configs': + '@plainidx/base': specifier: workspace:* - version: link:../configs - '@types/node': - specifier: ^22.10.1 - version: 22.10.1 - '@types/react': - specifier: ^19.0.1 - version: 19.0.1 - typescript: - specifier: ^5.7.2 - version: 5.7.2 - - packages/platform-react: - dependencies: - '@plainidx/plainidx': - specifier: workspace:* - version: link:../plainidx - devDependencies: + version: link:../base '@plainidx/configs': specifier: workspace:* version: link:../configs @@ -347,282 +323,138 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -986,81 +818,6 @@ packages: cpu: [x64] os: [win32] - '@swc/core-darwin-arm64@1.10.1': - resolution: {integrity: sha512-NyELPp8EsVZtxH/mEqvzSyWpfPJ1lugpTQcSlMduZLj1EASLO4sC8wt8hmL1aizRlsbjCX+r0PyL+l0xQ64/6Q==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - - '@swc/core-darwin-x64@1.10.1': - resolution: {integrity: sha512-L4BNt1fdQ5ZZhAk5qoDfUnXRabDOXKnXBxMDJ+PWLSxOGBbWE6aJTnu4zbGjJvtot0KM46m2LPAPY8ttknqaZA==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-linux-arm-gnueabihf@1.10.1': - resolution: {integrity: sha512-Y1u9OqCHgvVp2tYQAJ7hcU9qO5brDMIrA5R31rwWQIAKDkJKtv3IlTHF0hrbWk1wPR0ZdngkQSJZple7G+Grvw==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.10.1': - resolution: {integrity: sha512-tNQHO/UKdtnqjc7o04iRXng1wTUXPgVd8Y6LI4qIbHVoVPwksZydISjMcilKNLKIwOoUQAkxyJ16SlOAeADzhQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-musl@1.10.1': - resolution: {integrity: sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-x64-gnu@1.10.1': - resolution: {integrity: sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.10.1': - resolution: {integrity: sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.10.1': - resolution: {integrity: sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.10.1': - resolution: {integrity: sha512-WalYdFoU3454Og+sDKHM1MrjvxUGwA2oralknXkXL8S0I/8RkWZOB++p3pLaGbTvOO++T+6znFbQdR8KRaa7DA==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.10.1': - resolution: {integrity: sha512-JWobfQDbTnoqaIwPKQ3DVSywihVXlQMbDuwik/dDWlj33A8oEHcjPOGs4OqcA3RHv24i+lfCQpM3Mn4FAMfacA==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.10.1': - resolution: {integrity: sha512-rQ4dS6GAdmtzKiCRt3LFVxl37FaY1cgL9kSUTnhQ2xc3fmHOd7jdJK/V4pSZMG1ruGTd0bsi34O2R0Olg9Zo/w==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': '*' - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/types@0.1.17': - resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} - '@tootallnate/once@1.1.2': resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -1092,17 +849,6 @@ packages: '@types/node@22.10.1': resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - - '@types/react-dom@18.3.3': - resolution: {integrity: sha512-uTYkxTLkYp41nq/ULXyXMtkNT1vu5fXJoqad6uTNCOGat5t9cLgF4vMNLBXsTOXpdOI44XzKPY1M5RRm0bQHuw==} - peerDependencies: - '@types/react': ^18.0.0 - - '@types/react@18.3.15': - resolution: {integrity: sha512-XQzbwkCwrsabawgWsvDDwsDTRuH1sf6Uj1fnFYoG03ZXfT54/aBvlylKR9ix70pXAtTn8dFzj358zVcZN4m83w==} - '@types/react@19.0.1': resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} @@ -1162,11 +908,6 @@ packages: resolution: {integrity: sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-react-swc@3.7.2': - resolution: {integrity: sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==} - peerDependencies: - vite: ^4 || ^5 || ^6 - '@vitest/coverage-v8@2.1.8': resolution: {integrity: sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==} peerDependencies: @@ -1540,11 +1281,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1761,10 +1497,6 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.13.0: - resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} - engines: {node: '>=18'} - graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -2033,10 +1765,6 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - loupe@3.1.2: resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} @@ -2530,15 +2258,6 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - read-ini-file@4.0.0: resolution: {integrity: sha512-zz4qv/sKETv7nAkATqSJ9YMbKD8NXRPuA8d17VdYCuNYrVstB1S6UAMU6aytf5vRa9MESbZN7jLZdcmrOxz4gg==} engines: {node: '>=14.6'} @@ -2632,9 +2351,6 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -2886,11 +2602,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -3006,46 +2717,6 @@ packages: terser: optional: true - vite@6.0.3: - resolution: {integrity: sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vitest@2.1.8: resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3163,144 +2834,72 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.24.0': - optional: true - '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.24.0': - optional: true - '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.24.0': - optional: true - '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.24.0': - optional: true - '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.24.0': - optional: true - '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.24.0': - optional: true - '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.24.0': - optional: true - '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.24.0': - optional: true - '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.24.0': - optional: true - '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.24.0': - optional: true - '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.24.0': - optional: true - '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.24.0': - optional: true - '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.24.0': - optional: true - '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.24.0': - optional: true - '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.24.0': - optional: true - '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.24.0': - optional: true - '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.24.0': - optional: true - '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.24.0': - optional: true - - '@esbuild/openbsd-arm64@0.24.0': - optional: true - '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.24.0': - optional: true - '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.24.0': - optional: true - '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.24.0': - optional: true - '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.24.0': - optional: true - '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.24.0': - optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0)': dependencies: eslint: 9.16.0 @@ -3719,58 +3318,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.28.1': optional: true - '@swc/core-darwin-arm64@1.10.1': - optional: true - - '@swc/core-darwin-x64@1.10.1': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.10.1': - optional: true - - '@swc/core-linux-arm64-gnu@1.10.1': - optional: true - - '@swc/core-linux-arm64-musl@1.10.1': - optional: true - - '@swc/core-linux-x64-gnu@1.10.1': - optional: true - - '@swc/core-linux-x64-musl@1.10.1': - optional: true - - '@swc/core-win32-arm64-msvc@1.10.1': - optional: true - - '@swc/core-win32-ia32-msvc@1.10.1': - optional: true - - '@swc/core-win32-x64-msvc@1.10.1': - optional: true - - '@swc/core@1.10.1': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.17 - optionalDependencies: - '@swc/core-darwin-arm64': 1.10.1 - '@swc/core-darwin-x64': 1.10.1 - '@swc/core-linux-arm-gnueabihf': 1.10.1 - '@swc/core-linux-arm64-gnu': 1.10.1 - '@swc/core-linux-arm64-musl': 1.10.1 - '@swc/core-linux-x64-gnu': 1.10.1 - '@swc/core-linux-x64-musl': 1.10.1 - '@swc/core-win32-arm64-msvc': 1.10.1 - '@swc/core-win32-ia32-msvc': 1.10.1 - '@swc/core-win32-x64-msvc': 1.10.1 - - '@swc/counter@0.1.3': {} - - '@swc/types@0.1.17': - dependencies: - '@swc/counter': 0.1.3 - '@tootallnate/once@1.1.2': optional: true @@ -3800,17 +3347,6 @@ snapshots: dependencies: undici-types: 6.20.0 - '@types/prop-types@15.7.14': {} - - '@types/react-dom@18.3.3(@types/react@18.3.15)': - dependencies: - '@types/react': 18.3.15 - - '@types/react@18.3.15': - dependencies: - '@types/prop-types': 15.7.14 - csstype: 3.1.3 - '@types/react@19.0.1': dependencies: csstype: 3.1.3 @@ -3823,23 +3359,6 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0)(typescript@5.7.2))(eslint@9.16.0)(typescript@5.6.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.0(eslint@9.16.0)(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.18.0 - eslint: 9.16.0 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0)(typescript@5.7.2))(eslint@9.16.0)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -3857,18 +3376,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.18.0(eslint@9.16.0)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.18.0 - debug: 4.4.0 - eslint: 9.16.0 - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.18.0(eslint@9.16.0)(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 8.18.0 @@ -3886,17 +3393,6 @@ snapshots: '@typescript-eslint/types': 8.18.0 '@typescript-eslint/visitor-keys': 8.18.0 - '@typescript-eslint/type-utils@8.18.0(eslint@9.16.0)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0)(typescript@5.6.3) - debug: 4.4.0 - eslint: 9.16.0 - ts-api-utils: 1.4.3(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.18.0(eslint@9.16.0)(typescript@5.7.2)': dependencies: '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) @@ -3910,20 +3406,6 @@ snapshots: '@typescript-eslint/types@8.18.0': {} - '@typescript-eslint/typescript-estree@8.18.0(typescript@5.6.3)': - dependencies: - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/visitor-keys': 8.18.0 - debug: 4.4.0 - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.18.0(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 8.18.0 @@ -3938,17 +3420,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.18.0(eslint@9.16.0)(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.6.3) - eslint: 9.16.0 - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.18.0(eslint@9.16.0)(typescript@5.7.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0) @@ -3965,13 +3436,6 @@ snapshots: '@typescript-eslint/types': 8.18.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-react-swc@3.7.2(vite@6.0.3(@types/node@22.10.1))': - dependencies: - '@swc/core': 1.10.1 - vite: 6.0.3(@types/node@22.10.1) - transitivePeerDependencies: - - '@swc/helpers' - '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.1))': dependencies: '@ampproject/remapping': 2.3.0 @@ -4378,33 +3842,6 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.24.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 - escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -4646,8 +4083,6 @@ snapshots: globals@14.0.0: {} - globals@15.13.0: {} - graceful-fs@4.2.10: {} graceful-fs@4.2.11: {} @@ -4885,10 +4320,6 @@ snapshots: longest-streak@3.1.0: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - loupe@3.1.2: {} lru-cache@10.4.3: {} @@ -5615,16 +5046,6 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - read-ini-file@4.0.0: dependencies: ini: 3.0.1 @@ -5774,10 +5195,6 @@ snapshots: safer-buffer@2.1.2: optional: true - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - semver@7.6.3: {} set-blocking@2.0.0: @@ -5971,10 +5388,6 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.4.3(typescript@5.6.3): - dependencies: - typescript: 5.6.3 - ts-api-utils@1.4.3(typescript@5.7.2): dependencies: typescript: 5.7.2 @@ -6020,16 +5433,6 @@ snapshots: type-fest@0.6.0: {} - typescript-eslint@8.18.0(eslint@9.16.0)(typescript@5.6.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0)(typescript@5.7.2))(eslint@9.16.0)(typescript@5.6.3) - '@typescript-eslint/parser': 8.18.0(eslint@9.16.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.18.0(eslint@9.16.0)(typescript@5.6.3) - eslint: 9.16.0 - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - typescript-eslint@8.18.0(eslint@9.16.0)(typescript@5.7.2): dependencies: '@typescript-eslint/eslint-plugin': 8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0)(typescript@5.7.2))(eslint@9.16.0)(typescript@5.7.2) @@ -6040,8 +5443,6 @@ snapshots: transitivePeerDependencies: - supports-color - typescript@5.6.3: {} - typescript@5.7.2: {} undici-types@6.20.0: {} @@ -6185,15 +5586,6 @@ snapshots: '@types/node': 22.10.1 fsevents: 2.3.3 - vite@6.0.3(@types/node@22.10.1): - dependencies: - esbuild: 0.24.0 - postcss: 8.4.49 - rollup: 4.28.1 - optionalDependencies: - '@types/node': 22.10.1 - fsevents: 2.3.3 - vitest@2.1.8(@types/node@22.10.1): dependencies: '@vitest/expect': 2.1.8 diff --git a/tsconfig.json b/tsconfig.json index 005d7a5..17933ab 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,9 @@ { "include": [], "references": [ + { + "path": "./packages/base" + }, { "path": "./packages/plainidx" }, @@ -18,9 +21,6 @@ }, { "path": "./packages/plugin-markdown" - }, - { - "path": "./packages/platform-react" } ] }