one-shared 1.1.2 → 1.1.3

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.
package/dist/index.d.mts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Json } from "drizzle-orm";
2
2
  import z, { z as z$1 } from "zod";
3
3
  //#region schema.d.ts
4
+ export declare const statusSignalEnum: import("drizzle-orm/pg-core").PgEnum<["recovery", "failure"]>;
4
5
  export declare const tables: {
5
6
  teams: import("drizzle-orm/pg-core").PgTableWithColumns<{
6
7
  name: "teams";
@@ -5469,7 +5470,7 @@ export type ProcedureName = keyof ApiSchemas;
5469
5470
  //#region client.d.ts
5470
5471
  declare function client<P extends ProcedureName>(props: {
5471
5472
  procedure: P;
5472
- } & OptionalParams<ApiSchemas[P], "params"> & OptionalParams<ApiSchemas[P], "input">): Promise<z.infer<ApiSchemas[P]['output']>>;
5473
+ } & OptionalParams<ApiSchemas[P], "params"> & OptionalParams<ApiSchemas[P], "input">): Promise<z.infer<ApiSchemas[P]["output"]>>;
5473
5474
  //#endregion
5474
5475
  export { client };
5475
5476
  //# sourceMappingURL=index.d.mts.map
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Json } from "drizzle-orm";
2
2
  import z, { z as z$1 } from "zod";
3
3
  //#region schema.d.ts
4
+ export declare const statusSignalEnum: import("drizzle-orm/pg-core").PgEnum<["recovery", "failure"]>;
4
5
  export declare const tables: {
5
6
  teams: import("drizzle-orm/pg-core").PgTableWithColumns<{
6
7
  name: "teams";
@@ -5469,7 +5470,7 @@ export type ProcedureName = keyof ApiSchemas;
5469
5470
  //#region client.d.ts
5470
5471
  declare function client<P extends ProcedureName>(props: {
5471
5472
  procedure: P;
5472
- } & OptionalParams<ApiSchemas[P], "params"> & OptionalParams<ApiSchemas[P], "input">): Promise<z.infer<ApiSchemas[P]['output']>>;
5473
+ } & OptionalParams<ApiSchemas[P], "params"> & OptionalParams<ApiSchemas[P], "input">): Promise<z.infer<ApiSchemas[P]["output"]>>;
5473
5474
  //#endregion
5474
5475
  export { client };
5475
5476
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,7 +1,30 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region \0rolldown/runtime.js
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
+ get: ((k) => from[k]).bind(null, key),
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
20
+ value: mod,
21
+ enumerable: true
22
+ }) : target, mod));
23
+ //#endregion
2
24
  let drizzle_orm = require("drizzle-orm");
3
25
  let drizzle_orm_pg_core = require("drizzle-orm/pg-core");
4
26
  let zod = require("zod");
27
+ zod = __toESM(zod);
5
28
  let drizzle_orm_zod = require("drizzle-orm/zod");
6
29
  //#region schema.ts
7
30
  const statusSignalEnum = (0, drizzle_orm_pg_core.pgEnum)("status_signal", ["recovery", "failure"]);
@@ -138,6 +161,9 @@ const relations = (0, drizzle_orm.defineRelations)(tables, (props) => {
138
161
  }
139
162
  };
140
163
  });
164
+ function parseOutput(parser, data) {
165
+ return zod.default.parse(parser.output, data);
166
+ }
141
167
  //#endregion
142
168
  //#region types.ts
143
169
  const { createSelectSchema, createInsertSchema } = (0, drizzle_orm_zod.createSchemaFactory)({ coerce: { date: true } });
@@ -243,7 +269,7 @@ async function client(props) {
243
269
  }
244
270
  const url = parts.join("/");
245
271
  const data = await (await fetch(url, init)).json();
246
- return procedureSchemas.output.parse(data);
272
+ return parseOutput(apiSchemas[props.procedure], data);
247
273
  }
248
274
  //#endregion
249
275
  exports.apiSchemas = apiSchemas;
@@ -274,6 +300,7 @@ exports.prewatchResultInsertSchema = prewatchResultInsertSchema;
274
300
  exports.prewatchResultSchema = prewatchResultSchema;
275
301
  exports.relations = relations;
276
302
  exports.singleParamSchema = singleParamSchema;
303
+ exports.statusSignalEnum = statusSignalEnum;
277
304
  exports.statusSignalSchema = statusSignalSchema;
278
305
  exports.suspiciousPrewatchGenerationSchema = suspiciousPrewatchGenerationSchema;
