diff --git a/apps/e2e/.env.example b/apps/e2e/.env.example new file mode 100644 index 00000000..6ff2bb6c --- /dev/null +++ b/apps/e2e/.env.example @@ -0,0 +1,8 @@ +# ------------------------------------------------------------------------------ +# This is an example .env file. +# +# All of these environment vars must be defined either in your environment or in +# a local .env file in order to run this project. +# ------------------------------------------------------------------------------ + +# TODO diff --git a/apps/e2e/package.json b/apps/e2e/package.json new file mode 100644 index 00000000..5cb33918 --- /dev/null +++ b/apps/e2e/package.json @@ -0,0 +1,25 @@ +{ + "name": "@agentic/platform-e2e-tests", + "private": true, + "version": "0.1.0", + "description": "Internal Agentic platform E2E tests.", + "author": "Travis Fischer ", + "license": "UNLICENSED", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic-platform.git", + "directory": "apps/e2e" + }, + "type": "module", + "scripts": { + "test": "run-s test:*", + "test:lint": "eslint .", + "test:typecheck": "tsc --noEmit", + "test:e2e": "vitest run" + }, + "devDependencies": { + "@agentic/platform": "workspace:*", + "@agentic/platform-api-client": "workspace:*", + "@agentic/platform-fixtures": "workspace:*" + } +} diff --git a/apps/e2e/src/e2e.test.ts b/apps/e2e/src/e2e.test.ts new file mode 100644 index 00000000..923cbfdc --- /dev/null +++ b/apps/e2e/src/e2e.test.ts @@ -0,0 +1,63 @@ +import 'dotenv/config' + +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +import { loadAgenticConfig } from '@agentic/platform' +import { AgenticApiClient } from '@agentic/platform-api-client' +import { describe, expect, test } from 'vitest' + +const fixtures = [ + 'basic-raw-free-ts', + 'basic-raw-free-json', + 'pricing-freemium', + 'pricing-pay-as-you-go', + 'pricing-3-plans', + 'pricing-monthly-annual', + 'pricing-custom-0' +] + +const fixturesDir = path.join( + fileURLToPath(import.meta.url), + '..', + '..', + '..', + '..', + 'packages', + 'fixtures' +) +const validFixturesDir = path.join(fixturesDir, 'valid') +console.log(validFixturesDir) + +describe('loadAgenticConfig', () => { + for (const fixture of fixtures) { + test( + `${fixture}`, + { + timeout: 60_000 + }, + async () => { + const fixtureDir = path.join(validFixturesDir, fixture) + + const config = await loadAgenticConfig({ cwd: fixtureDir }) + expect(config).toMatchSnapshot() + } + ) + } + + for (const fixture of invalidFixtures) { + test( + `invalid: ${fixture}`, + { + timeout: 60_000 + }, + async () => { + const fixtureDir = path.join(invalidFixturesDir, fixture) + + await expect( + loadAgenticConfig({ cwd: fixtureDir }) + ).rejects.toThrowErrorMatchingSnapshot() + } + ) + } +}) diff --git a/apps/e2e/tsconfig.json b/apps/e2e/tsconfig.json new file mode 100644 index 00000000..6631568d --- /dev/null +++ b/apps/e2e/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "include": ["src", "*.config.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/apps/e2e/tsup.config.ts b/apps/e2e/tsup.config.ts new file mode 100644 index 00000000..d468120a --- /dev/null +++ b/apps/e2e/tsup.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'tsup' + +export default defineConfig([ + { + entry: ['src/server.ts'], + outDir: 'dist', + target: 'node18', + platform: 'node', + format: ['esm'], + splitting: false, + sourcemap: true, + minify: false, + shims: true, + dts: true + } +]) diff --git a/apps/e2e/vitest.config.ts b/apps/e2e/vitest.config.ts new file mode 100644 index 00000000..ed9bf14b --- /dev/null +++ b/apps/e2e/vitest.config.ts @@ -0,0 +1,12 @@ +import tsconfigPaths from 'vite-tsconfig-paths' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [tsconfigPaths()], + test: { + environment: 'node', + globals: true, + watch: false, + restoreMocks: true + } +}) diff --git a/apps/gateway/src/lib/get-request-cache-key.ts b/apps/gateway/src/lib/get-request-cache-key.ts index 66b6a5b1..6b616fe5 100644 --- a/apps/gateway/src/lib/get-request-cache-key.ts +++ b/apps/gateway/src/lib/get-request-cache-key.ts @@ -38,10 +38,10 @@ export async function getRequestCacheKey( // TODO: gracefully handle content-encoding compression // TODO: more robust content-type detection - if (type?.includes('json')) { + if (type.includes('json')) { const bodyJson: any = await request.clone().json() hash = hashObject(bodyJson) - } else if (type?.includes('text/')) { + } else if (type.includes('text/')) { const bodyString = await request.clone().text() hash = await sha256(bodyString) } else { diff --git a/packages/cli/package.json b/packages/cli/package.json index 14af1a18..554f1e39 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -20,8 +20,7 @@ "scripts": { "test": "run-s test:*", "test:lint": "eslint .", - "test:typecheck": "tsc --noEmit", - "test:unit": "vitest run" + "test:typecheck": "tsc --noEmit" }, "dependencies": { "@agentic/platform": "workspace:*", @@ -39,11 +38,9 @@ "open": "catalog:", "ora": "catalog:", "restore-cursor": "catalog:", - "semver": "catalog:", - "unconfig": "catalog:" + "semver": "catalog:" }, "devDependencies": { - "@agentic/platform-fixtures": "workspace:*", "@commander-js/extra-typings": "catalog:", "@types/semver": "catalog:" }, diff --git a/packages/cli/src/commands/debug.ts b/packages/cli/src/commands/debug.ts index 32a10917..5b7aced6 100644 --- a/packages/cli/src/commands/debug.ts +++ b/packages/cli/src/commands/debug.ts @@ -1,9 +1,9 @@ +import { loadAgenticConfig } from '@agentic/platform' import { Command } from 'commander' import { oraPromise } from 'ora' import type { Context } from '../types' import { AuthStore } from '../lib/auth-store' -import { loadAgenticConfig } from '../lib/load-agentic-config' export function registerDebugCommand({ program, logger }: Context) { const command = new Command('debug') diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts index 146dcc7b..a3ef435f 100644 --- a/packages/cli/src/commands/deploy.ts +++ b/packages/cli/src/commands/deploy.ts @@ -1,9 +1,9 @@ +import { loadAgenticConfig } from '@agentic/platform' import { Command } from 'commander' import { oraPromise } from 'ora' import type { Context } from '../types' import { AuthStore } from '../lib/auth-store' -import { loadAgenticConfig } from '../lib/load-agentic-config' export function registerDeployCommand({ client, program, logger }: Context) { const command = new Command('deploy') diff --git a/packages/cli/src/lib/resolve-deployment.ts b/packages/cli/src/lib/resolve-deployment.ts index 9131c012..1d9f53cc 100644 --- a/packages/cli/src/lib/resolve-deployment.ts +++ b/packages/cli/src/lib/resolve-deployment.ts @@ -1,8 +1,8 @@ import type { AgenticApiClient } from '@agentic/platform-api-client' import type { Deployment } from '@agentic/platform-types' +import { loadAgenticConfig } from '@agentic/platform' import { AuthStore } from './auth-store' -import { loadAgenticConfig } from './load-agentic-config' export async function resolveDeployment({ client, diff --git a/packages/platform/package.json b/packages/platform/package.json index 64df0bae..1315dabf 100644 --- a/packages/platform/package.json +++ b/packages/platform/package.json @@ -19,7 +19,8 @@ "scripts": { "test": "run-s test:*", "test:lint": "eslint .", - "test:typecheck": "tsc --noEmit" + "test:typecheck": "tsc --noEmit", + "test:unit": "vitest run" }, "dependencies": { "@agentic/platform-core": "workspace:*", @@ -29,6 +30,7 @@ "@hono/zod-openapi": "catalog:", "@modelcontextprotocol/sdk": "catalog:", "semver": "catalog:", + "unconfig": "catalog:", "zod": "catalog:" }, "devDependencies": { diff --git a/packages/cli/src/lib/__snapshots__/load-agentic-config.test.ts.snap b/packages/platform/src/__snapshots__/load-agentic-config.test.ts.snap similarity index 100% rename from packages/cli/src/lib/__snapshots__/load-agentic-config.test.ts.snap rename to packages/platform/src/__snapshots__/load-agentic-config.test.ts.snap diff --git a/packages/platform/src/index.ts b/packages/platform/src/index.ts index 71906c08..4496a066 100644 --- a/packages/platform/src/index.ts +++ b/packages/platform/src/index.ts @@ -1,4 +1,5 @@ export * from './define-config' +export * from './load-agentic-config' export * from './resolve-agentic-project-config' export * from './validate-agentic-project-config' export { defaultFreePricingPlan } from '@agentic/platform-types' diff --git a/packages/cli/src/lib/load-agentic-config.test.ts b/packages/platform/src/load-agentic-config.test.ts similarity index 99% rename from packages/cli/src/lib/load-agentic-config.test.ts rename to packages/platform/src/load-agentic-config.test.ts index 8e6eb36e..81c86ac0 100644 --- a/packages/cli/src/lib/load-agentic-config.test.ts +++ b/packages/platform/src/load-agentic-config.test.ts @@ -39,7 +39,6 @@ const fixturesDir = path.join( '..', '..', '..', - '..', 'fixtures' ) diff --git a/packages/cli/src/lib/load-agentic-config.ts b/packages/platform/src/load-agentic-config.ts similarity index 85% rename from packages/cli/src/lib/load-agentic-config.ts rename to packages/platform/src/load-agentic-config.ts index 9495314b..480c08f3 100644 --- a/packages/cli/src/lib/load-agentic-config.ts +++ b/packages/platform/src/load-agentic-config.ts @@ -1,7 +1,8 @@ import type { AgenticProjectConfig } from '@agentic/platform-types' -import { validateAgenticProjectConfig } from '@agentic/platform' import { loadConfig } from 'unconfig' +import { validateAgenticProjectConfig } from './validate-agentic-project-config' + export async function loadAgenticConfig({ cwd }: { diff --git a/packages/platform/src/parse-agentic-project-config.ts b/packages/platform/src/parse-agentic-project-config.ts index 7d37dce8..147c1c81 100644 --- a/packages/platform/src/parse-agentic-project-config.ts +++ b/packages/platform/src/parse-agentic-project-config.ts @@ -7,10 +7,10 @@ import { resolvedAgenticProjectConfigSchema } from '@agentic/platform-types' -// NOTE: The extra typing and cast here are necessary because we're -// overriding the default zod types for some fields (e.g. `pricingPlans`) in -// order to get stricter TypeScript types than what zod v3 allows (nested -// discrimianted unions). This should be removed once we upgrade to zod v4. +// NOTE: The extra typing and casts here are necessary because we're overriding +// the default zod types for some fields (e.g. `pricingPlans`) in order to get +// stricter TypeScript types than what zod v3 allows (nested discrimianted +// unions). We should consider removing these once we upgrade to zod v4. /** * @internal @@ -20,7 +20,7 @@ export function parseAgenticProjectConfig( { strip = false, strict = false }: { strip?: boolean; strict?: boolean } = {} ): AgenticProjectConfig { return parseZodSchema< - z.infer, + z.output, ZodTypeDef, z.input >( @@ -41,7 +41,7 @@ export function parseResolvedAgenticProjectConfig( { strip = false, strict = false }: { strip?: boolean; strict?: boolean } = {} ): ResolvedAgenticProjectConfig { return parseZodSchema< - z.infer, + z.output, ZodTypeDef, z.input >( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f06b1747..776684dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -343,6 +343,18 @@ importers: specifier: 'catalog:' version: 0.43.1(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(kysely@0.28.2)(postgres@3.4.7) + apps/e2e: + devDependencies: + '@agentic/platform': + specifier: workspace:* + version: link:../../packages/platform + '@agentic/platform-api-client': + specifier: workspace:* + version: link:../../packages/api-client + '@agentic/platform-fixtures': + specifier: workspace:* + version: link:../../packages/fixtures + apps/gateway: dependencies: '@agentic/platform': @@ -451,13 +463,7 @@ importers: semver: specifier: 'catalog:' version: 7.7.2 - unconfig: - specifier: 'catalog:' - version: 7.3.2 devDependencies: - '@agentic/platform-fixtures': - specifier: workspace:* - version: link:../fixtures '@commander-js/extra-typings': specifier: 'catalog:' version: 14.0.0(commander@14.0.0) @@ -538,6 +544,9 @@ importers: semver: specifier: 'catalog:' version: 7.7.2 + unconfig: + specifier: 'catalog:' + version: 7.3.2 zod: specifier: 'catalog:' version: 3.25.36 diff --git a/readme.md b/readme.md index 1a54cbde..c0e394c8 100644 --- a/readme.md +++ b/readme.md @@ -51,6 +51,8 @@ - add support for caching - add support for custom headers on responses - signed requests +- revisit deployment identifiers so possibly be URL-friendly? +- rename parseFaasIdentifier and move validators package into platform-types ## License