diff --git a/data-app/README.md b/data-app/README.md index b6a1d7c..3968f93 100644 --- a/data-app/README.md +++ b/data-app/README.md @@ -44,7 +44,6 @@ Upgrades resolve only the lockfile and restore the original manifest and lockfil fails. Restart running previews after an upgrade. Apps must already use the published package; `app upgrade` does not migrate local runtime copies or rewrite app source. -Version 0.69.0 removes operation `output` parsers: validate and return query results inside `run`. After `app upgrade`, migrate existing app source and run `app lint`. ## Verify diff --git a/data-app/starter/README.md b/data-app/starter/README.md index 333f21c..0d3cb86 100644 --- a/data-app/starter/README.md +++ b/data-app/starter/README.md @@ -22,7 +22,7 @@ Start with the [authoring router](AGENTS.md) for data and view changes, or the [ Run `altertable app lint` to check the app locally. Use `altertable app lint --lakehouse` to execute each operation's declared `checks` against the selected profile. -`altertable app upgrade` pins the package version tested with your CLI and updates the lockfile. It preserves app code and does not downgrade a newer installed package. Restart a running preview after upgrading. +`altertable app upgrade` pins the package version tested with your CLI and updates the lockfile. It preserves app code and does not downgrade a newer installed package. Version 0.70.0 requires typed query parameters and projections, with decoded record rows; migrate existing query declarations after upgrading. Restart a running preview after upgrading. ## Version control diff --git a/data-app/starter/bun.lock b/data-app/starter/bun.lock index afefb8f..caa1cc6 100644 --- a/data-app/starter/bun.lock +++ b/data-app/starter/bun.lock @@ -5,7 +5,7 @@ "": { "name": "data-app-starter", "dependencies": { - "@altertable/data-app": "0.69.0", + "@altertable/data-app": "0.70.0", "react": "19.3.0", "react-dom": "19.3.0", }, @@ -21,7 +21,7 @@ }, }, "packages": { - "@altertable/data-app": ["@altertable/data-app@0.69.0", "", { "dependencies": { "@altertable/lakehouse": "0.4.1", "@floating-ui/react": "0.27.20", "@internationalized/date": "3.12.4", "@tanstack/react-query": "5.104.0", "fflate": "0.8.3", "fuzzysort": "4.0.2", "html-to-image": "1.11.13", "lucide-react": "1.48.0", "react-aria-components": "1.21.1", "recharts": "3.10.1" }, "peerDependencies": { "react": ">=19.2.0", "react-dom": ">=19.2.0" } }, "sha512-f70vxzVNnsbURqIo8ah79ZVL0S0R5ry6YhxrJEW8vi+aVR45eoeExzJKu3d7mZUDbk3T1cDy0jT4egJA1XvK2Q=="], + "@altertable/data-app": ["@altertable/data-app@0.70.0", "", { "dependencies": { "@altertable/lakehouse": "0.4.1", "@floating-ui/react": "0.27.20", "@internationalized/date": "3.12.4", "@tanstack/react-query": "5.104.0", "fflate": "0.8.3", "fuzzysort": "4.0.2", "html-to-image": "1.11.13", "lucide-react": "1.48.0", "react-aria-components": "1.21.1", "recharts": "3.10.1" }, "peerDependencies": { "react": ">=19.2.0", "react-dom": ">=19.2.0" } }, "sha512-tfrzwRP4rGnnMM1Ddu0BYwl1q0c3KegIeBEHf4e/iK/EkTfFIHGw+5Mp7SqS+kmsPR7TpNFbWhCVeAYGH1f0xw=="], "@altertable/lakehouse": ["@altertable/lakehouse@0.4.1", "", {}, "sha512-m7d15cWt+WUGW7lVw2KYGD+Se8MzO25G7SWSuFd+OasBxWmOJNa2IrgvOHGVEbnZ+kexTUy9NjAGQ69sG4V91w=="], diff --git a/data-app/starter/fixtures/activity.ts b/data-app/starter/fixtures/activity.ts index 52527ed..e6fe8e4 100644 --- a/data-app/starter/fixtures/activity.ts +++ b/data-app/starter/fixtures/activity.ts @@ -1,5 +1,5 @@ import { defineDataApp } from "@altertable/data-app"; -import { defineDateRangeContract, parseCount, parseLabel } from "@altertable/data-app/contract"; +import { defineDateRangeContract } from "@altertable/data-app/contract"; type Activity = { count: number; features: string[] }; export const app = defineDataApp({ @@ -10,7 +10,8 @@ export const app = defineDataApp({ queries: { activity: { statement: "SELECT 120 AS count, 'Queries' AS feature WHERE $start <= $end", - params: { start: {}, end: {} }, + params: { start: { type: "string" }, end: { type: "string" } }, + projections: { count: { type: "number" }, feature: { type: "string" } }, }, }, }); @@ -31,9 +32,11 @@ export const operations = { { start: input.range.start, end: input.range.end }, { limit: 10 }, ); + const firstRow = result.rows[0]; + if (!firstRow) throw new Error("Activity query returned no rows."); return { - count: parseCount(result.rows[0]?.[0]), - features: result.rows.map((row) => parseLabel(row[1])), + count: firstRow.count, + features: result.rows.map((row) => row.feature), }; }, }), diff --git a/data-app/starter/fixtures/main.tsx b/data-app/starter/fixtures/main.tsx index e00ad4f..83a7e98 100644 --- a/data-app/starter/fixtures/main.tsx +++ b/data-app/starter/fixtures/main.tsx @@ -32,7 +32,13 @@ const app = defineDataApp({ description: "Completed orders in production.", scope: { organization: "Acme", environment: "production" }, appearance: { theme: "light" }, - queries: { connection: { statement: "SELECT 1 AS connection_check", params: {} } }, + queries: { + connection: { + statement: "SELECT 1 AS connection_check", + params: {}, + projections: { connection_check: { type: "number" } }, + }, + }, }); const operations = { connection: connectionCheck(app.queries) }; const connectionQueryNames = operations.connection.queryNames; diff --git a/data-app/starter/package.json b/data-app/starter/package.json index b75a73f..06e04f8 100644 --- a/data-app/starter/package.json +++ b/data-app/starter/package.json @@ -15,7 +15,7 @@ "build": "bun build src/index.html --outdir=dist --production" }, "dependencies": { - "@altertable/data-app": "0.69.0", + "@altertable/data-app": "0.70.0", "react": "19.3.0", "react-dom": "19.3.0" }, diff --git a/data-app/starter/src/config.ts b/data-app/starter/src/config.ts index 304d018..fa2a721 100644 --- a/data-app/starter/src/config.ts +++ b/data-app/starter/src/config.ts @@ -11,6 +11,7 @@ export default defineDataApp({ connection: { statement: "SELECT 1 AS connection_check", params: {}, + projections: { connection_check: { type: "number" } }, }, }, }); diff --git a/data-app/tests/bun.lock b/data-app/tests/bun.lock index 1636c60..7230714 100644 --- a/data-app/tests/bun.lock +++ b/data-app/tests/bun.lock @@ -5,7 +5,7 @@ "": { "name": "data-app-browser-tests", "dependencies": { - "@altertable/data-app": "0.69.0", + "@altertable/data-app": "0.70.0", }, "devDependencies": { "@playwright/test": "1.63.0", @@ -16,7 +16,7 @@ }, }, "packages": { - "@altertable/data-app": ["@altertable/data-app@0.69.0", "", { "dependencies": { "@altertable/lakehouse": "0.4.1", "@floating-ui/react": "0.27.20", "@internationalized/date": "3.12.4", "@tanstack/react-query": "5.104.0", "fflate": "0.8.3", "fuzzysort": "4.0.2", "html-to-image": "1.11.13", "lucide-react": "1.48.0", "react-aria-components": "1.21.1", "recharts": "3.10.1" }, "peerDependencies": { "react": ">=19.2.0", "react-dom": ">=19.2.0" } }, "sha512-f70vxzVNnsbURqIo8ah79ZVL0S0R5ry6YhxrJEW8vi+aVR45eoeExzJKu3d7mZUDbk3T1cDy0jT4egJA1XvK2Q=="], + "@altertable/data-app": ["@altertable/data-app@0.70.0", "", { "dependencies": { "@altertable/lakehouse": "0.4.1", "@floating-ui/react": "0.27.20", "@internationalized/date": "3.12.4", "@tanstack/react-query": "5.104.0", "fflate": "0.8.3", "fuzzysort": "4.0.2", "html-to-image": "1.11.13", "lucide-react": "1.48.0", "react-aria-components": "1.21.1", "recharts": "3.10.1" }, "peerDependencies": { "react": ">=19.2.0", "react-dom": ">=19.2.0" } }, "sha512-tfrzwRP4rGnnMM1Ddu0BYwl1q0c3KegIeBEHf4e/iK/EkTfFIHGw+5Mp7SqS+kmsPR7TpNFbWhCVeAYGH1f0xw=="], "@altertable/lakehouse": ["@altertable/lakehouse@0.4.1", "", {}, "sha512-m7d15cWt+WUGW7lVw2KYGD+Se8MzO25G7SWSuFd+OasBxWmOJNa2IrgvOHGVEbnZ+kexTUy9NjAGQ69sG4V91w=="], diff --git a/data-app/tests/package.json b/data-app/tests/package.json index ea51bc5..42659b1 100644 --- a/data-app/tests/package.json +++ b/data-app/tests/package.json @@ -15,6 +15,6 @@ "typescript": "7.0.2" }, "dependencies": { - "@altertable/data-app": "0.69.0" + "@altertable/data-app": "0.70.0" } }