Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/orm/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"build": "tsc --noEmit && tsdown",
"watch": "tsdown --watch",
"lint": "eslint src --ext ts",
"pack": "pnpm pack"
"pack": "pnpm pack",
"test:generate": "tsx ../../scripts/test-generate.ts . --generate-models"
},
"keywords": [],
"files": [
Expand Down
18 changes: 18 additions & 0 deletions packages/orm/test/schema/models.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//////////////////////////////////////////////////////////////////////////////////////////////
// DO NOT MODIFY THIS FILE //
// This file is automatically generated by ZenStack CLI and should not be manually updated. //
//////////////////////////////////////////////////////////////////////////////////////////////

/* eslint-disable */

import { schema as $schema, type SchemaType as $Schema } from "./schema";
import type { ModelResult as $ModelResult, TypeDefResult as $TypeDefResult } from "@zenstackhq/orm";
export type User = $ModelResult<$Schema, "User">;
export type Post = $ModelResult<$Schema, "Post">;
export type Product = $ModelResult<$Schema, "Product">;
export type Asset = $ModelResult<$Schema, "Asset">;
export type Video = $ModelResult<$Schema, "Video">;
export type Image = $ModelResult<$Schema, "Image">;
export type Address = $TypeDefResult<$Schema, "Address">;
export const Status = $schema.enums.Status.values;
export type Status = (typeof Status)[keyof typeof Status];
353 changes: 353 additions & 0 deletions packages/orm/test/schema/schema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,353 @@
//////////////////////////////////////////////////////////////////////////////////////////////
// DO NOT MODIFY THIS FILE //
// This file is automatically generated by ZenStack CLI and should not be manually updated. //
//////////////////////////////////////////////////////////////////////////////////////////////

/* eslint-disable */

import { type SchemaDef, type AttributeApplication, type FieldDefault, ExpressionUtils } from "@zenstackhq/schema";
export class SchemaType implements SchemaDef {
provider = {
type: "postgresql"
} as const;
models = {
User: {
name: "User",
fields: {
id: {
name: "id",
type: "String",
id: true,
attributes: [{ name: "@id" }, { name: "@default", args: [{ name: "value", value: ExpressionUtils.call("cuid") }] }] as readonly AttributeApplication[],
default: ExpressionUtils.call("cuid") as FieldDefault
},
email: {
name: "email",
type: "String",
attributes: [{ name: "@email" }, { name: "@meta", args: [{ name: "name", value: ExpressionUtils.literal("description") }, { name: "value", value: ExpressionUtils.literal("The user's email address") }] }] as readonly AttributeApplication[]
},
username: {
name: "username",
type: "String",
attributes: [{ name: "@length", args: [{ name: "min", value: ExpressionUtils.literal(3) }, { name: "max", value: ExpressionUtils.literal(50) }] }] as readonly AttributeApplication[]
},
website: {
name: "website",
type: "String",
optional: true,
attributes: [{ name: "@url" }] as readonly AttributeApplication[]
},
code: {
name: "code",
type: "String",
attributes: [{ name: "@startsWith", args: [{ name: "text", value: ExpressionUtils.literal("USR") }] }] as readonly AttributeApplication[]
},
age: {
name: "age",
type: "Int",
attributes: [{ name: "@gt", args: [{ name: "value", value: ExpressionUtils.literal(0) }] }, { name: "@lte", args: [{ name: "value", value: ExpressionUtils.literal(150) }] }] as readonly AttributeApplication[]
},
score: {
name: "score",
type: "Float",
attributes: [{ name: "@gte", args: [{ name: "value", value: ExpressionUtils.literal(0.0) }] }, { name: "@lt", args: [{ name: "value", value: ExpressionUtils.literal(100.0) }] }] as readonly AttributeApplication[]
},
bigNum: {
name: "bigNum",
type: "BigInt",
attributes: [{ name: "@gte", args: [{ name: "value", value: ExpressionUtils.literal(0) }] }] as readonly AttributeApplication[]
},
balance: {
name: "balance",
type: "Decimal",
attributes: [{ name: "@gt", args: [{ name: "value", value: ExpressionUtils.literal(0) }] }] as readonly AttributeApplication[]
},
active: {
name: "active",
type: "Boolean"
},
birthdate: {
name: "birthdate",
type: "DateTime",
optional: true
},
avatar: {
name: "avatar",
type: "Bytes",
optional: true
},
metadata: {
name: "metadata",
type: "Json",
optional: true
},
status: {
name: "status",
type: "Status"
},
address: {
name: "address",
type: "Address",
optional: true,
attributes: [{ name: "@json" }] as readonly AttributeApplication[]
},
posts: {
name: "posts",
type: "Post",
array: true,
relation: { opposite: "author" }
}
},
attributes: [
{ name: "@@validate", args: [{ name: "value", value: ExpressionUtils.binary(ExpressionUtils.field("age"), ">=", ExpressionUtils.literal(18)) }, { name: "message", value: ExpressionUtils.literal("Must be adult") }, { name: "path", value: ExpressionUtils.array("String", [ExpressionUtils.literal("age")]) }] },
{ name: "@@meta", args: [{ name: "name", value: ExpressionUtils.literal("description") }, { name: "value", value: ExpressionUtils.literal("A user of the system") }] }
] as readonly AttributeApplication[],
idFields: ["id"],
uniqueFields: {
id: { type: "String" }
}
},
Post: {
name: "Post",
fields: {
id: {
name: "id",
type: "String",
id: true,
attributes: [{ name: "@id" }, { name: "@default", args: [{ name: "value", value: ExpressionUtils.call("cuid") }] }] as readonly AttributeApplication[],
default: ExpressionUtils.call("cuid") as FieldDefault
},
title: {
name: "title",
type: "String"
},
published: {
name: "published",
type: "Boolean"
},
tags: {
name: "tags",
type: "String",
array: true
},
author: {
name: "author",
type: "User",
optional: true,
attributes: [{ name: "@relation", args: [{ name: "fields", value: ExpressionUtils.array("String", [ExpressionUtils.field("authorId")]) }, { name: "references", value: ExpressionUtils.array("String", [ExpressionUtils.field("id")]) }] }] as readonly AttributeApplication[],
relation: { opposite: "posts", fields: ["authorId"], references: ["id"] }
},
authorId: {
name: "authorId",
type: "String",
optional: true,
foreignKeyFor: [
"author"
] as readonly string[]
}
},
idFields: ["id"],
uniqueFields: {
id: { type: "String" }
}
},
Product: {
name: "Product",
fields: {
id: {
name: "id",
type: "String",
id: true,
attributes: [{ name: "@id" }, { name: "@default", args: [{ name: "value", value: ExpressionUtils.call("cuid") }] }] as readonly AttributeApplication[],
default: ExpressionUtils.call("cuid") as FieldDefault
},
name: {
name: "name",
type: "String"
},
price: {
name: "price",
type: "Float"
},
discount: {
name: "discount",
type: "Float",
attributes: [{ name: "@default", args: [{ name: "value", value: ExpressionUtils.literal(0) }] }] as readonly AttributeApplication[],
default: 0 as FieldDefault
},
finalPrice: {
name: "finalPrice",
type: "Float",
attributes: [{ name: "@computed" }] as readonly AttributeApplication[],
computed: true
}
},
idFields: ["id"],
uniqueFields: {
id: { type: "String" }
},
computedFields: {
finalPrice(_context: {
modelAlias: string;
}): number {
throw new Error("This is a stub for computed field");
}
}
},
Asset: {
name: "Asset",
fields: {
id: {
name: "id",
type: "Int",
id: true,
attributes: [{ name: "@id" }, { name: "@default", args: [{ name: "value", value: ExpressionUtils.call("autoincrement") }] }] as readonly AttributeApplication[],
default: ExpressionUtils.call("autoincrement") as FieldDefault
},
createdAt: {
name: "createdAt",
type: "DateTime",
attributes: [{ name: "@default", args: [{ name: "value", value: ExpressionUtils.call("now") }] }] as readonly AttributeApplication[],
default: ExpressionUtils.call("now") as FieldDefault
},
assetType: {
name: "assetType",
type: "String",
isDiscriminator: true
}
},
attributes: [
{ name: "@@delegate", args: [{ name: "discriminator", value: ExpressionUtils.field("assetType") }] }
] as readonly AttributeApplication[],
idFields: ["id"],
uniqueFields: {
id: { type: "Int" }
},
isDelegate: true,
subModels: ["Video", "Image"]
},
Video: {
name: "Video",
baseModel: "Asset",
fields: {
id: {
name: "id",
type: "Int",
id: true,
attributes: [{ name: "@id" }, { name: "@default", args: [{ name: "value", value: ExpressionUtils.call("autoincrement") }] }] as readonly AttributeApplication[],
default: ExpressionUtils.call("autoincrement") as FieldDefault
},
createdAt: {
name: "createdAt",
type: "DateTime",
originModel: "Asset",
attributes: [{ name: "@default", args: [{ name: "value", value: ExpressionUtils.call("now") }] }] as readonly AttributeApplication[],
default: ExpressionUtils.call("now") as FieldDefault
},
assetType: {
name: "assetType",
type: "String",
originModel: "Asset",
isDiscriminator: true
},
duration: {
name: "duration",
type: "Int"
},
url: {
name: "url",
type: "String"
}
},
idFields: ["id"],
uniqueFields: {
id: { type: "Int" }
}
},
Image: {
name: "Image",
baseModel: "Asset",
fields: {
id: {
name: "id",
type: "Int",
id: true,
attributes: [{ name: "@id" }, { name: "@default", args: [{ name: "value", value: ExpressionUtils.call("autoincrement") }] }] as readonly AttributeApplication[],
default: ExpressionUtils.call("autoincrement") as FieldDefault
},
createdAt: {
name: "createdAt",
type: "DateTime",
originModel: "Asset",
attributes: [{ name: "@default", args: [{ name: "value", value: ExpressionUtils.call("now") }] }] as readonly AttributeApplication[],
default: ExpressionUtils.call("now") as FieldDefault
},
assetType: {
name: "assetType",
type: "String",
originModel: "Asset",
isDiscriminator: true
},
format: {
name: "format",
type: "String"
},
width: {
name: "width",
type: "Int"
}
},
idFields: ["id"],
uniqueFields: {
id: { type: "Int" }
}
}
} as const;
typeDefs = {
Address: {
name: "Address",
fields: {
residents: {
name: "residents",
type: "String",
array: true
},
street: {
name: "street",
type: "String",
attributes: [{ name: "@meta", args: [{ name: "name", value: ExpressionUtils.literal("description") }, { name: "value", value: ExpressionUtils.literal("Street address line") }] }] as readonly AttributeApplication[]
},
city: {
name: "city",
type: "String",
attributes: [{ name: "@length", args: [{ name: "min", value: ExpressionUtils.literal(2) }] }] as readonly AttributeApplication[]
},
zip: {
name: "zip",
type: "String",
optional: true
}
},
attributes: [
{ name: "@@validate", args: [{ name: "value", value: ExpressionUtils.binary(ExpressionUtils.binary(ExpressionUtils.field("zip"), "==", ExpressionUtils._null()), "||", ExpressionUtils.binary(ExpressionUtils.call("length", [ExpressionUtils.field("zip")]), "==", ExpressionUtils.literal(5))) }, { name: "message", value: ExpressionUtils.literal("Zip code must be exactly 5 characters") }, { name: "path", value: ExpressionUtils.array("String", [ExpressionUtils.literal("zip")]) }] },
{ name: "@@meta", args: [{ name: "name", value: ExpressionUtils.literal("description") }, { name: "value", value: ExpressionUtils.literal("A mailing address") }] }
] as readonly AttributeApplication[]
}
} as const;
enums = {
Status: {
name: "Status",
values: {
ACTIVE: "ACTIVE",
INACTIVE: "INACTIVE",
PENDING: "PENDING"
},
attributes: [
{ name: "@@meta", args: [{ name: "name", value: ExpressionUtils.literal("description") }, { name: "value", value: ExpressionUtils.literal("User account status") }] }
] as readonly AttributeApplication[]
}
} as const;
authType = "User" as const;
plugins = {};
}
export const schema = new SchemaType();
Loading
Loading