This commit is contained in:
Morten Olsen
2025-09-08 22:22:40 +02:00
commit 1b02bc8e81
30 changed files with 5459 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
{
"name": "@morten-olsen/fluxcurrent-configs",
"version": "1.0.0"
}

View File

@@ -0,0 +1,20 @@
{
"compilerOptions": {
"target": "ESNext",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"strict": true,
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
"skipLibCheck": true,
"noEmit": true,
"jsx": "react-jsx",
"isolatedModules": true,
"verbatimModuleSyntax": true,
"erasableSyntaxOnly": true,
"allowImportingTsExtensions": true
}
}

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

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

View File

@@ -0,0 +1,38 @@
{
"type": "module",
"main": "src/exports.ts",
"scripts": {
"build": "tsc --build",
"test:unit": "vitest --run --passWithNoTests",
"test": "pnpm run \"/^test:/\""
},
"packageManager": "pnpm@10.6.0",
"files": [
"src"
],
"exports": {
".": "./src/exports.ts",
"./*": "./src/*"
},
"imports": {
"#root/*": "./src/*"
},
"devDependencies": {
"@morten-olsen/fluxcurrent-configs": "workspace:*",
"@morten-olsen/fluxcurrent-tests": "workspace:*",
"@types/node": "24.3.1",
"@vitest/coverage-v8": "3.2.4",
"typescript": "5.9.2",
"vitest": "3.2.4"
},
"name": "@morten-olsen/fluxcurrent-core",
"version": "1.0.0",
"imports": {
"#root/*": "./src/*"
},
"dependencies": {
"knex": "^3.1.0",
"pg": "^8.16.3",
"zod": "^4.1.5"
}
}

View File

View File

View File

@@ -0,0 +1,93 @@
import { z } from 'zod';
const metaValueSchema = z.union([z.string(), z.number(), z.boolean()]);
const documentSchema = z.object({
uri: z.string(),
created: z.iso.datetime(),
updated: z.iso.datetime(),
deleted: z.iso.datetime().nullish(),
type: z.string(),
title: z.string().nullish(),
description: z.string().nullish(),
tags: z.array(z.string()),
metadata: z.record(z.string(), metaValueSchema),
data: z.record(z.string(), z.unknown()),
});
type Document = z.infer<typeof Document>;
const documentUpsertSchema = documentSchema.omit({
created: true,
updated: true,
deleted: true,
});
type DocumentUpsert = z.infer<typeof documentUpsertSchema>;
const metaDateFilterSchema = z.object({
type: z.literal('date'),
field: z.string(),
filter: z.object({
gt: z.iso.datetime().optional(),
gte: z.iso.datetime().optional(),
lt: z.iso.datetime().optional(),
lte: z.iso.datetime().optional(),
nill: z.boolean().optional(),
}),
});
const metaNumberFilterSchema = z.object({
type: z.literal('number'),
field: z.string(),
filter: z.object({
gt: z.number().optional(),
gte: z.number().optional(),
lt: z.number().optional(),
lte: z.number().optional(),
eq: z.number().optional(),
neq: z.number().optional(),
nill: z.boolean().optional(),
}),
});
const metaTextFilterSchema = z.object({
type: z.literal('text'),
field: z.string(),
filter: z.object({
eq: z.string().optional(),
neq: z.string().optional(),
like: z.string().optional(),
nlike: z.string().optional(),
nill: z.boolean().optional(),
}),
});
const metaBoolFilterSchema = z.object({
type: z.literal('bool'),
field: z.string(),
filter: z.object({
eq: z.boolean(),
nill: z.boolean().optional(),
}),
});
const metaFilterSchema = z.union([
metaDateFilterSchema,
metaNumberFilterSchema,
metaTextFilterSchema,
metaBoolFilterSchema,
]);
type MetaFilter = z.infer<typeof metaFilterSchema>;
const documentSearchOptionsSchema = z.object({
uris: z.array(z.string()).optional(),
types: z.array(z.string()).optional(),
meta: z.array(metaFilterSchema).optional(),
});
type DocumentSearchOptions = z.infer<typeof documentSearchOptionsSchema>;
export type { Document, DocumentUpsert, MetaFilter, DocumentSearchOptions };
export { documentSchema, documentUpsertSchema, metaFilterSchema, documentSearchOptionsSchema };

View File

View File

@@ -0,0 +1,10 @@
{
"compilerOptions": {
"outDir": "./dist",
"paths": {
"#root/*": ["./src"]
}
},
"include": ["src/**/*.ts"],
"extends": "@morten-olsen/fluxcurrent-configs/tsconfig.json"
}

View File

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

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

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

View File

@@ -0,0 +1,27 @@
{
"type": "module",
"main": "dist/exports.js",
"scripts": {
"build": "tsc --build"
},
"packageManager": "pnpm@10.6.0",
"files": [
"dist"
],
"exports": {
".": "./dist/exports.js",
"./vitest": "./dist/vitest.js"
},
"devDependencies": {
"@types/node": "24.3.1",
"@vitest/coverage-v8": "3.2.4",
"typescript": "5.9.2",
"vitest": "3.2.4",
"@morten-olsen/fluxcurrent-configs": "workspace:*"
},
"dependencies": {
"@pnpm/find-workspace-packages": "6.0.9"
},
"name": "@morten-olsen/fluxcurrent-tests",
"version": "1.0.0"
}

View File

@@ -0,0 +1 @@
console.log('Hello World');

View File

@@ -0,0 +1,10 @@
import { resolve } from 'node:path';
import { findWorkspacePackages } from '@pnpm/find-workspace-packages';
const getAliases = async () => {
const packages = await findWorkspacePackages(process.cwd());
return Object.fromEntries(packages.map((pkg) => [pkg.manifest.name, resolve(pkg.dir, 'src', 'exports.ts')]));
};
export { getAliases };

View File

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