279
306
  exports.tables = tables;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["pgEnum","pgTable","uuid","text","timestamp","jsonb","integer","index","boolean","varchar","defineRelations","createSchemaFactory","z"],"sources":["../schema.ts","../types.ts","../client.ts"],"sourcesContent":["import { defineRelations, type Json } from \"drizzle-orm\";\nimport {\n pgEnum,\n pgTable,\n uuid,\n text,\n timestamp,\n jsonb,\n index,\n integer,\n boolean,\n varchar,\n} from \"drizzle-orm/pg-core\";\n\nexport const statusSignalEnum = pgEnum(\"status_signal\", [\n \"recovery\",\n \"failure\",\n]);\n\nexport const teamsTable = pgTable(\"teams\", {\n id: uuid().primaryKey().defaultRandom(),\n slackTeamId: text().notNull(),\n installerId: text().notNull(),\n installerToken: text(),\n scopes: text().array(),\n teamName: text(),\n botToken: text().notNull(),\n botScopes: text().array().notNull(),\n botUserId: text().notNull(),\n botId: text().notNull(),\n});\n\nexport const eventsTable = pgTable(\n \"events\",\n {\n id: uuid().primaryKey().defaultRandom(),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n slackAuthorId: text().notNull(),\n slackChannelId: text().notNull(),\n slackTeamId: text().notNull(),\n ts: timestamp().notNull().defaultNow(),\n textRaw: text(),\n textNorm: text(),\n payload: jsonb(\"payload\").$type<Json>().notNull(),\n mlClassification: integer().notNull(),\n permalink: text().notNull(),\n },\n (t) => [\n index(\"events_stream_ts_idx\").on(t.channelId, t.ts),\n index(\"events_stream_ts_event_idx\").on(\n t.channelId,\n t.ts,\n t.id,\n ),\n index(\"events_stream_idx\").on(t.channelId),\n ],\n);\n\nexport const channelsTable = pgTable(\"channels\", {\n id: uuid().primaryKey().defaultRandom(),\n slackChannelId: text().notNull(),\n slackName: text().notNull(),\n});\n\nexport const prewatchResultsTable = pgTable(\"prewatchResults\", {\n id: uuid().primaryKey().defaultRandom(),\n triggerEventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n suspicious: boolean().notNull(),\n reasoning: text().notNull(),\n title: text(),\n incidentId: uuid().references(() => incidentsTable.id),\n});\n\nexport const prewatchPromptEventsTable = pgTable(\"prewatchPromptEvents\", {\n id: uuid().primaryKey().defaultRandom(),\n prewatchResultId: uuid()\n .notNull()\n .references(() => prewatchResultsTable.id),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n});\n\nexport const prewatchEvidenceEventsTable = pgTable(\"prewatchEvidenceIds\", {\n id: uuid().primaryKey().defaultRandom(),\n prewatchResultId: uuid()\n .notNull()\n .references(() => prewatchResultsTable.id),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n});\n\nexport const watchResultsTable = pgTable(\"watchResults\", {\n id: uuid().primaryKey().defaultRandom(),\n incidentId: uuid()\n .notNull()\n .references(() => incidentsTable.id),\n triggerEventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n statusSignal: statusSignalEnum(),\n important: boolean().notNull(),\n description: text(),\n summary: text(),\n});\n\nexport const incidentsTable = pgTable(\"incidents\", {\n id: uuid().primaryKey().defaultRandom(),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n ts: timestamp().notNull().defaultNow(),\n});\n\nexport const incidentCommentsTable = pgTable(\"incidentComments\", {\n id: uuid().primaryKey().defaultRandom(),\n incidentId: uuid().notNull().references(() => incidentsTable.id),\n content: varchar({ length: 10000 }).notNull(),\n ts: timestamp().notNull().defaultNow()\n})\n\nexport const incidentEventsTable = pgTable(\"incidentEvents\", {\n id: uuid().primaryKey().defaultRandom(),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n incidentId: uuid()\n .notNull()\n .references(() => incidentsTable.id),\n});\n\nexport const tables = {\n teams: teamsTable,\n events: eventsTable,\n channels: channelsTable,\n prewatchResults: prewatchResultsTable,\n prewatchPromptEvents: prewatchPromptEventsTable,\n prewatchEvidenceEvents: prewatchEvidenceEventsTable,\n watchResults: watchResultsTable,\n incidents: incidentsTable,\n incidentEvents: incidentEventsTable,\n incidentComments: incidentCommentsTable\n};\n\n/*\nconst comment = db.query.incidentComments.findFirst({\n with: {\n incident: true\n }\n})\n\nconsole.log('The comment was made on this incident:', comment.incident) // GOOD\nconsole.log('The comment was made on this incident:', comment.incidents) // BAD\n*/\n\nexport const relations = defineRelations(tables, (props) => {\n return {\n incidents: {\n incidentEvents: props.many.incidentEvents(),\n incidentComments: props.many.incidentComments(),\n channel: props.one.channels({\n from: props.incidents.channelId,\n to: props.channels.id,\n optional: false,\n }),\n },\n incidentComments: {\n incident: props.one.incidents({\n from: props.incidentComments.incidentId,\n to: props.incidents.id,\n optional: false\n })\n },\n incidentEvents: {\n incident: props.one.incidents({\n from: props.incidentEvents.incidentId,\n to: props.incidents.id,\n optional: false,\n }),\n event: props.one.events({\n from: props.incidentEvents.eventId,\n to: props.events.id,\n optional: false,\n }),\n },\n events: {\n prewatchResult: props.one.prewatchResults({\n from: props.events.id,\n to: props.prewatchResults.triggerEventId,\n optional: true,\n }),\n watchResult: props.one.watchResults({\n from: props.events.id,\n to: props.watchResults.triggerEventId,\n optional: true,\n }),\n },\n };\n});\n\n","import db from \"./db\";\nimport { z } from \"zod\";\nimport {\n channelsTable,\n eventsTable,\n prewatchEvidenceEventsTable,\n prewatchPromptEventsTable,\n prewatchResultsTable,\n teamsTable,\n incidentEventsTable,\n incidentsTable,\n watchResultsTable,\n statusSignalEnum,\n incidentCommentsTable,\n} from \"./schema\";\n\nexport type Db = typeof db;\n\nimport { createSchemaFactory } from \"drizzle-orm/zod\";\n\nconst { createSelectSchema, createInsertSchema } = createSchemaFactory({\n coerce: {\n date: true,\n },\n});\n\n// Enums\nexport const statusSignalSchema = createSelectSchema(statusSignalEnum);\nexport type StatusSignal = z.infer<typeof statusSignalSchema>;\n\n// Tables\nexport const eventSchema = createSelectSchema(eventsTable);\nexport type Event = z.infer<typeof eventSchema>;\n\nexport const eventInsertSchema = createInsertSchema(eventsTable);\nexport type EventInsert = z.infer<typeof eventInsertSchema>;\n\nexport const channelSchema = createSelectSchema(channelsTable);\nexport type Channel = z.infer<typeof channelSchema>;\n\nexport const teamSchema = createSelectSchema(teamsTable);\nexport type Team = z.infer<typeof teamSchema>;\n\nexport const teamInsertSchema = createInsertSchema(teamsTable);\nexport type TeamInsert = z.infer<typeof teamInsertSchema>;\n\nexport const prewatchResultSchema = createSelectSchema(prewatchResultsTable);\nexport type PrewatchResult = z.infer<typeof prewatchResultSchema>;\nexport const prewatchResultInsertSchema =\n createInsertSchema(prewatchResultsTable);\nexport type PrewatchResultInsert = z.infer<typeof prewatchResultInsertSchema>;\n\nexport const prewatchPromptEventSchema = createSelectSchema(\n prewatchPromptEventsTable,\n);\nexport type PrewatchPromptEvent = z.infer<typeof prewatchPromptEventSchema>;\nexport const prewatchPromptEventInsertSchema = createInsertSchema(\n prewatchPromptEventsTable,\n);\nexport type PrewatchPromptEventInsert = z.infer<\n typeof prewatchPromptEventInsertSchema\n>;\n\nexport const watchResultSchema = createSelectSchema(watchResultsTable);\nexport type WatchResult = z.infer<typeof watchResultSchema>;\nexport const watchResultInsertSchema = createInsertSchema(watchResultsTable);\nexport type WatchResultInsert = z.infer<typeof watchResultInsertSchema>;\n\nexport const incidentSchema = createSelectSchema(incidentsTable);\nexport type Incident = z.infer<typeof incidentSchema>;\nexport const incidentInsertSchema = createInsertSchema(incidentsTable);\nexport type IncidentInsert = z.infer<typeof incidentInsertSchema>;\n\nexport const incidentCommentsSchema = createSelectSchema(incidentCommentsTable);\nexport type IncidentComments = z.infer<typeof incidentCommentsSchema>;\nexport const incidentCommentsInsertSchema = createInsertSchema(\n incidentCommentsTable,\n);\nexport type IncidentCommentsInsert = z.infer<\n typeof incidentCommentsInsertSchema\n>;\n\nexport const incidentEventSchema = createSelectSchema(incidentEventsTable);\nexport type IncidentEvent = z.infer<typeof incidentEventSchema>;\nexport const incidentEventInsertSchema =\n createInsertSchema(incidentEventsTable);\nexport type IncidentEventInsert = z.infer<typeof incidentEventInsertSchema>;\n\nexport const prewatchEvidenceEventSchema = createSelectSchema(\n prewatchEvidenceEventsTable,\n);\nexport type PrewatchEvidenceEvent = z.infer<typeof prewatchEvidenceEventSchema>;\nexport const prewatchEvidenceEventInsertSchema = createInsertSchema(\n prewatchEvidenceEventsTable,\n);\nexport type PrewatchEvidenceEventInsert = z.infer<\n typeof prewatchEvidenceEventInsertSchema\n>;\n\nconst relatedEventSchema = eventSchema.extend({\n prewatchResult: prewatchResultSchema.nullish(),\n watchResult: watchResultSchema.nullish(),\n});\n\nconst relatedIncidentEventSchema = incidentEventSchema.extend({\n event: relatedEventSchema,\n});\n\nexport interface PromptEvent {\n id: string;\n ts: string;\n slackAuthorId: string;\n textRaw: string | null;\n textNorm: string | null;\n}\n\nexport const unsuspiciousPrewatchGenerationSchema = z.object({\n suspicious: z.literal(false),\n reasoning: z.string(),\n});\n\nexport const suspiciousPrewatchGenerationSchema = z.object({\n suspicious: z.literal(true),\n reasoning: z.string(),\n title: z.string(),\n evidenceEventIds: z.string().array(),\n});\nexport type SuspiciousPrewatchGeneration = z.infer<\n typeof suspiciousPrewatchGenerationSchema\n>;\n\nexport const importantGenerationSchema = z\n .object({\n important: z.literal(true),\n statusSignal: statusSignalSchema,\n description: z.string(),\n summary: z.string(),\n })\n .strict();\n\nexport const unimportantGenerationSchema = z\n .object({\n important: z.literal(false),\n })\n .strict();\n\nexport const watchGenerationSchema = z.union([\n importantGenerationSchema,\n unimportantGenerationSchema,\n]);\nexport type WatchGeneration = z.infer<typeof watchGenerationSchema>;\n\nexport const prewatchGenerationSchema = z.union([\n suspiciousPrewatchGenerationSchema,\n unsuspiciousPrewatchGenerationSchema,\n]);\nexport type PrewatchGeneration = z.infer<typeof prewatchGenerationSchema>;\n\n// API\n\nexport const emptyParamsSchema = z.tuple([]).readonly();\nexport type EmptyParams = z.infer<typeof emptyParamsSchema>;\n\nexport const singleParamSchema = z.tuple([z.string()]).readonly();\nexport type SingleParam = z.infer<typeof singleParamSchema>;\n\nexport type OptionalParams<S, K extends PropertyKey> = S extends {\n [P in K]: infer T extends z.ZodType;\n}\n ? { [P in K]: z.infer<T> }\n : { [P in K]?: never };\n\nexport const incidentWithChannelSchema = incidentSchema.extend({\n channel: channelSchema,\n});\n\n// GET /health\nexport const getHealthOutputSchema = z.object({\n startupTime: z.string(),\n memoryLoad: z.number(),\n});\n\n// GET /incidents\nexport const getIncidentsOutputSchema = incidentWithChannelSchema.array();\n\n// GET /incidents/:incidentId\nexport const getIncidentOutputSchema = incidentSchema.extend({\n incidentEvents: relatedIncidentEventSchema.array(),\n channel: channelSchema,\n});\n\nexport const postIncidentCommentInputSchema = incidentCommentsInsertSchema.pick(\n {\n incidentId: true,\n content: true,\n },\n);\n\nexport const postIncidentCommentOutputSchema = incidentCommentsSchema;\n\nexport const apiSchemas = {\n getHealth: {\n method: \"GET\",\n path: \"health\",\n output: getHealthOutputSchema,\n },\n getIncidents: {\n method: \"GET\",\n path: \"incidents\",\n output: getIncidentsOutputSchema,\n },\n getIncident: {\n method: \"GET\",\n path: \"incidents\",\n output: getIncidentOutputSchema,\n params: singleParamSchema,\n },\n postIncidentComment: {\n method: \"POST\",\n path: \"incidents\",\n output: postIncidentCommentOutputSchema,\n input: postIncidentCommentInputSchema,\n },\n};\n\nexport type ApiSchemas = typeof apiSchemas;\n\nexport type ProcedureName = keyof ApiSchemas;\n// 'getHealth' | 'getIncidents' | 'getIncident' ...\n","import z from \"zod\";\nimport {\n apiSchemas,\n ApiSchemas,\n ProcedureName,\n OptionalParams,\n} from \"./types\";\n\n/*\nexport const emptyParamsSchema = z.tuple([]).readonly()\n// [] GOOD\n// [string] BAD\n// [string, string] BAD\n\nexport const singleParamSchema = z.tuple([z.string()]).readonly()\n// [string] GOOD\n// [] BAD\n// [string, string] BAD\n\nexport const apiSchemas = {\n getHealth: {\n path: 'health',\n output: getHealthOutputSchema,\n params: emptyParamsSchema\n },\n getIncidents: {\n path: 'incidents',\n output: getIncidentsOutputSchema,\n params: emptyParamsSchema\n },\n getIncident: {\n path: 'incidents',\n output: getIncidentOutputSchema,\n params: singleParamSchema\n },\n}\n*/\n\nexport default async function client<P extends ProcedureName>(\n props: { procedure: P } & OptionalParams<ApiSchemas[P], \"params\"> &\n OptionalParams<ApiSchemas[P], \"input\">,\n): Promise<z.infer<ApiSchemas[P]['output']>> {\n const base = \"http://localhost:3000\";\n const procedureSchemas = apiSchemas[props.procedure];\n\n // Body\n const init: RequestInit = {\n method: procedureSchemas.method,\n };\n if (\"input\" in procedureSchemas) {\n const parsed = procedureSchemas.input.parse(props.input);\n const json = JSON.stringify(parsed);\n init.body = json;\n }\n \n // URL\n const parts = [base, procedureSchemas.path];\n if (\"params\" in procedureSchemas) {\n const parsed = procedureSchemas.params.parse(props.params);\n const encoded = parsed.map((param) => encodeURIComponent(param));\n parts.push(...encoded);\n }\n const url = parts.join(\"/\");\n\n const response = await fetch(url, init);\n const data: unknown = await response.json();\n const output = procedureSchemas.output.parse(data) as unknown as z.infer<ApiSchemas[P]['output']>\n\n return output;\n}"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["pgEnum","pgTable","uuid","text","timestamp","jsonb","integer","index","boolean","varchar","defineRelations","z","createSchemaFactory","z"],"sources":["../schema.ts","../types.ts","../client.ts"],"sourcesContent":["import { defineRelations, type Json } from \"drizzle-orm\";\nimport {\n pgEnum,\n pgTable,\n uuid,\n text,\n timestamp,\n jsonb,\n index,\n integer,\n boolean,\n varchar,\n} from \"drizzle-orm/pg-core\";\nimport z from \"zod\";\n\nexport const statusSignalEnum = pgEnum(\"status_signal\", [\n \"recovery\",\n \"failure\",\n]);\n\nexport const teamsTable = pgTable(\"teams\", {\n id: uuid().primaryKey().defaultRandom(),\n slackTeamId: text().notNull(),\n installerId: text().notNull(),\n installerToken: text(),\n scopes: text().array(),\n teamName: text(),\n botToken: text().notNull(),\n botScopes: text().array().notNull(),\n botUserId: text().notNull(),\n botId: text().notNull(),\n});\n\nexport const eventsTable = pgTable(\n \"events\",\n {\n id: uuid().primaryKey().defaultRandom(),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n slackAuthorId: text().notNull(),\n slackChannelId: text().notNull(),\n slackTeamId: text().notNull(),\n ts: timestamp().notNull().defaultNow(),\n textRaw: text(),\n textNorm: text(),\n payload: jsonb(\"payload\").$type<Json>().notNull(),\n mlClassification: integer().notNull(),\n permalink: text().notNull(),\n },\n (t) => [\n index(\"events_stream_ts_idx\").on(t.channelId, t.ts),\n index(\"events_stream_ts_event_idx\").on(\n t.channelId,\n t.ts,\n t.id,\n ),\n index(\"events_stream_idx\").on(t.channelId),\n ],\n);\n\nexport const channelsTable = pgTable(\"channels\", {\n id: uuid().primaryKey().defaultRandom(),\n slackChannelId: text().notNull(),\n slackName: text().notNull(),\n});\n\nexport const prewatchResultsTable = pgTable(\"prewatchResults\", {\n id: uuid().primaryKey().defaultRandom(),\n triggerEventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n suspicious: boolean().notNull(),\n reasoning: text().notNull(),\n title: text(),\n incidentId: uuid().references(() => incidentsTable.id),\n});\n\nexport const prewatchPromptEventsTable = pgTable(\"prewatchPromptEvents\", {\n id: uuid().primaryKey().defaultRandom(),\n prewatchResultId: uuid()\n .notNull()\n .references(() => prewatchResultsTable.id),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n});\n\nexport const prewatchEvidenceEventsTable = pgTable(\"prewatchEvidenceIds\", {\n id: uuid().primaryKey().defaultRandom(),\n prewatchResultId: uuid()\n .notNull()\n .references(() => prewatchResultsTable.id),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n});\n\nexport const watchResultsTable = pgTable(\"watchResults\", {\n id: uuid().primaryKey().defaultRandom(),\n incidentId: uuid()\n .notNull()\n .references(() => incidentsTable.id),\n triggerEventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n statusSignal: statusSignalEnum(),\n important: boolean().notNull(),\n description: text(),\n summary: text(),\n});\n\nexport const incidentsTable = pgTable(\"incidents\", {\n id: uuid().primaryKey().defaultRandom(),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n ts: timestamp().notNull().defaultNow(),\n});\n\nexport const incidentCommentsTable = pgTable(\"incidentComments\", {\n id: uuid().primaryKey().defaultRandom(),\n incidentId: uuid().notNull().references(() => incidentsTable.id),\n content: varchar({ length: 10000 }).notNull(),\n ts: timestamp().notNull().defaultNow()\n})\n\nexport const incidentEventsTable = pgTable(\"incidentEvents\", {\n id: uuid().primaryKey().defaultRandom(),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n incidentId: uuid()\n .notNull()\n .references(() => incidentsTable.id),\n});\n\nexport const tables = {\n teams: teamsTable,\n events: eventsTable,\n channels: channelsTable,\n prewatchResults: prewatchResultsTable,\n prewatchPromptEvents: prewatchPromptEventsTable,\n prewatchEvidenceEvents: prewatchEvidenceEventsTable,\n watchResults: watchResultsTable,\n incidents: incidentsTable,\n incidentEvents: incidentEventsTable,\n incidentComments: incidentCommentsTable\n};\n\n/*\nconst comment = db.query.incidentComments.findFirst({\n with: {\n incident: true\n }\n})\n\nconsole.log('The comment was made on this incident:', comment.incident) // GOOD\nconsole.log('The comment was made on this incident:', comment.incidents) // BAD\n*/\n\nexport const relations = defineRelations(tables, (props) => {\n return {\n incidents: {\n incidentEvents: props.many.incidentEvents(),\n incidentComments: props.many.incidentComments(),\n channel: props.one.channels({\n from: props.incidents.channelId,\n to: props.channels.id,\n optional: false,\n }),\n },\n incidentComments: {\n incident: props.one.incidents({\n from: props.incidentComments.incidentId,\n to: props.incidents.id,\n optional: false\n })\n },\n incidentEvents: {\n incident: props.one.incidents({\n from: props.incidentEvents.incidentId,\n to: props.incidents.id,\n optional: false,\n }),\n event: props.one.events({\n from: props.incidentEvents.eventId,\n to: props.events.id,\n optional: false,\n }),\n },\n events: {\n prewatchResult: props.one.prewatchResults({\n from: props.events.id,\n to: props.prewatchResults.triggerEventId,\n optional: true,\n }),\n watchResult: props.one.watchResults({\n from: props.events.id,\n to: props.watchResults.triggerEventId,\n optional: true,\n }),\n },\n };\n});\n\nexport function parseOutput<Parser extends { output: z.ZodType; }>(\n parser: Parser,\n data: unknown): z.infer<Parser[\"output\"]> {\n return z.parse<Parser[\"output\"]>(parser.output, data);\n}\n\n","import db from \"./db\";\nimport { output, z } from \"zod\";\nimport {\n channelsTable,\n eventsTable,\n prewatchEvidenceEventsTable,\n prewatchPromptEventsTable,\n prewatchResultsTable,\n teamsTable,\n incidentEventsTable,\n incidentsTable,\n watchResultsTable,\n statusSignalEnum,\n incidentCommentsTable,\n} from \"./schema\";\n\nexport type Db = typeof db;\n\nimport { createSchemaFactory } from \"drizzle-orm/zod\";\n\nconst { createSelectSchema, createInsertSchema } = createSchemaFactory({\n coerce: {\n date: true,\n },\n});\n\n// Enums\nexport const statusSignalSchema = createSelectSchema(statusSignalEnum);\nexport type StatusSignal = z.infer<typeof statusSignalSchema>;\n\n// Tables\nexport const eventSchema = createSelectSchema(eventsTable);\nexport type Event = z.infer<typeof eventSchema>;\n\nexport const eventInsertSchema = createInsertSchema(eventsTable);\nexport type EventInsert = z.infer<typeof eventInsertSchema>;\n\nexport const channelSchema = createSelectSchema(channelsTable);\nexport type Channel = z.infer<typeof channelSchema>;\n\nexport const teamSchema = createSelectSchema(teamsTable);\nexport type Team = z.infer<typeof teamSchema>;\n\nexport const teamInsertSchema = createInsertSchema(teamsTable);\nexport type TeamInsert = z.infer<typeof teamInsertSchema>;\n\nexport const prewatchResultSchema = createSelectSchema(prewatchResultsTable);\nexport type PrewatchResult = z.infer<typeof prewatchResultSchema>;\nexport const prewatchResultInsertSchema =\n createInsertSchema(prewatchResultsTable);\nexport type PrewatchResultInsert = z.infer<typeof prewatchResultInsertSchema>;\n\nexport const prewatchPromptEventSchema = createSelectSchema(\n prewatchPromptEventsTable,\n);\nexport type PrewatchPromptEvent = z.infer<typeof prewatchPromptEventSchema>;\nexport const prewatchPromptEventInsertSchema = createInsertSchema(\n prewatchPromptEventsTable,\n);\nexport type PrewatchPromptEventInsert = z.infer<\n typeof prewatchPromptEventInsertSchema\n>;\n\nexport const watchResultSchema = createSelectSchema(watchResultsTable);\nexport type WatchResult = z.infer<typeof watchResultSchema>;\nexport const watchResultInsertSchema = createInsertSchema(watchResultsTable);\nexport type WatchResultInsert = z.infer<typeof watchResultInsertSchema>;\n\nexport const incidentSchema = createSelectSchema(incidentsTable);\nexport type Incident = z.infer<typeof incidentSchema>;\nexport const incidentInsertSchema = createInsertSchema(incidentsTable);\nexport type IncidentInsert = z.infer<typeof incidentInsertSchema>;\n\nexport const incidentCommentsSchema = createSelectSchema(incidentCommentsTable);\nexport type IncidentComments = z.infer<typeof incidentCommentsSchema>;\nexport const incidentCommentsInsertSchema = createInsertSchema(\n incidentCommentsTable,\n);\nexport type IncidentCommentsInsert = z.infer<\n typeof incidentCommentsInsertSchema\n>;\n\nexport const incidentEventSchema = createSelectSchema(incidentEventsTable);\nexport type IncidentEvent = z.infer<typeof incidentEventSchema>;\nexport const incidentEventInsertSchema =\n createInsertSchema(incidentEventsTable);\nexport type IncidentEventInsert = z.infer<typeof incidentEventInsertSchema>;\n\nexport const prewatchEvidenceEventSchema = createSelectSchema(\n prewatchEvidenceEventsTable,\n);\nexport type PrewatchEvidenceEvent = z.infer<typeof prewatchEvidenceEventSchema>;\nexport const prewatchEvidenceEventInsertSchema = createInsertSchema(\n prewatchEvidenceEventsTable,\n);\nexport type PrewatchEvidenceEventInsert = z.infer<\n typeof prewatchEvidenceEventInsertSchema\n>;\n\nconst relatedEventSchema = eventSchema.extend({\n prewatchResult: prewatchResultSchema.nullish(),\n watchResult: watchResultSchema.nullish(),\n});\n\nconst relatedIncidentEventSchema = incidentEventSchema.extend({\n event: relatedEventSchema,\n});\n\nexport interface PromptEvent {\n id: string;\n ts: string;\n slackAuthorId: string;\n textRaw: string | null;\n textNorm: string | null;\n}\n\nexport const unsuspiciousPrewatchGenerationSchema = z.object({\n suspicious: z.literal(false),\n reasoning: z.string(),\n});\n\nexport const suspiciousPrewatchGenerationSchema = z.object({\n suspicious: z.literal(true),\n reasoning: z.string(),\n title: z.string(),\n evidenceEventIds: z.string().array(),\n});\nexport type SuspiciousPrewatchGeneration = z.infer<\n typeof suspiciousPrewatchGenerationSchema\n>;\n\nexport const importantGenerationSchema = z\n .object({\n important: z.literal(true),\n statusSignal: statusSignalSchema,\n description: z.string(),\n summary: z.string(),\n })\n .strict();\n\nexport const unimportantGenerationSchema = z\n .object({\n important: z.literal(false),\n })\n .strict();\n\nexport const watchGenerationSchema = z.union([\n importantGenerationSchema,\n unimportantGenerationSchema,\n]);\nexport type WatchGeneration = z.infer<typeof watchGenerationSchema>;\n\nexport const prewatchGenerationSchema = z.union([\n suspiciousPrewatchGenerationSchema,\n unsuspiciousPrewatchGenerationSchema,\n]);\nexport type PrewatchGeneration = z.infer<typeof prewatchGenerationSchema>;\n\n// API\n\nexport const emptyParamsSchema = z.tuple([]).readonly();\nexport type EmptyParams = z.infer<typeof emptyParamsSchema>;\n\nexport const singleParamSchema = z.tuple([z.string()]).readonly();\nexport type SingleParam = z.infer<typeof singleParamSchema>;\n\nexport type OptionalParams<S, K extends PropertyKey> = S extends {\n [P in K]: infer T extends z.ZodType;\n}\n ? { [P in K]: z.infer<T> }\n : { [P in K]?: never };\n\n// export type OutputByProcedure = {\n// [Name in ProcedureName]: z.infer<ApiSchemas[Name]['output']>\n// }\n\n// export type ParsersByProcedure = {\n// [Name in ProcedureName]: {\n// output: {\n// parse(data: unknown): z.infer<ApiSchemas[Name]['output']>\n// }\n// }\n// }\n\nexport const incidentWithChannelSchema = incidentSchema.extend({\n channel: channelSchema,\n});\n\n// GET /health\nexport const getHealthOutputSchema = z.object({\n startupTime: z.string(),\n memoryLoad: z.number(),\n});\n\n// GET /incidents\nexport const getIncidentsOutputSchema = incidentWithChannelSchema.array();\n\n// GET /incidents/:incidentId\nexport const getIncidentOutputSchema = incidentSchema.extend({\n incidentEvents: relatedIncidentEventSchema.array(),\n channel: channelSchema,\n});\n\nexport const postIncidentCommentInputSchema = incidentCommentsInsertSchema.pick(\n {\n incidentId: true,\n content: true,\n },\n);\n\nexport const postIncidentCommentOutputSchema = incidentCommentsSchema;\n\nexport const apiSchemas = {\n getHealth: {\n method: \"GET\",\n path: \"health\",\n output: getHealthOutputSchema,\n },\n getIncidents: {\n method: \"GET\",\n path: \"incidents\",\n output: getIncidentsOutputSchema,\n },\n getIncident: {\n method: \"GET\",\n path: \"incidents\",\n output: getIncidentOutputSchema,\n params: singleParamSchema,\n },\n postIncidentComment: {\n method: \"POST\",\n path: \"incidents\",\n output: postIncidentCommentOutputSchema,\n input: postIncidentCommentInputSchema,\n },\n};\n\nexport type ApiSchemas = typeof apiSchemas;\n\nexport type ProcedureName = keyof ApiSchemas;\n// 'getHealth' | 'getIncidents' | 'getIncident' ...\n\n","import z from \"zod\";\nimport {\n apiSchemas,\n ApiSchemas,\n ProcedureName,\n OptionalParams,\n} from \"./types\";\nimport { parseOutput } from \"./schema\";\n\n/*\nexport const emptyParamsSchema = z.tuple([]).readonly()\n// [] GOOD\n// [string] BAD\n// [string, string] BAD\n\nexport const singleParamSchema = z.tuple([z.string()]).readonly()\n// [string] GOOD\n// [] BAD\n// [string, string] BAD\n\nexport const apiSchemas = {\n getHealth: {\n path: 'health',\n output: getHealthOutputSchema,\n params: emptyParamsSchema\n },\n getIncidents: {\n path: 'incidents',\n output: getIncidentsOutputSchema,\n params: emptyParamsSchema\n },\n getIncident: {\n path: 'incidents',\n output: getIncidentOutputSchema,\n params: singleParamSchema\n },\n}\n*/\n\nexport default async function client<P extends ProcedureName>(\n props: { procedure: P } & OptionalParams<ApiSchemas[P], \"params\"> &\n OptionalParams<ApiSchemas[P], \"input\">,\n): Promise<z.infer<ApiSchemas[P][\"output\"]>> {\n const base = \"http://localhost:3000\";\n const procedureSchemas = apiSchemas[props.procedure];\n\n // Body\n const init: RequestInit = {\n method: procedureSchemas.method,\n };\n if (\"input\" in procedureSchemas) {\n const parsed = procedureSchemas.input.parse(props.input);\n const json = JSON.stringify(parsed);\n init.body = json;\n }\n\n // URL\n const parts = [base, procedureSchemas.path];\n if (\"params\" in procedureSchemas) {\n const parsed = procedureSchemas.params.parse(props.params);\n const encoded = parsed.map((param) => encodeURIComponent(param));\n parts.push(...encoded);\n }\n const url = parts.join(\"/\");\n\n const response = await fetch(url, init);\n const data: unknown = await response.json();\n\n // const parser: ParsersByProcedure[P] = apiSchemas[props.procedure];\n // const output = parser.output.parse(data);\n\n const output = parseOutput(apiSchemas[props.procedure], data)\n\n return output;\n}\n\n\n"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { defineRelations } from "drizzle-orm";
2
2
  import { boolean, index, integer, jsonb, pgEnum, pgTable, text, timestamp, uuid, varchar } from "drizzle-orm/pg-core";
3
- import { z as z$1 } from "zod";
3
+ import z, { z as z$1 } from "zod";
4
4
  import { createSchemaFactory } from "drizzle-orm/zod";
5
5
  //#region schema.ts
6
6
  const statusSignalEnum = pgEnum("status_signal", ["recovery", "failure"]);
@@ -137,6 +137,9 @@ const relations = defineRelations(tables, (props) => {
137
137
  }
138
138
  };
139
139
  });
