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"
}
]
}