@tailorkit/app 0.1.0-beta.3 → 0.1.0-beta.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE.md +74 -0
  2. package/README.md +115 -0
  3. package/dist/chunk-7ZQPXG7O.js +34 -0
  4. package/dist/chunk-PJBDA2RU.js +415 -0
  5. package/dist/chunk-UDXPIO6D.js +618 -0
  6. package/dist/chunk-YX3JURMG.js +262 -0
  7. package/dist/client/connection.d.ts +31 -0
  8. package/dist/client/query-store.d.ts +23 -0
  9. package/dist/client/reference.d.ts +20 -0
  10. package/dist/client/session.d.ts +41 -0
  11. package/dist/client/tools.d.ts +16 -0
  12. package/dist/client-connection.js +16 -0
  13. package/dist/client.d.ts +11 -0
  14. package/dist/client.js +40 -0
  15. package/dist/database/definition.d.ts +8 -0
  16. package/dist/database/schema.d.ts +78 -0
  17. package/dist/database/types.d.ts +8 -0
  18. package/dist/errors.d.ts +6 -0
  19. package/dist/index.d.ts +2 -72
  20. package/dist/index.js +91 -76
  21. package/dist/preact.d.ts +52 -0
  22. package/dist/protocol.d.ts +74 -0
  23. package/dist/protocol.js +30 -0
  24. package/dist/routing.d.ts +34 -0
  25. package/dist/server/builder.d.ts +45 -0
  26. package/dist/server/bundle.d.ts +12 -0
  27. package/dist/server/functions.d.ts +105 -0
  28. package/dist/server/instances.d.ts +17 -0
  29. package/dist/server.d.ts +11 -0
  30. package/dist/server.js +60 -0
  31. package/dist/views.d.ts +126 -0
  32. package/package.json +56 -34
  33. package/LICENSE +0 -674
  34. package/dist/builder/index.d.ts +0 -11
  35. package/dist/builder/index.d.ts.map +0 -1
  36. package/dist/builder/upload-manifest.d.ts +0 -10
  37. package/dist/builder/upload-manifest.d.ts.map +0 -1
  38. package/dist/builder.js +0 -135
  39. package/dist/chunk-7L6ZZHCK.js +0 -26
  40. package/dist/chunk-AGGRUUWG.js +0 -22
  41. package/dist/config/config.d.ts +0 -17
  42. package/dist/config/config.d.ts.map +0 -1
  43. package/dist/config/index.d.ts +0 -2
  44. package/dist/config/index.d.ts.map +0 -1
  45. package/dist/config/loader.d.ts +0 -8
  46. package/dist/config/loader.d.ts.map +0 -1
  47. package/dist/config-loader.js +0 -7
  48. package/dist/config.js +0 -8
  49. package/dist/index.d.ts.map +0 -1
  50. package/dist/preact-version.d.ts +0 -8
  51. package/dist/preact-version.d.ts.map +0 -1
  52. package/src/builder/index.ts +0 -116
  53. package/src/builder/upload-manifest.ts +0 -18
  54. package/src/config/config.ts +0 -24
  55. package/src/config/index.ts +0 -1
  56. package/src/config/loader.ts +0 -35
  57. package/src/index.ts +0 -206
  58. package/src/preact-version.ts +0 -31
