chore: improved schema

This commit is contained in:
Morten Olsen
2025-12-10 20:45:02 +01:00
parent d02102977a
commit 5fe99b2c17
14 changed files with 870 additions and 82 deletions

4
packages/client/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
/node_modules/
/dist/
/coverage/
/.env

View File

@@ -0,0 +1,34 @@
{
"type": "module",
"main": "dist/exports.js",
"scripts": {
"build": "tsc --build",
"test:unit": "vitest --run --passWithNoTests",
"test": "pnpm run \"/^test:/\"",
"generate:client": "openapi-typescript http://localhost:3400/docs/openapi.json -o src/__generated__/schema.ts"
},
"packageManager": "pnpm@10.6.0",
"files": [
"dist"
],
"exports": {
".": "./dist/exports.js"
},
"devDependencies": {
"@morten-olsen/stash-configs": "workspace:*",
"@morten-olsen/stash-tests": "workspace:*",
"@types/node": "24.10.2",
"@vitest/coverage-v8": "4.0.15",
"openapi-typescript": "^7.10.1",
"typescript": "5.9.3",
"vitest": "4.0.15"
},
"name": "@morten-olsen/stash-client",
"version": "1.0.0",
"imports": {
"#root/*": "./src/*"
},
"dependencies": {
"openapi-fetch": "^0.15.0"
}
}

View File

