@parsrun/entity 0.1.35

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/pg.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pg.ts"],"names":[],"mappings":"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","file":"pg.js","sourcesContent":["/**\n * PostgreSQL Drizzle table generation from entity definitions\n */\nimport {\n pgTable,\n uuid,\n text,\n integer,\n boolean,\n timestamp,\n numeric,\n json,\n index,\n uniqueIndex,\n} from 'drizzle-orm/pg-core'\nimport { sql } from 'drizzle-orm'\nimport type { Entity, Field, FieldDefinition } from './types.js'\n\n/**\n * Convert field definition to Drizzle column builder\n */\nfunction fieldToColumn(name: string, field: Field) {\n const def: FieldDefinition = typeof field === 'string' ? { type: field } : field\n\n const columnName = def.db?.column ?? toSnakeCase(name)\n let column: any\n\n // Determine column type based on field type\n const fieldType = def.type.split(' ')[0] ?? 'string'\n\n switch (fieldType) {\n case 'string.uuid':\n column = uuid(columnName)\n break\n\n case 'string.email':\n case 'string.url':\n case 'string':\n column = text(columnName)\n break\n\n case 'number.integer':\n column = integer(columnName)\n break\n\n case 'number':\n if (def.db?.precision) {\n column = numeric(columnName, {\n precision: def.db.precision,\n scale: def.db.scale ?? 2,\n })\n } else {\n column = numeric(columnName)\n }\n break\n\n case 'boolean':\n column = boolean(columnName)\n break\n\n case 'Date':\n column = timestamp(columnName, { withTimezone: true })\n break\n\n case 'json':\n column = json(columnName)\n break\n\n default:\n // Union types like \"'draft' | 'active'\" become text\n column = text(columnName)\n }\n\n // Apply modifiers\n if (!def.optional && def.default === undefined) {\n column = column.notNull()\n }\n\n if (def.default !== undefined) {\n column = column.default(def.default)\n }\n\n return column\n}\n\n/**\n * Convert camelCase to snake_case\n */\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)\n}\n\n/**\n * Generate a Drizzle pgTable from an entity definition\n */\nexport function toPgTable<E extends Entity<string, Record<string, Field>, unknown>>(\n entity: E,\n tableRefs?: Record<string, any>\n): any {\n const def = entity.definition\n const columns: Record<string, any> = {}\n\n // Add id column\n columns['id'] = uuid('id').primaryKey().defaultRandom()\n\n // Add tenantId if tenant-scoped\n if (def.tenant) {\n const tenantsTable = tableRefs?.['tenants']\n if (tenantsTable) {\n columns['tenantId'] = uuid('tenant_id')\n .notNull()\n .references(() => tenantsTable.id, { onDelete: 'cascade' })\n } else {\n columns['tenantId'] = uuid('tenant_id').notNull()\n }\n }\n\n // Add user-defined fields\n for (const [name, field] of Object.entries(def.fields)) {\n const fieldDef: FieldDefinition = typeof field === 'string' ? { type: field } : field\n\n // Handle references\n if (fieldDef.db?.references && tableRefs) {\n const refTable = tableRefs[fieldDef.db.references.entity]\n if (refTable) {\n const refField = fieldDef.db.references.field ?? 'id'\n const onDelete = fieldDef.db.references.onDelete ?? 'restrict'\n\n let col = uuid(toSnakeCase(name)).references(() => refTable[refField], { onDelete })\n if (!fieldDef.optional) {\n col = col.notNull()\n }\n columns[name] = col\n } else {\n columns[name] = fieldToColumn(name, field)\n }\n } else {\n columns[name] = fieldToColumn(name, field)\n }\n }\n\n // Add timestamp fields\n if (def.timestamps) {\n columns['insertedAt'] = timestamp('inserted_at', { withTimezone: true })\n .notNull()\n .defaultNow()\n\n columns['updatedAt'] = timestamp('updated_at', { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date())\n }\n\n // Add soft delete field\n if (def.softDelete) {\n columns['deletedAt'] = timestamp('deleted_at', { withTimezone: true })\n }\n\n // Create table with indexes\n return pgTable(def.name, columns, (t: any) => {\n const indexes: Record<string, any> = {}\n\n // Add indexes from definition\n if (def.indexes) {\n for (const idx of def.indexes) {\n const idxName = idx.name ?? `${def.name}_${idx.fields.join('_')}_idx`\n const idxColumns = idx.fields.map((f) => t[f]).filter(Boolean)\n\n if (idxColumns.length === 0) continue\n\n if (idx.unique) {\n if (idx.where) {\n indexes[idxName] = uniqueIndex(idxName)\n .on(...(idxColumns as [any, ...any[]]))\n .where(sql.raw(idx.where))\n } else {\n indexes[idxName] = uniqueIndex(idxName).on(...(idxColumns as [any, ...any[]]))\n }\n } else {\n if (idx.where) {\n indexes[idxName] = index(idxName)\n .on(...(idxColumns as [any, ...any[]]))\n .where(sql.raw(idx.where))\n } else {\n indexes[idxName] = index(idxName).on(...(idxColumns as [any, ...any[]]))\n }\n }\n }\n }\n\n // Add default tenant index if tenant-scoped\n if (def.tenant && t.tenantId) {\n const tenantIdxName = `${def.name}_tenant_id_idx`\n if (!indexes[tenantIdxName]) {\n indexes[tenantIdxName] = index(tenantIdxName).on(t.tenantId)\n }\n }\n\n return indexes\n })\n}\n\n/**\n * Create multiple tables with resolved references\n */\nexport function createPgSchema<\n T extends Record<string, Entity<string, Record<string, Field>, unknown>>,\n>(entities: T): { [K in keyof T]: any } {\n const tables: Record<string, any> = {}\n\n // First pass: create tables without references\n for (const [key, entity] of Object.entries(entities)) {\n tables[key] = toPgTable(entity)\n }\n\n // Second pass: recreate tables with resolved references\n for (const [key, entity] of Object.entries(entities)) {\n tables[key] = toPgTable(entity, tables)\n }\n\n return tables as { [K in keyof T]: any }\n}\n\nexport { toPgTable as toTable }\n"]}
@@ -0,0 +1,15 @@
1
+ import { a as Entity, F as Field } from './types-CmS0cBdC.js';
2
+ import 'arktype';
3
+
4
+ /**
5
+ * Generate a Drizzle sqliteTable from an entity definition
6
+ */
7
+ declare function toSqliteTable<E extends Entity<string, Record<string, Field>, unknown>>(entity: E, tableRefs?: Record<string, any>): any;
8
+ /**
9
+ * Create multiple SQLite tables with resolved references
10
+ */
11
+ declare function createSqliteSchema<T extends Record<string, Entity<string, Record<string, Field>, unknown>>>(entities: T): {
12
+ [K in keyof T]: any;
13
+ };
14
+
15
+ export { createSqliteSchema, toSqliteTable, toSqliteTable as toTable };
package/dist/sqlite.js ADDED
@@ -0,0 +1,132 @@
1
+ import { text, sqliteTable, uniqueIndex, index, integer, real } from 'drizzle-orm/sqlite-core';
2
+ import { sql } from 'drizzle-orm';
3
+
4
+ // src/sqlite.ts
5
+ function fieldToColumn(name, field) {
6
+ const def = typeof field === "string" ? { type: field } : field;
7
+ const columnName = toSnakeCase(name);
8
+ let column;
9
+ const fieldType = def.type.split(" ")[0] ?? "string";
10
+ switch (fieldType) {
11
+ case "string.uuid":
12
+ case "string.email":
13
+ case "string.url":
14
+ case "string":
15
+ column = text(columnName);
16
+ break;
17
+ case "number.integer":
18
+ column = integer(columnName);
19
+ break;
20
+ case "number":
21
+ column = real(columnName);
22
+ break;
23
+ case "boolean":
24
+ column = integer(columnName, { mode: "boolean" });
25
+ break;
26
+ case "Date":
27
+ column = text(columnName);
28
+ break;
29
+ case "json":
30
+ column = text(columnName, { mode: "json" });
31
+ break;
32
+ default:
33
+ column = text(columnName);
34
+ }
35
+ if (!def.optional && def.default === void 0) {
36
+ column = column.notNull();
37
+ }
38
+ if (def.default !== void 0) {
39
+ if (typeof def.default === "object") {
40
+ column = column.default(JSON.stringify(def.default));
41
+ } else {
42
+ column = column.default(def.default);
43
+ }
44
+ }
45
+ return column;
46
+ }
47
+ function toSnakeCase(str) {
48
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
49
+ }
50
+ function toSqliteTable(entity, tableRefs) {
51
+ const def = entity.definition;
52
+ const columns = {};
53
+ columns["id"] = text("id").primaryKey().$defaultFn(() => crypto.randomUUID());
54
+ if (def.tenant) {
55
+ const tenantsTable = tableRefs?.["tenants"];
56
+ if (tenantsTable) {
57
+ columns["tenantId"] = text("tenant_id").notNull().references(() => tenantsTable.id, { onDelete: "cascade" });
58
+ } else {
59
+ columns["tenantId"] = text("tenant_id").notNull();
60
+ }
61
+ }
62
+ for (const [name, field] of Object.entries(def.fields)) {
63
+ const fieldDef = typeof field === "string" ? { } : field;
64
+ if (fieldDef.db?.references && tableRefs) {
65
+ const refTable = tableRefs[fieldDef.db.references.entity];
66
+ if (refTable) {
67
+ const refField = fieldDef.db.references.field ?? "id";
68
+ const onDelete = fieldDef.db.references.onDelete ?? "restrict";
69
+ let col = text(toSnakeCase(name)).references(() => refTable[refField], { onDelete });
70
+ if (!fieldDef.optional) {
71
+ col = col.notNull();
72
+ }
73
+ columns[name] = col;
74
+ } else {
75
+ columns[name] = fieldToColumn(name, field);
76
+ }
77
+ } else {
78
+ columns[name] = fieldToColumn(name, field);
79
+ }
80
+ }
81
+ if (def.timestamps) {
82
+ columns["insertedAt"] = text("inserted_at").notNull().$defaultFn(() => (/* @__PURE__ */ new Date()).toISOString());
83
+ columns["updatedAt"] = text("updated_at").notNull().$defaultFn(() => (/* @__PURE__ */ new Date()).toISOString()).$onUpdate(() => (/* @__PURE__ */ new Date()).toISOString());
84
+ }
85
+ if (def.softDelete) {
86
+ columns["deletedAt"] = text("deleted_at");
87
+ }
88
+ return sqliteTable(def.name, columns, (t) => {
89
+ const indexes = {};
90
+ if (def.indexes) {
91
+ for (const idx of def.indexes) {
92
+ const idxName = idx.name ?? `${def.name}_${idx.fields.join("_")}_idx`;
93
+ const idxColumns = idx.fields.map((f) => t[f]).filter(Boolean);
94
+ if (idxColumns.length === 0) continue;
95
+ if (idx.unique) {
96
+ if (idx.where) {
97
+ indexes[idxName] = uniqueIndex(idxName).on(...idxColumns).where(sql.raw(idx.where));
98
+ } else {
99
+ indexes[idxName] = uniqueIndex(idxName).on(...idxColumns);
100
+ }
101
+ } else {
102
+ if (idx.where) {
103
+ indexes[idxName] = index(idxName).on(...idxColumns).where(sql.raw(idx.where));
104
+ } else {
105
+ indexes[idxName] = index(idxName).on(...idxColumns);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ if (def.tenant && t.tenantId) {
111
+ const tenantIdxName = `${def.name}_tenant_id_idx`;
112
+ if (!indexes[tenantIdxName]) {
113
+ indexes[tenantIdxName] = index(tenantIdxName).on(t.tenantId);
114
+ }
115
+ }
116
+ return indexes;
117
+ });
118
+ }
119
+ function createSqliteSchema(entities) {
120
+ const tables = {};
121
+ for (const [key, entity] of Object.entries(entities)) {
122
+ tables[key] = toSqliteTable(entity);
123
+ }
124
+ for (const [key, entity] of Object.entries(entities)) {
125
+ tables[key] = toSqliteTable(entity, tables);
126
+ }
127
+ return tables;
128
+ }
129
+
130
+ export { createSqliteSchema, toSqliteTable, toSqliteTable as toTable };
131
+ //# sourceMappingURL=sqlite.js.map
132
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sqlite.ts"],"names":[],"mappings":"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","file":"sqlite.js","sourcesContent":["/**\n * SQLite Drizzle table generation from entity definitions\n * Compatible with Cloudflare D1\n */\nimport {\n sqliteTable,\n text,\n integer,\n real,\n index,\n uniqueIndex,\n} from 'drizzle-orm/sqlite-core'\nimport { sql } from 'drizzle-orm'\nimport type { Entity, Field, FieldDefinition } from './types.js'\n\n/**\n * Convert field definition to Drizzle SQLite column builder\n */\nfunction fieldToColumn(name: string, field: Field) {\n const def: FieldDefinition = typeof field === 'string' ? { type: field } : field\n\n const columnName = toSnakeCase(name)\n let column: any\n\n // Determine column type based on field type\n const fieldType = def.type.split(' ')[0] ?? 'string'\n\n switch (fieldType) {\n case 'string.uuid':\n case 'string.email':\n case 'string.url':\n case 'string':\n column = text(columnName)\n break\n\n case 'number.integer':\n column = integer(columnName)\n break\n\n case 'number':\n column = real(columnName)\n break\n\n case 'boolean':\n column = integer(columnName, { mode: 'boolean' })\n break\n\n case 'Date':\n column = text(columnName)\n break\n\n case 'json':\n column = text(columnName, { mode: 'json' })\n break\n\n default:\n column = text(columnName)\n }\n\n // Apply modifiers\n if (!def.optional && def.default === undefined) {\n column = column.notNull()\n }\n\n if (def.default !== undefined) {\n if (typeof def.default === 'object') {\n column = column.default(JSON.stringify(def.default))\n } else {\n column = column.default(def.default)\n }\n }\n\n return column\n}\n\n/**\n * Convert camelCase to snake_case\n */\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)\n}\n\n/**\n * Generate a Drizzle sqliteTable from an entity definition\n */\nexport function toSqliteTable<E extends Entity<string, Record<string, Field>, unknown>>(\n entity: E,\n tableRefs?: Record<string, any>\n): any {\n const def = entity.definition\n const columns: Record<string, any> = {}\n\n // Add id column\n columns['id'] = text('id')\n .primaryKey()\n .$defaultFn(() => crypto.randomUUID())\n\n // Add tenantId if tenant-scoped\n if (def.tenant) {\n const tenantsTable = tableRefs?.['tenants']\n if (tenantsTable) {\n columns['tenantId'] = text('tenant_id')\n .notNull()\n .references(() => tenantsTable.id, { onDelete: 'cascade' })\n } else {\n columns['tenantId'] = text('tenant_id').notNull()\n }\n }\n\n // Add user-defined fields\n for (const [name, field] of Object.entries(def.fields)) {\n const fieldDef: FieldDefinition = typeof field === 'string' ? { type: field } : field\n\n // Handle references\n if (fieldDef.db?.references && tableRefs) {\n const refTable = tableRefs[fieldDef.db.references.entity]\n if (refTable) {\n const refField = fieldDef.db.references.field ?? 'id'\n const onDelete = fieldDef.db.references.onDelete ?? 'restrict'\n\n let col = text(toSnakeCase(name)).references(() => refTable[refField], { onDelete })\n if (!fieldDef.optional) {\n col = col.notNull()\n }\n columns[name] = col\n } else {\n columns[name] = fieldToColumn(name, field)\n }\n } else {\n columns[name] = fieldToColumn(name, field)\n }\n }\n\n // Add timestamp fields\n if (def.timestamps) {\n columns['insertedAt'] = text('inserted_at')\n .notNull()\n .$defaultFn(() => new Date().toISOString())\n\n columns['updatedAt'] = text('updated_at')\n .notNull()\n .$defaultFn(() => new Date().toISOString())\n .$onUpdate(() => new Date().toISOString())\n }\n\n // Add soft delete field\n if (def.softDelete) {\n columns['deletedAt'] = text('deleted_at')\n }\n\n // Create table with indexes\n return sqliteTable(def.name, columns, (t: any) => {\n const indexes: Record<string, any> = {}\n\n // Add indexes from definition\n if (def.indexes) {\n for (const idx of def.indexes) {\n const idxName = idx.name ?? `${def.name}_${idx.fields.join('_')}_idx`\n const idxColumns = idx.fields.map((f) => t[f]).filter(Boolean)\n\n if (idxColumns.length === 0) continue\n\n if (idx.unique) {\n if (idx.where) {\n indexes[idxName] = uniqueIndex(idxName)\n .on(...(idxColumns as [any, ...any[]]))\n .where(sql.raw(idx.where))\n } else {\n indexes[idxName] = uniqueIndex(idxName).on(...(idxColumns as [any, ...any[]]))\n }\n } else {\n if (idx.where) {\n indexes[idxName] = index(idxName)\n .on(...(idxColumns as [any, ...any[]]))\n .where(sql.raw(idx.where))\n } else {\n indexes[idxName] = index(idxName).on(...(idxColumns as [any, ...any[]]))\n }\n }\n }\n }\n\n // Add default tenant index if tenant-scoped\n if (def.tenant && t.tenantId) {\n const tenantIdxName = `${def.name}_tenant_id_idx`\n if (!indexes[tenantIdxName]) {\n indexes[tenantIdxName] = index(tenantIdxName).on(t.tenantId)\n }\n }\n\n return indexes\n })\n}\n\n/**\n * Create multiple SQLite tables with resolved references\n */\nexport function createSqliteSchema<\n T extends Record<string, Entity<string, Record<string, Field>, unknown>>,\n>(entities: T): { [K in keyof T]: any } {\n const tables: Record<string, any> = {}\n\n // First pass: create tables without references\n for (const [key, entity] of Object.entries(entities)) {\n tables[key] = toSqliteTable(entity)\n }\n\n // Second pass: recreate tables with resolved references\n for (const [key, entity] of Object.entries(entities)) {\n tables[key] = toSqliteTable(entity, tables)\n }\n\n return tables as { [K in keyof T]: any }\n}\n\nexport { toSqliteTable as toTable }\n"]}
@@ -0,0 +1,149 @@
1
+ import { Type } from 'arktype';
2
+
3
+ /**
4
+ * Supported field types for entity definitions
5
+ */
6
+ type FieldType = 'string' | 'string.uuid' | 'string.email' | 'string.url' | 'number' | 'number.integer' | 'boolean' | 'Date' | 'json' | `'${string}'` | `'${string}' | '${string}'` | string;
7
+ /**
8
+ * Field definition with full options
9
+ */
10
+ interface FieldDefinition {
11
+ /** The arktype type string */
12
+ type: FieldType;
13
+ /** Whether the field is optional (nullable in DB) */
14
+ optional?: boolean;
15
+ /** Default value for the field */
16
+ default?: unknown;
17
+ /** Minimum value/length */
18
+ min?: number;
19
+ /** Maximum value/length */
20
+ max?: number;
21
+ /** Regex pattern for strings */
22
+ pattern?: RegExp;
23
+ /** Database-specific options */
24
+ db?: {
25
+ /** Custom column name */
26
+ column?: string;
27
+ /** Precision for decimals */
28
+ precision?: number;
29
+ /** Scale for decimals */
30
+ scale?: number;
31
+ /** Whether to index this field */
32
+ index?: boolean;
33
+ /** Whether this field is unique (within tenant if multi-tenant) */
34
+ unique?: boolean;
35
+ /** Reference to another entity */
36
+ references?: {
37
+ entity: string;
38
+ field?: string;
39
+ onDelete?: 'cascade' | 'set null' | 'restrict' | 'no action';
40
+ };
41
+ };
42
+ }
43
+ /**
44
+ * Simplified field definition - just the type string
45
+ */
46
+ type SimpleFieldDefinition = FieldType;
47
+ /**
48
+ * Field can be either simple or full definition
49
+ */
50
+ type Field = SimpleFieldDefinition | FieldDefinition;
51
+ /**
52
+ * Index definition
53
+ */
54
+ interface IndexDefinition {
55
+ /** Fields to include in the index */
56
+ fields: string[];
57
+ /** Whether the index is unique */
58
+ unique?: boolean;
59
+ /** Optional name for the index */
60
+ name?: string;
61
+ /** SQL WHERE clause for partial index */
62
+ where?: string;
63
+ }
64
+ /**
65
+ * Entity definition options
66
+ */
67
+ interface EntityDefinition<TFields extends Record<string, Field>> {
68
+ /** Table name in the database */
69
+ name: string;
70
+ /** Human-readable description */
71
+ description?: string;
72
+ /** Whether this entity is tenant-scoped (adds tenantId field) */
73
+ tenant?: boolean;
74
+ /** Field definitions */
75
+ fields: TFields;
76
+ /** Index definitions */
77
+ indexes?: IndexDefinition[];
78
+ /** Whether to add timestamp fields (insertedAt, updatedAt) */
79
+ timestamps?: boolean;
80
+ /** Whether to add soft delete (deletedAt) */
81
+ softDelete?: boolean;
82
+ }
83
+ /**
84
+ * Generated schemas from entity definition
85
+ */
86
+ interface EntitySchemas<T> {
87
+ /** Full entity schema (all fields) */
88
+ schema: Type<T>;
89
+ /** Schema for creating (without id, timestamps) */
90
+ createSchema: Type<Partial<T>>;
91
+ /** Schema for updating (all fields optional) */
92
+ updateSchema: Type<Partial<T>>;
93
+ /** Schema for query filters */
94
+ querySchema: Type<Record<string, unknown>>;
95
+ /** Schema for list response with pagination */
96
+ listSchema: Type<{
97
+ items: T[];
98
+ total: number;
99
+ nextCursor?: string;
100
+ }>;
101
+ }
102
+ /**
103
+ * The complete entity object returned by defineEntity
104
+ */
105
+ interface Entity<TName extends string, TFields extends Record<string, Field>, TType> {
106
+ /** Entity name (table name) */
107
+ name: TName;
108
+ /** Original definition */
109
+ definition: EntityDefinition<TFields>;
110
+ /** ArkType schema for the full entity */
111
+ schema: Type<TType>;
112
+ /** ArkType schema for create operations */
113
+ createSchema: Type<Partial<TType>>;
114
+ /** ArkType schema for update operations */
115
+ updateSchema: Type<Partial<TType>>;
116
+ /** ArkType schema for query/filter operations */
117
+ querySchema: Type<Record<string, unknown>>;
118
+ /** TypeScript type (use typeof entity.infer) */
119
+ infer: TType;
120
+ /** Field names that are auto-generated (id, timestamps) */
121
+ autoFields: string[];
122
+ /** Field names that are required for creation */
123
+ requiredFields: string[];
124
+ /** Field names that are optional */
125
+ optionalFields: string[];
126
+ }
127
+ /**
128
+ * Options for Drizzle table generation
129
+ */
130
+ interface DrizzleOptions {
131
+ /** Database dialect */
132
+ dialect: 'pg' | 'sqlite' | 'mysql';
133
+ /** Custom schema name (PostgreSQL) */
134
+ schema?: string;
135
+ }
136
+ /**
137
+ * Utility type to extract the inferred type from an entity
138
+ */
139
+ type InferEntity<E> = E extends Entity<string, Record<string, Field>, infer T> ? T : never;
140
+ /**
141
+ * Utility type to extract create input type
142
+ */
143
+ type InferCreateInput<E> = E extends Entity<string, Record<string, Field>, infer T> ? Omit<T, 'id' | 'insertedAt' | 'updatedAt' | 'deletedAt'> : never;
144
+ /**
145
+ * Utility type to extract update input type
146
+ */
147
+ type InferUpdateInput<E> = E extends Entity<string, Record<string, Field>, infer T> ? Partial<Omit<T, 'id' | 'tenantId' | 'insertedAt' | 'updatedAt' | 'deletedAt'>> : never;
148
+
149
+ export type { DrizzleOptions as D, EntityDefinition as E, Field as F, IndexDefinition as I, SimpleFieldDefinition as S, Entity as a, FieldDefinition as b, FieldType as c, EntitySchemas as d, InferEntity as e, InferCreateInput as f, InferUpdateInput as g };
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@parsrun/entity",
3
+ "version": "0.1.35",
4
+ "description": "Single-source entity definitions for Pars - generates ArkType schemas and Drizzle tables",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./pg": {
15
+ "types": "./dist/pg.d.ts",
16
+ "import": "./dist/pg.js"
17
+ },
18
+ "./sqlite": {
19
+ "types": "./dist/sqlite.d.ts",
20
+ "import": "./dist/sqlite.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "src"
26
+ ],
27
+ "scripts": {
28
+ "build": "tsup",
29
+ "dev": "tsup --watch",
30
+ "typecheck": "tsc --noEmit",
31
+ "test": "vitest run",
32
+ "test:watch": "vitest"
33
+ },
34
+ "dependencies": {
35
+ "@parsrun/core": "workspace:*",
36
+ "arktype": "^2.0.0"
37
+ },
38
+ "devDependencies": {
39
+ "drizzle-orm": "^0.44.0",
40
+ "tsup": "^8.3.5",
41
+ "typescript": "^5.7.2",
42
+ "vitest": "^2.1.8"
43
+ },
44
+ "peerDependencies": {
45
+ "drizzle-orm": ">=0.30.0"
46
+ },
47
+ "keywords": [
48
+ "pars",
49
+ "entity",
50
+ "schema",
51
+ "arktype",
52
+ "drizzle",
53
+ "orm",
54
+ "validation"
55
+ ],
56
+ "license": "MIT",
57
+ "homepage": "https://pars.run",
58
+ "repository": {
59
+ "type": "git",
60
+ "url": "https://github.com/parsrun/pars",
61
+ "directory": "packages/entity"
62
+ }
63
+ }