140
+ function parseOutput(parser, data) {
141
+ return z.parse(parser.output, data);
142
+ }
140
143
  //#endregion
141
144
  //#region types.ts
142
145
  const { createSelectSchema, createInsertSchema } = createSchemaFactory({ coerce: { date: true } });
@@ -242,9 +245,9 @@ async function client(props) {
242
245
  }
243
246
  const url = parts.join("/");
244
247
  const data = await (await fetch(url, init)).json();
245
- return procedureSchemas.output.parse(data);
248
+ return parseOutput(apiSchemas[props.procedure], data);
246
249
  }
247
250
  //#endregion
248
- export { apiSchemas, channelSchema, client, emptyParamsSchema, eventInsertSchema, eventSchema, getHealthOutputSchema, getIncidentOutputSchema, getIncidentsOutputSchema, importantGenerationSchema, incidentCommentsInsertSchema, incidentCommentsSchema, incidentEventInsertSchema, incidentEventSchema, incidentInsertSchema, incidentSchema, incidentWithChannelSchema, postIncidentCommentInputSchema, postIncidentCommentOutputSchema, prewatchEvidenceEventInsertSchema, prewatchEvidenceEventSchema, prewatchGenerationSchema, prewatchPromptEventInsertSchema, prewatchPromptEventSchema, prewatchResultInsertSchema, prewatchResultSchema, relations, singleParamSchema, statusSignalSchema, suspiciousPrewatchGenerationSchema, tables, teamInsertSchema, teamSchema, unimportantGenerationSchema, unsuspiciousPrewatchGenerationSchema, watchGenerationSchema, watchResultInsertSchema, watchResultSchema };
251
+ export { apiSchemas, channelSchema, client, emptyParamsSchema, eventInsertSchema, eventSchema, getHealthOutputSchema, getIncidentOutputSchema, getIncidentsOutputSchema, importantGenerationSchema, incidentCommentsInsertSchema, incidentCommentsSchema, incidentEventInsertSchema, incidentEventSchema, incidentInsertSchema, incidentSchema, incidentWithChannelSchema, postIncidentCommentInputSchema, postIncidentCommentOutputSchema, prewatchEvidenceEventInsertSchema, prewatchEvidenceEventSchema, prewatchGenerationSchema, prewatchPromptEventInsertSchema, prewatchPromptEventSchema, prewatchResultInsertSchema, prewatchResultSchema, relations, singleParamSchema, statusSignalEnum, statusSignalSchema, suspiciousPrewatchGenerationSchema, tables, teamInsertSchema, teamSchema, unimportantGenerationSchema, unsuspiciousPrewatchGenerationSchema, watchGenerationSchema, watchResultInsertSchema, watchResultSchema };
249
252
 
