diff --git a/.cursor/worktrees.json b/.cursor/worktrees.json index 3d1a828e..8f088e0d 100644 --- a/.cursor/worktrees.json +++ b/.cursor/worktrees.json @@ -1,3 +1,8 @@ { - "setup-worktree": ["pnpm install", "pnpm run build"] + "setup-worktree": [ + "pnpm install", + "pnpm run build", + "cp $ROOT_WORKTREE_PATH/apps/dev-playground/.env apps/dev-playground/.env", + "cp $ROOT_WORKTREE_PATH/apps/clean-app/.env apps/clean-app/.env" + ] } diff --git a/apps/dev-playground/server/lakebase-examples-plugin.ts b/apps/dev-playground/server/lakebase-examples-plugin.ts index 930653f8..8f2cf4b5 100644 --- a/apps/dev-playground/server/lakebase-examples-plugin.ts +++ b/apps/dev-playground/server/lakebase-examples-plugin.ts @@ -19,6 +19,7 @@ import * as typeormExample from "./lakebase-examples/typeorm-example"; */ export class LakebaseExamplesPlugin extends Plugin { + static override readonly name = "lakebase-examples"; public name = "lakebase-examples"; protected envVars: string[] = []; @@ -80,8 +81,4 @@ export class LakebaseExamplesPlugin extends Plugin { } } -export const lakebaseExamples = toPlugin< - typeof LakebaseExamplesPlugin, - Record, - "lakebase-examples" ->(LakebaseExamplesPlugin, "lakebase-examples"); +export const lakebaseExamples = toPlugin(LakebaseExamplesPlugin); diff --git a/apps/dev-playground/server/reconnect-plugin.ts b/apps/dev-playground/server/reconnect-plugin.ts index 908b0e1a..8c4b9b9a 100644 --- a/apps/dev-playground/server/reconnect-plugin.ts +++ b/apps/dev-playground/server/reconnect-plugin.ts @@ -14,6 +14,7 @@ interface ReconnectStreamResponse { } export class ReconnectPlugin extends Plugin { + static override readonly name = "reconnect"; public name = "reconnect"; static manifest = { @@ -84,8 +85,4 @@ export class ReconnectPlugin extends Plugin { } } -export const reconnect = toPlugin< - typeof ReconnectPlugin, - Record, - "reconnect" ->(ReconnectPlugin, "reconnect"); +export const reconnect = toPlugin(ReconnectPlugin); diff --git a/apps/dev-playground/server/telemetry-example-plugin.ts b/apps/dev-playground/server/telemetry-example-plugin.ts index 8f879687..1a5a45c9 100644 --- a/apps/dev-playground/server/telemetry-example-plugin.ts +++ b/apps/dev-playground/server/telemetry-example-plugin.ts @@ -16,6 +16,7 @@ import { import type { Request, Response, Router } from "express"; class TelemetryExamples extends Plugin { + static override readonly name = "telemetry-examples"; public name = "telemetry-examples" as const; static manifest = { @@ -522,8 +523,4 @@ class TelemetryExamples extends Plugin { } } -export const telemetryExamples = toPlugin< - typeof TelemetryExamples, - BasePluginConfig, - "telemetryExamples" ->(TelemetryExamples, "telemetryExamples"); +export const telemetryExamples = toPlugin(TelemetryExamples); diff --git a/packages/appkit/src/plugin/to-plugin.ts b/packages/appkit/src/plugin/to-plugin.ts index 110664d6..1e61513a 100644 --- a/packages/appkit/src/plugin/to-plugin.ts +++ b/packages/appkit/src/plugin/to-plugin.ts @@ -1,15 +1,19 @@ -import type { PluginData, ToPlugin } from "shared"; +import type { PluginConstructor, PluginData, ToPlugin } from "shared"; /** + * Wraps a plugin class so it can be passed to createApp with optional config. + * Infers config type from the constructor and plugin name from the static `name` property. + * * @internal */ -export function toPlugin( +export function toPlugin( plugin: T, - name: N, -): ToPlugin { - return (config: U = {} as U): PluginData => ({ +): ToPlugin[0], T["name"]> { + type Config = ConstructorParameters[0]; + type Name = T["name"]; + return (config: Config = {} as Config): PluginData => ({ plugin: plugin as T, - config: config as U, - name, + config: config as Config, + name: plugin.name as Name, }); } diff --git a/packages/appkit/src/plugins/analytics/analytics.ts b/packages/appkit/src/plugins/analytics/analytics.ts index 1619bdf0..a4ae8e6f 100644 --- a/packages/appkit/src/plugins/analytics/analytics.ts +++ b/packages/appkit/src/plugins/analytics/analytics.ts @@ -26,6 +26,7 @@ import type { const logger = createLogger("analytics"); export class AnalyticsPlugin extends Plugin { + static override readonly name = "analytics"; name = "analytics"; /** Plugin manifest declaring metadata and resource requirements */ @@ -285,8 +286,4 @@ export class AnalyticsPlugin extends Plugin { /** * @internal */ -export const analytics = toPlugin< - typeof AnalyticsPlugin, - IAnalyticsConfig, - "analytics" ->(AnalyticsPlugin, "analytics"); +export const analytics = toPlugin(AnalyticsPlugin); diff --git a/packages/appkit/src/plugins/genie/genie.ts b/packages/appkit/src/plugins/genie/genie.ts index 1656a8ea..1876ddc0 100644 --- a/packages/appkit/src/plugins/genie/genie.ts +++ b/packages/appkit/src/plugins/genie/genie.ts @@ -17,6 +17,7 @@ import type { const logger = createLogger("genie"); export class GeniePlugin extends Plugin { + static override readonly name = "genie"; name = "genie"; static manifest = genieManifest; @@ -230,7 +231,4 @@ export class GeniePlugin extends Plugin { /** * @internal */ -export const genie = toPlugin( - GeniePlugin, - "genie", -); +export const genie = toPlugin(GeniePlugin); diff --git a/packages/appkit/src/plugins/lakebase/lakebase.ts b/packages/appkit/src/plugins/lakebase/lakebase.ts index e8a1f18c..205b4ead 100644 --- a/packages/appkit/src/plugins/lakebase/lakebase.ts +++ b/packages/appkit/src/plugins/lakebase/lakebase.ts @@ -30,6 +30,7 @@ const logger = createLogger("lakebase"); * ``` */ export class LakebasePlugin extends Plugin { + static override readonly name = "lakebase"; name = "lakebase"; /** Plugin manifest declaring metadata and resource requirements */ @@ -117,8 +118,4 @@ export class LakebasePlugin extends Plugin { /** * @internal */ -export const lakebase = toPlugin< - typeof LakebasePlugin, - ILakebaseConfig, - "lakebase" ->(LakebasePlugin, "lakebase"); +export const lakebase = toPlugin(LakebasePlugin); diff --git a/packages/appkit/src/plugins/server/index.ts b/packages/appkit/src/plugins/server/index.ts index 40cf01e0..b5df9360 100644 --- a/packages/appkit/src/plugins/server/index.ts +++ b/packages/appkit/src/plugins/server/index.ts @@ -43,6 +43,7 @@ export class ServerPlugin extends Plugin { /** Plugin manifest declaring metadata and resource requirements */ static manifest = serverManifest; + static override readonly name = "server"; public name = "server" as const; private serverApplication: express.Application; private server: HTTPServer | null; @@ -354,10 +355,7 @@ const EXCLUDED_PLUGINS = [ServerPlugin.name]; /** * @internal */ -export const server = toPlugin( - ServerPlugin, - "server", -); +export const server = toPlugin(ServerPlugin); // Export manifest and types export { serverManifest } from "./manifest"; diff --git a/packages/appkit/src/plugins/server/tests/server.integration.test.ts b/packages/appkit/src/plugins/server/tests/server.integration.test.ts index 84496348..70675540 100644 --- a/packages/appkit/src/plugins/server/tests/server.integration.test.ts +++ b/packages/appkit/src/plugins/server/tests/server.integration.test.ts @@ -98,6 +98,7 @@ describe("ServerPlugin with custom plugin", () => { // Create a simple test plugin class TestPlugin extends Plugin { + static override readonly name = "test-plugin"; static manifest = { name: "test-plugin", displayName: "Test Plugin", @@ -117,10 +118,7 @@ describe("ServerPlugin with custom plugin", () => { } } - const testPlugin = toPlugin( - TestPlugin, - "test-plugin", - ); + const testPlugin = toPlugin(TestPlugin); const app = await createApp({ plugins: [ diff --git a/packages/shared/src/cli/commands/plugin/create/scaffold.ts b/packages/shared/src/cli/commands/plugin/create/scaffold.ts index d93c127a..4a05c650 100644 --- a/packages/shared/src/cli/commands/plugin/create/scaffold.ts +++ b/packages/shared/src/cli/commands/plugin/create/scaffold.ts @@ -132,7 +132,10 @@ export const manifest = JSON.parse( const pluginTs = `import { Plugin, toPlugin, type IAppRouter } from "@databricks/appkit"; import { manifest } from "./manifest.js"; +export { manifest }; + export class ${className} extends Plugin { + static override readonly name = "${answers.name}"; name = "${answers.name}"; static manifest = manifest; @@ -150,16 +153,12 @@ export class ${className} extends Plugin { } } -export const ${exportName} = toPlugin< - typeof ${className}, - Record, - "${answers.name}" ->(${className}, "${answers.name}"); +export const ${exportName} = toPlugin(${className}); `; writeTracked(path.join(targetDir, `${answers.name}.ts`), pluginTs, written); - const indexTs = `export { ${className}, ${exportName} } from "./${answers.name}.js"; + const indexTs = `export { ${className}, ${exportName}, manifest } from "./${answers.name}.js"; `; writeTracked(path.join(targetDir, "index.ts"), indexTs, written);