diff --git a/cli/cli.test.ts b/cli/cli.test.ts index cac7498a..d340d921 100644 --- a/cli/cli.test.ts +++ b/cli/cli.test.ts @@ -6,6 +6,7 @@ import * as os from 'node:os' import * as path from 'node:path' import {expect} from 'vitest' +import {loadConfig, normalizeConfig} from '../lang/config.ts' import {isServerRunning, stopGrapheneIfRunning} from './background.ts' interface RunResult { @@ -56,6 +57,11 @@ async function createTelemetryProject(prefix: string) { } describe('cli package', () => { + it('derives the project name from package.json with a directory fallback', async () => { + expect((await loadConfig(flightDir, () => {})).projectName).toBe('example-flights') + expect(normalizeConfig({root: '/tmp/project-without-package'}).projectName).toBe('project-without-package') + }) + it('directly includes every lang and ui runtime dependency with the exact same spec', async () => { let cli = JSON.parse(await fsp.readFile(path.resolve(dir, '../cli/package.json'), 'utf8')) let lang = JSON.parse(await fsp.readFile(path.resolve(dir, '../lang/package.json'), 'utf8')) diff --git a/cli/serve2.ts b/cli/serve2.ts index dc573bd5..91303122 100644 --- a/cli/serve2.ts +++ b/cli/serve2.ts @@ -295,7 +295,10 @@ function updateWorkspacePlugin(telemetry?: CliTelemetry) { } } - return `export default ${JSON.stringify(res)}` + return ` + export const projectName = ${JSON.stringify(config.projectName)}; + export default ${JSON.stringify(res)} + ` }, configureServer: (s: ViteDevServer) => { let refresh = async () => { diff --git a/cli/telemetry.test.ts b/cli/telemetry.test.ts index fb809826..ca8f17c4 100644 --- a/cli/telemetry.test.ts +++ b/cli/telemetry.test.ts @@ -50,10 +50,10 @@ describe('cli telemetry', () => { let env = process.env.GRAPHENE_TELEMETRY_DISABLED try { delete process.env.GRAPHENE_TELEMETRY_DISABLED - expect(isTelemetryEnabled({dialect: 'duckdb', envFile: ['.env'], ignoredFiles: [], root: '/tmp'}, 'https://example.com')).toBe(true) - expect(isTelemetryEnabled({dialect: 'duckdb', envFile: ['.env'], ignoredFiles: [], root: '/tmp', telemetry: false}, 'https://example.com')).toBe(false) + expect(isTelemetryEnabled({dialect: 'duckdb', envFile: ['.env'], ignoredFiles: [], root: '/tmp', projectName: 'tmp'}, 'https://example.com')).toBe(true) + expect(isTelemetryEnabled({dialect: 'duckdb', envFile: ['.env'], ignoredFiles: [], root: '/tmp', projectName: 'tmp', telemetry: false}, 'https://example.com')).toBe(false) process.env.GRAPHENE_TELEMETRY_DISABLED = '1' - expect(isTelemetryEnabled({dialect: 'duckdb', envFile: ['.env'], ignoredFiles: [], root: '/tmp'}, 'https://example.com')).toBe(false) + expect(isTelemetryEnabled({dialect: 'duckdb', envFile: ['.env'], ignoredFiles: [], root: '/tmp', projectName: 'tmp'}, 'https://example.com')).toBe(false) } finally { if (env === undefined) delete process.env.GRAPHENE_TELEMETRY_DISABLED else process.env.GRAPHENE_TELEMETRY_DISABLED = env diff --git a/cli/updateNotifier.test.ts b/cli/updateNotifier.test.ts index 1c4cdeae..43bb34a2 100644 --- a/cli/updateNotifier.test.ts +++ b/cli/updateNotifier.test.ts @@ -8,7 +8,7 @@ import type {Config} from '../lang/config.ts' import {checkForUpdate, detectPackageManager, getUpgradeCommand, isNewerVersion, isUpdateNotifierEnabled, showCachedUpdateNotice} from './updateNotifier.ts' function testConfig(root: string, overrides: Partial = {}): Config { - return {dialect: 'duckdb', envFile: ['.env'], ignoredFiles: [], root, ...overrides} + return {dialect: 'duckdb', envFile: ['.env'], ignoredFiles: [], root, ...overrides, projectName: overrides.projectName || path.basename(root)} } function testStderr() { diff --git a/lang/config.ts b/lang/config.ts index f9bfbfa3..dba8d729 100644 --- a/lang/config.ts +++ b/lang/config.ts @@ -4,6 +4,7 @@ import path from 'path' export interface Config { root: string + projectName: string dialect: string defaultNamespace?: string ignoredFiles: string[] @@ -69,7 +70,7 @@ export interface Config { } } -export type ConfigInput = Omit & { +export type ConfigInput = Omit & { root?: string dialect?: Config['dialect'] ignoredFiles?: Config['ignoredFiles'] @@ -79,13 +80,15 @@ export type ConfigInput = Omit delete config[key]) - Object.assign(config, normalizeConfig(cfg)) + if ('projectName' in cfg) projectName ||= cfg.projectName + Object.assign(config, normalizeConfig(cfg, process.cwd(), projectName)) } -export function normalizeConfig(input: ConfigInput, defaultRoot = process.cwd()): Config { +export function normalizeConfig(input: ConfigInput, defaultRoot = process.cwd(), projectName?: string): Config { let cfg = {...input} + let root = path.resolve(cfg.root || defaultRoot) if (cfg.namespace && !cfg.defaultNamespace) cfg.defaultNamespace = cfg.namespace let dialect = cfg.dialect || 'duckdb' @@ -103,7 +106,8 @@ export function normalizeConfig(input: ConfigInput, defaultRoot = process.cwd()) return { ...cfg, dialect, - root: path.resolve(cfg.root || defaultRoot), + root, + projectName: projectName || path.basename(root), port: cfg.port || Number(process.env.GRAPHENE_PORT) || 4000, ignoredFiles: cfg.ignoredFiles || [], envFile, @@ -121,7 +125,8 @@ export async function loadConfig(dir: string, envLoader: (envFiles: string[]) => } let txt = await readFile(path.join(configDir, 'package.json'), 'utf8') - let graphene = JSON.parse(txt).graphene + let pkgJson = JSON.parse(txt) + let graphene = pkgJson.graphene if (!graphene || typeof graphene != 'object' || Array.isArray(graphene)) { throw new Error(`No graphene config found in ${path.join(configDir, 'package.json')}`) } @@ -130,6 +135,6 @@ export async function loadConfig(dir: string, envLoader: (envFiles: string[]) => let envFiles = Array.isArray(graphene.envFile) ? graphene.envFile : [graphene.envFile || '.env'] envLoader(envFiles.map(file => path.resolve(configDir, file))) - let cfg = normalizeConfig({...graphene, root: configDir}, configDir) + let cfg = normalizeConfig({...graphene, root: configDir}, configDir, pkgJson.name) return cfg } diff --git a/ui/internal/LocalApp.svelte b/ui/internal/LocalApp.svelte index 64d1fd47..c3dd760f 100644 --- a/ui/internal/LocalApp.svelte +++ b/ui/internal/LocalApp.svelte @@ -1,7 +1,7 @@