@@ -0,0 +1,515 @@
/**
* This file was auto-generated by openapi-typescript.
* Do not make direct changes to the file.
*/
export interface paths {
"/system/ready": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Get system ready state */
get: operations["GET/system/ready"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/documents": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Upsert document */
post: operations["POST/documents"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/document-filters": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Find documents */
post: operations["POST/documents-filters"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/document-chunk-filters": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Find document chunks */
post: operations["POST/documents-chunk-filters"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
}
export type webhooks = Record<string, never>;
export interface components {
schemas: never;
responses: never;
parameters: never;
requestBodies: never;
headers: never;
pathItems: never;
}
export type $defs = Record<string, never>;
export interface operations {
"GET/system/ready": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Default Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
/** @enum {string} */
status: "ok";
};
};
};
};
};
"POST/documents": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: {
content: {
"application/json": {
id?: string | null;
owner?: string | null;
contentType?: string | null;
content?: string | null;
source?: string | null;
sourceId?: string | null;
type?: string;
typeVersion?: number | null;
searchText?: string | null;
metadata?: unknown;
};
};
};
responses: {
/** @description Default Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
/** @enum {string} */
action: "inserted" | "updated" | "skipped";
id: string;
document: {
id: string;
owner: string | null;
/** Format: date-time */
createdAt: string;
/** Format: date-time */
updatedAt: string;
/** Format: date-time */
deletedAt: string | null;
contentType: string | null;
content: string | null;
source: string | null;
sourceId: string | null;
type: string;
typeVersion: number | null;
searchText: string | null;
metadata: unknown;
};
};
};
};
};
};
"POST/documents-filters": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": {
/** @default 0 */
offset?: number;
/** @default 20 */
limit?: number;
condition: (({
/** @enum {string} */
type: "text";
tableName?: string;
field: string[];
conditions: {
equal?: string | null;
notEqual?: string;
like?: string;
notLike?: string;
in?: string[];
notIn?: string[];
};
} | {
/** @enum {string} */
type: "number";
tableName?: string;
field: string[];
conditions: {
equals?: number | null;
notEquals?: number | null;
greaterThan?: number;
greaterThanOrEqual?: number;
lessThan?: number;
lessThanOrEqual?: number;
in?: number[];
notIn?: number[];
};
}) | {
/** @enum {string} */
type: "operator";
/** @enum {string} */
operator: "and" | "or";
conditions: (({
/** @enum {string} */
type: "text";
tableName?: string;
field: string[];
conditions: {
equal?: string | null;
notEqual?: string;
like?: string;
notLike?: string;
in?: string[];
notIn?: string[];
};
} | {
/** @enum {string} */
type: "number";
tableName?: string;
field: string[];
conditions: {
equals?: number | null;
notEquals?: number | null;
greaterThan?: number;
greaterThanOrEqual?: number;
lessThan?: number;
lessThanOrEqual?: number;
in?: number[];
notIn?: number[];
};
}) | {
/** @enum {string} */
type: "operator";
/** @enum {string} */
operator: "and" | "or";
conditions: (({
/** @enum {string} */
type: "text";
tableName?: string;
field: string[];
conditions: {
equal?: string | null;
notEqual?: string;
like?: string;
notLike?: string;
in?: string[];
notIn?: string[];
};
} | {
/** @enum {string} */
type: "number";
tableName?: string;
field: string[];
conditions: {
equals?: number | null;
notEquals?: number | null;
greaterThan?: number;
greaterThanOrEqual?: number;
lessThan?: number;
lessThanOrEqual?: number;
in?: number[];
notIn?: number[];
};
}) | {
/** @enum {string} */
type: "operator";
/** @enum {string} */
operator: "and" | "or";
conditions: ({
/** @enum {string} */
type: "text";
tableName?: string;
field: string[];
conditions: {
equal?: string | null;
notEqual?: string;
like?: string;
notLike?: string;
in?: string[];
notIn?: string[];
};
} | {
/** @enum {string} */
type: "number";
tableName?: string;
field: string[];
conditions: {
equals?: number | null;
notEquals?: number | null;
greaterThan?: number;
greaterThanOrEqual?: number;
lessThan?: number;
lessThanOrEqual?: number;
in?: number[];
notIn?: number[];
};
})[];
})[];
})[];
}) | string;
};
};
};
responses: {
/** @description Default Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: {
id: string;
owner: string | null;
/** Format: date-time */
createdAt: string;
/** Format: date-time */
updatedAt: string;
/** Format: date-time */
deletedAt: string | null;
contentType: string | null;
content: string | null;
source: string | null;
sourceId: string | null;
type: string;
typeVersion: number | null;
searchText: string | null;
metadata: unknown;
}[];
};
};
};
};
};
"POST/documents-chunk-filters": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: {
content: {
"application/json": {
/** @default 20 */
limit?: number;
/** @default 0 */
offset?: number;
semanticText?: string;
conditions?: (({
/** @enum {string} */
type: "text";
tableName?: string;
field: string[];
conditions: {
equal?: string | null;
notEqual?: string;
like?: string;
notLike?: string;
in?: string[];
notIn?: string[];
};
} | {
/** @enum {string} */
type: "number";
tableName?: string;
field: string[];
conditions: {
equals?: number | null;
notEquals?: number | null;
greaterThan?: number;
greaterThanOrEqual?: number;
lessThan?: number;
lessThanOrEqual?: number;
in?: number[];
notIn?: number[];
};
}) | {
/** @enum {string} */
type: "operator";
/** @enum {string} */
operator: "and" | "or";
conditions: (({
/** @enum {string} */
type: "text";
tableName?: string;
field: string[];
conditions: {
equal?: string | null;
notEqual?: string;
like?: string;
notLike?: string;
in?: string[];
notIn?: string[];
};
} | {
/** @enum {string} */
type: "number";
tableName?: string;
field: string[];
conditions: {
equals?: number | null;
notEquals?: number | null;
greaterThan?: number;
greaterThanOrEqual?: number;
lessThan?: number;
lessThanOrEqual?: number;
in?: number[];
notIn?: number[];
};
}) | {
/** @enum {string} */
type: "operator";
/** @enum {string} */
operator: "and" | "or";
conditions: (({
/** @enum {string} */
type: "text";
tableName?: string;
field: string[];
conditions: {
equal?: string | null;
notEqual?: string;
like?: string;
notLike?: string;
in?: string[];
notIn?: string[];
};
} | {
/** @enum {string} */
type: "number";
tableName?: string;
field: string[];
conditions: {
equals?: number | null;
notEquals?: number | null;
greaterThan?: number;
greaterThanOrEqual?: number;
lessThan?: number;
lessThanOrEqual?: number;
in?: number[];
notIn?: number[];
};
}) | {
/** @enum {string} */
type: "operator";
/** @enum {string} */
operator: "and" | "or";
conditions: ({
/** @enum {string} */
type: "text";
tableName?: string;
field: string[];
conditions: {
equal?: string | null;
notEqual?: string;
like?: string;
notLike?: string;
in?: string[];
notIn?: string[];
};
} | {
/** @enum {string} */
type: "number";
tableName?: string;
field: string[];
conditions: {
equals?: number | null;
notEquals?: number | null;
greaterThan?: number;
greaterThanOrEqual?: number;
lessThan?: number;
lessThanOrEqual?: number;
in?: number[];
notIn?: number[];
};
})[];
})[];
})[];
}) | string;
};
};
};
responses: {
/** @description Default Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: {
id: string;
owner: string;
content: string;
metadata: unknown;
distance?: number;
}[];
};
};
};
};
};
}

View File

@@ -0,0 +1,19 @@
import createApiClient from 'openapi-fetch';
import type { paths } from './__generated__/schema.js';
type CreateStashClientOptions = {
baseUrl: string;
};
type StashClient = ReturnType<typeof createApiClient<paths>>;
const createStashClient = (options: CreateStashClientOptions): StashClient => {
const client = createApiClient<paths>({
baseUrl: options.baseUrl,
});
return client;
};
export type { StashClient };
export { createStashClient };

View File

@@ -0,0 +1,9 @@
{
"compilerOptions": {
"outDir": "./dist"
},
"include": [
"src/**/*.ts"
],
"extends": "@morten-olsen/stash-configs/tsconfig.json"
}

View File

@@ -0,0 +1,12 @@
import { defineConfig } from 'vitest/config';
import { getAliases } from '@morten-olsen/stash-tests/vitest';
// eslint-disable-next-line import/no-default-export
export default defineConfig(async () => {
const aliases = await getAliases();
return {
resolve: {
alias: aliases,
},
};
});