250
253
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["z"],"sources":["../schema.ts","../types.ts","../client.ts"],"sourcesContent":["import { defineRelations, type Json } from \"drizzle-orm\";\nimport {\n pgEnum,\n pgTable,\n uuid,\n text,\n timestamp,\n jsonb,\n index,\n integer,\n boolean,\n varchar,\n} from \"drizzle-orm/pg-core\";\n\nexport const statusSignalEnum = pgEnum(\"status_signal\", [\n \"recovery\",\n \"failure\",\n]);\n\nexport const teamsTable = pgTable(\"teams\", {\n id: uuid().primaryKey().defaultRandom(),\n slackTeamId: text().notNull(),\n installerId: text().notNull(),\n installerToken: text(),\n scopes: text().array(),\n teamName: text(),\n botToken: text().notNull(),\n botScopes: text().array().notNull(),\n botUserId: text().notNull(),\n botId: text().notNull(),\n});\n\nexport const eventsTable = pgTable(\n \"events\",\n {\n id: uuid().primaryKey().defaultRandom(),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n slackAuthorId: text().notNull(),\n slackChannelId: text().notNull(),\n slackTeamId: text().notNull(),\n ts: timestamp().notNull().defaultNow(),\n textRaw: text(),\n textNorm: text(),\n payload: jsonb(\"payload\").$type<Json>().notNull(),\n mlClassification: integer().notNull(),\n permalink: text().notNull(),\n },\n (t) => [\n index(\"events_stream_ts_idx\").on(t.channelId, t.ts),\n index(\"events_stream_ts_event_idx\").on(\n t.channelId,\n t.ts,\n t.id,\n ),\n index(\"events_stream_idx\").on(t.channelId),\n ],\n);\n\nexport const channelsTable = pgTable(\"channels\", {\n id: uuid().primaryKey().defaultRandom(),\n slackChannelId: text().notNull(),\n slackName: text().notNull(),\n});\n\nexport const prewatchResultsTable = pgTable(\"prewatchResults\", {\n id: uuid().primaryKey().defaultRandom(),\n triggerEventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n suspicious: boolean().notNull(),\n reasoning: text().notNull(),\n title: text(),\n incidentId: uuid().references(() => incidentsTable.id),\n});\n\nexport const prewatchPromptEventsTable = pgTable(\"prewatchPromptEvents\", {\n id: uuid().primaryKey().defaultRandom(),\n prewatchResultId: uuid()\n .notNull()\n .references(() => prewatchResultsTable.id),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n});\n\nexport const prewatchEvidenceEventsTable = pgTable(\"prewatchEvidenceIds\", {\n id: uuid().primaryKey().defaultRandom(),\n prewatchResultId: uuid()\n .notNull()\n .references(() => prewatchResultsTable.id),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n});\n\nexport const watchResultsTable = pgTable(\"watchResults\", {\n id: uuid().primaryKey().defaultRandom(),\n incidentId: uuid()\n .notNull()\n .references(() => incidentsTable.id),\n triggerEventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n statusSignal: statusSignalEnum(),\n important: boolean().notNull(),\n description: text(),\n summary: text(),\n});\n\nexport const incidentsTable = pgTable(\"incidents\", {\n id: uuid().primaryKey().defaultRandom(),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n ts: timestamp().notNull().defaultNow(),\n});\n\nexport const incidentCommentsTable = pgTable(\"incidentComments\", {\n id: uuid().primaryKey().defaultRandom(),\n incidentId: uuid().notNull().references(() => incidentsTable.id),\n content: varchar({ length: 10000 }).notNull(),\n ts: timestamp().notNull().defaultNow()\n})\n\nexport const incidentEventsTable = pgTable(\"incidentEvents\", {\n id: uuid().primaryKey().defaultRandom(),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n incidentId: uuid()\n .notNull()\n .references(() => incidentsTable.id),\n});\n\nexport const tables = {\n teams: teamsTable,\n events: eventsTable,\n channels: channelsTable,\n prewatchResults: prewatchResultsTable,\n prewatchPromptEvents: prewatchPromptEventsTable,\n prewatchEvidenceEvents: prewatchEvidenceEventsTable,\n watchResults: watchResultsTable,\n incidents: incidentsTable,\n incidentEvents: incidentEventsTable,\n incidentComments: incidentCommentsTable\n};\n\n/*\nconst comment = db.query.incidentComments.findFirst({\n with: {\n incident: true\n }\n})\n\nconsole.log('The comment was made on this incident:', comment.incident) // GOOD\nconsole.log('The comment was made on this incident:', comment.incidents) // BAD\n*/\n\nexport const relations = defineRelations(tables, (props) => {\n return {\n incidents: {\n incidentEvents: props.many.incidentEvents(),\n incidentComments: props.many.incidentComments(),\n channel: props.one.channels({\n from: props.incidents.channelId,\n to: props.channels.id,\n optional: false,\n }),\n },\n incidentComments: {\n incident: props.one.incidents({\n from: props.incidentComments.incidentId,\n to: props.incidents.id,\n optional: false\n })\n },\n incidentEvents: {\n incident: props.one.incidents({\n from: props.incidentEvents.incidentId,\n to: props.incidents.id,\n optional: false,\n }),\n event: props.one.events({\n from: props.incidentEvents.eventId,\n to: props.events.id,\n optional: false,\n }),\n },\n events: {\n prewatchResult: props.one.prewatchResults({\n from: props.events.id,\n to: props.prewatchResults.triggerEventId,\n optional: true,\n }),\n watchResult: props.one.watchResults({\n from: props.events.id,\n to: props.watchResults.triggerEventId,\n optional: true,\n }),\n },\n };\n});\n\n","import db from \"./db\";\nimport { z } from \"zod\";\nimport {\n channelsTable,\n eventsTable,\n prewatchEvidenceEventsTable,\n prewatchPromptEventsTable,\n prewatchResultsTable,\n teamsTable,\n incidentEventsTable,\n incidentsTable,\n watchResultsTable,\n statusSignalEnum,\n incidentCommentsTable,\n} from \"./schema\";\n\nexport type Db = typeof db;\n\nimport { createSchemaFactory } from \"drizzle-orm/zod\";\n\nconst { createSelectSchema, createInsertSchema } = createSchemaFactory({\n coerce: {\n date: true,\n },\n});\n\n// Enums\nexport const statusSignalSchema = createSelectSchema(statusSignalEnum);\nexport type StatusSignal = z.infer<typeof statusSignalSchema>;\n\n// Tables\nexport const eventSchema = createSelectSchema(eventsTable);\nexport type Event = z.infer<typeof eventSchema>;\n\nexport const eventInsertSchema = createInsertSchema(eventsTable);\nexport type EventInsert = z.infer<typeof eventInsertSchema>;\n\nexport const channelSchema = createSelectSchema(channelsTable);\nexport type Channel = z.infer<typeof channelSchema>;\n\nexport const teamSchema = createSelectSchema(teamsTable);\nexport type Team = z.infer<typeof teamSchema>;\n\nexport const teamInsertSchema = createInsertSchema(teamsTable);\nexport type TeamInsert = z.infer<typeof teamInsertSchema>;\n\nexport const prewatchResultSchema = createSelectSchema(prewatchResultsTable);\nexport type PrewatchResult = z.infer<typeof prewatchResultSchema>;\nexport const prewatchResultInsertSchema =\n createInsertSchema(prewatchResultsTable);\nexport type PrewatchResultInsert = z.infer<typeof prewatchResultInsertSchema>;\n\nexport const prewatchPromptEventSchema = createSelectSchema(\n prewatchPromptEventsTable,\n);\nexport type PrewatchPromptEvent = z.infer<typeof prewatchPromptEventSchema>;\nexport const prewatchPromptEventInsertSchema = createInsertSchema(\n prewatchPromptEventsTable,\n);\nexport type PrewatchPromptEventInsert = z.infer<\n typeof prewatchPromptEventInsertSchema\n>;\n\nexport const watchResultSchema = createSelectSchema(watchResultsTable);\nexport type WatchResult = z.infer<typeof watchResultSchema>;\nexport const watchResultInsertSchema = createInsertSchema(watchResultsTable);\nexport type WatchResultInsert = z.infer<typeof watchResultInsertSchema>;\n\nexport const incidentSchema = createSelectSchema(incidentsTable);\nexport type Incident = z.infer<typeof incidentSchema>;\nexport const incidentInsertSchema = createInsertSchema(incidentsTable);\nexport type IncidentInsert = z.infer<typeof incidentInsertSchema>;\n\nexport const incidentCommentsSchema = createSelectSchema(incidentCommentsTable);\nexport type IncidentComments = z.infer<typeof incidentCommentsSchema>;\nexport const incidentCommentsInsertSchema = createInsertSchema(\n incidentCommentsTable,\n);\nexport type IncidentCommentsInsert = z.infer<\n typeof incidentCommentsInsertSchema\n>;\n\nexport const incidentEventSchema = createSelectSchema(incidentEventsTable);\nexport type IncidentEvent = z.infer<typeof incidentEventSchema>;\nexport const incidentEventInsertSchema =\n createInsertSchema(incidentEventsTable);\nexport type IncidentEventInsert = z.infer<typeof incidentEventInsertSchema>;\n\nexport const prewatchEvidenceEventSchema = createSelectSchema(\n prewatchEvidenceEventsTable,\n);\nexport type PrewatchEvidenceEvent = z.infer<typeof prewatchEvidenceEventSchema>;\nexport const prewatchEvidenceEventInsertSchema = createInsertSchema(\n prewatchEvidenceEventsTable,\n);\nexport type PrewatchEvidenceEventInsert = z.infer<\n typeof prewatchEvidenceEventInsertSchema\n>;\n\nconst relatedEventSchema = eventSchema.extend({\n prewatchResult: prewatchResultSchema.nullish(),\n watchResult: watchResultSchema.nullish(),\n});\n\nconst relatedIncidentEventSchema = incidentEventSchema.extend({\n event: relatedEventSchema,\n});\n\nexport interface PromptEvent {\n id: string;\n ts: string;\n slackAuthorId: string;\n textRaw: string | null;\n textNorm: string | null;\n}\n\nexport const unsuspiciousPrewatchGenerationSchema = z.object({\n suspicious: z.literal(false),\n reasoning: z.string(),\n});\n\nexport const suspiciousPrewatchGenerationSchema = z.object({\n suspicious: z.literal(true),\n reasoning: z.string(),\n title: z.string(),\n evidenceEventIds: z.string().array(),\n});\nexport type SuspiciousPrewatchGeneration = z.infer<\n typeof suspiciousPrewatchGenerationSchema\n>;\n\nexport const importantGenerationSchema = z\n .object({\n important: z.literal(true),\n statusSignal: statusSignalSchema,\n description: z.string(),\n summary: z.string(),\n })\n .strict();\n\nexport const unimportantGenerationSchema = z\n .object({\n important: z.literal(false),\n })\n .strict();\n\nexport const watchGenerationSchema = z.union([\n importantGenerationSchema,\n unimportantGenerationSchema,\n]);\nexport type WatchGeneration = z.infer<typeof watchGenerationSchema>;\n\nexport const prewatchGenerationSchema = z.union([\n suspiciousPrewatchGenerationSchema,\n unsuspiciousPrewatchGenerationSchema,\n]);\nexport type PrewatchGeneration = z.infer<typeof prewatchGenerationSchema>;\n\n// API\n\nexport const emptyParamsSchema = z.tuple([]).readonly();\nexport type EmptyParams = z.infer<typeof emptyParamsSchema>;\n\nexport const singleParamSchema = z.tuple([z.string()]).readonly();\nexport type SingleParam = z.infer<typeof singleParamSchema>;\n\nexport type OptionalParams<S, K extends PropertyKey> = S extends {\n [P in K]: infer T extends z.ZodType;\n}\n ? { [P in K]: z.infer<T> }\n : { [P in K]?: never };\n\nexport const incidentWithChannelSchema = incidentSchema.extend({\n channel: channelSchema,\n});\n\n// GET /health\nexport const getHealthOutputSchema = z.object({\n startupTime: z.string(),\n memoryLoad: z.number(),\n});\n\n// GET /incidents\nexport const getIncidentsOutputSchema = incidentWithChannelSchema.array();\n\n// GET /incidents/:incidentId\nexport const getIncidentOutputSchema = incidentSchema.extend({\n incidentEvents: relatedIncidentEventSchema.array(),\n channel: channelSchema,\n});\n\nexport const postIncidentCommentInputSchema = incidentCommentsInsertSchema.pick(\n {\n incidentId: true,\n content: true,\n },\n);\n\nexport const postIncidentCommentOutputSchema = incidentCommentsSchema;\n\nexport const apiSchemas = {\n getHealth: {\n method: \"GET\",\n path: \"health\",\n output: getHealthOutputSchema,\n },\n getIncidents: {\n method: \"GET\",\n path: \"incidents\",\n output: getIncidentsOutputSchema,\n },\n getIncident: {\n method: \"GET\",\n path: \"incidents\",\n output: getIncidentOutputSchema,\n params: singleParamSchema,\n },\n postIncidentComment: {\n method: \"POST\",\n path: \"incidents\",\n output: postIncidentCommentOutputSchema,\n input: postIncidentCommentInputSchema,\n },\n};\n\nexport type ApiSchemas = typeof apiSchemas;\n\nexport type ProcedureName = keyof ApiSchemas;\n// 'getHealth' | 'getIncidents' | 'getIncident' ...\n","import z from \"zod\";\nimport {\n apiSchemas,\n ApiSchemas,\n ProcedureName,\n OptionalParams,\n} from \"./types\";\n\n/*\nexport const emptyParamsSchema = z.tuple([]).readonly()\n// [] GOOD\n// [string] BAD\n// [string, string] BAD\n\nexport const singleParamSchema = z.tuple([z.string()]).readonly()\n// [string] GOOD\n// [] BAD\n// [string, string] BAD\n\nexport const apiSchemas = {\n getHealth: {\n path: 'health',\n output: getHealthOutputSchema,\n params: emptyParamsSchema\n },\n getIncidents: {\n path: 'incidents',\n output: getIncidentsOutputSchema,\n params: emptyParamsSchema\n },\n getIncident: {\n path: 'incidents',\n output: getIncidentOutputSchema,\n params: singleParamSchema\n },\n}\n*/\n\nexport default async function client<P extends ProcedureName>(\n props: { procedure: P } & OptionalParams<ApiSchemas[P], \"params\"> &\n OptionalParams<ApiSchemas[P], \"input\">,\n): Promise<z.infer<ApiSchemas[P]['output']>> {\n const base = \"http://localhost:3000\";\n const procedureSchemas = apiSchemas[props.procedure];\n\n // Body\n const init: RequestInit = {\n method: procedureSchemas.method,\n };\n if (\"input\" in procedureSchemas) {\n const parsed = procedureSchemas.input.parse(props.input);\n const json = JSON.stringify(parsed);\n init.body = json;\n }\n \n // URL\n const parts = [base, procedureSchemas.path];\n if (\"params\" in procedureSchemas) {\n const parsed = procedureSchemas.params.parse(props.params);\n const encoded = parsed.map((param) => encodeURIComponent(param));\n parts.push(...encoded);\n }\n const url = parts.join(\"/\");\n\n const response = await fetch(url, init);\n const data: unknown = await response.json();\n const output = procedureSchemas.output.parse(data) as unknown as z.infer<ApiSchemas[P]['output']>\n\n return output;\n}"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["z"],"sources":["../schema.ts","../types.ts","../client.ts"],"sourcesContent":["import { defineRelations, type Json } from \"drizzle-orm\";\nimport {\n pgEnum,\n pgTable,\n uuid,\n text,\n timestamp,\n jsonb,\n index,\n integer,\n boolean,\n varchar,\n} from \"drizzle-orm/pg-core\";\nimport z from \"zod\";\n\nexport const statusSignalEnum = pgEnum(\"status_signal\", [\n \"recovery\",\n \"failure\",\n]);\n\nexport const teamsTable = pgTable(\"teams\", {\n id: uuid().primaryKey().defaultRandom(),\n slackTeamId: text().notNull(),\n installerId: text().notNull(),\n installerToken: text(),\n scopes: text().array(),\n teamName: text(),\n botToken: text().notNull(),\n botScopes: text().array().notNull(),\n botUserId: text().notNull(),\n botId: text().notNull(),\n});\n\nexport const eventsTable = pgTable(\n \"events\",\n {\n id: uuid().primaryKey().defaultRandom(),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n slackAuthorId: text().notNull(),\n slackChannelId: text().notNull(),\n slackTeamId: text().notNull(),\n ts: timestamp().notNull().defaultNow(),\n textRaw: text(),\n textNorm: text(),\n payload: jsonb(\"payload\").$type<Json>().notNull(),\n mlClassification: integer().notNull(),\n permalink: text().notNull(),\n },\n (t) => [\n index(\"events_stream_ts_idx\").on(t.channelId, t.ts),\n index(\"events_stream_ts_event_idx\").on(\n t.channelId,\n t.ts,\n t.id,\n ),\n index(\"events_stream_idx\").on(t.channelId),\n ],\n);\n\nexport const channelsTable = pgTable(\"channels\", {\n id: uuid().primaryKey().defaultRandom(),\n slackChannelId: text().notNull(),\n slackName: text().notNull(),\n});\n\nexport const prewatchResultsTable = pgTable(\"prewatchResults\", {\n id: uuid().primaryKey().defaultRandom(),\n triggerEventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n suspicious: boolean().notNull(),\n reasoning: text().notNull(),\n title: text(),\n incidentId: uuid().references(() => incidentsTable.id),\n});\n\nexport const prewatchPromptEventsTable = pgTable(\"prewatchPromptEvents\", {\n id: uuid().primaryKey().defaultRandom(),\n prewatchResultId: uuid()\n .notNull()\n .references(() => prewatchResultsTable.id),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n});\n\nexport const prewatchEvidenceEventsTable = pgTable(\"prewatchEvidenceIds\", {\n id: uuid().primaryKey().defaultRandom(),\n prewatchResultId: uuid()\n .notNull()\n .references(() => prewatchResultsTable.id),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n});\n\nexport const watchResultsTable = pgTable(\"watchResults\", {\n id: uuid().primaryKey().defaultRandom(),\n incidentId: uuid()\n .notNull()\n .references(() => incidentsTable.id),\n triggerEventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n statusSignal: statusSignalEnum(),\n important: boolean().notNull(),\n description: text(),\n summary: text(),\n});\n\nexport const incidentsTable = pgTable(\"incidents\", {\n id: uuid().primaryKey().defaultRandom(),\n channelId: uuid()\n .notNull()\n .references(() => channelsTable.id),\n ts: timestamp().notNull().defaultNow(),\n});\n\nexport const incidentCommentsTable = pgTable(\"incidentComments\", {\n id: uuid().primaryKey().defaultRandom(),\n incidentId: uuid().notNull().references(() => incidentsTable.id),\n content: varchar({ length: 10000 }).notNull(),\n ts: timestamp().notNull().defaultNow()\n})\n\nexport const incidentEventsTable = pgTable(\"incidentEvents\", {\n id: uuid().primaryKey().defaultRandom(),\n eventId: uuid()\n .notNull()\n .references(() => eventsTable.id),\n incidentId: uuid()\n .notNull()\n .references(() => incidentsTable.id),\n});\n\nexport const tables = {\n teams: teamsTable,\n events: eventsTable,\n channels: channelsTable,\n prewatchResults: prewatchResultsTable,\n prewatchPromptEvents: prewatchPromptEventsTable,\n prewatchEvidenceEvents: prewatchEvidenceEventsTable,\n watchResults: watchResultsTable,\n incidents: incidentsTable,\n incidentEvents: incidentEventsTable,\n incidentComments: incidentCommentsTable\n};\n\n/*\nconst comment = db.query.incidentComments.findFirst({\n with: {\n incident: true\n }\n})\n\nconsole.log('The comment was made on this incident:', comment.incident) // GOOD\nconsole.log('The comment was made on this incident:', comment.incidents) // BAD\n*/\n\nexport const relations = defineRelations(tables, (props) => {\n return {\n incidents: {\n incidentEvents: props.many.incidentEvents(),\n incidentComments: props.many.incidentComments(),\n channel: props.one.channels({\n from: props.incidents.channelId,\n to: props.channels.id,\n optional: false,\n }),\n },\n incidentComments: {\n incident: props.one.incidents({\n from: props.incidentComments.incidentId,\n to: props.incidents.id,\n optional: false\n })\n },\n incidentEvents: {\n incident: props.one.incidents({\n from: props.incidentEvents.incidentId,\n to: props.incidents.id,\n optional: false,\n }),\n event: props.one.events({\n from: props.incidentEvents.eventId,\n to: props.events.id,\n optional: false,\n }),\n },\n events: {\n prewatchResult: props.one.prewatchResults({\n from: props.events.id,\n to: props.prewatchResults.triggerEventId,\n optional: true,\n }),\n watchResult: props.one.watchResults({\n from: props.events.id,\n to: props.watchResults.triggerEventId,\n optional: true,\n }),\n },\n };\n});\n\nexport function parseOutput<Parser extends { output: z.ZodType; }>(\n parser: Parser,\n data: unknown): z.infer<Parser[\"output\"]> {\n return z.parse<Parser[\"output\"]>(parser.output, data);\n}\n\n","import db from \"./db\";\nimport { output, z } from \"zod\";\nimport {\n channelsTable,\n eventsTable,\n prewatchEvidenceEventsTable,\n prewatchPromptEventsTable,\n prewatchResultsTable,\n teamsTable,\n incidentEventsTable,\n incidentsTable,\n watchResultsTable,\n statusSignalEnum,\n incidentCommentsTable,\n} from \"./schema\";\n\nexport type Db = typeof db;\n\nimport { createSchemaFactory } from \"drizzle-orm/zod\";\n\nconst { createSelectSchema, createInsertSchema } = createSchemaFactory({\n coerce: {\n date: true,\n },\n});\n\n// Enums\nexport const statusSignalSchema = createSelectSchema(statusSignalEnum);\nexport type StatusSignal = z.infer<typeof statusSignalSchema>;\n\n// Tables\nexport const eventSchema = createSelectSchema(eventsTable);\nexport type Event = z.infer<typeof eventSchema>;\n\nexport const eventInsertSchema = createInsertSchema(eventsTable);\nexport type EventInsert = z.infer<typeof eventInsertSchema>;\n\nexport const channelSchema = createSelectSchema(channelsTable);\nexport type Channel = z.infer<typeof channelSchema>;\n\nexport const teamSchema = createSelectSchema(teamsTable);\nexport type Team = z.infer<typeof teamSchema>;\n\nexport const teamInsertSchema = createInsertSchema(teamsTable);\nexport type TeamInsert = z.infer<typeof teamInsertSchema>;\n\nexport const prewatchResultSchema = createSelectSchema(prewatchResultsTable);\nexport type PrewatchResult = z.infer<typeof prewatchResultSchema>;\nexport const prewatchResultInsertSchema =\n createInsertSchema(prewatchResultsTable);\nexport type PrewatchResultInsert = z.infer<typeof prewatchResultInsertSchema>;\n\nexport const prewatchPromptEventSchema = createSelectSchema(\n prewatchPromptEventsTable,\n);\nexport type PrewatchPromptEvent = z.infer<typeof prewatchPromptEventSchema>;\nexport const prewatchPromptEventInsertSchema = createInsertSchema(\n prewatchPromptEventsTable,\n);\nexport type PrewatchPromptEventInsert = z.infer<\n typeof prewatchPromptEventInsertSchema\n>;\n\nexport const watchResultSchema = createSelectSchema(watchResultsTable);\nexport type WatchResult = z.infer<typeof watchResultSchema>;\nexport const watchResultInsertSchema = createInsertSchema(watchResultsTable);\nexport type WatchResultInsert = z.infer<typeof watchResultInsertSchema>;\n\nexport const incidentSchema = createSelectSchema(incidentsTable);\nexport type Incident = z.infer<typeof incidentSchema>;\nexport const incidentInsertSchema = createInsertSchema(incidentsTable);\nexport type IncidentInsert = z.infer<typeof incidentInsertSchema>;\n\nexport const incidentCommentsSchema = createSelectSchema(incidentCommentsTable);\nexport type IncidentComments = z.infer<typeof incidentCommentsSchema>;\nexport const incidentCommentsInsertSchema = createInsertSchema(\n incidentCommentsTable,\n);\nexport type IncidentCommentsInsert = z.infer<\n typeof incidentCommentsInsertSchema\n>;\n\nexport const incidentEventSchema = createSelectSchema(incidentEventsTable);\nexport type IncidentEvent = z.infer<typeof incidentEventSchema>;\nexport const incidentEventInsertSchema =\n createInsertSchema(incidentEventsTable);\nexport type IncidentEventInsert = z.infer<typeof incidentEventInsertSchema>;\n\nexport const prewatchEvidenceEventSchema = createSelectSchema(\n prewatchEvidenceEventsTable,\n);\nexport type PrewatchEvidenceEvent = z.infer<typeof prewatchEvidenceEventSchema>;\nexport const prewatchEvidenceEventInsertSchema = createInsertSchema(\n prewatchEvidenceEventsTable,\n);\nexport type PrewatchEvidenceEventInsert = z.infer<\n typeof prewatchEvidenceEventInsertSchema\n>;\n\nconst relatedEventSchema = eventSchema.extend({\n prewatchResult: prewatchResultSchema.nullish(),\n watchResult: watchResultSchema.nullish(),\n});\n\nconst relatedIncidentEventSchema = incidentEventSchema.extend({\n event: relatedEventSchema,\n});\n\nexport interface PromptEvent {\n id: string;\n ts: string;\n slackAuthorId: string;\n textRaw: string | null;\n textNorm: string | null;\n}\n\nexport const unsuspiciousPrewatchGenerationSchema = z.object({\n suspicious: z.literal(false),\n reasoning: z.string(),\n});\n\nexport const suspiciousPrewatchGenerationSchema = z.object({\n suspicious: z.literal(true),\n reasoning: z.string(),\n title: z.string(),\n evidenceEventIds: z.string().array(),\n});\nexport type SuspiciousPrewatchGeneration = z.infer<\n typeof suspiciousPrewatchGenerationSchema\n>;\n\nexport const importantGenerationSchema = z\n .object({\n important: z.literal(true),\n statusSignal: statusSignalSchema,\n description: z.string(),\n summary: z.string(),\n })\n .strict();\n\nexport const unimportantGenerationSchema = z\n .object({\n important: z.literal(false),\n })\n .strict();\n\nexport const watchGenerationSchema = z.union([\n importantGenerationSchema,\n unimportantGenerationSchema,\n]);\nexport type WatchGeneration = z.infer<typeof watchGenerationSchema>;\n\nexport const prewatchGenerationSchema = z.union([\n suspiciousPrewatchGenerationSchema,\n unsuspiciousPrewatchGenerationSchema,\n]);\nexport type PrewatchGeneration = z.infer<typeof prewatchGenerationSchema>;\n\n// API\n\nexport const emptyParamsSchema = z.tuple([]).readonly();\nexport type EmptyParams = z.infer<typeof emptyParamsSchema>;\n\nexport const singleParamSchema = z.tuple([z.string()]).readonly();\nexport type SingleParam = z.infer<typeof singleParamSchema>;\n\nexport type OptionalParams<S, K extends PropertyKey> = S extends {\n [P in K]: infer T extends z.ZodType;\n}\n ? { [P in K]: z.infer<T> }\n : { [P in K]?: never };\n\n// export type OutputByProcedure = {\n// [Name in ProcedureName]: z.infer<ApiSchemas[Name]['output']>\n// }\n\n// export type ParsersByProcedure = {\n// [Name in ProcedureName]: {\n// output: {\n// parse(data: unknown): z.infer<ApiSchemas[Name]['output']>\n// }\n// }\n// }\n\nexport const incidentWithChannelSchema = incidentSchema.extend({\n channel: channelSchema,\n});\n\n// GET /health\nexport const getHealthOutputSchema = z.object({\n startupTime: z.string(),\n memoryLoad: z.number(),\n});\n\n// GET /incidents\nexport const getIncidentsOutputSchema = incidentWithChannelSchema.array();\n\n// GET /incidents/:incidentId\nexport const getIncidentOutputSchema = incidentSchema.extend({\n incidentEvents: relatedIncidentEventSchema.array(),\n channel: channelSchema,\n});\n\nexport const postIncidentCommentInputSchema = incidentCommentsInsertSchema.pick(\n {\n incidentId: true,\n content: true,\n },\n);\n\nexport const postIncidentCommentOutputSchema = incidentCommentsSchema;\n\nexport const apiSchemas = {\n getHealth: {\n method: \"GET\",\n path: \"health\",\n output: getHealthOutputSchema,\n },\n getIncidents: {\n method: \"GET\",\n path: \"incidents\",\n output: getIncidentsOutputSchema,\n },\n getIncident: {\n method: \"GET\",\n path: \"incidents\",\n output: getIncidentOutputSchema,\n params: singleParamSchema,\n },\n postIncidentComment: {\n method: \"POST\",\n path: \"incidents\",\n output: postIncidentCommentOutputSchema,\n input: postIncidentCommentInputSchema,\n },\n};\n\nexport type ApiSchemas = typeof apiSchemas;\n\nexport type ProcedureName = keyof ApiSchemas;\n// 'getHealth' | 'getIncidents' | 'getIncident' ...\n\n","import z from \"zod\";\nimport {\n apiSchemas,\n ApiSchemas,\n ProcedureName,\n OptionalParams,\n} from \"./types\";\nimport { parseOutput } from \"./schema\";\n\n/*\nexport const emptyParamsSchema = z.tuple([]).readonly()\n// [] GOOD\n// [string] BAD\n// [string, string] BAD\n\nexport const singleParamSchema = z.tuple([z.string()]).readonly()\n// [string] GOOD\n// [] BAD\n// [string, string] BAD\n\nexport const apiSchemas = {\n getHealth: {\n path: 'health',\n output: getHealthOutputSchema,\n params: emptyParamsSchema\n },\n getIncidents: {\n path: 'incidents',\n output: getIncidentsOutputSchema,\n params: emptyParamsSchema\n },\n getIncident: {\n path: 'incidents',\n output: getIncidentOutputSchema,\n params: singleParamSchema\n },\n}\n*/\n\nexport default async function client<P extends ProcedureName>(\n props: { procedure: P } & OptionalParams<ApiSchemas[P], \"params\"> &\n OptionalParams<ApiSchemas[P], \"input\">,\n): Promise<z.infer<ApiSchemas[P][\"output\"]>> {\n const base = \"http://localhost:3000\";\n const procedureSchemas = apiSchemas[props.procedure];\n\n // Body\n const init: RequestInit = {\n method: procedureSchemas.method,\n };\n if (\"input\" in procedureSchemas) {\n const parsed = procedureSchemas.input.parse(props.input);\n const json = JSON.stringify(parsed);\n init.body = json;\n }\n\n // URL\n const parts = [base, procedureSchemas.path];\n if (\"params\" in procedureSchemas) {\n const parsed = procedureSchemas.params.parse(props.params);\n const encoded = parsed.map((param) => encodeURIComponent(param));\n parts.push(...encoded);\n }\n const url = parts.join(\"/\");\n\n const response = await fetch(url, init);\n const data: unknown = await response.json();\n\n // const parser: ParsersByProcedure[P] = apiSchemas[props.procedure];\n // const output = parser.output.parse(data);\n\n const output = parseOutput(apiSchemas[props.procedure], data)\n\n return output;\n}\n\n\n"],"mappings":"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"}
package/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { tables, relations} from './schema'
1
+ export { tables, relations, statusSignalEnum} from './schema'
2
2
 
3
3
  export { default as client } from './client'
4
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "one-shared",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "",
5
5
  "homepage": "https://github.com/eightseventeen/one-shared#readme",
6
6
  "bugs": {
package/types.ts CHANGED
@@ -174,13 +174,13 @@ export type OptionalParams<S, K extends PropertyKey> = S extends {
174
174
  // [Name in ProcedureName]: z.infer<ApiSchemas[Name]['output']>
175
175
  // }
176
176
 
177
- export type ParsersByProcedure = {
178
- [Name in ProcedureName]: {
179
- output: {
180
- parse(data: unknown): z.infer<ApiSchemas[Name]['output']>
181
- }
182
- }
183
- }
177
+ // export type ParsersByProcedure = {
178
+ // [Name in ProcedureName]: {
179
+ // output: {
180
+ // parse(data: unknown): z.infer<ApiSchemas[Name]['output']>
181
+ // }
182
+ // }
183
+ // }
184
184
 
185
185
  export const incidentWithChannelSchema = incidentSchema.extend({
186
186
  channel: channelSchema,