diff --git a/.changeset/chilly-yaks-listen.md b/.changeset/chilly-yaks-listen.md
new file mode 100644
index 0000000000..8a4217f757
--- /dev/null
+++ b/.changeset/chilly-yaks-listen.md
@@ -0,0 +1,13 @@
+---
+'@evidence-dev/tailwind': patch
+---
+
+[!] BREAKING CHANGE:
+Custom theme colors are converted implicitly to kebab-case by tailwindcss
+
+This means that some color defined in `evidence.config.yaml` as `myCustomColor`
+should be used as (for example) `text-my-custom-color`. (`text-myCustomColor` will not work)
+
+When referencing custom theme colors in Javascript the original case should still be used
+(for example) `myCustomColor` would still be ``
+_NOT_ ``
diff --git a/.changeset/four-mugs-taste.md b/.changeset/four-mugs-taste.md
new file mode 100644
index 0000000000..c9778c7be4
--- /dev/null
+++ b/.changeset/four-mugs-taste.md
@@ -0,0 +1,11 @@
+---
+'@evidence-dev/source-javascript': patch
+'@evidence-dev/component-utilities': patch
+'@evidence-dev/preprocess': patch
+'@evidence-dev/sdk': patch
+'@evidence-dev/universal-sql': patch
+'@evidence-dev/core-components': patch
+'@evidence-dev/tailwind': patch
+---
+
+bump vitest
diff --git a/.changeset/hungry-donkeys-run.md b/.changeset/hungry-donkeys-run.md
new file mode 100644
index 0000000000..8c764299cc
--- /dev/null
+++ b/.changeset/hungry-donkeys-run.md
@@ -0,0 +1,6 @@
+---
+'@evidence-dev/sdk': patch
+'@evidence-dev/universal-sql': patch
+---
+
+Fix type errors
diff --git a/.changeset/kind-fishes-mate.md b/.changeset/kind-fishes-mate.md
new file mode 100644
index 0000000000..57b2c12d93
--- /dev/null
+++ b/.changeset/kind-fishes-mate.md
@@ -0,0 +1,7 @@
+---
+'@evidence-dev/core-components': patch
+'@evidence-dev/tailwind': patch
+'@evidence-dev/evidence': patch
+---
+
+Use theme class instead of data-
diff --git a/.changeset/seven-books-press.md b/.changeset/seven-books-press.md
new file mode 100644
index 0000000000..8f52e9a4fe
--- /dev/null
+++ b/.changeset/seven-books-press.md
@@ -0,0 +1,6 @@
+---
+'@evidence-dev/evidence': minor
+'@evidence-dev/core-components': minor
+---
+
+Improved settings page UI
diff --git a/.changeset/strong-wombats-admire.md b/.changeset/strong-wombats-admire.md
new file mode 100644
index 0000000000..6f4dc03056
--- /dev/null
+++ b/.changeset/strong-wombats-admire.md
@@ -0,0 +1,5 @@
+---
+'@evidence-dev/evidence': patch
+---
+
+Add theme.css export for svelte component tags that need to access tailwind theme
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index b81404c360..126feed526 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -10,5 +10,15 @@ module.exports = {
browser: true,
es2017: true,
node: true
+ },
+ rules: {
+ 'no-unused-vars': [
+ 'error',
+ {
+ argsIgnorePattern: '^_',
+ varsIgnorePattern: '^_',
+ caughtErrorsIgnorePattern: '^_'
+ }
+ ]
}
};
diff --git a/.gitignore b/.gitignore
index 0b41bf736e..ce0aee452f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,5 +39,6 @@ packages/ui/core-components/coverage
sites/docs/.evidence/meta/query-cache/hashes.json
priority_support_users.csv
+.aider*
evidence-*.tgz
diff --git a/e2e/base-path/tests/tests.spec.js b/e2e/base-path/tests/tests.spec.js
index 43ccadb494..eac1dad3a8 100644
--- a/e2e/base-path/tests/tests.spec.js
+++ b/e2e/base-path/tests/tests.spec.js
@@ -191,6 +191,24 @@ test.describe('Page', () => {
});
});
+test.describe('Parquet Files', () => {
+ test('Manifest links should use base path', async ({ page }) => {
+ // Firefox does not behave as expected in playwright.
+ // This isn't a browser-specific test, so we can get away with
+ // not running on firefox
+ if (test.info().project.name === 'firefox') return;
+ page.addListener('request', (req) => {
+ console.log(req.url());
+ });
+ const reqPromise = page.waitForRequest(`${basePath}/data/needful_things/orders/orders.parquet`);
+ page.goto(basePath);
+ const req = await reqPromise;
+
+ const res = await req.response();
+ expect(res?.ok()).toBe(true);
+ });
+});
+
test.describe('Components', () => {
test('Table row links should use base path', async ({ page }) => {
await page.goto(`${basePath}/table-row-links`);
diff --git a/e2e/dev-server-startup/package.json b/e2e/dev-server-startup/package.json
index ccf6ffbb86..edd53b2c61 100644
--- a/e2e/dev-server-startup/package.json
+++ b/e2e/dev-server-startup/package.json
@@ -20,7 +20,7 @@
"@evidence-dev/duckdb": "workspace:*",
"@evidence-dev/evidence": "workspace:*",
"vite": "5.4.14",
- "vitest": "^2.1.8"
+ "vitest": "^2.1.9"
},
"overrides": {
"jsonwebtoken": "9.0.0",
diff --git a/e2e/hmr/tests/tests.spec.js b/e2e/hmr/tests/tests.spec.js
index d19b538c59..fba0d2b68a 100644
--- a/e2e/hmr/tests/tests.spec.js
+++ b/e2e/hmr/tests/tests.spec.js
@@ -1,6 +1,6 @@
// @ts-check
import { test, expect } from '@playwright/test';
-import { createFile, deleteFile, editFile, restoreChangedFiles } from './fs-utils';
+import { editFile, restoreChangedFiles } from './fs-utils';
import { waitForPageToLoad } from '../../test-utils';
/** @param {import("@playwright/test").Page} page */
@@ -26,34 +26,6 @@ test.describe('pages', () => {
await expect(page.getByText('This page has some different text on it')).toBeVisible();
});
-
- test('creating should add to the sidebar and allow navigation', async ({ page }) => {
- await page.goto('/');
- await waitForPageToLoad(page);
-
- await expect(page.getByText('Index')).toBeVisible();
-
- createFile('pages/new-page.md', 'This is a new page');
- // file deletions trigger full reload, so we don't waitForHMR() here
-
- await expect(page.getByRole('link', { name: 'New Page' })).toBeVisible();
- await page.goto('/new-page');
- await expect(page.getByText('This is a new page')).toBeVisible();
- });
-
- test('deleting should remove from the sidebar and prevent navigation', async ({ page }) => {
- await page.goto('/');
- await waitForPageToLoad(page);
-
- await expect(page.getByText('Index')).toBeVisible();
-
- deleteFile('pages/page.md');
- await waitForHMR(page);
-
- await expect(page.getByRole('link', { name: 'Page' })).not.toBeVisible();
- await page.goto('/page');
- await expect(page.getByText('Page Not Found')).toBeVisible();
- });
});
test.describe('sources', () => {
diff --git a/e2e/themes/pages/index.md b/e2e/themes/pages/index.md
index 1da87b7063..8788f51fa1 100644
--- a/e2e/themes/pages/index.md
+++ b/e2e/themes/pages/index.md
@@ -6,7 +6,7 @@
div-primary-var
-
+
div-myCustomColor-class
diff --git a/package.json b/package.json
index 201f368425..aea239f600 100644
--- a/package.json
+++ b/package.json
@@ -26,6 +26,8 @@
"@evidence-dev/telemetry": "link:packages/lib/telemetry",
"@evidence-dev/trino": "link:packages/datasources/trino",
"@evidence-dev/universal-sql": "link:packages/lib/universal-sql",
+ "@tailwindcss/vite": "^4.0.0",
+ "tailwindcss": "^4.0.0",
"@parcel/packager-ts": "2.12.0",
"@parcel/transformer-typescript-types": "2.12.0",
"@playwright/test": "^1.45.3",
diff --git a/packages/datasources/javascript/package.json b/packages/datasources/javascript/package.json
index 5f7f7b6dd5..e75fb57b8b 100644
--- a/packages/datasources/javascript/package.json
+++ b/packages/datasources/javascript/package.json
@@ -12,7 +12,7 @@
"license": "MIT",
"devDependencies": {
"typescript": "^5.3.3",
- "vitest": "^2.0.5"
+ "vitest": "^2.1.9"
},
"dependencies": {
"@evidence-dev/db-commons": "^1.0.5"
diff --git a/packages/evidence/package.json b/packages/evidence/package.json
index 6d20f06bf0..43a564b387 100644
--- a/packages/evidence/package.json
+++ b/packages/evidence/package.json
@@ -21,6 +21,9 @@
"bin": {
"evidence": "cli.js"
},
+ "exports": {
+ "./theme.css": "./template/src/app.css"
+ },
"scripts": {
"build": "node scripts/build-template",
"prepublishOnly": "npm run build"
@@ -54,12 +57,10 @@
"autoprefixer": "^10.4.7",
"debounce": "^1.2.1",
"git-remote-origin-url": "4.0.0",
- "postcss": "^8.4.14",
- "postcss-load-config": "^4.0.1",
"svelte": "4.2.19",
"svelte-preprocess": "5.1.3",
"svelte2tsx": "0.7.4",
- "tailwindcss": "^3.3.1",
+ "tailwindcss": "^4.0.0",
"typescript": "5.4.2",
"unist-util-visit": "4.1.2",
"vite": "5.4.14"
diff --git a/packages/evidence/scripts/build-template.js b/packages/evidence/scripts/build-template.js
index da1cd2ab27..cc3b6caddd 100644
--- a/packages/evidence/scripts/build-template.js
+++ b/packages/evidence/scripts/build-template.js
@@ -21,9 +21,7 @@ const templatePaths = [
'src/pages/settings/',
'src/pages/explore',
'src/pages/api/',
- 'src/pages/manifest.webmanifest/+server.js',
- 'tailwind.config.cjs',
- 'postcss.config.cjs'
+ 'src/pages/manifest.webmanifest/+server.js'
];
const ignorePaths = ['static/data'];
@@ -54,6 +52,7 @@ fsExtra.outputFileSync(
import { isDebug } from '@evidence-dev/sdk/utils';
import { log } from "@evidence-dev/sdk/logger";
import { evidenceThemes } from '@evidence-dev/tailwind/vite-plugin';
+ import tailwindcss from '@tailwindcss/vite';
process.removeAllListeners('warning');
@@ -73,7 +72,7 @@ fsExtra.outputFileSync(
/** @type {import('vite').UserConfig} */
const config =
{
- plugins: [sveltekit(), configVirtual(), queryDirectoryHmr, sourceQueryHmr(), evidenceThemes()],
+ plugins: [tailwindcss(), sveltekit(), configVirtual(), queryDirectoryHmr, sourceQueryHmr(), evidenceThemes()],
optimizeDeps: {
include: ['echarts-stat', 'echarts', 'blueimp-md5', 'nanoid', '@uwdata/mosaic-sql',
// We need these to prevent HMR from doing a full page reload
diff --git a/packages/evidence/scripts/svelte.config.js b/packages/evidence/scripts/svelte.config.js
index 1c5fb12d35..03cab9dff1 100644
--- a/packages/evidence/scripts/svelte.config.js
+++ b/packages/evidence/scripts/svelte.config.js
@@ -1,5 +1,5 @@
import evidencePreprocess from '@evidence-dev/preprocess';
-import preprocess from 'svelte-preprocess';
+
import adapter from '@sveltejs/adapter-static';
import { addBasePathToHrefAndSrc, injectComponents } from '@evidence-dev/sdk/build/svelte';
import fs from 'fs';
@@ -37,14 +37,7 @@ function errorHandler(warning) {
/** @type {import('@sveltejs/kit').Config} */
const config = {
extensions: ['.svelte', '.md'],
- preprocess: [
- ...evidencePreprocess(true),
- injectComponents(),
- preprocess({
- postcss: true
- }),
- addBasePathToHrefAndSrc
- ],
+ preprocess: [...evidencePreprocess(true), injectComponents(), addBasePathToHrefAndSrc],
onwarn: errorHandler,
kit: {
adapter: adapter({
diff --git a/packages/lib/component-utilities/package.json b/packages/lib/component-utilities/package.json
index 9304bc75f4..bc74e291f4 100644
--- a/packages/lib/component-utilities/package.json
+++ b/packages/lib/component-utilities/package.json
@@ -12,7 +12,7 @@
"devDependencies": {
"@evidence-dev/tailwind": "workspace:^",
"@faker-js/faker": "^8.0.2",
- "vitest": "^2.0.5"
+ "vitest": "^2.1.9"
},
"scripts": {
"test": "vitest --run",
@@ -32,4 +32,4 @@
"ssf": "^0.11.2",
"svelte": "4.2.19"
}
-}
\ No newline at end of file
+}
diff --git a/packages/lib/component-utilities/src/stores.js b/packages/lib/component-utilities/src/stores.js
index e22e609d04..9d988363b4 100644
--- a/packages/lib/component-utilities/src/stores.js
+++ b/packages/lib/component-utilities/src/stores.js
@@ -1,6 +1,6 @@
import { dev } from '$app/environment';
import { browser } from '$app/environment';
-import { writable } from 'svelte/store';
+import { get, writable } from 'svelte/store';
export const pageHasQueries = writable(true);
export const routeHash = writable('');
@@ -60,17 +60,6 @@ function createToastsObject() {
/** @type {import('svelte/store').Readable
& { add: (toast: Toast, timeout: number) => void }} */
export const toasts = createToastsObject();
-/**
- * @template T
- * @param {import('svelte/store').Readable} store
- * @returns {T}
- */
-const getStoreVal = (store) => {
- let v;
- store.subscribe((x) => (v = x))();
- return v;
-};
-
/** @template T @typedef {{ serialize: (value: T) => string; deserialize: (raw: string) => T }} SerializeAndDeserialize */
/**
@@ -99,7 +88,7 @@ export const localStorageStore = (key, init, serializeAndDeserialize) => {
}
};
- flush(getStoreVal(store));
+ flush(get(store));
/** @type {Writable} */
return {
@@ -109,7 +98,7 @@ export const localStorageStore = (key, init, serializeAndDeserialize) => {
flush(v);
},
update: (cb) => {
- const updatedStore = cb(getStoreVal(store));
+ const updatedStore = cb(get(store));
set(updatedStore);
flush(updatedStore);
}
diff --git a/packages/lib/preprocess/package.json b/packages/lib/preprocess/package.json
index 840841e0cc..7d4c01db1f 100644
--- a/packages/lib/preprocess/package.json
+++ b/packages/lib/preprocess/package.json
@@ -39,7 +39,7 @@
"mock-fs": "^5.2.0",
"parcel": "^2.8.3",
"typescript": "5.4.2",
- "vitest": "^2.0.5"
+ "vitest": "^2.1.9"
},
"peerDependencies": {
"@types/hast": "^2.0.0",
@@ -68,4 +68,4 @@
"@parcel/transformer-js": {
"inlineFS": true
}
-}
\ No newline at end of file
+}
diff --git a/packages/lib/sdk/package.json b/packages/lib/sdk/package.json
index 1bdd07b0c8..41d711e99d 100644
--- a/packages/lib/sdk/package.json
+++ b/packages/lib/sdk/package.json
@@ -110,7 +110,7 @@
"@types/node": "^20.11.0",
"@typescript-eslint/typescript-estree": "^6.18.1",
"@uwdata/mosaic-sql": "^0.10.0",
- "@vitest/coverage-v8": "^1.2.0",
+ "@vitest/coverage-v8": "3.0.5",
"chalk": "^5.3.0",
"chokidar": "^3.5.3",
"deep-object-diff": "^1.1.9",
@@ -134,7 +134,7 @@
"svelte-sequential-preprocessor": "^2.0.1",
"sveltekit-autoimport": "^1.7.1",
"vite": "5.4.14",
- "vitest": "^1.1.3",
+ "vitest": "^2.1.9",
"yaml": "^2.3.4",
"zod": "^3.23.7"
},
@@ -161,4 +161,4 @@
"optional": true
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/lib/sdk/src/build-dev/vite/config-virtual.d.ts b/packages/lib/sdk/src/build-dev/vite/evidence-config.d.ts
similarity index 100%
rename from packages/lib/sdk/src/build-dev/vite/config-virtual.d.ts
rename to packages/lib/sdk/src/build-dev/vite/evidence-config.d.ts
diff --git a/packages/lib/sdk/src/build-dev/vite/virtuals/initUsql.js b/packages/lib/sdk/src/build-dev/vite/virtuals/initUsql.js
deleted file mode 100644
index dabd7b84b6..0000000000
--- a/packages/lib/sdk/src/build-dev/vite/virtuals/initUsql.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import {
- initDB,
- setParquetURLs,
- updateSearchPath,
- query
-} from '@evidence-dev/universal-sql/client-duckdb';
-
-import { getManifest } from '$evidence/static-assets';
-
-export default (async () => {
- await initDB();
- let res;
- // TODO: Optionally take in a filepath and/or URL for the manifest
- res = await getManifest();
- res = JSON.parse(res);
-
- await setParquetURLs(res.renderedFiles ?? {});
- await updateSearchPath(Object.keys(res.renderedFiles ?? {}));
- if (!res.renderedFiles) console.error('No fixture data available!');
- // Test Query
- await query('SELECT * FROM information_schema.tables');
- console.log('Universal SQL has been initialized successfully');
-})();
diff --git a/packages/lib/sdk/src/build-dev/vite/virtuals/queries.svelte.js b/packages/lib/sdk/src/build-dev/vite/virtuals/queries.svelte.js
index 44ff9ca96d..8fc1abec14 100644
--- a/packages/lib/sdk/src/build-dev/vite/virtuals/queries.svelte.js
+++ b/packages/lib/sdk/src/build-dev/vite/virtuals/queries.svelte.js
@@ -1,3 +1,5 @@
+// @ts-nocheck Adding nocheck because type errors in this file were failing the build and @ItsMeBrianD told said this code is dead
+
import { getContext } from 'svelte';
import { ALL_QUERIES_CONTEXT_KEY, QUERIES_CONTEXT_KEY } from '$evidence/contextKeys';
import { Query } from '@evidence-dev/sdk/usql';
diff --git a/packages/lib/sdk/src/plugins/datasources/cli/edit/Options.js b/packages/lib/sdk/src/plugins/datasources/cli/edit/Options.js
index 4f5c72a86d..176fb276bd 100644
--- a/packages/lib/sdk/src/plugins/datasources/cli/edit/Options.js
+++ b/packages/lib/sdk/src/plugins/datasources/cli/edit/Options.js
@@ -10,7 +10,7 @@ export const OptionGetSpec = Symbol();
export const IsOptions = Symbol();
/**
- * @param {import('../../schemas/datasourcePluginOptions.schema.js').IDatasourceOptionSpecSchema} fieldSpec
+ * @param {import('../../schemas/datasourcePluginOptions.schema.js').IDatasourceOptionSpec} fieldSpec
* @param {string} prop
* @param {*} sourceOptions
* @param {OptionsOpts} [opts]
@@ -228,7 +228,7 @@ export const getSecretOptions = (options) => filterByMode(options, OptionSecretM
/**
* @param {*} options
* @param {string[]} optionPath
- * @returns {import('../../schemas/datasourcePluginOptions.schema.js').IDatasourceOptionSpecSchema}
+ * @returns {import('../../schemas/datasourcePluginOptions.schema.js').IDatasourceOptionSpec}
*/
export const getSpecAtPath = (options, optionPath) => {
let x = options[OptionSpecMode];
diff --git a/packages/lib/sdk/src/types.d.ts b/packages/lib/sdk/src/types.d.ts
index 05e163d35c..2d9e69b2be 100644
--- a/packages/lib/sdk/src/types.d.ts
+++ b/packages/lib/sdk/src/types.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/packages/lib/sdk/src/utils/svelte/addBasePath.js b/packages/lib/sdk/src/utils/svelte/addBasePath.js
index a2f58d4257..3b39d0df80 100644
--- a/packages/lib/sdk/src/utils/svelte/addBasePath.js
+++ b/packages/lib/sdk/src/utils/svelte/addBasePath.js
@@ -1,20 +1,30 @@
/**
* Adjusts a path to include the configured base path
* Ignores undefined, and absolute URLs
- * @param {unknown} path
+ * @template T
+ * @param {T} path
* @param {import("../../configuration/schemas/config.schema.js").EvidenceConfig} config
* @example addBasePath('http://localhost:3000/test') // 'http://localhost:3000/test'
* @example addBasePath('/test') // '/base/test'
* @example addBasePath(undefined) // undefined
*
- * @returns
+ * @returns {T | string}
*/
export const addBasePath = (path, config) => {
- if (path instanceof String) path = path.toString();
- if (typeof path !== 'string') return path;
- if (path.startsWith('http')) return path;
- if (path.startsWith('#')) return path; // ignore hash links
- if (/^[^/]*:/.test(path)) return path; // ignore other protocols
+ /** @type {string} */
+ let _path;
+
+ if (path instanceof String) {
+ _path = path.toString();
+ } else if (typeof path !== 'string') {
+ return path;
+ } else {
+ _path = path;
+ }
+
+ if (_path.startsWith('http')) return _path;
+ if (_path.startsWith('#')) return _path; // ignore hash links
+ if (/^[^/]*:/.test(_path)) return _path; // ignore other protocols
let basePath = config.deployment.basePath;
if (basePath) {
@@ -24,12 +34,12 @@ export const addBasePath = (path, config) => {
if (basePath.endsWith('/')) {
basePath = basePath.slice(0, -1);
}
- if (path.startsWith(basePath)) return path;
- if (!path.startsWith('/')) {
- path = `/${path}`;
+ if (_path.startsWith(basePath)) return _path;
+ if (!_path.startsWith('/')) {
+ _path = `/${_path}`;
}
- return `${basePath}${path}`;
+ return `${basePath}${_path}`;
} else {
- return path;
+ return _path;
}
};
diff --git a/packages/lib/sdk/src/utils/svelte/addBasePath.spec.js b/packages/lib/sdk/src/utils/svelte/addBasePath.spec.js
index a85b2ec11a..ce0e5a00b3 100644
--- a/packages/lib/sdk/src/utils/svelte/addBasePath.spec.js
+++ b/packages/lib/sdk/src/utils/svelte/addBasePath.spec.js
@@ -79,4 +79,8 @@ describe('addBasePath', () => {
const obj = {};
expect(addBasePath(obj, config)).toBe(obj);
});
+ it('should add slash', () => {
+ basePath = '/base';
+ expect(addBasePath('test', config)).toBe('/base/test');
+ });
});
diff --git a/packages/lib/universal-sql/package.json b/packages/lib/universal-sql/package.json
index 651ed81844..e5d71d5556 100644
--- a/packages/lib/universal-sql/package.json
+++ b/packages/lib/universal-sql/package.json
@@ -20,7 +20,6 @@
"cli-progress": "^3.12.0",
"lodash.chunk": "^4.2.0",
"parquet-wasm": "0.5.0",
- "@evidence-dev/sdk": "workspace:*",
"web-worker": "^1.2.0"
},
"exports": {
@@ -43,6 +42,6 @@
"@types/node": "20.11.28",
"@types/mock-fs": "^4.13.1",
"mock-fs": "^5.2.0",
- "vitest": "^2.0.5"
+ "vitest": "^2.1.9"
}
}
diff --git a/packages/lib/universal-sql/src/build-parquet.js b/packages/lib/universal-sql/src/build-parquet.js
index 42dd46709a..aa971bdc8a 100644
--- a/packages/lib/universal-sql/src/build-parquet.js
+++ b/packages/lib/universal-sql/src/build-parquet.js
@@ -20,7 +20,7 @@ import { emptyDbFs, initDB, query } from './client-duckdb/node.js';
import chunk from 'lodash.chunk';
import { columnsToScore } from './calculateScore.js';
import chalk from 'chalk';
-import { log } from '@evidence-dev/sdk/logger';
+// import { log } from '@evidence-dev/sdk/logger';
/**
* @param {{name: string, evidenceType: string}} column
@@ -86,9 +86,9 @@ export async function buildMultipartParquet(
outputFilename,
batchSize = 1000000
) {
- log.debug(`Building parquet file ${outputFilename}`);
- let { meta: fn_meta, done: fn_done } = log.measure('buildMultipartParquet');
- fn_meta('output filename', outputFilename);
+ // log.debug(`Building parquet file ${outputFilename}`);
+ // let { meta: fn_meta, done: fn_done } = log.measure('buildMultipartParquet');
+ // fn_meta('output filename', outputFilename);
let batchNum = 0;
const outputSubpath = outputFilename.split('.parquet')[0];
@@ -96,9 +96,9 @@ export async function buildMultipartParquet(
let rowCount = 0;
const flush = async (results) => {
- log.debug(`Flushing batch ${batchNum} with ${results.length} rows`);
- let { meta, done } = log.measure('flush');
- meta('batch number', batchNum);
+ // log.debug(`Flushing batch ${batchNum} with ${results.length} rows`);
+ // let { meta, done } = log.measure('flush');
+ // meta('batch number', batchNum);
// Convert JS Objects -> Arrow
const vectorized = Object.fromEntries(
@@ -131,8 +131,8 @@ export async function buildMultipartParquet(
tmpFilenames.push(tempFilename);
rowCount += results.length;
- done();
- log.debug(`Flushed batch ${batchNum} with ${results.length} rows`);
+ // done();
+ // log.debug(`Flushed batch ${batchNum} with ${results.length} rows`);
batchNum++;
};
@@ -153,26 +153,26 @@ export async function buildMultipartParquet(
})();
}
- log.debug('Reading rows from a generator object');
- let { meta, done } = log.measure('buildMultipartParquet');
- meta('batch number', batchNum);
+ // log.debug('Reading rows from a generator object');
+ // let { meta, done } = log.measure('buildMultipartParquet');
+ // meta('batch number', batchNum);
const currentBatch = [];
for await (const results of data) {
for (const result of results) currentBatch.push(result);
if (currentBatch.length >= batchSize) {
- done();
- log.debug(`Flushing batch ${batchNum} with ${currentBatch.length} rows`);
+ // done();
+ // log.debug(`Flushing batch ${batchNum} with ${currentBatch.length} rows`);
await flush(currentBatch);
currentBatch.length = 0;
- ({ meta, done } = log.measure('buildMultipartParquet'));
- meta('batch number', batchNum);
+ // ({ meta, done } = log.measure('buildMultipartParquet'));
+ // meta('batch number', batchNum);
}
}
- done();
- log.debug(`Flushing batch ${batchNum} with ${currentBatch.length} rows`);
+ // done();
+ // log.debug(`Flushing batch ${batchNum} with ${currentBatch.length} rows`);
if (currentBatch.length) await flush(currentBatch);
@@ -230,7 +230,7 @@ export async function buildMultipartParquet(
}
await emptyDbFs('*');
- fn_done();
+ // fn_done();
return rowCount;
}
diff --git a/packages/lib/universal-sql/src/client-duckdb/browser.d.ts b/packages/lib/universal-sql/src/client-duckdb/browser.d.ts
index af51d8a7fc..f3f51e0d2f 100644
--- a/packages/lib/universal-sql/src/client-duckdb/browser.d.ts
+++ b/packages/lib/universal-sql/src/client-duckdb/browser.d.ts
@@ -17,18 +17,21 @@ export function updateSearchPath(schemas): Promise;
* Queries the database with the given SQL statement.
*
* @param {string} sql
- * @returns {Promise}
+ * @returns {Promise[]>}
*/
-export function query(sql: string): Promise;
+export function query(sql: string): Promise[]>;
/**
* Adds a new view to the database, pointing to the provided parquet URLs.
*
* @param {Record} urls
- * @param {boolean} [append]
+ * @param {{ append?: boolean, addBasePath?: (path: string) => string }} [opts]
* @returns {Promise}
*/
-export function setParquetURLs(urls: Record, append?: boolean): Promise;
+export function setParquetURLs(
+ urls: Record,
+ opts?: { append?: boolean; addBasePath?: (path: string) => string }
+): Promise;
/**
* Converts an Apache Arrow table to a Javascript array.
diff --git a/packages/lib/universal-sql/src/client-duckdb/browser.js b/packages/lib/universal-sql/src/client-duckdb/browser.js
index 2632efe5a3..27c5b439a5 100644
--- a/packages/lib/universal-sql/src/client-duckdb/browser.js
+++ b/packages/lib/universal-sql/src/client-duckdb/browser.js
@@ -6,7 +6,6 @@ import {
getPlatformFeatures,
VoidLogger
} from '@duckdb/duckdb-wasm';
-import { addBasePath } from '@evidence-dev/sdk/utils/svelte';
export { tableFromIPC } from 'apache-arrow';
@@ -106,10 +105,10 @@ export async function emptyDbFs(targetGlob) {
/**
* Adds a new view to the database, pointing to the provided parquet URL.
* @param {Record} urls
- * @param {boolean} [append]
+ * @param {{ append?: boolean, addBasePath?: (path: string) => string }} [opts]
* @returns {Promise}
*/
-export async function setParquetURLs(urls, append = false) {
+export async function setParquetURLs(urls, { append, addBasePath = (x) => x } = {}) {
if (!db) await initDB();
if (!append) await emptyDbFs('*');
if (import.meta.env.VITE_EVIDENCE_DEBUG) console.debug('Updating Parquet URLs');
@@ -142,6 +141,7 @@ export async function setParquetURLs(urls, append = false) {
resolveTables();
} catch (e) {
rejectTables(e);
+ console.error(`Error encountered while updating Parquet URLs`, e);
throw e;
}
}
@@ -150,7 +150,7 @@ export async function setParquetURLs(urls, append = false) {
* Queries the database with the given SQL statement.
*
* @param {string} sql
- * @returns {Promise}
+ * @returns {Promise[]>}
*/
export async function query(sql) {
// After this point, the database has been initialized
diff --git a/packages/lib/universal-sql/src/client-duckdb/node-async.d.ts b/packages/lib/universal-sql/src/client-duckdb/node-async.d.ts
deleted file mode 100644
index cf84ea22bb..0000000000
--- a/packages/lib/universal-sql/src/client-duckdb/node-async.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Initializes the database.
- *
- * @returns {Promise}
- */
-export async function initDB(): Promise;
-
-/**
- * Queries the database with the given SQL statement.
- *
- * @param {string} sql
- * @returns {Promise}
- */
-export function query(sql: string): Promise | null>;
diff --git a/packages/lib/universal-sql/src/client-duckdb/node-async.js b/packages/lib/universal-sql/src/client-duckdb/node-async.js
deleted file mode 100644
index 93a547f65e..0000000000
--- a/packages/lib/universal-sql/src/client-duckdb/node-async.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import { AsyncDuckDB, ConsoleLogger, selectBundle } from '@duckdb/duckdb-wasm';
-import { createRequire } from 'module';
-import { dirname, resolve } from 'path';
-import Worker from 'web-worker';
-
-const require = createRequire(import.meta.url);
-const DUCKDB_DIST = dirname(require.resolve('@duckdb/duckdb-wasm'));
-
-/** @type {AsyncDuckDB} */
-let db;
-
-/** @type {Awaited>} */
-let connection;
-
-/**
- * Initializes the database.
- *
- * @returns {Promise}
- */
-export async function initDB() {
- // If the database is already available, don't do anything
- if (db) return;
-
- const DUCKDB_BUNDLES = await selectBundle({
- mvp: {
- mainModule: resolve(DUCKDB_DIST, './duckdb-mvp.wasm'),
- mainWorker: resolve(DUCKDB_DIST, './duckdb-node-mvp.worker.cjs')
- },
- eh: {
- mainModule: resolve(DUCKDB_DIST, './duckdb-eh.wasm'),
- mainWorker: resolve(DUCKDB_DIST, './duckdb-node-eh.worker.cjs')
- }
- });
- const logger = new ConsoleLogger();
- const worker = new Worker(DUCKDB_BUNDLES.mainWorker);
-
- // and synchronous database
- db = new AsyncDuckDB(logger, worker);
- await db.instantiate(DUCKDB_BUNDLES.mainModule);
- await db.open({ query: { castBigIntToDouble: true, castTimestampToDate: true } });
- connection = await db.connect();
-}
-
-/**
- * Queries the database with the given SQL statement.
- *
- * @param {string} sql
- * @returns {Promise}
- */
-export async function query(sql) {
- return connection.query(sql);
-}
diff --git a/packages/lib/universal-sql/src/client-duckdb/node.d.ts b/packages/lib/universal-sql/src/client-duckdb/node.d.ts
index 97909e6fbf..779ea3ee2b 100644
--- a/packages/lib/universal-sql/src/client-duckdb/node.d.ts
+++ b/packages/lib/universal-sql/src/client-duckdb/node.d.ts
@@ -19,21 +19,21 @@ export function updateSearchPath(schemas): Promise;
*
* @param {string} sql
* @param {{ route_hash: string, query_name: string, prerendering: boolean }} [cache_options]
- * @returns {import('apache-arrow').Table | null}
+ * @returns {Record}
*/
export function query(
sql: string,
cache_options?: { route_hash: string; query_name: string; prerendering: boolean }
-): import('apache-arrow').Table | null;
+): Record[];
/**
* Adds a new view to the database, pointing to the provided parquet URLs.
*
* @param {Record} urls
- * @param {boolean} [append]
+ * @param {{ append?: boolean }} [opts]
* @returns {void}
*/
-export function setParquetURLs(urls: Record, append?: boolean): void;
+export function setParquetURLs(urls: Record, opts?: { append?: boolean }): void;
/**
* Converts an Apache Arrow table to a Javascript array.
diff --git a/packages/lib/universal-sql/src/client-duckdb/node.js b/packages/lib/universal-sql/src/client-duckdb/node.js
index 54e20e507d..62ed790611 100644
--- a/packages/lib/universal-sql/src/client-duckdb/node.js
+++ b/packages/lib/universal-sql/src/client-duckdb/node.js
@@ -103,10 +103,10 @@ export async function emptyDbFs(targetGlob) {
* Adds a new view to the database, pointing to the provided parquet URLs.
*
* @param {Record} urls
- * @param {boolean} [append]
+ * @param {{ append?: boolean }} [opts]
* @returns {void}
*/
-export async function setParquetURLs(urls, append = false) {
+export async function setParquetURLs(urls, { append } = {}) {
if (!append) await emptyDbFs('*');
const pathDelimiterRegex = /[\\/]/;
diff --git a/packages/ui/core-components/.storybook/main.js b/packages/ui/core-components/.storybook/main.js
index 958ee22932..47b31ed6cc 100644
--- a/packages/ui/core-components/.storybook/main.js
+++ b/packages/ui/core-components/.storybook/main.js
@@ -15,8 +15,10 @@ const config = {
builder: '@storybook/builder-vite'
},
async viteFinal(config) {
+ // This was being weird about the imports, so we did it dynamically
+ const tailwindcss = (await import('@tailwindcss/vite')).default;
return mergeConfig(config, {
- plugins: [evidenceThemes()],
+ plugins: [tailwindcss(), evidenceThemes()],
server: {
fs: {
strict: false
diff --git a/packages/ui/core-components/.storybook/preview.js b/packages/ui/core-components/.storybook/preview.js
index 50c32f27a7..33cae35d5b 100644
--- a/packages/ui/core-components/.storybook/preview.js
+++ b/packages/ui/core-components/.storybook/preview.js
@@ -1,6 +1,6 @@
-import { withThemeByDataAttribute } from '@storybook/addon-themes';
+import { withThemeByClassName } from '@storybook/addon-themes';
-import '../src/app.postcss';
+import '../src/app.css';
import WithEvidence from '../src/lib/storybook-helpers/WithEvidence.svelte';
import { initialize } from '../src/lib/storybook-helpers/initializeUSQL.js';
@@ -23,12 +23,11 @@ const preview = {
series: { table: { disable: true } }
},
decorators: [
- withThemeByDataAttribute({
+ withThemeByClassName({
themes: {
- light: 'light',
- dark: 'dark'
+ light: 'theme-light',
+ dark: 'theme-dark'
},
- attributeName: 'data-theme',
defaultTheme: 'light'
}),
() => WithEvidence
diff --git a/packages/ui/core-components/package.json b/packages/ui/core-components/package.json
index 18c3fd8ba2..c244720f1c 100644
--- a/packages/ui/core-components/package.json
+++ b/packages/ui/core-components/package.json
@@ -94,9 +94,10 @@
"@sveltejs/kit": "2.8.4",
"@sveltejs/package": "^2.3.1",
"@sveltejs/vite-plugin-svelte": "3.0.2",
+ "@tailwindcss/vite": "^4.0.0",
"@types/chroma-js": "^2.4.4",
"@types/lodash.debounce": "^4.0.9",
- "@vitest/coverage-v8": "2.0.5",
+ "@vitest/coverage-v8": "3.0.5",
"autoprefixer": "^10.4.19",
"chromatic": "^11.4.0",
"eslint": "8.45.0",
@@ -104,8 +105,6 @@
"eslint-plugin-storybook": "^0.8.0",
"eslint-plugin-svelte": "2.35.1",
"mockdate": "^3.0.5",
- "postcss": "^8.4.38",
- "postcss-load-config": "^4.0.2",
"prettier": "^3.2.5",
"prettier-plugin-svelte": "^3.2.3",
"publint": "^0.1.16",
@@ -115,11 +114,11 @@
"svelte": "4.2.19",
"svelte-check": "3.6.7",
"svelte-preprocess": "5.1.3",
- "tailwindcss": "^3.4.3",
+ "tailwindcss": "^4.0.0",
"tslib": "^2.6.2",
"typescript": "5.4.2",
"vite": "5.4.14",
- "vitest": "2.0.5"
+ "vitest": "^2.1.9"
},
"overrides": {
"svelte2tsx": "^0.6.15"
@@ -141,4 +140,4 @@
},
"readme": "ERROR: No README data found!",
"_id": "@evidence-dev/core-components@0.0.1"
-}
\ No newline at end of file
+}
diff --git a/packages/ui/core-components/postcss.config.cjs b/packages/ui/core-components/postcss.config.cjs
deleted file mode 100644
index 6293c3dc90..0000000000
--- a/packages/ui/core-components/postcss.config.cjs
+++ /dev/null
@@ -1,11 +0,0 @@
-const config = {
- plugins: [
- require('tailwindcss/nesting')(),
- //Some plugins, like tailwindcss/nesting, need to run before Tailwind,
- require('tailwindcss')(),
- //But others, like autoprefixer, need to run after,
- require('autoprefixer')
- ]
-};
-
-module.exports = config;
diff --git a/packages/ui/core-components/src/app.css b/packages/ui/core-components/src/app.css
new file mode 100644
index 0000000000..77d1360795
--- /dev/null
+++ b/packages/ui/core-components/src/app.css
@@ -0,0 +1,21 @@
+/* Write your global styles here, in PostCSS syntax */
+@import 'tailwindcss';
+@config "@evidence-dev/tailwind/config";
+
+/*
+ The default border color has changed to `currentColor` in Tailwind CSS v4,
+ so we've added these compatibility styles to make sure everything still
+ looks the same as it did with Tailwind CSS v3.
+
+ If we ever want to remove these styles, we need to add an explicit border
+ color utility to any element that depends on these defaults.
+*/
+@layer base {
+ *,
+ ::after,
+ ::before,
+ ::backdrop,
+ ::file-selector-button {
+ border-color: var(--color-gray-200, currentColor);
+ }
+}
diff --git a/packages/ui/core-components/src/app.postcss b/packages/ui/core-components/src/app.postcss
deleted file mode 100644
index 1a7b7cf38b..0000000000
--- a/packages/ui/core-components/src/app.postcss
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Write your global styles here, in PostCSS syntax */
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
diff --git a/packages/ui/core-components/src/lib/atoms/alert/Alert.svelte b/packages/ui/core-components/src/lib/atoms/alert/Alert.svelte
index b4fd5f3582..b9cd92c91b 100644
--- a/packages/ui/core-components/src/lib/atoms/alert/Alert.svelte
+++ b/packages/ui/core-components/src/lib/atoms/alert/Alert.svelte
@@ -18,6 +18,13 @@
}
return input;
};
+
+ const classMap = {
+ info: 'border-info/50 bg-info/10 text-info',
+ negative: 'border-negative/50 bg-negative/10 text-negative',
+ positive: 'border-positive/50 bg-positive/10 text-positive',
+ warning: 'border-warning/50 bg-warning/10 text-warning'
+ };
- const outlines = [false, true];
+
+ {#each variants as variant}
+
+ {variant}
+
+
+ {#each sizes as size}
+
+
+
+ {size}
+
+
+ {/each}
+
+ {/each}
+
- const disableds = [false, true];
-
+
+ {#each variants as variant}
+
+ {variant}
+
+
+ {#each sizes as size}
+
+
+
+ {size}
+
+
+ {/each}
+
+ {/each}
+
-
-
-
- {#each outlines as outline}
-
outline={outline}
- {/each}
- {#each variants as variant}
- {#each disableds as disabled}
-
disabled={disabled}
- {#each outlines as outline}
-
- {#each sizes as size}
-
-
-
- {/each}
-
- {/each}
+
+ {#each variants as variant}
+
+ {variant}
+
+
+ {#each sizes as size}
+
+
+
+ {size}
+
+
{/each}
- {/each}
-
-
+
+ {/each}
+
+
+
+ {#each variants as variant}
+
+ {variant}
+
+
+ {#each sizes as size}
+
+
+
+ {size}
+
+
+ {/each}
+
+ {/each}
+
+
+
+
+ class='w-full mt-6'
+
+ {#each variants as variant}
+
+ {/each}
diff --git a/packages/ui/core-components/src/lib/atoms/button/Button.svelte b/packages/ui/core-components/src/lib/atoms/button/Button.svelte
index ee11108aff..66edc6ad69 100644
--- a/packages/ui/core-components/src/lib/atoms/button/Button.svelte
+++ b/packages/ui/core-components/src/lib/atoms/button/Button.svelte
@@ -1,47 +1,11 @@
-
-
diff --git a/packages/ui/core-components/src/lib/atoms/content-box/ContentBox.svelte b/packages/ui/core-components/src/lib/atoms/content-box/ContentBox.svelte
index d0b97f3602..954034035c 100644
--- a/packages/ui/core-components/src/lib/atoms/content-box/ContentBox.svelte
+++ b/packages/ui/core-components/src/lib/atoms/content-box/ContentBox.svelte
@@ -10,7 +10,9 @@
-
+
-
diff --git a/packages/ui/core-components/src/lib/molecules/toast/Toast.svelte b/packages/ui/core-components/src/lib/molecules/toast/Toast.svelte
index e995a55d83..a9501c42d0 100644
--- a/packages/ui/core-components/src/lib/molecules/toast/Toast.svelte
+++ b/packages/ui/core-components/src/lib/molecules/toast/Toast.svelte
@@ -15,6 +15,13 @@
}
return status;
};
+
+ const classLookup = {
+ negative: 'border-negative/50 bg-negative/10 text-negative',
+ positive: 'border-positive/50 bg-positive/10 text-positive',
+ info: 'border-info/50 bg-info/10 text-info',
+ warning: 'border-warning/50 bg-warning/10 text-warning'
+ };
-
+
diff --git a/packages/ui/core-components/src/lib/organisms/layout/header/SearchButton.css b/packages/ui/core-components/src/lib/organisms/layout/header/SearchButton.css
deleted file mode 100644
index f42d63eaac..0000000000
--- a/packages/ui/core-components/src/lib/organisms/layout/header/SearchButton.css
+++ /dev/null
@@ -1,16 +0,0 @@
-.DocSearch-Button {
- @apply bg-base-100 border-base-300 hover:bg-base-200/40 transition-colors duration-200 rounded-md flex gap-16 cursor-pointer py-1 pl-2 sm:pr-1 pr-20 sm:text-xs border font-sans font-medium items-center;
-}
-.DocSearch-Button-Placeholder {
- @apply text-base-content-muted;
-}
-.DocSearch-Search-Icon {
- display: none;
-}
-.DocSearch-Button-Keys {
- @apply sm:flex gap-0.5 bg-base-200/40 border-base-300 border rounded px-1 py-0.5 text-xs hidden;
-}
-.DocSearch-Button-Key,
-.DocSearch-Control-Key-Icon {
- @apply text-base-content-muted *:text-base-content-muted;
-}
diff --git a/packages/ui/core-components/src/lib/organisms/layout/sidebar/Badge.svelte b/packages/ui/core-components/src/lib/organisms/layout/sidebar/Badge.svelte
index 20f1357d00..5aac412a7f 100644
--- a/packages/ui/core-components/src/lib/organisms/layout/sidebar/Badge.svelte
+++ b/packages/ui/core-components/src/lib/organisms/layout/sidebar/Badge.svelte
@@ -1,5 +1,5 @@
diff --git a/packages/ui/core-components/src/lib/organisms/layout/tableofcontents/ContentsList.svelte b/packages/ui/core-components/src/lib/organisms/layout/tableofcontents/ContentsList.svelte
index e19e5339aa..3e4156d725 100644
--- a/packages/ui/core-components/src/lib/organisms/layout/tableofcontents/ContentsList.svelte
+++ b/packages/ui/core-components/src/lib/organisms/layout/tableofcontents/ContentsList.svelte
@@ -28,6 +28,12 @@
onDestroy(() => {
observer?.disconnect();
});
+
+ const classLookup = {
+ h1: 'mt-3 font-semibold block bg-base-100 shadow shadow-base-100',
+ h2: 'pl-0 text-base-content-muted',
+ h3: 'pl-4 text-base-content-muted'
+ };
{#if headers && headers.length > 1}
@@ -35,30 +41,13 @@
On this page
{#each headers as header}
-
{/each}
{/if}
-
-
diff --git a/packages/ui/core-components/src/lib/organisms/source-config/NewSourceForm.svelte b/packages/ui/core-components/src/lib/organisms/source-config/NewSourceForm.svelte
index 68c996e285..6819eb37f3 100644
--- a/packages/ui/core-components/src/lib/organisms/source-config/NewSourceForm.svelte
+++ b/packages/ui/core-components/src/lib/organisms/source-config/NewSourceForm.svelte
@@ -1,76 +1,222 @@
-