Skip to content

Commit d93dbfb

Browse files
committed
refactor: move generated types into appkit-types/ directory
Consolidate generated .d.ts files into a single src/appkit-types/ directory instead of polluting client/src/ with multiple top-level type files. TypeScript auto-discovers files via "include": ["src"]. - analytics types: src/appkit-types/analytics.d.ts - serving types: src/appkit-types/serving.d.ts Both generators now ensure the parent directory exists before writing. Directory name and filenames are shared constants in type-generator. Signed-off-by: Pawel Kosiec <pawel.kosiec@databricks.com>
1 parent e72bee4 commit d93dbfb

File tree

12 files changed

+37
-131
lines changed

12 files changed

+37
-131
lines changed

apps/dev-playground/client/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ dist-ssr
1313
*.local
1414

1515
# Auto-generated types (endpoint-specific, varies per developer)
16-
src/appKitServingTypes.d.ts
16+
src/appkit-types/serving.d.ts
1717

1818
# Editor directories and files
1919
.vscode/*

apps/dev-playground/client/src/appKitServingTypes.d.ts

Lines changed: 0 additions & 114 deletions
This file was deleted.
File renamed without changes.

docs/docs/development/type-generation.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ AppKit can automatically generate TypeScript types for your SQL queries, providi
88

99
## Goal
1010

11-
Generate `client/src/appKitTypes.d.ts` so query keys, parameters, and result rows are type-safe.
11+
Generate `client/src/appkit-types/analytics.d.ts` so query keys, parameters, and result rows are type-safe. All generated type files live in the `client/src/appkit-types/` directory (one file per plugin).
1212

1313
## Vite plugin: `appKitTypesPlugin`
1414

1515
The recommended approach is to use the Vite plugin, which watches your SQL files and regenerates types automatically during development.
1616

1717
### Configuration
1818

19-
- `outFile?: string` - Output file path (default: `src/appKitTypes.d.ts`)
19+
- `outFile?: string` - Output file path (default: `src/appkit-types/analytics.d.ts`)
2020
- `watchFolders?: string[]` - Folders to watch for SQL files (default: `["../config/queries"]`)
2121

2222
### Example
@@ -31,7 +31,7 @@ export default defineConfig({
3131
plugins: [
3232
react(),
3333
appKitTypesPlugin({
34-
outFile: "src/appKitTypes.d.ts",
34+
outFile: "src/appkit-types/analytics.d.ts",
3535
watchFolders: ["../config/queries"],
3636
}),
3737
],
@@ -56,13 +56,13 @@ npx @databricks/appkit generate-types [rootDir] [outFile] [warehouseId]
5656
- Generate types using warehouse ID from environment
5757

5858
```bash
59-
npx @databricks/appkit generate-types . client/src/appKitTypes.d.ts
59+
npx @databricks/appkit generate-types . client/src/appkit-types/analytics.d.ts
6060
```
6161

6262
- Generate types using warehouse ID explicitly
6363

6464
```bash
65-
npx @databricks/appkit generate-types . client/src/appKitTypes.d.ts abc123...
65+
npx @databricks/appkit generate-types . client/src/appkit-types/analytics.d.ts abc123...
6666
```
6767

6868
- Force regeneration (skip cache)

docs/docs/plugins/analytics.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ function SpendTable() {
136136
Augment the `QueryRegistry` interface to get full type inference on parameters and results:
137137

138138
```ts
139-
// config/appKitTypes.d.ts
139+
// client/src/appkit-types/analytics.d.ts
140140
declare module "@databricks/appkit-ui/react" {
141141
interface QueryRegistry {
142142
spend_summary: {

packages/appkit/src/type-generator/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import fs from "node:fs/promises";
2+
import path from "node:path";
23
import dotenv from "dotenv";
34
import { createLogger } from "../logging/logger";
45
import { generateQueriesFromDescribe } from "./query-registry";
@@ -83,6 +84,7 @@ export async function generateFromEntryPoint(options: {
8384

8485
const typeDeclarations = generateTypeDeclarations(queryRegistry);
8586

87+
await fs.mkdir(path.dirname(outFile), { recursive: true });
8688
await fs.writeFile(outFile, typeDeclarations, "utf-8");
8789

8890
logger.debug("Type generation complete!");
@@ -92,3 +94,10 @@ export async function generateFromEntryPoint(options: {
9294
// A local binding ensures the serving vite plugin's import keeps this in the dependency graph,
9395
// mirroring how generateFromEntryPoint (also defined here) is preserved via the analytics vite plugin.
9496
export const generateServingTypes = generateServingTypesImpl;
97+
98+
/** Directory name for generated AppKit type declaration files. */
99+
export const TYPES_DIR = "appkit-types";
100+
/** Default filename for analytics query type declarations. */
101+
export const ANALYTICS_TYPES_FILE = "analytics.d.ts";
102+
/** Default filename for serving endpoint type declarations. */
103+
export const SERVING_TYPES_FILE = "serving.d.ts";

packages/appkit/src/type-generator/serving/generator.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import fs from "node:fs/promises";
2+
import path from "node:path";
23
import { WorkspaceClient } from "@databricks/sdk-experimental";
34
import pc from "picocolors";
45
import { createLogger } from "../../logging/logger";
@@ -73,6 +74,7 @@ export async function generateServingTypes(
7374
printLogTable(logEntries, startTime);
7475

7576
const output = generateTypeDeclarations(registryEntries);
77+
await fs.mkdir(path.dirname(outFile), { recursive: true });
7678
await fs.writeFile(outFile, output, "utf-8");
7779

7880
if (registryEntries.length === 0) {

packages/appkit/src/type-generator/serving/tests/generator.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ describe("generateServingTypes", () => {
9191
const outFile = "/tmp/test-serving-types.d.ts";
9292

9393
beforeEach(() => {
94+
vi.mocked(fs.mkdir).mockResolvedValue(undefined);
9495
vi.mocked(fs.writeFile).mockResolvedValue();
9596
process.env.TEST_SERVING_ENDPOINT = "my-endpoint";
9697
});

packages/appkit/src/type-generator/serving/tests/vite-plugin.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ describe("appKitServingTypesPlugin", () => {
7979
expect(mockGenerateServingTypes).toHaveBeenCalledWith(
8080
expect.objectContaining({
8181
outFile: expect.stringContaining(
82-
"/app/client/src/appKitServingTypes.d.ts",
82+
"/app/client/src/appkit-types/serving.d.ts",
8383
),
8484
}),
8585
);

packages/appkit/src/type-generator/serving/vite-plugin.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import path from "node:path";
22
import type { Plugin } from "vite";
33
import { createLogger } from "../../logging/logger";
44
import type { EndpointConfig } from "../../plugins/serving/types";
5-
import { generateServingTypes } from "../index";
5+
import { generateServingTypes, SERVING_TYPES_FILE, TYPES_DIR } from "../index";
66
import {
77
extractServingEndpoints,
88
findServerFile,
@@ -96,7 +96,7 @@ export function appKitServingTypesPlugin(
9696
projectRoot = path.resolve(config.root, "..");
9797
outFile = path.resolve(
9898
config.root,
99-
options?.outFile ?? "src/appKitServingTypes.d.ts",
99+
options?.outFile ?? `src/${TYPES_DIR}/${SERVING_TYPES_FILE}`,
100100
);
101101
},
102102

0 commit comments

Comments
 (0)