@@ -0,0 +1,262 @@
1
+ import {
2
+ AppError
3
+ } from "./chunk-7ZQPXG7O.js";
4
+
5
+ // src/server/functions.ts
6
+ var query = (definition) => Object.freeze({ ...definition, kind: "query" });
7
+ var mutation = (definition) => Object.freeze({ ...definition, kind: "mutation" });
8
+ var action = (definition) => Object.freeze({ ...definition, kind: "action" });
9
+ var isFunction = (value) => typeof value.kind === "string" && typeof value.handler === "function";
10
+ var defineServer = (functions) => {
11
+ for (const [name, value] of Object.entries(functions)) {
12
+ if (!/^[a-zA-Z][a-zA-Z0-9_]{0,63}$/u.test(name)) {
13
+ throw new Error("Invalid function name");
14
+ }
15
+ if (!isFunction(value)) {
16
+ defineServer(value);
17
+ }
18
+ }
19
+ return Object.freeze({ functions });
20
+ };
21
+
22
+ // src/database/definition.ts
23
+ var defineDatabase = (definition) => Object.freeze({ relations: definition.relations });
24
+
25
+ // src/server/builder.ts
26
+ import { z } from "zod";
27
+ var FunctionBuilder = class _FunctionBuilder {
28
+ kind;
29
+ args;
30
+ result;
31
+ calls;
32
+ databaseDefinition;
33
+ constructor(kind, args, result, calls, database) {
34
+ this.kind = kind;
35
+ this.args = args;
36
+ this.result = result;
37
+ this.calls = calls;
38
+ this.databaseDefinition = database;
39
+ }
40
+ input(schema) {
41
+ return new _FunctionBuilder(
42
+ this.kind,
43
+ schema,
44
+ this.result,
45
+ this.calls,
46
+ this.databaseDefinition
47
+ );
48
+ }
49
+ output(schema) {
50
+ return new _FunctionBuilder(
51
+ this.kind,
52
+ this.args,
53
+ schema,
54
+ this.calls,
55
+ this.databaseDefinition
56
+ );
57
+ }
58
+ functions(functions) {
59
+ return new _FunctionBuilder(
60
+ this.kind,
61
+ this.args,
62
+ this.result,
63
+ functions,
64
+ this.databaseDefinition
65
+ );
66
+ }
67
+ database(database) {
68
+ return new _FunctionBuilder(
69
+ this.kind,
70
+ this.args,
71
+ this.result,
72
+ this.calls,
73
+ database
74
+ );
75
+ }
76
+ handler(handler) {
77
+ const metadata = {};
78
+ if (this.databaseDefinition) {
79
+ metadata.database = this.databaseDefinition;
80
+ }
81
+ if (this.result) {
82
+ metadata.result = this.result;
83
+ }
84
+ if (this.kind === "action") {
85
+ metadata.functions = this.calls;
86
+ }
87
+ return (
88
+ /* oxlint-disable typescript/no-unsafe-type-assertion, anti-slop/no-chained-type-assertions -- This builder or fixture preserves the declared capabilities across an erased generic boundary. */
89
+ Object.freeze({
90
+ ...metadata,
91
+ args: this.args,
92
+ handler: (context) => (
93
+ // SAFETY: The adapter reconstructs the same runtime contract, but TypeScript cannot relate the erased generic parameters across this library boundary.
94
+ // oxlint-disable-next-line anti-slop/no-chained-type-assertions -- The adapter reconstructs the same runtime contract, but TypeScript cannot relate the erased generic parameters across this library boundary.
95
+ handler({
96
+ ...context,
97
+ input: context.args
98
+ })
99
+ ),
100
+ kind: this.kind
101
+ })
102
+ );
103
+ }
104
+ };
105
+ var fn = Object.freeze({
106
+ action: new FunctionBuilder("action", z.undefined(), void 0, {}),
107
+ mutation: new FunctionBuilder("mutation", z.undefined(), void 0, {}),
108
+ query: new FunctionBuilder("query", z.undefined(), void 0, {})
109
+ });
110
+
111
+ // src/server/instances.ts
112
+ import { z as z2 } from "zod";
113
+ var addressSchema = z2.object({
114
+ path: z2.string().startsWith("/").max(1024),
115
+ slot: z2.string().min(1).max(255)
116
+ });
117
+ var registeredQueries = (functions) => {
118
+ const queries = {};
119
+ for (const [name, fn2] of Object.entries(functions)) {
120
+ if (isFunction(fn2)) {
121
+ if (fn2.kind === "query") {
122
+ queries[name] = fn2;
123
+ }
124
+ } else {
125
+ const nested = registeredQueries(fn2);
126
+ if (Object.keys(nested).length) {
127
+ queries[name] = nested;
128
+ }
129
+ }
130
+ }
131
+ return queries;
132
+ };
133
+ var withInstanceResolvers = (app, resolvers) => {
134
+ if (Object.hasOwn(app.functions, "_tailorkit")) {
135
+ throw new Error(
136
+ "The _tailorkit function namespace is reserved by TailorKit."
137
+ );
138
+ }
139
+ const queries = registeredQueries(app.functions);
140
+ const registry = /* @__PURE__ */ new Map();
141
+ for (const resolver of resolvers) {
142
+ addressSchema.parse(resolver);
143
+ let paths = registry.get(resolver.slot);
144
+ if (!paths) {
145
+ paths = /* @__PURE__ */ new Map();
146
+ registry.set(resolver.slot, paths);
147
+ }
148
+ if (paths.has(resolver.path)) {
149
+ throw new Error(
150
+ `Duplicate instance resolver for slot "${resolver.slot}" and path "${resolver.path}".`
151
+ );
152
+ }
153
+ const result = z2.array(
154
+ z2.object({
155
+ data: resolver.dataSchema,
156
+ key: z2.string().min(1),
157
+ metadata: z2.record(z2.string(), z2.unknown())
158
+ })
159
+ ).refine(
160
+ (items) => new Set(items.map((item) => item.key)).size === items.length,
161
+ {
162
+ message: "Instance keys must be unique"
163
+ }
164
+ );
165
+ paths.set(resolver.path, { resolver, result });
166
+ }
167
+ const instances = {
168
+ resolve: action({
169
+ args: addressSchema.extend({
170
+ context: z2.record(z2.string(), z2.unknown())
171
+ }),
172
+ functions: queries,
173
+ handler: async ({ args, identity, signal, queries: queriesValue }) => {
174
+ const entry = registry.get(args.slot)?.get(args.path);
175
+ if (!entry) {
176
+ throw new AppError("NOT_FOUND", "Instance resolver not found");
177
+ }
178
+ const value = await entry.resolver.resolve({
179
+ context: args.context,
180
+ identity,
181
+ queries: queriesValue,
182
+ signal
183
+ });
184
+ const result = entry.result.safeParse(value);
185
+ if (!result.success) {
186
+ throw new AppError(
187
+ "INTERNAL_SERVER_ERROR",
188
+ "Invalid function result"
189
+ );
190
+ }
191
+ return result.data;
192
+ }
193
+ })
194
+ };
195
+ const internal = defineServer({ instances });
196
+ return Object.freeze({
197
+ functions: { ...app.functions, _tailorkit: internal.functions }
198
+ });
199
+ };
200
+
201
+ // src/database/schema.ts
202
+ import {
203
+ sqliteTable,
204
+ text as sqliteText,
205
+ integer as sqliteInteger,
206
+ real as sqliteReal
207
+ } from "drizzle-orm/sqlite-core";
208
+ import {
209
+ eq,
210
+ ne,
211
+ gt,
212
+ gte,
213
+ lt,
214
+ lte,
215
+ and,
216
+ or,
217
+ asc,
218
+ desc,
219
+ count,
220
+ isNull,
221
+ isNotNull,
222
+ inArray
223
+ } from "drizzle-orm";
224
+ var table = (name, columns) => {
225
+ if (!/^[a-zA-Z][a-zA-Z0-9_]{0,62}$/u.test(name) || name.startsWith("sqlite_") || name.startsWith("tailorkit_")) {
226
+ throw new Error("Invalid or reserved table name");
227
+ }
228
+ return sqliteTable(name, columns);
229
+ };
230
+ var text = (name = "") => sqliteText(name);
231
+ var integer = (name = "") => sqliteInteger(name);
232
+ var real = (name = "") => sqliteReal(name);
233
+ var boolean = (name = "") => sqliteInteger(name, { mode: "boolean" });
234
+
235
+ export {
236
+ query,
237
+ mutation,
238
+ action,
239
+ defineServer,
240
+ defineDatabase,
241
+ fn,
242
+ withInstanceResolvers,
243
+ table,
244
+ text,
245
+ integer,
246
+ real,
247
+ boolean,
248
+ eq,
249
+ ne,
250
+ gt,
251
+ gte,
252
+ lt,
253
+ lte,
254
+ and,
255
+ or,
256
+ asc,
257
+ desc,
258
+ count,
259
+ isNull,
260
+ isNotNull,
261
+ inArray
262
+ };
@@ -0,0 +1,31 @@
1
+ import { AppError } from "#errors";
2
+ import type { Reference } from "./reference";
3
+ import type { Session } from "./session";
4
+ export type { Session } from "./session";
5
+ export { reference } from "./reference";
6
+ export type { Reference, References } from "./reference";
7
+ export { AppError } from "#errors";
8
+ type InputArguments<I> = undefined extends I ? [args?: I] : [args: I];
9
+ type MutationArguments<I> = undefined extends I ? [args?: I, options?: {
10
+ requestId?: string;
11
+ }] : [args: I, options?: {
12
+ requestId?: string;
13
+ }];
14
+ export interface Client {
15
+ query: <I, O>(reference: Reference<"query", I, O>, ...args: InputArguments<NoInfer<I>>) => Promise<O>;
16
+ mutate: <I, O>(reference: Reference<"mutation", I, O>, ...args: MutationArguments<NoInfer<I>>) => Promise<O>;
17
+ action: <I, O>(reference: Reference<"action", I, O>, ...args: InputArguments<NoInfer<I>>) => Promise<O>;
18
+ subscribe: <I, O>(reference: Reference<"query", I, O>, args: NoInfer<I>, next: (value: O) => void, options?: {
19
+ onError?: (error: AppError) => void;
20
+ }) => () => void;
21
+ close: () => void;
22
+ }
23
+ export declare const createClient: (options?: {
24
+ getSession?: (options: {
25
+ refresh: boolean;
26
+ }) => Promise<Session>;
27
+ connect?: (url: string, protocols: string[]) => WebSocket | Promise<WebSocket>;
28
+ fetch?: typeof fetch;
29
+ retryDelayMs?: number;
30
+ }) => Client;
31
+ export { createSessionProvider, parseSession } from "./session";
@@ -0,0 +1,23 @@
1
+ import type { AppError } from "#errors";
2
+ import type { Client } from "./connection";
3
+ import type { Reference } from "./reference";
4
+ export interface QueryState<T> {
5
+ data: T | undefined;
6
+ error: AppError | null;
7
+ status: "pending" | "success" | "error";
8
+ }
9
+ export declare const pendingQuery: QueryState<never>;
10
+ export declare const serializeInput: (input: unknown) => string;
11
+ /** One subscription per active query/input pair, scoped to this provider's client. */
12
+ export declare class QueryStore {
13
+ readonly state: import("nanostores").PreinitializedWritableAtom<Map<string, QueryState<unknown>>> & object;
14
+ private readonly entries;
15
+ private disposed;
16
+ readonly client: Client;
17
+ private readonly ownsClient;
18
+ private readonly errorHandler;
19
+ constructor(client: Client, ownsClient: boolean, errorHandler?: (error: AppError) => void);
20
+ watch<I, O>(key: string, ref: Reference<"query", I, O>, input: I): () => void;
21
+ dispose(): void;
22
+ onError(error: AppError): void;
23
+ }
@@ -0,0 +1,20 @@
1
+ import type { z } from "zod";
2
+ import type { FunctionResult, Functions } from "#server/functions";
3
+ export interface Reference<K extends "query" | "mutation" | "action", I, O> {
4
+ readonly name: string;
5
+ readonly $types?: {
6
+ kind: K;
7
+ input: I;
8
+ output: O;
9
+ };
10
+ }
11
+ export declare const reference: <K extends "query" | "mutation" | "action", I, O>(name: string, _kind: K) => Reference<K, I, O>;
12
+ export type References<F> = {
13
+ readonly [N in keyof F]: F[N] extends {
14
+ kind: infer K extends "query" | "mutation" | "action";
15
+ args: infer A extends z.ZodType;
16
+ handler: (...args: never[]) => infer _Output;
17
+ } ? Reference<K, z.input<A>, FunctionResult<F[N]>> : F[N] extends Functions ? References<F[N]> : never;
18
+ };
19
+ /** Browser references inferred directly from the server's exported function type. */
20
+ export declare const createApi: <F extends Functions>() => References<F>;
@@ -0,0 +1,41 @@
1
+ import { z } from "zod";
2
+ import type { Identity } from "#server/functions";
3
+ declare const sessionSchema: z.ZodObject<{
4
+ expiresAt: z.ZodNumber;
5
+ identity: z.ZodOptional<z.ZodObject<{
6
+ appId: z.ZodString;
7
+ deploymentId: z.ZodString;
8
+ expiresAt: z.ZodNumber;
9
+ installationId: z.ZodString;
10
+ projectId: z.ZodString;
11
+ scope: z.ZodObject<{
12
+ name: z.ZodString;
13
+ value: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
14
+ }, z.core.$strip>;
15
+ subjectId: z.ZodOptional<z.ZodString>;
16
+ toolUrl: z.ZodString;
17
+ }, z.core.$strip>>;
18
+ subjectId: z.ZodOptional<z.ZodString>;
19
+ token: z.ZodString;
20
+ toolUrl: z.ZodOptional<z.ZodString>;
21
+ url: z.ZodString;
22
+ }, z.core.$strip>;
23
+ export declare const parseSession: (value: Parameters<typeof sessionSchema.parse>[0]) => Session;
24
+ export interface Session {
25
+ toolUrl?: string;
26
+ identity?: Identity;
27
+ subjectId?: string;
28
+ token: string;
29
+ expiresAt: number;
30
+ url: string;
31
+ }
32
+ export declare const sessionRenewalDelay: (session: Session) => number;
33
+ /** Host-owned provider: project credentials never cross into the sandbox. */
34
+ export declare const createSessionProvider: (options: {
35
+ baseUrl: string | URL;
36
+ appId: string;
37
+ fetch?: typeof fetch;
38
+ }) => (input: {
39
+ refresh: boolean;
40
+ }) => Promise<Session>;
41
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { Session } from "./session";
2
+ export interface ToolBridge<TInput = unknown, TOutput = unknown> {
3
+ client: (path: string, input: TInput) => Promise<TOutput>;
4
+ session: (path: string) => Promise<Session>;
5
+ }
6
+ declare global {
7
+ var __tailorkitTools: ToolBridge | undefined;
8
+ var __tailorkitBackendSession: ((options: {
9
+ refresh: boolean;
10
+ }) => Promise<Session>) | undefined;
11
+ }
12
+ export interface TailorKitServerTools {
13
+ }
14
+ export declare const executeServerTool: (session: Session, path: string, input: unknown, request?: typeof fetch, signal?: AbortSignal) => Promise<unknown>;
15
+ /** Generated callers delegate only transport; host/server declarations validate both directions. */
16
+ export declare const callTool: (kind: "client" | "server", path: string, input?: Parameters<ToolBridge["client"]>[1]) => ReturnType<ToolBridge["client"]>;
@@ -0,0 +1,16 @@
1
+ import {
2
+ createClient,
3
+ createSessionProvider,
4
+ parseSession,
5
+ reference
6
+ } from "./chunk-PJBDA2RU.js";
7
+ import {
8
+ AppError
9
+ } from "./chunk-7ZQPXG7O.js";
10
+ export {
11
+ AppError,
12
+ createClient,
13
+ createSessionProvider,
14
+ parseSession,
15
+ reference
16
+ };
@@ -0,0 +1,11 @@
1
+ export * from "./views";
2
+ export * from "./preact";
3
+ export { defineRoute, Route, createFileClient } from "./routing";
4
+ export type { RouteDefinition, ShellProps } from "./routing";
5
+ export { createClient, createSessionProvider, reference, } from "./client/connection";
6
+ export { createApi } from "./client/reference";
7
+ export type { Client, Session, Reference, References, } from "./client/connection";
8
+ export { AppError, appError } from "./errors";
9
+ export type { ErrorCode } from "./errors";
10
+ export { callTool } from "./client/tools";
11
+ export type { TailorKitServerTools, ToolBridge } from "./client/tools";
package/dist/client.js ADDED
@@ -0,0 +1,40 @@
1
+ import {
2
+ ClientProvider,
3
+ Route,
4
+ callTool,
5
+ createFileClient,
6
+ createRemoteComponent,
7
+ defineRoute,
8
+ defineView,
9
+ useAction,
10
+ useMutation,
11
+ useQuery
12
+ } from "./chunk-UDXPIO6D.js";
13
+ import {
14
+ createApi,
15
+ createClient,
16
+ createSessionProvider,
17
+ reference
18
+ } from "./chunk-PJBDA2RU.js";
19
+ import {
20
+ AppError,
21
+ appError
22
+ } from "./chunk-7ZQPXG7O.js";
23
+ export {
24
+ AppError,
25
+ ClientProvider,
26
+ Route,
27
+ appError,
28
+ callTool,
29
+ createApi,
30
+ createClient,
31
+ createFileClient,
32
+ createRemoteComponent,
33
+ createSessionProvider,
34
+ defineRoute,
35
+ defineView,
36
+ reference,
37
+ useAction,
38
+ useMutation,
39
+ useQuery
40
+ };
@@ -0,0 +1,8 @@
1
+ import type { AnyRelations } from "drizzle-orm/relations";
2
+ export interface DatabaseDefinition<R extends AnyRelations = AnyRelations> {
3
+ readonly relations: R;
4
+ }
5
+ /** Configure the installation database with Drizzle relations, which also contain its tables. */
6
+ export declare const defineDatabase: <const R extends AnyRelations>(definition: DatabaseDefinition<R>) => Readonly<{
7
+ relations: R;
8
+ }>;
@@ -0,0 +1,78 @@
1
+ import type { ColumnBuilderBase } from "drizzle-orm";
2
+ export declare const table: <N extends string, C extends Record<string, ColumnBuilderBase>>(name: N, columns: C) => import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
3
+ name: N;
4
+ schema: undefined;
5
+ columns: { [Key in keyof C]: import("drizzle-orm/sqlite-core").SQLiteColumn<{
6
+ name: string;
7
+ tableName: N;
8
+ dataType: C[Key]["_"]["dataType"];
9
+ data: C[Key]["_"] extends infer T ? T extends C[Key]["_"] ? T extends {
10
+ $type: infer U;
11
+ } ? U : T["data"] : never : never;
12
+ driverParam: C[Key]["_"]["driverParam"];
13
+ notNull: C[Key]["_"]["notNull"] extends true ? true : false;
14
+ hasDefault: C[Key]["_"]["hasDefault"] extends true ? true : false;
15
+ isPrimaryKey: C[Key]["_"] extends infer T_1 ? T_1 extends C[Key]["_"] ? T_1 extends {
16
+ isPrimaryKey: true;
17
+ } ? true : false : never : never;
18
+ isAutoincrement: C[Key]["_"] extends infer T_2 ? T_2 extends C[Key]["_"] ? T_2 extends {
19
+ isAutoincrement: true;
20
+ } ? true : false : never : never;
21
+ hasRuntimeDefault: C[Key]["_"] extends infer T_3 ? T_3 extends C[Key]["_"] ? T_3 extends {
22
+ hasRuntimeDefault: true;
23
+ } ? true : false : never : never;
24
+ enumValues: C[Key]["_"] extends infer T_4 ? T_4 extends C[Key]["_"] ? T_4 extends {
25
+ enumValues: [string, ...string[]];
26
+ } ? T_4["enumValues"] : undefined : never : never;
27
+ baseColumn: C[Key]["_"] extends infer T_5 ? T_5 extends C[Key]["_"] ? T_5 extends {
28
+ baseBuilder: infer U_1 extends ColumnBuilderBase;
29
+ } ? import("drizzle-orm/sqlite-core").SQLiteColumn<{
30
+ name: string;
31
+ tableName: N;
32
+ dataType: U_1["_"]["dataType"];
33
+ data: U_1["_"] extends infer T_6 ? T_6 extends U_1["_"] ? T_6 extends {
34
+ $type: infer U;
35
+ } ? U : T_6["data"] : never : never;
36
+ driverParam: U_1["_"]["driverParam"];
37
+ notNull: U_1["_"]["notNull"] extends true ? true : false;
38
+ hasDefault: U_1["_"]["hasDefault"] extends true ? true : false;
39
+ isPrimaryKey: U_1["_"] extends infer T_7 ? T_7 extends U_1["_"] ? T_7 extends {
40
+ isPrimaryKey: true;
41
+ } ? true : false : never : never;
42
+ isAutoincrement: U_1["_"] extends infer T_8 ? T_8 extends U_1["_"] ? T_8 extends {
43
+ isAutoincrement: true;
44
+ } ? true : false : never : never;
45
+ hasRuntimeDefault: U_1["_"] extends infer T_9 ? T_9 extends U_1["_"] ? T_9 extends {
46
+ hasRuntimeDefault: true;
47
+ } ? true : false : never : never;
48
+ enumValues: U_1["_"] extends infer T_10 ? T_10 extends U_1["_"] ? T_10 extends {
49
+ enumValues: [string, ...string[]];
50
+ } ? T_10["enumValues"] : undefined : never : never;
51
+ baseColumn: U_1["_"] extends infer T_11 ? T_11 extends U_1["_"] ? T_11 extends {
52
+ baseBuilder: infer U_1 extends ColumnBuilderBase;
53
+ } ? import("drizzle-orm/sqlite-core").SQLiteColumn</*elided*/ any, {}> : never : never : never;
54
+ identity: U_1["_"] extends infer T_12 ? T_12 extends U_1["_"] ? T_12 extends {
55
+ identity: 'always';
56
+ } ? "always" : T_12 extends {
57
+ identity: 'byDefault';
58
+ } ? "byDefault" : undefined : never : never;
59
+ generated: U_1["_"] extends infer T_13 ? T_13 extends U_1["_"] ? T_13 extends {
60
+ generated: infer G;
61
+ } ? unknown extends G ? undefined : G extends undefined ? undefined : G : undefined : never : never;
62
+ }, {}> : never : never : never;
63
+ identity: C[Key]["_"] extends infer T_14 ? T_14 extends C[Key]["_"] ? T_14 extends {
64
+ identity: 'always';
65
+ } ? "always" : T_14 extends {
66
+ identity: 'byDefault';
67
+ } ? "byDefault" : undefined : never : never;
68
+ generated: C[Key]["_"] extends infer T_15 ? T_15 extends C[Key]["_"] ? T_15 extends {
69
+ generated: infer G;
70
+ } ? unknown extends G ? undefined : G extends undefined ? undefined : G : undefined : never : never;
71
+ }, {}>; };
72
+ dialect: 'sqlite';
73
+ }>;
74
+ export declare const text: (name?: string) => import("drizzle-orm/sqlite-core").SQLiteTextBuilder<[string, ...string[]]>;
75
+ export declare const integer: (name?: string) => import("drizzle-orm/sqlite-core").SQLiteIntegerBuilder;
76
+ export declare const real: (name?: string) => import("drizzle-orm/sqlite-core").SQLiteRealBuilder;
77
+ export declare const boolean: (name?: string) => import("drizzle-orm/sqlite-core").SQLiteBooleanBuilder;
78
+ export { eq, ne, gt, gte, lt, lte, and, or, asc, desc, count, isNull, isNotNull, inArray, } from "drizzle-orm";
@@ -0,0 +1,8 @@
1
+ import type { AnyRelations, EmptyRelations } from "drizzle-orm/relations";
2
+ import type { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core";
3
+ type Database<R extends AnyRelations> = BaseSQLiteDatabase<"sync", {
4
+ changes: number;
5
+ }, Record<string, never>, R>;
6
+ export type QueryDatabase<R extends AnyRelations = EmptyRelations> = Pick<Database<R>, "select" | "selectDistinct" | "query">;
7
+ export type MutationDatabase<R extends AnyRelations = EmptyRelations> = QueryDatabase<R> & Pick<Database<R>, "insert" | "update" | "delete">;
8
+ export {};
@@ -0,0 +1,6 @@
1
+ export type ErrorCode = "BAD_REQUEST" | "UNAUTHORIZED" | "FORBIDDEN" | "NOT_FOUND" | "CONFLICT" | "INCOMPATIBLE_VERSION" | "UNAVAILABLE" | "INTERNAL_SERVER_ERROR";
2
+ export declare class AppError extends Error {
3
+ readonly code: ErrorCode;
4
+ constructor(code: ErrorCode, message?: string);
5
+ }
6
+ export declare const appError: (cause: unknown) => AppError;
package/dist/index.d.ts CHANGED
@@ -1,72 +1,2 @@
1
- import { h } from "preact";
2
- import type { ComponentChild, ComponentChildren, VNode } from "preact";
3
- export interface TailorKitScreens {
4
- }
5
- export type ScreenPath = Extract<keyof TailorKitScreens & string, `/${string}`>;
6
- export type AppScreenPath = ScreenPath;
7
- export type ScreenProps<TPath extends ScreenPath> = TailorKitScreens[TPath] extends object ? TailorKitScreens[TPath] : Record<string, never>;
8
- export type ScreenPropsForPath<TPath extends AppScreenPath> = TPath extends ScreenPath ? ScreenProps<TPath> : never;
9
- export type ScreenContext<TPath extends AppScreenPath> = ScreenPropsForPath<TPath> extends {
10
- context: infer TContext;
11
- } ? TContext : Record<string, never>;
12
- export type View<TProps extends object = Record<string, never>> = (props: TProps) => ComponentChild;
13
- export type ScreenRuntimeProps<TPath extends AppScreenPath> = {
14
- context: ScreenContext<TPath>;
15
- screen: TPath;
16
- status: "ready";
17
- } | {
18
- context?: never;
19
- screen: TPath;
20
- status: "loading";
21
- } | {
22
- context?: never;
23
- screen: TPath;
24
- status: "error";
25
- };
26
- export interface ScreenDefinition<TPath extends AppScreenPath = AppScreenPath> {
27
- component: View<ScreenRuntimeProps<TPath>>;
28
- path: TPath;
29
- useContext: () => ScreenContext<TPath>;
30
- }
31
- type RegisteredScreens = {
32
- [TPath in AppScreenPath]: ScreenDefinition<TPath>;
33
- };
34
- type ScreenDefinitions = Partial<RegisteredScreens>;
35
- type InvalidScreenPath<TScreens> = Exclude<keyof TScreens & string, `/${string}`>;
36
- type RequireScreenPaths<TScreens> = InvalidScreenPath<TScreens> extends never ? unknown : {
37
- readonly __tailorkit_error__: `Screen paths must start with "/". Invalid screen: ${InvalidScreenPath<TScreens>}`;
38
- };
39
- type ScreenKeyPathMismatch<TScreens> = {
40
- [TPath in keyof TScreens & string]: TScreens[TPath] extends ScreenDefinition<infer TScreenPath> ? TScreenPath extends TPath ? never : TPath : TPath;
41
- }[keyof TScreens & string];
42
- type RequireMatchingScreenKeys<TScreens> = ScreenKeyPathMismatch<TScreens> extends never ? unknown : {
43
- readonly __tailorkit_error__: `Screen key must match createScreen path. Invalid screen: ${ScreenKeyPathMismatch<TScreens>}`;
44
- };
45
- export interface TailorKitClient<TScreens extends ScreenDefinitions = ScreenDefinitions> {
46
- screens: TScreens;
47
- }
48
- export interface TailorKitClientMeta {
49
- preactVersion: string;
50
- }
51
- export interface TailorKitClientRuntime {
52
- h: typeof h;
53
- render: (vnode: VNode, parent: Element | Document | ShadowRoot | DocumentFragment) => void;
54
- }
55
- export type TailorKitClientWithMeta<TScreens extends ScreenDefinitions = ScreenDefinitions> = TailorKitClient<TScreens> & {
56
- $meta: TailorKitClientMeta;
57
- $runtime: TailorKitClientRuntime;
58
- };
59
- export declare const createScreen: <const TPath extends AppScreenPath>(path: TPath, options: {
60
- component: View<Record<string, never>>;
61
- error?: View<Record<string, never>>;
62
- loading?: View<Record<string, never>>;
63
- }) => ScreenDefinition<TPath>;
64
- export declare const defineClient: <const TScreens extends ScreenDefinitions>(client: TailorKitClient<TScreens> & RequireScreenPaths<TScreens> & RequireMatchingScreenKeys<TScreens>) => TailorKitClientWithMeta<TScreens>;
65
- export declare const createRemoteComponent: <TProps extends object, TSlots extends readonly string[]>(name: string, options: {
66
- callbacks?: Record<string, number>;
67
- slots: TSlots;
68
- }) => View<TProps & {
69
- children?: ComponentChildren;
70
- }>;
71
- export {};
72
- //# sourceMappingURL=index.d.ts.map
1
+ export * from "./client";
2
+ export * from "./server";