joist-codegen 2.3.0-next.65 → 2.3.0-next.66

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.
@@ -1 +1 @@
1
- {"version":3,"file":"generateEntityCodegenFile.cjs","names":["keywords","uncapitalize","camelCase","imp","toIdOf","BaseEntity","EntityManager","joinCode","FieldsOf","RelationsOf","Flavor","Scope","ConfigApi","newScopeFn","ProjectEntity","EntityMetadata","failNoIdYet","TaggedId","getField","tsdocComments","setOpts","PartialOrNull","OptsOf","DeepPartialOrNull","updatePartial","Changes","newChangesProxy","Lens","loadLens","LoadHint","Loaded","isLoaded","ToJsonHint","JsonPayload","toJSON","MaybeAbstractEntityConstructor","isEntity","fail","pascalCase","newRequiredLazyFieldRule","newRequiredRule","cannotBeUpdated","getStiEntities","mustBeSubType","IdOf","ValueFilter","BooleanFilter","EntityFilter","FilterOf","ValueGraphQLFilter","BooleanGraphQLFilter","EntityGraphQLFilter","GraphQLFilterOf","OrderBy","ReactiveField","Zod","setField","SSAssert","code","ReactiveReference","ManyToOneReference","hasOne","ReadOnlyCollection","hasRecursiveParents","hasRecursiveChildren","hasRecursiveM2m","Collection","hasMany","LargeCollection","hasLargeMany","OneToOneReference","hasOneToOne","ReactiveManyToMany","ReactiveManyToManyOtherSide","hasReactiveManyToManyOtherSide","hasManyToMany","EnumCollection","hasEnumCollection","hasLargeManyToMany","PolymorphicReference","hasOnePolymorphic","LazyField","hasLazyField","nowUTC","buildJSDocBlock","generatedTag","assertNever"],"sources":["../src/generateEntityCodegenFile.ts"],"sourcesContent":["import { camelCase, pascalCase } from \"change-case\";\nimport pluralize from \"pluralize\";\nimport { type Code, code, imp, joinCode } from \"ts-poet\";\n\nimport { type Config } from \"./config.ts\";\nimport { type ParsedDoc, buildJSDocBlock, generatedTag } from \"./docs/index.ts\";\nimport {\n type DbMetadata,\n type Entity,\n type EntityDbMetadata,\n type EnumField,\n type ManyToOneField,\n type PgEnumField,\n type PolymorphicField,\n type PrimitiveField,\n type PrimitiveTypescriptType,\n} from \"./EntityDbMetadata.ts\";\nimport { type ScopeMember } from \"./findEntityScopes.ts\";\nimport { getStiEntities } from \"./inheritance.ts\";\nimport { keywords } from \"./keywords.ts\";\nimport {\n BaseEntity,\n BooleanFilter,\n BooleanGraphQLFilter,\n Changes,\n Collection,\n ConfigApi,\n DeepPartialOrNull,\n EntityFilter,\n EntityGraphQLFilter,\n EntityManager,\n EntityMetadata,\n EnumCollection,\n FieldsOf,\n FilterOf,\n Flavor,\n GraphQLFilterOf,\n IdOf,\n JsonPayload,\n LargeCollection,\n LazyField,\n Lens,\n LoadHint,\n Loaded,\n ManyToOneReference,\n MaybeAbstractEntityConstructor,\n OneToOneReference,\n OptsOf,\n OrderBy,\n PartialOrNull,\n PolymorphicReference,\n ProjectEntity,\n ReactiveField,\n ReactiveManyToMany,\n ReactiveManyToManyOtherSide,\n ReactiveReference,\n ReadOnlyCollection,\n RelationsOf,\n SSAssert,\n Scope,\n TaggedId,\n ToJsonHint,\n ValueFilter,\n ValueGraphQLFilter,\n Zod,\n cannotBeUpdated,\n failNoIdYet,\n getField,\n hasEnumCollection,\n hasLargeMany,\n hasLargeManyToMany,\n hasLazyField,\n hasMany,\n hasManyToMany,\n hasOne,\n hasOnePolymorphic,\n hasOneToOne,\n hasReactiveManyToManyOtherSide,\n hasRecursiveChildren,\n hasRecursiveM2m,\n hasRecursiveParents,\n isEntity,\n isLoaded,\n loadLens,\n mustBeSubType,\n newChangesProxy,\n newRequiredLazyFieldRule,\n newRequiredRule,\n newScopeFn,\n nowUTC,\n setField,\n setOpts,\n toIdOf,\n toJSON,\n updatePartial,\n} from \"./symbols.ts\";\nimport { tsdocComments } from \"./tsdoc.ts\";\nimport { assertNever, fail, uncapitalize } from \"./utils.ts\";\n\nconst { plural } = pluralize;\n\nexport interface ColumnMetaData {\n fieldType: PrimitiveTypescriptType;\n}\n\n// A local type just for tracking abstract vs. concrete relations\ntype Relation =\n // I.e. `abstract ReactiveReference` that the user must implement\n | { kind: \"abstract\"; fieldName: string; line: Code; comment?: string }\n // I.e. a `get author(): ManyToOne<...>`\n | { kind: \"concrete\"; fieldName: string; decl: Code; init: Code; comment?: string }\n // I.e. a `get author(): { super.author as ... }`\n | { kind: \"super\"; fieldName: string; decl: Code; comment?: string };\n\n/** Creates the base class with the boilerplate annotations. */\nexport function generateEntityCodegenFile(\n config: Config,\n dbMeta: DbMetadata,\n meta: EntityDbMetadata,\n scopeMembers: ScopeMember[] = [],\n docs?: ParsedDoc,\n): Code {\n const { entitiesByName: metasByName } = dbMeta;\n const { entity, tagName } = meta;\n const entityName = entity.name;\n\n // Per-field `.md` docs to inject as JSDocs on the codegen'd getters/relations (empty if docs are off)\n const fieldDocs = docs?.fields ?? {};\n\n // Avoid using `do` as a variable name b/c it's a reserved keyword\n const varName = keywords.includes(tagName) ? uncapitalize(entityName) : tagName;\n\n const primitives = createPrimitives(meta, entity, fieldDocs); // Add the primitives\n primitives.push(...createRegularEnums(meta, entity, fieldDocs)); // Add ManyToOne enums\n primitives.push(...createArrayEnums(meta, fieldDocs)); // Add integer[] enums\n primitives.push(...createPgEnums(meta, fieldDocs)); // Add native enums\n const relations = createRelations(config, meta, entity);\n\n const configName = `${camelCase(entityName)}Config`;\n const scopeFnName = `${camelCase(entityName)}Scope`;\n const metadata = imp(`${camelCase(entityName)}Meta@./entities.ts`);\n\n const contextType = config.contextType ? imp(`t:${config.contextType}`) : \"{}\";\n const factoryMethod = imp(`new${entity.name}@./entities.ts`);\n\n // If we're not tagged-strings, detag on the way out of id\n const idMaybeCode =\n config.idType === \"tagged-string\"\n ? code`return this.idTaggedMaybe;`\n : code`return ${toIdOf}(${metadata}, this.idTaggedMaybe);`;\n const idType = getIdType(config);\n\n const maybeSoftDeleteMethods = meta.deletedAt\n ? code`\n get isSoftDeletedEntity(): boolean {\n return this.${meta.deletedAt.fieldName} !== undefined;\n }\n\n softDelete(): void {\n if (this.isSoftDeletedEntity) return;\n this.${meta.deletedAt.fieldName} = ${nowUTCCall(config, meta.deletedAt)};\n }\n `\n : \"\";\n\n // Set up the codegen artifacts to extend from the base type if necessary\n const baseEntity = dbMeta.entities.find((e) => e.name === meta.baseClassName);\n const subEntities = dbMeta.entities.filter((e) => e.baseClassName === meta.name);\n const base = baseEntity?.entity.typeSymbol ?? code`${BaseEntity}<${EntityManager}, ${idType}>`;\n // CTI subtype ids have their own SQL defaults, unlike the base table's sequence-backed ids.\n // Locally redeclared fields also replace base policies when STI strengthens notNull.\n const maybeBaseFields = baseEntity\n ? code`extends Omit<${imp(\"t:\" + baseEntity.entity.fieldsName + \"@./entities.ts\")}, \"id\"${[\n ...meta.primitives,\n ...meta.enums,\n ...meta.pgEnums,\n ...meta.manyToOnes,\n ]\n .filter((field) =>\n [...baseEntity.primitives, ...baseEntity.enums, ...baseEntity.pgEnums, ...baseEntity.manyToOnes].some(\n (baseField) => baseField.fieldName === field.fieldName,\n ),\n )\n .map((field) => code` | \"${field.fieldName}\"`)}>`\n : \"\";\n const maybeBaseOpts = baseEntity ? code`extends ${baseEntity.entity.optsType}` : \"\";\n const physical = meta.physicalMetadata ?? meta;\n const sharedTable = meta.inheritanceType === \"sti\" && baseEntity;\n const columns = sharedTable ? {} : generateColumnsType(physical, idType);\n const maybeBaseColumns = sharedTable ? code`extends ${imp(`t:${baseEntity.name}Columns@./entities.ts`)}` : \"\";\n const maybeBaseIdOpts = baseEntity\n ? code`extends ${imp(\"t:\" + baseEntity.entity.idsOptsName + \"@./entities.ts\")}`\n : \"\";\n const maybeBaseFilter = baseEntity\n ? code`extends ${imp(\"t:\" + baseEntity.entity.filterName + \"@./entities.ts\")}`\n : \"\";\n const maybeBaseGqlFilter = baseEntity\n ? code`extends ${imp(\"t:\" + baseEntity.entity.graphqlFilterName + \"@./entities.ts\")}`\n : \"\";\n const maybeBaseOrder = baseEntity ? code`extends ${baseEntity.entity.orderType}` : \"\";\n const maybePreventBaseTypeInstantiation = meta.abstract\n ? code`\n if (this.constructor === ${entity.type} && !(em as any).fakeInstance) {\n throw new Error(\\`${entity.type} must be instantiated via a subtype\\`);\n }`\n : \"\";\n\n let maybeOtherTypeChanges;\n if (subEntities.length > 0) {\n maybeOtherTypeChanges = joinCode(\n // Pass `K = keyof Publisher | keyof SmallPublisher | keyof LargePublisher` to `changes` so that\n // our subtypes can have `SmallPublisher.changes(): Changes<SmallPublisher>` be covariant, which\n // will break if it adds a key to `Changes.fields` that `Publisher.changes()` does not include.\n //\n // type A1 = { foo: 1 | 2 };\n // type A2 = { foo: 1 | 2 | 3 };\n // type A3 = A2 extends A1 ? 1 : 2;\n //\n // A3 will be 2 because the extra 3 breaks code written against A1.foo.\n //\n // So essentially we're pre-emptively our subtypes \"3\".\n [\n code`, `,\n ...[meta, ...subEntities].map(\n (e) => code`keyof (${FieldsOf}<${e.entity.type}> & ${RelationsOf}<${e.entity.type}>)`,\n ),\n ],\n { on: \"|\" },\n );\n } else {\n maybeOtherTypeChanges = \"\";\n }\n\n let maybeOtherLoaded;\n if (baseEntity) {\n maybeOtherLoaded = code`| ${baseEntity.entity.type}`;\n } else {\n maybeOtherLoaded = \"\";\n }\n\n return code`\n export type ${entity.idName} = ${Flavor}<${idType}, \"${baseEntity ? baseEntity.name : entityName}\">;\n\n ${generatePolymorphicTypes(meta)}\n\n export interface ${entity.fieldsName} ${maybeBaseFields} {\n ${generateFieldsType(meta, idType)}\n }\n\n export interface ${entityName}Columns ${maybeBaseColumns} {\n ${Object.entries(columns).map(([name, descriptor]) => code`${JSON.stringify(name)}: ${descriptor};`)}\n }\n\n export interface ${entity.optsName} ${maybeBaseOpts} {\n ${generateOptsFields(meta)}\n }\n\n export interface ${entity.idsOptsName} ${maybeBaseIdOpts} {\n ${generateOptIdsFields(meta)}\n }\n\n export interface ${entity.filterName} ${maybeBaseFilter} {\n ${generateFilterFields(metasByName, meta)}\n }\n\n export interface ${entity.graphqlFilterName} ${maybeBaseGqlFilter} {\n ${generateGraphQLFilterFields(metasByName, meta)}\n }\n\n export interface ${entity.orderName} ${maybeBaseOrder} {\n ${generateOrderFields(meta)}\n }\n\n export interface ${entity.factoryExtrasName} {\n ${generateFactoryExtrasType(meta)}\n }\n\n export interface ${entity.scopesName} {\n ${scopeMembers.map((member) => code`${member.name}: ${member.type};`)}\n }\n\n export type ${entity.scopeName} = ${Scope}<${entity.type}, ${entity.scopesName}>;\n\n export const ${configName} = new ${ConfigApi}<${entity.type}, ${contextType}>();\n\n export const ${scopeFnName} = ${newScopeFn}<${entity.type}, ${entity.scopeName}>(\"${entityName}\");\n\n ${generateDefaultValidationRules(dbMeta, meta, configName)}\n ${generateDefaultValues(config, meta, configName)};\n\n declare module \"joist-core\" {\n interface TypeMap {\n ${entityName}: {\n entityType: ${entityName};\n filterType: ${entity.filterName};\n gqlFilterType: ${entity.graphqlFilterName};\n orderType: ${entity.orderName};\n optsType: ${entity.optsName};\n fieldsType: ${entity.fieldsName};\n columnsType: ${entityName}Columns;\n inheritanceType: ${meta.inheritanceType ? code`\"${meta.inheritanceType}\"` : \"never\"};\n supportsEmExecute: ${!meta.inheritanceType && meta.supportsEmExecute === true};\n optIdsType: ${entity.idsOptsName};\n factoryExtrasType: ${entity.factoryExtrasName};\n factoryOptsType: Parameters<typeof ${factoryMethod}>[1];\n };\n }\n }\n\n export abstract class ${entityName}Codegen extends ${base} implements ${ProjectEntity} {\n static readonly tagName = \"${tagName}\";\n static readonly metadata: ${EntityMetadata}<${entity.type}>;\n\n declare readonly __type: {\n ${baseEntity ? `0: \"${baseEntity.name}\",` : \"\"}\n ${baseEntity ? 1 : 0}: \"${entityName}\", \n };\n\n ${relations\n .filter((r) => r.kind === \"abstract\")\n .map((r) => {\n return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}${r.line}${maybeComment(r.comment)}`;\n })}\n ${relations\n .filter((r) => r.kind === \"concrete\")\n .map((r) => {\n return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}readonly ${r.fieldName}: ${r.decl} = ${r.init};${maybeComment(r.comment)}`;\n })}\n ${relations\n .filter((r) => r.kind === \"super\")\n .map((r) => {\n return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}declare readonly ${r.fieldName}: ${r.decl};${maybeComment(r.comment)}`;\n })}\n\n get id(): ${entity.idName} {\n return this.idMaybe || ${failNoIdYet}(\"${entityName}\");\n }\n\n get idMaybe(): ${entity.idName} | undefined {\n ${idMaybeCode}\n }\n\n get idTagged(): ${TaggedId} {\n return this.idTaggedMaybe || ${failNoIdYet}(\"${entityName}\");\n }\n\n get idTaggedMaybe(): ${TaggedId} | undefined {\n return ${getField}(this, \"id\");\n }\n\n ${primitives} \n\n ${tsdocComments.entity.setPartial}\n set(opts: Partial<${entity.optsName}>): void {\n ${setOpts}(this as any as ${entityName}, opts);\n }\n\n ${tsdocComments.entity.setPartial}\n setPartial(opts: ${PartialOrNull}<${entity.optsName}>): void {\n ${setOpts}(this as any as ${entityName}, opts as ${OptsOf}<${entityName}>, { partial: true });\n }\n\n ${tsdocComments.entity.setDeepPartial}\n setDeepPartial(opts: ${DeepPartialOrNull}<${entityName}>): Promise<void> {\n return ${updatePartial}(this as any as ${entityName}, opts);\n }\n\n ${tsdocComments.entity.changes}\n get changes(): ${Changes}<${entityName}${maybeOtherTypeChanges}> {\n return ${newChangesProxy}(this) as any;\n }\n\n ${maybeSoftDeleteMethods}\n\n ${tsdocComments.entity.load}\n load<U, V>(fn: (lens: ${Lens}<${entity.type}>) => ${Lens}<U, V>, opts: { sql?: boolean } = {}): Promise<V> {\n return ${loadLens}(this as any as ${entityName}, fn, opts);\n }\n\n ${tsdocComments.entity.populate}\n populate<const H extends ${LoadHint}<${entityName}>>(hint: H): Promise<${Loaded}<${entityName}, H>>;\n populate<const H extends ${LoadHint}<${entityName}>>(opts: { hint: H, forceReload?: boolean }): Promise<${Loaded}<${entityName}, H>>;\n populate<const H extends ${LoadHint}<${entityName}>, V>(hint: H, fn: (${varName}: Loaded<${entityName}, H>) => V): Promise<V>;\n populate<const H extends ${LoadHint}<${entityName}>, V>(opts: { hint: H, forceReload?: boolean }, fn: (${varName}: Loaded<${entityName}, H>) => V): Promise<V>;\n populate<const H extends ${LoadHint}<${entityName}>, V>(hintOrOpts: any, fn?: (${varName}: Loaded<${entityName}, H>) => V): Promise<${Loaded}<${entityName}, H> | V> {\n return this.em.populate(this as any as ${entityName}, hintOrOpts, fn);\n }\n\n ${tsdocComments.entity.isLoaded}\n isLoaded<const H extends ${LoadHint}<${entityName}>>(hint: H): this is ${Loaded}<${entityName}${maybeOtherLoaded}, H> {\n return ${isLoaded}(this as any as ${entityName}, hint);\n }\n\n ${tsdocComments.entity.toJSON}\n toJSON(): object;\n toJSON<const H extends ${ToJsonHint}<${entityName}>>(hint: H): Promise<${JsonPayload}<${entityName}, H>>;\n toJSON(hint?: any): object {\n return !hint || typeof hint === \"string\" ? super.toJSON() : ${toJSON}(this, hint);\n }\n }\n `;\n}\n\nfunction fieldHasDefaultValue(field: PrimitiveField | EnumField | PgEnumField): boolean {\n let { columnDefault } = field;\n // If there's no default at all, return false\n if (columnDefault === null) {\n return false;\n }\n // Even though default is defined as a `number | boolean | string | null`, in reality pg-structure\n // only ever returns a `string | null`, so we handle that here\n columnDefault = columnDefault.toString();\n const fieldType = field.kind === \"primitive\" ? field.fieldType : \"number\";\n // Try to validate that we actually got a primitive value and not arbitrary SQL\n return (\n (fieldType === \"number\" && !isNaN(parseInt(columnDefault))) ||\n (fieldType === \"bigint\" && !isNaN(parseInt(columnDefault))) ||\n (fieldType === \"string\" && /^'.*'$/.test(columnDefault)) ||\n (fieldType === \"boolean\" && [\"true\", \"false\"].includes(columnDefault))\n );\n}\n\nfunction generatePolymorphicTypes(meta: EntityDbMetadata) {\n return meta.polymorphics.flatMap((pf) => [\n code`export type ${pf.fieldType} = ${pf.components.map((c) => code`| ${c.otherEntity.type}`)};`,\n code`export function get${pf.fieldType}Constructors(): ${MaybeAbstractEntityConstructor}<${pf.fieldType}>[] {\n return [${pf.components.map((c) => code`${c.otherEntity.typeSymbol},`)}];\n }`,\n code`export function is${pf.fieldType}(maybeEntity: unknown): maybeEntity is ${pf.fieldType} {\n return ${isEntity}(maybeEntity) && get${pf.fieldType}Constructors().some((type) => maybeEntity instanceof type);\n }`,\n ]);\n}\n\nfunction generateDefaultValues(config: Config, meta: EntityDbMetadata, configName: string): Code[] {\n // Skip sync defaults b/c we'll just stomp the getter; leave async in case they're RQFs\n // where the row must fundamentally be inserted with a dummy value before the real value is calced.\n function notSync(field: PrimitiveField | EnumField): boolean {\n return \"derived\" in field && field.derived !== \"sync\";\n }\n\n const primitives = meta.primitives\n .filter((field) => fieldHasDefaultValue(field))\n .filter(notSync)\n .map(({ fieldName, columnDefault }) => {\n return code`${configName}.setDefault(\"${fieldName}\", ${columnDefault});`;\n });\n const pgEnums = meta.pgEnums\n .filter((field) => !!field.columnDefault)\n .map(({ fieldName, columnDefault }) => {\n return code`${configName}.setDefault(\"${fieldName}\", ${columnDefault});`;\n });\n const enums = meta.enums\n .filter((field) => !!field.columnDefault && !field.isArray)\n .filter(notSync)\n .map(({ fieldName, columnDefault, enumRows, enumType, columnName }) => {\n const defaultRow =\n enumRows.find((r) => r.id === Number(columnDefault)) ||\n fail(`Invalid default value ${columnDefault} for ${meta.tableName}.${columnName}`);\n return code`${configName}.setDefault(\"${fieldName}\", ${enumType}.${pascalCase(defaultRow.code)});`;\n });\n return [...primitives, ...enums, ...pgEnums];\n}\n\nfunction generateDefaultValidationRules(db: DbMetadata, meta: EntityDbMetadata, configName: string): Code[] {\n // Add required rules for all not-null columns\n const fields = [...meta.primitives, ...meta.enums, ...meta.manyToOnes, ...meta.polymorphics];\n const rules = fields\n .filter((p) => p.notNull)\n .map((p) => {\n const { fieldName } = p;\n const isReactive = \"derived\" in p && p.derived === \"async\";\n if (\"lazy\" in p && p.lazy) {\n // Lazy columns use a rule that won't force-load (or falsely fail) an unloaded value on a persisted entity\n return code`${configName}.addRule(${newRequiredLazyFieldRule}(\"${fieldName}\"));`;\n } else if (isReactive) {\n return code`${configName}.addRule(\"${fieldName}\", ${newRequiredRule}(\"${fieldName}\"));`;\n } else {\n return code`${configName}.addRule(${newRequiredRule}(\"${fieldName}\"));`;\n }\n });\n // Add STI discriminator cannot change\n if (meta.stiDiscriminatorField) {\n const field = meta.enums.find((e) => e.fieldName === meta.stiDiscriminatorField) ?? fail(\"STI field not found\");\n rules.push(code`${configName}.addRule(${cannotBeUpdated}(\"${field.fieldName}\"));`);\n }\n // Add STI type must match\n const stiEntities = getStiEntities(db.entities);\n if (stiEntities.size > 0) {\n for (const m2o of meta.manyToOnes) {\n // The `m2o.otherEntity` may already be pointing at the subtype, but stiEntities has subtypes in it as well...\n const target = stiEntities.get(m2o.otherEntity.name);\n if (target && m2o.otherEntity.name !== target.base.name) {\n rules.push(code`${configName}.addRule(\"${m2o.fieldName}\", ${mustBeSubType}(\"${m2o.fieldName}\"));`);\n }\n }\n }\n // Add subtype specialization must match\n if (meta.baseType) {\n meta.manyToOnes\n .filter((m2o) =>\n meta.baseType?.manyToOnes?.find(\n (o) => o.fieldName === m2o.fieldName && o.otherEntity.name !== m2o.otherEntity.name,\n ),\n )\n .forEach((m2o) => {\n rules.push(code`${configName}.addRule(\"${m2o.fieldName}\", ${mustBeSubType}(\"${m2o.fieldName}\"));`);\n });\n }\n return rules;\n}\n\n// Make our opts type\nfunction generateOptsFields(meta: EntityDbMetadata): Code[] {\n const primitives = meta.primitives.map((field) => {\n const { fieldName, fieldType, notNull, derived } = field;\n if (derived) return code``;\n return code`${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType}${maybeUnionNull(notNull)};`;\n });\n const enums = meta.enums.map((field) => {\n const { fieldName, enumType, notNull, isArray, derived } = field;\n if (meta.stiDiscriminatorField === fieldName || derived) {\n // Don't include the discriminator as an opt b/c we'll infer it from the instance type\n return code``;\n } else if (isArray) {\n // Arrays are always optional and we'll default to `[]`\n return code`${fieldName}?: ${enumType}[];`;\n } else {\n return code`${fieldName}${maybeOptionalOrDefault(field)}: ${enumType}${maybeUnionNull(notNull)};`;\n }\n });\n const pgEnums = meta.pgEnums.map((field) => {\n const { fieldName, enumType, notNull } = field;\n return code`${fieldName}${maybeOptionalOrDefault(field)}: ${enumType}${maybeUnionNull(notNull)};`;\n });\n const m2o = meta.manyToOnes\n .filter(({ derived }) => !derived) // Skip ReactiveReferences (derived m2o)\n // If a `group: { subType: SmallPublisherGroup }` is specializing this relation, that's\n // fine for most things, but not the `SmallPublisherOpts`, b/c it will break the contravariance\n // of `Publisher.setOpts` and `SmallPublisher.setOpts`\n .filter(({ fieldName }) => !meta.baseType?.manyToOnes.find((o) => o.fieldName === fieldName))\n .map((field) => {\n const { fieldName, otherEntity, notNull } = field;\n const maybeNull = maybeUnionNull(notNull);\n return code`${fieldName}${maybeOptionalOrDefault(field)}: ${otherEntity.type} | ${otherEntity.idType} ${maybeNull};`;\n });\n const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${otherEntity.type} | null;`;\n });\n const o2m = meta.oneToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${otherEntity.type}[];`;\n });\n const m2m = meta.manyToManys\n .filter(({ derived }) => !derived) // Skip ReactiveManyToManys\n .map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${otherEntity.type}[];`;\n });\n const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {\n return code`${fieldName}?: ${enumType}[];`;\n });\n const polys = meta.polymorphics.map((field) => {\n const { fieldName, notNull, fieldType } = field;\n return code`${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType};`;\n });\n return [...primitives, ...enums, ...pgEnums, ...m2o, ...polys, ...o2o, ...o2m, ...m2m, ...m2mEnum];\n}\n\n// Make our fields type\nfunction generateFieldsType(meta: EntityDbMetadata, idType: \"string\" | \"number\"): Code[] {\n const id = code`id: { kind: \"primitive\"; type: ${idType}; unique: ${true}; nullable: never; };`;\n const primitives = meta.primitives.map((field) => {\n const { fieldName, fieldType, notNull, unique, derived } = field;\n return code`${fieldName}: { kind: \"primitive\"; type: ${fieldType}; unique: ${unique}; nullable: ${undefinedOrNever(\n notNull,\n )}, derived: ${derived !== false}; };`;\n });\n const enums = meta.enums.map((field) => {\n const { fieldName, enumType, notNull, isArray } = field;\n if (isArray) {\n // Arrays are always optional and we'll default to `[]`\n return code`${fieldName}: { kind: \"enum\"; type: ${enumType}[]; nullable: never; };`;\n } else {\n return code`${fieldName}: { kind: \"enum\"; type: ${enumType}; nullable: ${undefinedOrNever(notNull)}; };`;\n }\n });\n const pgEnums = meta.pgEnums.map((field) => {\n const { fieldName, enumType, notNull } = field;\n const nullable = undefinedOrNever(notNull);\n return code`${fieldName}: { kind: \"enum\"; type: ${enumType}; nullable: ${nullable}; native: true; };`;\n });\n const m2o = meta.manyToOnes.map((field) => {\n const { fieldName, otherEntity, notNull, derived } = field;\n return code`${fieldName}: { kind: \"m2o\"; type: ${otherEntity.type}; nullable: ${undefinedOrNever(\n notNull,\n )}, derived: ${derived !== false}; };`;\n });\n const polys = meta.polymorphics.map((field) => {\n const { fieldName, notNull, fieldType } = field;\n return code`${fieldName}: { kind: \"poly\"; type: ${fieldType}; nullable: ${undefinedOrNever(notNull)} };`;\n });\n const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}: { kind: \"m2m\"; type: ${otherEntity.type} };`;\n });\n const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {\n return code`${fieldName}: { kind: \"m2mEnum\"; type: ${enumType} };`;\n });\n const o2m = meta.oneToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}: { kind: \"o2m\"; type: ${otherEntity.type} };`;\n });\n const o2o = meta.oneToOnes.map((field) => {\n return code`${field.fieldName}: { kind: \"o2o\"; type: ${field.otherEntity.type} };`;\n });\n const lo2m = meta.largeOneToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}: { kind: \"o2m\"; type: ${otherEntity.type} };`;\n });\n return [id, ...primitives, ...enums, ...pgEnums, ...m2o, ...polys, ...m2m, ...m2mEnum, ...o2m, ...o2o, ...lo2m];\n}\n\n/**\n * Emits physical columns with domain value types and database nullability.\n * I.e. Comment.parent_book_id is an optional Book reference, not the CommentParent union.\n * Polymorphic component writes remain unsupported, so their policies are conservative.\n */\nfunction generateColumnsType(meta: EntityDbMetadata, idType: \"string\" | \"number\"): Record<string, Code> {\n const columns: Record<string, Code> = {\n id: code`{ kind: \"primitive\"; type: ${idType}; unique: true; ${columnPolicyType(meta, meta.primaryKey)} }`,\n };\n for (const field of [...meta.primitives, ...meta.enums, ...meta.pgEnums, ...meta.manyToOnes]) {\n const policy = columnPolicyType(meta, field);\n if (field.kind === \"primitive\") {\n columns[field.columnName] =\n code`{ kind: \"primitive\"; type: ${field.fieldType}; unique: ${field.unique}; derived: ${field.derived !== false}; ${policy} }`;\n } else if (field.kind === \"m2o\") {\n columns[field.columnName] =\n code`{ kind: \"m2o\"; type: ${field.otherEntity.type}; derived: ${field.derived !== false}; ${policy} }`;\n } else {\n const array = field.kind === \"enum\" && field.isArray ? \"[]\" : \"\";\n const native = field.kind === \"pg-enum\" ? \"native: true;\" : \"\";\n columns[field.columnName] = code`{ kind: \"enum\"; type: ${field.enumType}${array}; ${native} ${policy} }`;\n }\n }\n for (const field of meta.polymorphics) {\n for (const component of field.components) {\n columns[component.columnName] =\n code`{ kind: \"m2o\"; type: ${component.otherEntity.type}; nullable: true; insert: \"never\"; update: false; }`;\n }\n }\n return columns;\n}\n\n/** Emits SQL write policy without using ORM defaults or derived-field restrictions. */\nfunction columnPolicyType(\n meta: EntityDbMetadata,\n column: Pick<PrimitiveField, \"columnNotNull\" | \"columnGenerated\"> & Partial<Pick<PrimitiveField, \"columnDefault\">>,\n): Code {\n const primaryKey = column === meta.primaryKey ? meta.primaryKey.columnType : undefined;\n const insert = column.columnGenerated\n ? \"never\"\n : !column.columnNotNull ||\n column.columnDefault != null ||\n column === meta.createdAt ||\n column === meta.updatedAt ||\n primaryKey === \"int\" ||\n primaryKey === \"bigint\"\n ? \"optional\"\n : \"required\";\n return code`nullable: ${!column.columnNotNull}; insert: \"${insert}\"; update: ${!primaryKey && !column.columnGenerated};`;\n}\n\n// We know the OptIds types are only used in partials, so we make everything optional.\n// This especially needs to be the case b/c both `book: ...` and `bookId: ...` will be\n// in the partial type and of course the caller will only be setting one.\nfunction generateOptIdsFields(meta: EntityDbMetadata): Code[] {\n const m2o = meta.manyToOnes\n .filter(({ derived }) => !derived) // Skip ReactiveReferences\n .map(({ fieldName, otherEntity }) => {\n return code`${fieldName}Id?: ${otherEntity.idType} | null;`;\n });\n const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}Id?: ${otherEntity.idType} | null;`;\n });\n const o2m = meta.oneToManys.map(({ singularName, otherEntity }) => {\n return code`${singularName}Ids?: ${otherEntity.idType}[] | null;`;\n });\n const m2m = meta.manyToManys\n .filter(({ derived }) => !derived) // Skip ReactiveManyToManys\n .map(({ singularName, otherEntity }) => {\n return code`${singularName}Ids?: ${otherEntity.idType}[] | null;`;\n });\n const polys = meta.polymorphics.map(({ fieldName, fieldType }) => {\n return code`${fieldName}Id?: ${IdOf}<${fieldType}> | null;`;\n });\n return [...m2o, ...polys, ...o2o, ...o2m, ...m2m];\n}\n\nfunction generateFilterFields(metasByName: Record<string, EntityDbMetadata>, meta: EntityDbMetadata): Code[] {\n // Always allow filtering on null to do \"child.id is null\" for detecting \"has no children\"\n const maybeId = meta.baseClassName ? [] : [code`id?: ${ValueFilter}<${meta.entity.idName}, never> | null;`];\n const primitives = meta.primitives.map(({ fieldName, fieldType, notNull }) => {\n if (fieldType === \"boolean\") {\n return code`${fieldName}?: ${BooleanFilter}<${nullOrNever(notNull)}>;`;\n } else {\n return code`${fieldName}?: ${ValueFilter}<${fieldType}, ${nullOrNever(notNull)}>;`;\n }\n });\n const enums = meta.enums.map(({ fieldName, enumType, notNull, isArray }) => {\n const maybeArray = isArray ? \"[]\" : \"\";\n return code`${fieldName}?: ${ValueFilter}<${enumType}${maybeArray}, ${nullOrNever(notNull)}>;`;\n });\n const pgEnums = meta.pgEnums.map(({ fieldName, enumType, notNull }) => {\n return code`${fieldName}?: ${ValueFilter}<${enumType}, ${nullOrNever(notNull)}>;`;\n });\n const m2o = meta.manyToOnes.flatMap(({ fieldName, otherEntity, notNull }) => {\n const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);\n return [\n code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${\n otherEntity.type\n }>, ${nullOrNever(notNull)}>;`,\n ...otherMeta.subTypes.map((st) => {\n return code`${fieldName}${st.name}?: ${EntityFilter}<${st.entity.type}, ${st.entity.idType}, ${FilterOf}<${\n st.entity.type\n }>, ${nullOrNever(notNull)}>;`;\n }),\n ];\n });\n const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`;\n });\n const o2m = meta.oneToManys.flatMap(({ fieldName, otherEntity, otherColumnNotNull }) => {\n const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);\n return [\n code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`,\n ...otherMeta.subTypes.map((st) => {\n return code`${fieldName}${st.name}?: ${EntityFilter}<${st.entity.type}, ${st.entity.idType}, ${FilterOf}<${\n st.entity.type\n }>, ${nullOrNever(otherColumnNotNull)}>;`;\n }),\n ];\n });\n const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`;\n });\n // Enum m2m filters are membership filters, e.g. `{ logoColors: Color.Red }` / `{ logoColors: [Red, Green] }`.\n const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {\n return code`${fieldName}?: ${ValueFilter}<${enumType}, null | undefined>;`;\n });\n const polys = meta.polymorphics.flatMap(({ fieldName, fieldType, components, notNull }) => {\n return [\n code`${fieldName}?: ${EntityFilter}<${fieldType}, ${IdOf}<${fieldType}>, never, ${nullOrNever(notNull)}>;`,\n ...components.map((comp) => {\n const { type } = comp.otherEntity;\n return code`${fieldName}${type}?: ${EntityFilter}<${type}, ${IdOf}<${type}>, ${FilterOf}<${type}>, null>;`;\n }),\n ];\n });\n return [...maybeId, ...primitives, ...enums, ...pgEnums, ...m2o, ...o2o, ...o2m, ...m2m, ...m2mEnum, ...polys];\n}\n\nfunction generateGraphQLFilterFields(metasByName: Record<string, EntityDbMetadata>, meta: EntityDbMetadata): Code[] {\n const maybeId = meta.baseClassName ? [] : [code`id?: ${ValueGraphQLFilter}<${meta.entity.idName}>;`];\n const primitives = meta.primitives.map(({ fieldName, fieldType }) => {\n if (fieldType === \"boolean\") {\n return code`${fieldName}?: ${BooleanGraphQLFilter};`;\n } else {\n return code`${fieldName}?: ${ValueGraphQLFilter}<${fieldType}>;`;\n }\n });\n const enums = meta.enums.map(({ fieldName, enumType, isArray }) => {\n const maybeArray = isArray ? \"[]\" : \"\";\n return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}${maybeArray}>;`;\n });\n const pgEnums = meta.pgEnums.map(({ fieldName, enumType }) => {\n return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}>;`;\n });\n const m2o = meta.manyToOnes.flatMap(({ fieldName, otherEntity, notNull }) => {\n const otherMeta = metasByName[otherEntity.name];\n return [\n code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${\n otherEntity.type\n }>, ${nullOrNever(notNull)}>;`,\n code`${fieldName}Id?: ${ValueGraphQLFilter}<${otherEntity.idType}>;`,\n ...otherMeta.subTypes.map((st) => {\n return code`${fieldName}${st.name}?: ${EntityGraphQLFilter}<${st.entity.type}, ${st.entity.idType}, ${GraphQLFilterOf}<${\n st.entity.type\n }>, ${nullOrNever(notNull)}>;`;\n }),\n ];\n });\n const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`;\n });\n const o2m = meta.oneToManys.flatMap(({ fieldName, otherEntity, otherColumnNotNull }) => {\n const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);\n return [\n code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`,\n ...otherMeta.subTypes.map((st) => {\n return code`${fieldName}${st.name}?: ${EntityGraphQLFilter}<${st.entity.type}, ${st.entity.idType}, ${GraphQLFilterOf}<${\n st.entity.type\n }>, ${nullOrNever(otherColumnNotNull)}>;`;\n }),\n ];\n });\n const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`;\n });\n const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {\n return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}>;`;\n });\n const polys = meta.polymorphics.flatMap(({ fieldName, fieldType, components, notNull }) => {\n return [\n code`${fieldName}?: ${EntityGraphQLFilter}<${fieldType}, ${IdOf}<${fieldType}>, never, ${nullOrNever(notNull)}>;`,\n code`${fieldName}Id?: ${ValueGraphQLFilter}<${IdOf}<${fieldType}>>;`,\n ...components.map((comp) => {\n const { type } = comp.otherEntity;\n return code`${fieldName}${type}?: ${EntityGraphQLFilter}<${type}, ${IdOf}<${type}>, ${FilterOf}<${type}>, null>;`;\n }),\n ];\n });\n return [...maybeId, ...primitives, ...enums, ...pgEnums, ...m2o, ...o2o, ...o2m, ...m2m, ...m2mEnum, ...polys];\n}\n\nfunction generateOrderFields(meta: EntityDbMetadata): Code[] {\n const maybeId = meta.baseClassName ? [] : [code`id?: ${OrderBy};`];\n const primitives = meta.primitives.map(({ fieldName }) => {\n return code`${fieldName}?: ${OrderBy};`;\n });\n const enums = meta.enums.map(({ fieldName }) => {\n return code`${fieldName}?: ${OrderBy};`;\n });\n const pgEnums = meta.pgEnums.map(({ fieldName }) => {\n return code`${fieldName}?: ${OrderBy};`;\n });\n const m2o = meta.manyToOnes.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${otherEntity.orderType};`;\n });\n return [...maybeId, ...primitives, ...enums, ...pgEnums, ...m2o];\n}\n\nfunction generateFactoryExtrasType(meta: EntityDbMetadata): Code[] {\n function withName(fieldName: string): string {\n return `with${fieldName[0].toUpperCase() + fieldName.substring(1)}`;\n }\n const primitives = meta.primitives\n .filter((f) => f.derived === \"async\")\n .map((field) => {\n const { fieldName, fieldType, notNull } = field;\n return code`${withName(fieldName)}?: ${fieldType}${maybeUnionNull(notNull)};`;\n });\n const enums = meta.enums\n .filter((f) => f.derived === \"async\")\n .map((field) => {\n const { fieldName, enumType, notNull, isArray } = field;\n if (isArray) {\n return code`${withName(fieldName)}?: ${enumType}[];`;\n } else {\n return code`${withName(fieldName)}?: ${enumType}${maybeUnionNull(notNull)};`;\n }\n });\n return [...primitives, ...enums];\n}\n\nfunction createPrimitives(meta: EntityDbMetadata, entity: Entity, fieldDocs: Record<string, string>) {\n const primitives = meta.primitives.map((p) => {\n const { fieldName, fieldType, notNull } = p;\n const maybeOptional = notNull ? \"\" : \" | undefined\";\n\n // `lazy` columns are emitted as `LazyField` relations by `createLazyFields`, not as getters/setters\n if (p.lazy) return code``;\n\n let getter: Code;\n if (p.derived === \"async\") {\n getter = code`\n abstract readonly ${fieldName}: ${ReactiveField}<${entity.name}, ${p.fieldType}${maybeOptional}>;\n `;\n } else if (p.derived === \"sync\") {\n getter = code`\n abstract get ${fieldName}(): ${fieldType}${maybeOptional};\n `;\n } else if (p.zodSchema) {\n getter = code`\n get ${fieldName}(): ${Zod}.output<typeof ${p.zodSchema}>${maybeOptional} {\n return ${getField}(this, \"${fieldName}\");\n }\n `;\n } else {\n getter = code`\n get ${fieldName}(): ${fieldType}${maybeOptional} {\n return ${getField}(this, \"${fieldName}\");\n }\n `;\n }\n\n let setter: Code | string;\n // ...technically we should be checking a list of JS keywords\n const paramName = keywords.includes(fieldName) ? \"value\" : fieldName;\n if (p.protected) {\n // TODO Allow making the getter to be protected as well. And so probably remove it\n // from the Opts as well. Wonder how that works for required protected fields?\n //\n // We have to use a method of `set${fieldName}` because TS enforces getters/setters to have\n // same access level and currently we're leaving the getter as public.\n setter = code`\n protected set${pascalCase(fieldName)}(${paramName}: ${fieldType}${maybeOptional}) {\n ${setField}(this, \"${fieldName}\", ${paramName});\n }\n `;\n } else if (p.derived) {\n setter = \"\";\n } else if (p.superstruct) {\n // We use `value` as the param name to not potentially conflict with the\n // name of the imported superstruct const that is passed to assert.\n setter = code`\n set ${fieldName}(value: ${fieldType}${maybeOptional}) {\n if (value) {\n ${SSAssert}(value, ${p.superstruct});\n }\n ${setField}(this, \"${fieldName}\", value);\n }\n `;\n } else if (p.zodSchema) {\n // We use `value` as the param name to not potentially conflict with the\n // name of the imported zod schema that is passed to parse.\n setter = code`\n set ${fieldName}(value: ${Zod}.input<typeof ${p.zodSchema}>${maybeOptional}) {\n if (value) {\n ${setField}(this, \"${fieldName}\", ${p.zodSchema}.parse(value));\n } else {\n ${setField}(this, \"${fieldName}\", value);\n }\n }\n `;\n } else {\n setter = code`\n set ${fieldName}(${paramName}: ${fieldType}${maybeOptional}) {\n ${setField}(this, \"${fieldName}\", ${paramName});\n }\n `;\n }\n\n return code`${fieldDocBlock(fieldDocs, fieldName, entity.name)}${getter} ${setter}`;\n });\n return primitives;\n}\n\nfunction createRegularEnums(meta: EntityDbMetadata, entity: Entity, fieldDocs: Record<string, string>) {\n return meta.enums\n .filter((e) => !e.isArray)\n .flatMap((e) => {\n const { fieldName, enumType, enumDetailType, enumDetailsType, notNull, enumRows, derived } = e;\n const maybeOptional = notNull ? \"\" : \" | undefined\";\n const getByCode = code`${enumDetailType}.getByCode(this.${fieldName})`;\n\n let getter: Code;\n if (derived === \"async\") {\n getter = code`\n abstract readonly ${fieldName}: ${ReactiveField}<${entity.name}, ${enumType}${maybeOptional}>;\n `;\n } else if (derived === \"sync\") {\n getter = code`\n abstract get ${fieldName}(): ${enumType}${maybeOptional};\n `;\n } else {\n getter = code`\n get ${fieldName}(): ${enumType}${maybeOptional} {\n return ${getField}(this, \"${fieldName}\");\n }\n\n get ${fieldName}Details(): ${enumDetailsType}${maybeOptional} {\n return ${notNull ? getByCode : code`this.${fieldName} ? ${getByCode} : undefined`};\n }\n `;\n }\n\n let setter: Code;\n if (derived) {\n setter = code``;\n } else {\n setter = code`\n set ${fieldName}(${fieldName}: ${enumType}${maybeOptional}) {\n ${setField}(this, \"${fieldName}\", ${fieldName});\n }\n `;\n }\n\n const codes = new Set(enumRows.map((r) => r.code));\n const shouldPrefixAccessors = meta.enums\n .filter((other) => other !== e)\n .some((other) => other.enumRows.some((r) => codes.has(r.code)));\n\n const accessors = enumRows.map(\n (row) => code`\n get is${shouldPrefixAccessors ? pascalCase(fieldName) : \"\"}${pascalCase(row.code)}(): boolean {\n return ${getField}(this, \"${fieldName}\") === ${enumType}.${pascalCase(row.code)};\n }\n `,\n );\n return [code`${fieldDocBlock(fieldDocs, fieldName, entity.name)}${getter}`, setter, ...accessors];\n });\n}\n\nfunction createArrayEnums(meta: EntityDbMetadata, fieldDocs: Record<string, string>) {\n return meta.enums\n .filter((e) => e.isArray)\n .flatMap((e) => {\n const { fieldName, enumType, enumDetailType, enumDetailsType, enumRows } = e;\n const getter = code`\n get ${fieldName}(): ${enumType}[] {\n return ${getField}(this, \"${fieldName}\") || [];\n }\n\n get ${fieldName}Details(): ${enumDetailsType}[] {\n return this.${fieldName}.map(code => ${enumDetailType}.getByCode(code));\n }\n `;\n const setter = code`\n set ${fieldName}(${fieldName}: ${enumType}[]) {\n ${setField}(this, \"${fieldName}\", ${fieldName});\n }\n `;\n\n const codes = new Set(enumRows.map((r) => r.code));\n const shouldPrefixAccessors = meta.enums\n .filter((other) => other !== e)\n .some((other) => other.enumRows.some((r) => codes.has(r.code)));\n\n const accessors = enumRows.map(\n (row) => code`\n get is${shouldPrefixAccessors ? pascalCase(fieldName) : \"\"}${pascalCase(row.code)}(): boolean {\n return this.${fieldName}.includes(${enumType}.${pascalCase(row.code)});\n }\n `,\n );\n return [code`${fieldDocBlock(fieldDocs, fieldName, meta.entity.name)}${getter}`, setter, ...accessors];\n });\n}\n\nfunction createPgEnums(meta: EntityDbMetadata, fieldDocs: Record<string, string>) {\n return meta.pgEnums.flatMap((e) => {\n const { fieldName, enumType, enumValues, notNull } = e;\n const maybeOptional = notNull ? \"\" : \" | undefined\";\n\n const getter = code`\n get ${fieldName}(): ${enumType}${maybeOptional} {\n return ${getField}(this, \"${fieldName}\");\n }\n `;\n const setter = code`\n set ${fieldName}(${fieldName}: ${enumType}${maybeOptional}) {\n ${setField}(this, \"${fieldName}\", ${fieldName});\n }\n `;\n\n const codes = new Set(enumValues);\n const shouldPrefixAccessors = meta.pgEnums\n .filter((other) => other !== e)\n .some((other) => other.enumValues.some((r) => codes.has(r)));\n\n const accessors = enumValues.map(\n (row) => code`\n get is${shouldPrefixAccessors ? pascalCase(fieldName) : \"\"}${pascalCase(row)}(): boolean {\n return this.${fieldName} === ${enumType}.${pascalCase(row)};\n }\n `,\n );\n return [code`${fieldDocBlock(fieldDocs, fieldName, meta.entity.name)}${getter}`, setter, ...accessors];\n });\n}\n\nfunction createRelations(config: Config, meta: EntityDbMetadata, entity: Entity): Relation[] {\n // Add ManyToOne entities\n const m2o: Relation[] = meta.manyToOnes.map((m2o) => {\n const { fieldName, otherEntity, otherFieldName, notNull } = m2o;\n const maybeOptional = notNull ? \"never\" : \"undefined\";\n if (m2o.derived === \"async\") {\n const line = code`abstract readonly ${fieldName}: ${ReactiveReference}<${entity.name}, ${otherEntity.type}, ${maybeOptional}>;`;\n return { kind: \"abstract\", fieldName, line } as const;\n }\n const decl = code`${ManyToOneReference}<${entity.type}, ${otherEntity.type}, ${maybeOptional}>`;\n const init = code`${hasOne}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n // Specialize\n const m2oBase: Relation[] =\n meta.baseType?.manyToOnes\n // Skip m2os that are already specialized to a different otherEntity, i.e. `SmallPublisher.group: SmallPublisherGroup`\n .filter((m2o) => !meta.manyToOnes.find((o) => o.fieldName === m2o.fieldName))\n // Don't specialize hasReactiveReferences b/c they're fields, not getters\n .filter((m2o) => m2o.derived !== \"async\")\n .map((m2o) => {\n const { fieldName, otherEntity, notNull } = m2o;\n const maybeOptional = notNull ? \"never\" : \"undefined\";\n const decl = code`${ManyToOneReference}<${entity.type}, ${otherEntity.type}, ${maybeOptional}>`;\n return { kind: \"super\", fieldName, decl };\n }) ?? [];\n\n // Add any recursive ManyToOne entities\n const m2oRecursive: Relation[] = meta.manyToOnes\n .filter((m2o) => m2o.otherEntity.name === meta.name)\n // Allow disabling recursive relations\n .filter(\n (m2o) =>\n // STI subtypes don't have their own key in config.entities (stripped by stripStiPlaceholders),\n // so look up the base class name to find skipRecursiveRelations config\n !(\n config.entities[meta.inheritanceType == \"sti\" && meta.baseClassName ? meta.baseClassName : meta.name]\n ?.relations?.[m2o.fieldName]?.skipRecursiveRelations === true\n ),\n )\n // Skip ReactiveReferences because they don't have an `other` side for us to use\n .filter((m2o) => !m2o.derived)\n .flatMap((m2o) => {\n const { fieldName: m2oName, otherFieldName, otherEntity } = m2o;\n const parentsField = `${plural(m2oName)}Recursive`;\n const maybeOneToOne = meta.oneToOnes.find((o2o) => o2o.fieldName === otherFieldName);\n const childrenField = maybeOneToOne ? `${plural(otherFieldName)}Recursive` : `${otherFieldName}Recursive`;\n return [\n {\n kind: \"concrete\",\n fieldName: parentsField,\n decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,\n init: code`${hasRecursiveParents}(\"${m2oName}\", \"${childrenField}\")`,\n },\n {\n kind: \"concrete\",\n fieldName: childrenField,\n decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,\n init: code`${hasRecursiveChildren}(\"${otherFieldName}\", \"${parentsField}\")`,\n },\n ];\n });\n\n // Add any recursive ManyToMany entities (self-referential m2m)\n const m2mRecursive: Relation[] = meta.manyToManys\n .filter((m2m) => m2m.otherEntity.name === meta.name)\n .filter((m2m) => !m2m.derived)\n // STI subtypes don't have their own key in config.entities (stripped by stripStiPlaceholders),\n // so look up the base class name to find skipRecursiveRelations config\n .filter(\n (m2m) =>\n !(\n config.entities[meta.inheritanceType == \"sti\" && meta.baseClassName ? meta.baseClassName : meta.name]\n ?.relations?.[m2m.fieldName]?.skipRecursiveRelations === true\n ),\n )\n .map((m2m) => {\n const { fieldName, otherFieldName, otherEntity } = m2m;\n return {\n kind: \"concrete\",\n fieldName: `${fieldName}Recursive`,\n decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,\n init: code`${hasRecursiveM2m}(\"${fieldName}\", \"${otherFieldName}Recursive\")`,\n };\n });\n\n // Add OneToMany\n const o2m: Relation[] = meta.oneToManys.map((o2m) => {\n const { fieldName, otherEntity } = o2m;\n const decl = code`${Collection}<${entity.type}, ${otherEntity.type}>`;\n const init = code`${hasMany}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n // Specialize\n const o2mBase: Relation[] =\n meta.baseType?.oneToManys\n // Skip o2ms that are already specialized to a different otherEntity, i.e. `SmallPublisherGroup.publishers: SmallPublisher`\n .filter((o2m) => !meta.oneToManys.find((o) => o.fieldName === o2m.fieldName))\n .map((o2m) => {\n const { fieldName, otherEntity } = o2m;\n const decl = code`${Collection}<${entity.type}, ${otherEntity.type}>`;\n return { kind: \"super\", fieldName, decl };\n }) ?? [];\n\n // Add large OneToMany\n const lo2m: Relation[] = meta.largeOneToManys.map((o2m) => {\n const { fieldName, otherEntity } = o2m;\n const decl = code`${LargeCollection}<${entity.type}, ${otherEntity.type}>`;\n const init = code`${hasLargeMany}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n\n // Add OneToOne\n const o2o: Relation[] = meta.oneToOnes.map((o2o) => {\n const { fieldName, otherEntity } = o2o;\n const decl = code`${OneToOneReference}<${entity.type}, ${otherEntity.type}>`;\n const init = code`${hasOneToOne}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n // Specialize\n const o2oBase: Relation[] =\n meta.baseType?.oneToOnes.map((o2o) => {\n const { fieldName, otherEntity } = o2o;\n const decl = code`${OneToOneReference}<${entity.type}, ${otherEntity.type}>`;\n return { kind: \"super\", fieldName, decl };\n }) ?? [];\n\n // Add ManyToMany\n const m2m: Relation[] = meta.manyToManys.map((m2m) => {\n const { fieldName, otherEntity } = m2m;\n const comment = `// ${m2m.joinTableName} ${m2m.columnName} ${m2m.otherColumnName}`;\n if (m2m.derived === \"async\") {\n const line = code`abstract readonly ${fieldName}: ${ReactiveManyToMany}<${entity.name}, ${otherEntity.type}>;`;\n return { kind: \"abstract\", fieldName, line, comment } as const;\n } else if (m2m.derived === \"otherSide\") {\n const decl = code`${ReactiveManyToManyOtherSide}<${entity.type}, ${otherEntity.type}>`;\n const init = code`${hasReactiveManyToManyOtherSide}()`;\n return { kind: \"concrete\", fieldName, decl, init, comment };\n } else if (!m2m.derived) {\n const decl = code`${Collection}<${entity.type}, ${otherEntity.type}>`;\n const init = code`${hasManyToMany}()`;\n return { kind: \"concrete\", fieldName, decl, init, comment };\n } else {\n assertNever(m2m.derived);\n }\n });\n // Specialize\n const m2mBase: Relation[] =\n meta.baseType?.manyToManys\n // Don't specialize hasReactiveManyToMany or hasReactiveManyToManyOtherSide b/c they're fields, not getters\n .filter((m2m) => !m2m.derived)\n .map((m2m) => {\n const { fieldName, otherEntity } = m2m;\n const decl = code`${Collection}<${entity.type}, ${otherEntity.type}>`;\n return { kind: \"super\", fieldName, decl };\n }) ?? [];\n\n // Add enum-backed ManyToMany (i.e. `Publisher.logoColors`)\n const m2mEnum: Relation[] = meta.manyToManyEnums.map((m2m) => {\n const { fieldName, enumType } = m2m;\n const comment = `// ${m2m.joinTableName} ${m2m.columnName} ${m2m.otherColumnName}`;\n const decl = code`${EnumCollection}<${entity.type}, ${enumType}>`;\n const init = code`${hasEnumCollection}()`;\n return { kind: \"concrete\", fieldName, decl, init, comment };\n });\n const m2mEnumBase: Relation[] =\n meta.baseType?.manyToManyEnums.map((m2m) => {\n const { fieldName, enumType } = m2m;\n const decl = code`${EnumCollection}<${entity.type}, ${enumType}>`;\n return { kind: \"super\", fieldName, decl };\n }) ?? [];\n\n // Add large ManyToMany\n const lm2m: Relation[] = meta.largeManyToManys.map((m2m) => {\n const { joinTableName, fieldName, columnName, otherEntity, otherFieldName, otherColumnName } = m2m;\n const decl = code`${LargeCollection}<${entity.type}, ${otherEntity.type}>`;\n const init = code`\n ${hasLargeManyToMany}(\n \"${joinTableName}\",\n \"${columnName}\",\n \"${otherFieldName}\",\n \"${otherColumnName}\",\n ${m2m.hasJoinTableId},\n );\n `;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n\n // Add Polymorphic\n const polymorphic: Relation[] = meta.polymorphics.map((p) => {\n const { fieldName, notNull, fieldType } = p;\n const maybeOptional = notNull ? \"never\" : \"undefined\";\n const decl = code`${PolymorphicReference}<${entity.type}, ${fieldType}, ${maybeOptional}>`;\n const init = code`${hasOnePolymorphic}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n\n // Add `lazy` primitives, which are exposed as `LazyField`s instead of getters/setters\n const lazy: Relation[] = meta.primitives\n .filter((p) => p.lazy)\n .map((p) => {\n const { fieldName, fieldType, notNull } = p;\n const maybeOptional = notNull ? \"\" : \" | undefined\";\n const decl = code`${LazyField}<${entity.type}, ${fieldType}${maybeOptional}>`;\n const init = code`${hasLazyField}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n\n return [\n o2m,\n o2mBase,\n lo2m,\n m2o,\n m2oBase,\n m2oRecursive,\n m2mRecursive,\n o2o,\n o2oBase,\n m2m,\n m2mBase,\n m2mEnum,\n m2mEnumBase,\n lm2m,\n polymorphic,\n lazy,\n ].flat();\n}\n\n/** Makes the field required if there is a `NOT NULL` and no db-or-config default. */\nfunction maybeOptionalOrDefault(\n field: PrimitiveField | EnumField | PgEnumField | ManyToOneField | PolymorphicField,\n): string {\n const hasDefault =\n (field.kind !== \"m2o\" && field.kind !== \"poly\" && fieldHasDefaultValue(field)) || field.hasConfigDefault;\n return !field.notNull || hasDefault ? \"?\" : \"\";\n}\n\nfunction maybeUnionNull(notNull: boolean): string {\n return notNull ? \"\" : \" | null\";\n}\n\nfunction maybeUndefined(notNull: boolean): string {\n return notNull ? \"\" : \" | undefined\";\n}\n\nfunction undefinedOrNever(notNull: boolean): string {\n return notNull ? \"never\" : \"undefined\";\n}\n\nfunction nullOrNever(notNull: boolean): string {\n return notNull ? \"never\" : \"null\";\n}\n\n/** Returns the nowUTC call for the deleted-at field's generated timestamp type. */\nfunction nowUTCCall(config: Config, field: PrimitiveField): Code {\n if (!config.temporal) return code`${nowUTC}()`;\n switch (field.columnType) {\n case \"date\":\n return code`${nowUTC}(\"plainDate\")`;\n case \"timestamp without time zone\":\n return code`${nowUTC}(\"plainDateTime\")`;\n case \"timestamp with time zone\":\n return code`${nowUTC}(\"zonedDateTime\")`;\n default:\n return fail(`Unsupported deleted-at column type ${field.columnType}`);\n }\n}\n\n/** Prefixes the comment with a newline, so it gets its own line. */\nfunction maybeComment(comment: string | undefined): string {\n return comment ? ` ${comment}\\n` : \"\";\n}\n\n/**\n * Renders a field's `.md` doc (plus its `@generated` tag) as a bare JSDoc block, or `\"\"` if undocumented.\n *\n * Reuses the same {@link buildJSDocBlock} formatter the `.md` sync uses for hand-written `Entity.ts`\n * members. Used directly before a getter template (which supplies its own leading newline), so the\n * JSDoc lands immediately above the getter with no intervening blank line.\n */\nfunction fieldDocBlock(fieldDocs: Record<string, string>, fieldName: string, entityName: string): string {\n const doc = fieldDocs[fieldName];\n return doc ? buildJSDocBlock(`${doc}\\n${generatedTag(entityName)}`, 0) : \"\";\n}\n\n/** Like {@link fieldDocBlock} but wrapped in newlines, i.e. for inline `readonly x = ...` relation decls. */\nfunction relationDocBlock(fieldDocs: Record<string, string>, fieldName: string, entityName: string): string {\n const block = fieldDocBlock(fieldDocs, fieldName, entityName);\n return block ? `\\n${block}\\n` : \"\";\n}\n\nexport function getIdType(config: Config) {\n switch (config.idType) {\n case \"untagged-string\":\n case \"tagged-string\":\n case undefined:\n return \"string\";\n case \"number\":\n return \"number\";\n default:\n return assertNever(config.idType);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"generateEntityCodegenFile.cjs","names":["keywords","uncapitalize","camelCase","imp","toIdOf","BaseEntity","EntityManager","joinCode","FieldsOf","RelationsOf","Flavor","Scope","ConfigApi","newScopeFn","ProjectEntity","EntityMetadata","failNoIdYet","TaggedId","getField","tsdocComments","setOpts","PartialOrNull","OptsOf","DeepPartialOrNull","updatePartial","Changes","newChangesProxy","Lens","loadLens","LoadHint","Loaded","isLoaded","ToJsonHint","JsonPayload","toJSON","MaybeAbstractEntityConstructor","isEntity","fail","pascalCase","newRequiredLazyFieldRule","newRequiredRule","cannotBeUpdated","getStiEntities","mustBeSubType","IdOf","ValueFilter","BooleanFilter","EntityFilter","FilterOf","ValueGraphQLFilter","BooleanGraphQLFilter","EntityGraphQLFilter","GraphQLFilterOf","OrderBy","ReactiveField","Zod","setField","SSAssert","code","ReactiveReference","ManyToOneReference","hasOne","ReadOnlyCollection","hasRecursiveParents","hasRecursiveChildren","hasRecursiveM2m","Collection","hasMany","LargeCollection","hasLargeMany","OneToOneReference","hasOneToOne","ReactiveManyToMany","ReactiveManyToManyOtherSide","hasReactiveManyToManyOtherSide","hasManyToMany","EnumCollection","hasEnumCollection","hasLargeManyToMany","PolymorphicReference","hasOnePolymorphic","LazyField","hasLazyField","nowUTC","buildJSDocBlock","generatedTag","assertNever"],"sources":["../src/generateEntityCodegenFile.ts"],"sourcesContent":["import { camelCase, pascalCase } from \"change-case\";\nimport pluralize from \"pluralize\";\nimport { type Code, code, imp, joinCode } from \"ts-poet\";\n\nimport { type Config } from \"./config.ts\";\nimport { type ParsedDoc, buildJSDocBlock, generatedTag } from \"./docs/index.ts\";\nimport {\n type DbMetadata,\n type Entity,\n type EntityDbMetadata,\n type EnumField,\n type ManyToOneField,\n type PgEnumField,\n type PolymorphicField,\n type PrimitiveField,\n type PrimitiveTypescriptType,\n} from \"./EntityDbMetadata.ts\";\nimport { type ScopeMember } from \"./findEntityScopes.ts\";\nimport { getStiEntities } from \"./inheritance.ts\";\nimport { keywords } from \"./keywords.ts\";\nimport {\n BaseEntity,\n BooleanFilter,\n BooleanGraphQLFilter,\n Changes,\n Collection,\n ConfigApi,\n DeepPartialOrNull,\n EntityFilter,\n EntityGraphQLFilter,\n EntityManager,\n EntityMetadata,\n EnumCollection,\n FieldsOf,\n FilterOf,\n Flavor,\n GraphQLFilterOf,\n IdOf,\n JsonPayload,\n LargeCollection,\n LazyField,\n Lens,\n LoadHint,\n Loaded,\n ManyToOneReference,\n MaybeAbstractEntityConstructor,\n OneToOneReference,\n OptsOf,\n OrderBy,\n PartialOrNull,\n PolymorphicReference,\n ProjectEntity,\n ReactiveField,\n ReactiveManyToMany,\n ReactiveManyToManyOtherSide,\n ReactiveReference,\n ReadOnlyCollection,\n RelationsOf,\n SSAssert,\n Scope,\n TaggedId,\n ToJsonHint,\n ValueFilter,\n ValueGraphQLFilter,\n Zod,\n cannotBeUpdated,\n failNoIdYet,\n getField,\n hasEnumCollection,\n hasLargeMany,\n hasLargeManyToMany,\n hasLazyField,\n hasMany,\n hasManyToMany,\n hasOne,\n hasOnePolymorphic,\n hasOneToOne,\n hasReactiveManyToManyOtherSide,\n hasRecursiveChildren,\n hasRecursiveM2m,\n hasRecursiveParents,\n isEntity,\n isLoaded,\n loadLens,\n mustBeSubType,\n newChangesProxy,\n newRequiredLazyFieldRule,\n newRequiredRule,\n newScopeFn,\n nowUTC,\n setField,\n setOpts,\n toIdOf,\n toJSON,\n updatePartial,\n} from \"./symbols.ts\";\nimport { tsdocComments } from \"./tsdoc.ts\";\nimport { assertNever, fail, q, uncapitalize } from \"./utils.ts\";\n\nconst { plural } = pluralize;\n\nexport interface ColumnMetaData {\n fieldType: PrimitiveTypescriptType;\n}\n\n// A local type just for tracking abstract vs. concrete relations\ntype Relation =\n // I.e. `abstract ReactiveReference` that the user must implement\n | { kind: \"abstract\"; fieldName: string; line: Code; comment?: string }\n // I.e. a `get author(): ManyToOne<...>`\n | { kind: \"concrete\"; fieldName: string; decl: Code; init: Code; comment?: string }\n // I.e. a `get author(): { super.author as ... }`\n | { kind: \"super\"; fieldName: string; decl: Code; comment?: string };\n\n/** Creates the base class with the boilerplate annotations. */\nexport function generateEntityCodegenFile(\n config: Config,\n dbMeta: DbMetadata,\n meta: EntityDbMetadata,\n scopeMembers: ScopeMember[] = [],\n docs?: ParsedDoc,\n): Code {\n const { entitiesByName: metasByName } = dbMeta;\n const { entity, tagName } = meta;\n const entityName = entity.name;\n\n // Per-field `.md` docs to inject as JSDocs on the codegen'd getters/relations (empty if docs are off)\n const fieldDocs = docs?.fields ?? {};\n\n // Avoid using `do` as a variable name b/c it's a reserved keyword\n const varName = keywords.includes(tagName) ? uncapitalize(entityName) : tagName;\n\n const primitives = createPrimitives(meta, entity, fieldDocs); // Add the primitives\n primitives.push(...createRegularEnums(meta, entity, fieldDocs)); // Add ManyToOne enums\n primitives.push(...createArrayEnums(meta, fieldDocs)); // Add integer[] enums\n primitives.push(...createPgEnums(meta, fieldDocs)); // Add native enums\n const relations = createRelations(config, meta, entity);\n\n const configName = `${camelCase(entityName)}Config`;\n const scopeFnName = `${camelCase(entityName)}Scope`;\n const metadata = imp(`${camelCase(entityName)}Meta@./entities.ts`);\n\n const contextType = config.contextType ? imp(`t:${config.contextType}`) : \"{}\";\n const factoryMethod = imp(`new${entity.name}@./entities.ts`);\n\n // If we're not tagged-strings, detag on the way out of id\n const idMaybeCode =\n config.idType === \"tagged-string\"\n ? code`return this.idTaggedMaybe;`\n : code`return ${toIdOf}(${metadata}, this.idTaggedMaybe);`;\n const idType = getIdType(config);\n\n const maybeSoftDeleteMethods = meta.deletedAt\n ? code`\n get isSoftDeletedEntity(): boolean {\n return this.${meta.deletedAt.fieldName} !== undefined;\n }\n\n softDelete(): void {\n if (this.isSoftDeletedEntity) return;\n this.${meta.deletedAt.fieldName} = ${nowUTCCall(config, meta.deletedAt)};\n }\n `\n : \"\";\n\n // Set up the codegen artifacts to extend from the base type if necessary\n const baseEntity = dbMeta.entities.find((e) => e.name === meta.baseClassName);\n const subEntities = dbMeta.entities.filter((e) => e.baseClassName === meta.name);\n const base = baseEntity?.entity.typeSymbol ?? code`${BaseEntity}<${EntityManager}, ${idType}>`;\n // CTI subtype ids have their own SQL defaults, unlike the base table's sequence-backed ids.\n // Locally redeclared fields also replace base policies when STI strengthens notNull.\n const maybeBaseFields = baseEntity\n ? code`extends Omit<${imp(\"t:\" + baseEntity.entity.fieldsName + \"@./entities.ts\")}, \"id\"${[\n ...meta.primitives,\n ...meta.enums,\n ...meta.pgEnums,\n ...meta.manyToOnes,\n ]\n .filter((field) =>\n [...baseEntity.primitives, ...baseEntity.enums, ...baseEntity.pgEnums, ...baseEntity.manyToOnes].some(\n (baseField) => baseField.fieldName === field.fieldName,\n ),\n )\n .map((field) => code` | \"${field.fieldName}\"`)}>`\n : \"\";\n const maybeBaseOpts = baseEntity ? code`extends ${baseEntity.entity.optsType}` : \"\";\n const physical = meta.physicalMetadata ?? meta;\n const sharedTable = meta.inheritanceType === \"sti\" && baseEntity;\n const columns = sharedTable ? {} : generateColumnsType(physical);\n const maybeBaseColumns = sharedTable ? code`extends ${imp(`t:${baseEntity.name}Columns@./entities.ts`)}` : \"\";\n const maybeBaseIdOpts = baseEntity\n ? code`extends ${imp(\"t:\" + baseEntity.entity.idsOptsName + \"@./entities.ts\")}`\n : \"\";\n const maybeBaseFilter = baseEntity\n ? code`extends ${imp(\"t:\" + baseEntity.entity.filterName + \"@./entities.ts\")}`\n : \"\";\n const maybeBaseGqlFilter = baseEntity\n ? code`extends ${imp(\"t:\" + baseEntity.entity.graphqlFilterName + \"@./entities.ts\")}`\n : \"\";\n const maybeBaseOrder = baseEntity ? code`extends ${baseEntity.entity.orderType}` : \"\";\n const maybePreventBaseTypeInstantiation = meta.abstract\n ? code`\n if (this.constructor === ${entity.type} && !(em as any).fakeInstance) {\n throw new Error(\\`${entity.type} must be instantiated via a subtype\\`);\n }`\n : \"\";\n\n let maybeOtherTypeChanges;\n if (subEntities.length > 0) {\n maybeOtherTypeChanges = joinCode(\n // Pass `K = keyof Publisher | keyof SmallPublisher | keyof LargePublisher` to `changes` so that\n // our subtypes can have `SmallPublisher.changes(): Changes<SmallPublisher>` be covariant, which\n // will break if it adds a key to `Changes.fields` that `Publisher.changes()` does not include.\n //\n // type A1 = { foo: 1 | 2 };\n // type A2 = { foo: 1 | 2 | 3 };\n // type A3 = A2 extends A1 ? 1 : 2;\n //\n // A3 will be 2 because the extra 3 breaks code written against A1.foo.\n //\n // So essentially we're pre-emptively our subtypes \"3\".\n [\n code`, `,\n ...[meta, ...subEntities].map(\n (e) => code`keyof (${FieldsOf}<${e.entity.type}> & ${RelationsOf}<${e.entity.type}>)`,\n ),\n ],\n { on: \"|\" },\n );\n } else {\n maybeOtherTypeChanges = \"\";\n }\n\n let maybeOtherLoaded;\n if (baseEntity) {\n maybeOtherLoaded = code`| ${baseEntity.entity.type}`;\n } else {\n maybeOtherLoaded = \"\";\n }\n\n return code`\n export type ${entity.idName} = ${Flavor}<${idType}, \"${baseEntity ? baseEntity.name : entityName}\">;\n\n ${generatePolymorphicTypes(meta)}\n\n export interface ${entity.fieldsName} ${maybeBaseFields} {\n ${generateFieldsType(meta, idType)}\n }\n\n export interface ${entityName}Columns ${maybeBaseColumns} {\n ${Object.entries(columns).map(([name, descriptor]) => code`${JSON.stringify(name)}: ${descriptor};`)}\n }\n\n export interface ${entity.optsName} ${maybeBaseOpts} {\n ${generateOptsFields(meta)}\n }\n\n export interface ${entity.idsOptsName} ${maybeBaseIdOpts} {\n ${generateOptIdsFields(meta)}\n }\n\n export interface ${entity.filterName} ${maybeBaseFilter} {\n ${generateFilterFields(metasByName, meta)}\n }\n\n export interface ${entity.graphqlFilterName} ${maybeBaseGqlFilter} {\n ${generateGraphQLFilterFields(metasByName, meta)}\n }\n\n export interface ${entity.orderName} ${maybeBaseOrder} {\n ${generateOrderFields(meta)}\n }\n\n export interface ${entity.factoryExtrasName} {\n ${generateFactoryExtrasType(meta)}\n }\n\n export interface ${entity.scopesName} {\n ${scopeMembers.map((member) => code`${member.name}: ${member.type};`)}\n }\n\n export type ${entity.scopeName} = ${Scope}<${entity.type}, ${entity.scopesName}>;\n\n export const ${configName} = new ${ConfigApi}<${entity.type}, ${contextType}>();\n\n export const ${scopeFnName} = ${newScopeFn}<${entity.type}, ${entity.scopeName}>(\"${entityName}\");\n\n ${generateDefaultValidationRules(dbMeta, meta, configName)}\n ${generateDefaultValues(config, meta, configName)};\n\n declare module \"joist-core\" {\n interface TypeMap {\n ${entityName}: {\n entityType: ${entityName};\n filterType: ${entity.filterName};\n gqlFilterType: ${entity.graphqlFilterName};\n orderType: ${entity.orderName};\n optsType: ${entity.optsName};\n fieldsType: ${entity.fieldsName};\n columnsType: ${entityName}Columns;\n inheritanceType: ${meta.inheritanceType ? code`\"${meta.inheritanceType}\"` : \"never\"};\n supportsEmExecute: ${!meta.inheritanceType && meta.supportsEmExecute === true};\n optIdsType: ${entity.idsOptsName};\n factoryExtrasType: ${entity.factoryExtrasName};\n factoryOptsType: Parameters<typeof ${factoryMethod}>[1];\n };\n }\n }\n\n export abstract class ${entityName}Codegen extends ${base} implements ${ProjectEntity} {\n static readonly tagName = \"${tagName}\";\n static readonly metadata: ${EntityMetadata}<${entity.type}>;\n\n declare readonly __type: {\n ${baseEntity ? `0: \"${baseEntity.name}\",` : \"\"}\n ${baseEntity ? 1 : 0}: \"${entityName}\", \n };\n\n ${relations\n .filter((r) => r.kind === \"abstract\")\n .map((r) => {\n return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}${r.line}${maybeComment(r.comment)}`;\n })}\n ${relations\n .filter((r) => r.kind === \"concrete\")\n .map((r) => {\n return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}readonly ${r.fieldName}: ${r.decl} = ${r.init};${maybeComment(r.comment)}`;\n })}\n ${relations\n .filter((r) => r.kind === \"super\")\n .map((r) => {\n return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}declare readonly ${r.fieldName}: ${r.decl};${maybeComment(r.comment)}`;\n })}\n\n get id(): ${entity.idName} {\n return this.idMaybe || ${failNoIdYet}(\"${entityName}\");\n }\n\n get idMaybe(): ${entity.idName} | undefined {\n ${idMaybeCode}\n }\n\n get idTagged(): ${TaggedId} {\n return this.idTaggedMaybe || ${failNoIdYet}(\"${entityName}\");\n }\n\n get idTaggedMaybe(): ${TaggedId} | undefined {\n return ${getField}(this, \"id\");\n }\n\n ${primitives} \n\n ${tsdocComments.entity.setPartial}\n set(opts: Partial<${entity.optsName}>): void {\n ${setOpts}(this as any as ${entityName}, opts);\n }\n\n ${tsdocComments.entity.setPartial}\n setPartial(opts: ${PartialOrNull}<${entity.optsName}>): void {\n ${setOpts}(this as any as ${entityName}, opts as ${OptsOf}<${entityName}>, { partial: true });\n }\n\n ${tsdocComments.entity.setDeepPartial}\n setDeepPartial(opts: ${DeepPartialOrNull}<${entityName}>): Promise<void> {\n return ${updatePartial}(this as any as ${entityName}, opts);\n }\n\n ${tsdocComments.entity.changes}\n get changes(): ${Changes}<${entityName}${maybeOtherTypeChanges}> {\n return ${newChangesProxy}(this) as any;\n }\n\n ${maybeSoftDeleteMethods}\n\n ${tsdocComments.entity.load}\n load<U, V>(fn: (lens: ${Lens}<${entity.type}>) => ${Lens}<U, V>, opts: { sql?: boolean } = {}): Promise<V> {\n return ${loadLens}(this as any as ${entityName}, fn, opts);\n }\n\n ${tsdocComments.entity.populate}\n populate<const H extends ${LoadHint}<${entityName}>>(hint: H): Promise<${Loaded}<${entityName}, H>>;\n populate<const H extends ${LoadHint}<${entityName}>>(opts: { hint: H, forceReload?: boolean }): Promise<${Loaded}<${entityName}, H>>;\n populate<const H extends ${LoadHint}<${entityName}>, V>(hint: H, fn: (${varName}: Loaded<${entityName}, H>) => V): Promise<V>;\n populate<const H extends ${LoadHint}<${entityName}>, V>(opts: { hint: H, forceReload?: boolean }, fn: (${varName}: Loaded<${entityName}, H>) => V): Promise<V>;\n populate<const H extends ${LoadHint}<${entityName}>, V>(hintOrOpts: any, fn?: (${varName}: Loaded<${entityName}, H>) => V): Promise<${Loaded}<${entityName}, H> | V> {\n return this.em.populate(this as any as ${entityName}, hintOrOpts, fn);\n }\n\n ${tsdocComments.entity.isLoaded}\n isLoaded<const H extends ${LoadHint}<${entityName}>>(hint: H): this is ${Loaded}<${entityName}${maybeOtherLoaded}, H> {\n return ${isLoaded}(this as any as ${entityName}, hint);\n }\n\n ${tsdocComments.entity.toJSON}\n toJSON(): object;\n toJSON<const H extends ${ToJsonHint}<${entityName}>>(hint: H): Promise<${JsonPayload}<${entityName}, H>>;\n toJSON(hint?: any): object {\n return !hint || typeof hint === \"string\" ? super.toJSON() : ${toJSON}(this, hint);\n }\n }\n `;\n}\n\nfunction fieldHasDefaultValue(field: PrimitiveField | EnumField | PgEnumField): boolean {\n let { columnDefault } = field;\n // If there's no default at all, return false\n if (columnDefault === null) {\n return false;\n }\n // Even though default is defined as a `number | boolean | string | null`, in reality pg-structure\n // only ever returns a `string | null`, so we handle that here\n columnDefault = columnDefault.toString();\n const fieldType = field.kind === \"primitive\" ? field.fieldType : \"number\";\n // Try to validate that we actually got a primitive value and not arbitrary SQL\n return (\n (fieldType === \"number\" && !isNaN(parseInt(columnDefault))) ||\n (fieldType === \"bigint\" && !isNaN(parseInt(columnDefault))) ||\n (fieldType === \"string\" && /^'.*'$/.test(columnDefault)) ||\n (fieldType === \"boolean\" && [\"true\", \"false\"].includes(columnDefault))\n );\n}\n\nfunction generatePolymorphicTypes(meta: EntityDbMetadata) {\n return meta.polymorphics.flatMap((pf) => [\n code`export type ${pf.fieldType} = ${pf.components.map((c) => code`| ${c.otherEntity.type}`)};`,\n code`export function get${pf.fieldType}Constructors(): ${MaybeAbstractEntityConstructor}<${pf.fieldType}>[] {\n return [${pf.components.map((c) => code`${c.otherEntity.typeSymbol},`)}];\n }`,\n code`export function is${pf.fieldType}(maybeEntity: unknown): maybeEntity is ${pf.fieldType} {\n return ${isEntity}(maybeEntity) && get${pf.fieldType}Constructors().some((type) => maybeEntity instanceof type);\n }`,\n ]);\n}\n\nfunction generateDefaultValues(config: Config, meta: EntityDbMetadata, configName: string): Code[] {\n // Skip sync defaults b/c we'll just stomp the getter; leave async in case they're RQFs\n // where the row must fundamentally be inserted with a dummy value before the real value is calced.\n function notSync(field: PrimitiveField | EnumField): boolean {\n return \"derived\" in field && field.derived !== \"sync\";\n }\n\n const primitives = meta.primitives\n .filter((field) => fieldHasDefaultValue(field))\n .filter(notSync)\n .map(({ fieldName, columnDefault }) => {\n return code`${configName}.setDefault(\"${fieldName}\", ${columnDefault});`;\n });\n const pgEnums = meta.pgEnums\n .filter((field) => !!field.columnDefault)\n .map(({ fieldName, columnDefault }) => {\n return code`${configName}.setDefault(\"${fieldName}\", ${columnDefault});`;\n });\n const enums = meta.enums\n .filter((field) => !!field.columnDefault && !field.isArray)\n .filter(notSync)\n .map(({ fieldName, columnDefault, enumRows, enumType, columnName }) => {\n const defaultRow =\n enumRows.find((r) => r.id === Number(columnDefault)) ||\n fail(`Invalid default value ${columnDefault} for ${meta.tableName}.${columnName}`);\n return code`${configName}.setDefault(\"${fieldName}\", ${enumType}.${pascalCase(defaultRow.code)});`;\n });\n return [...primitives, ...enums, ...pgEnums];\n}\n\nfunction generateDefaultValidationRules(db: DbMetadata, meta: EntityDbMetadata, configName: string): Code[] {\n // Add required rules for all not-null columns\n const fields = [...meta.primitives, ...meta.enums, ...meta.manyToOnes, ...meta.polymorphics];\n const rules = fields\n .filter((p) => p.notNull)\n .map((p) => {\n const { fieldName } = p;\n const isReactive = \"derived\" in p && p.derived === \"async\";\n if (\"lazy\" in p && p.lazy) {\n // Lazy columns use a rule that won't force-load (or falsely fail) an unloaded value on a persisted entity\n return code`${configName}.addRule(${newRequiredLazyFieldRule}(\"${fieldName}\"));`;\n } else if (isReactive) {\n return code`${configName}.addRule(\"${fieldName}\", ${newRequiredRule}(\"${fieldName}\"));`;\n } else {\n return code`${configName}.addRule(${newRequiredRule}(\"${fieldName}\"));`;\n }\n });\n // Add STI discriminator cannot change\n if (meta.stiDiscriminatorField) {\n const field = meta.enums.find((e) => e.fieldName === meta.stiDiscriminatorField) ?? fail(\"STI field not found\");\n rules.push(code`${configName}.addRule(${cannotBeUpdated}(\"${field.fieldName}\"));`);\n }\n // Add STI type must match\n const stiEntities = getStiEntities(db.entities);\n if (stiEntities.size > 0) {\n for (const m2o of meta.manyToOnes) {\n // The `m2o.otherEntity` may already be pointing at the subtype, but stiEntities has subtypes in it as well...\n const target = stiEntities.get(m2o.otherEntity.name);\n if (target && m2o.otherEntity.name !== target.base.name) {\n rules.push(code`${configName}.addRule(\"${m2o.fieldName}\", ${mustBeSubType}(\"${m2o.fieldName}\"));`);\n }\n }\n }\n // Add subtype specialization must match\n if (meta.baseType) {\n meta.manyToOnes\n .filter((m2o) =>\n meta.baseType?.manyToOnes?.find(\n (o) => o.fieldName === m2o.fieldName && o.otherEntity.name !== m2o.otherEntity.name,\n ),\n )\n .forEach((m2o) => {\n rules.push(code`${configName}.addRule(\"${m2o.fieldName}\", ${mustBeSubType}(\"${m2o.fieldName}\"));`);\n });\n }\n return rules;\n}\n\n// Make our opts type\nfunction generateOptsFields(meta: EntityDbMetadata): Code[] {\n const primitives = meta.primitives.map((field) => {\n const { fieldName, fieldType, notNull, derived } = field;\n if (derived) return code``;\n return code`${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType}${maybeUnionNull(notNull)};`;\n });\n const enums = meta.enums.map((field) => {\n const { fieldName, enumType, notNull, isArray, derived } = field;\n if (meta.stiDiscriminatorField === fieldName || derived) {\n // Don't include the discriminator as an opt b/c we'll infer it from the instance type\n return code``;\n } else if (isArray) {\n // Arrays are always optional and we'll default to `[]`\n return code`${fieldName}?: ${enumType}[];`;\n } else {\n return code`${fieldName}${maybeOptionalOrDefault(field)}: ${enumType}${maybeUnionNull(notNull)};`;\n }\n });\n const pgEnums = meta.pgEnums.map((field) => {\n const { fieldName, enumType, notNull } = field;\n return code`${fieldName}${maybeOptionalOrDefault(field)}: ${enumType}${maybeUnionNull(notNull)};`;\n });\n const m2o = meta.manyToOnes\n .filter(({ derived }) => !derived) // Skip ReactiveReferences (derived m2o)\n // If a `group: { subType: SmallPublisherGroup }` is specializing this relation, that's\n // fine for most things, but not the `SmallPublisherOpts`, b/c it will break the contravariance\n // of `Publisher.setOpts` and `SmallPublisher.setOpts`\n .filter(({ fieldName }) => !meta.baseType?.manyToOnes.find((o) => o.fieldName === fieldName))\n .map((field) => {\n const { fieldName, otherEntity, notNull } = field;\n const maybeNull = maybeUnionNull(notNull);\n return code`${fieldName}${maybeOptionalOrDefault(field)}: ${otherEntity.type} | ${otherEntity.idType} ${maybeNull};`;\n });\n const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${otherEntity.type} | null;`;\n });\n const o2m = meta.oneToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${otherEntity.type}[];`;\n });\n const m2m = meta.manyToManys\n .filter(({ derived }) => !derived) // Skip ReactiveManyToManys\n .map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${otherEntity.type}[];`;\n });\n const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {\n return code`${fieldName}?: ${enumType}[];`;\n });\n const polys = meta.polymorphics.map((field) => {\n const { fieldName, notNull, fieldType } = field;\n return code`${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType};`;\n });\n return [...primitives, ...enums, ...pgEnums, ...m2o, ...polys, ...o2o, ...o2m, ...m2m, ...m2mEnum];\n}\n\n// Make our fields type\nfunction generateFieldsType(meta: EntityDbMetadata, idType: \"string\" | \"number\"): Code[] {\n const id = code`id: { kind: \"primitive\"; type: ${idType}; unique: ${true}; nullable: never; };`;\n const primitives = meta.primitives.map((field) => {\n const { fieldName, fieldType, notNull, unique, derived } = field;\n return code`${fieldName}: { kind: \"primitive\"; type: ${fieldType}; unique: ${unique}; nullable: ${undefinedOrNever(\n notNull,\n )}, derived: ${derived !== false}; };`;\n });\n const enums = meta.enums.map((field) => {\n const { fieldName, enumType, notNull, isArray } = field;\n if (isArray) {\n // Arrays are always optional and we'll default to `[]`\n return code`${fieldName}: { kind: \"enum\"; type: ${enumType}[]; nullable: never; };`;\n } else {\n return code`${fieldName}: { kind: \"enum\"; type: ${enumType}; nullable: ${undefinedOrNever(notNull)}; };`;\n }\n });\n const pgEnums = meta.pgEnums.map((field) => {\n const { fieldName, enumType, notNull } = field;\n const nullable = undefinedOrNever(notNull);\n return code`${fieldName}: { kind: \"enum\"; type: ${enumType}; nullable: ${nullable}; native: true; };`;\n });\n const m2o = meta.manyToOnes.map((field) => {\n const { fieldName, otherEntity, notNull, derived } = field;\n return code`${fieldName}: { kind: \"m2o\"; type: ${otherEntity.type}; nullable: ${undefinedOrNever(\n notNull,\n )}, derived: ${derived !== false}; };`;\n });\n const polys = meta.polymorphics.map((field) => {\n const { fieldName, notNull, fieldType } = field;\n return code`${fieldName}: { kind: \"poly\"; type: ${fieldType}; nullable: ${undefinedOrNever(notNull)} };`;\n });\n const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}: { kind: \"m2m\"; type: ${otherEntity.type} };`;\n });\n const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {\n return code`${fieldName}: { kind: \"m2mEnum\"; type: ${enumType} };`;\n });\n const o2m = meta.oneToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}: { kind: \"o2m\"; type: ${otherEntity.type} };`;\n });\n const o2o = meta.oneToOnes.map((field) => {\n return code`${field.fieldName}: { kind: \"o2o\"; type: ${field.otherEntity.type} };`;\n });\n const lo2m = meta.largeOneToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}: { kind: \"o2m\"; type: ${otherEntity.type} };`;\n });\n return [id, ...primitives, ...enums, ...pgEnums, ...m2o, ...polys, ...m2m, ...m2mEnum, ...o2m, ...o2o, ...lo2m];\n}\n\n/**\n * Emits physical columns with domain value types and database nullability.\n * I.e. Comment.parent_book_id is an optional Book reference, not the CommentParent union.\n * Polymorphic component writes remain unsupported, so their policies are conservative.\n */\nfunction generateColumnsType(meta: EntityDbMetadata): Record<string, Code> {\n const columns: Record<string, Code> = {\n id: code`{ type: ${IdOf}<${meta.entity.type}>; entity: ${meta.entity.type}; ${columnPolicyType(meta, meta.primaryKey)} }`,\n };\n for (const field of [...meta.primitives, ...meta.enums, ...meta.pgEnums, ...meta.manyToOnes]) {\n const policy = columnPolicyType(meta, field);\n if (field.kind === \"primitive\") {\n columns[field.columnName] = code`{ type: ${field.fieldType}; ${policy} }`;\n } else if (field.kind === \"m2o\") {\n columns[field.columnName] =\n code`{ type: ${IdOf}<${field.otherEntity.type}>; entity: ${field.otherEntity.type}; ${policy} }`;\n } else {\n const array = field.kind === \"enum\" && field.isArray ? \"[]\" : \"\";\n columns[field.columnName] = code`{ type: ${field.enumType}${array}; ${policy} }`;\n }\n }\n for (const field of meta.polymorphics) {\n for (const component of field.components) {\n columns[component.columnName] =\n code`{ type: ${IdOf}<${component.otherEntity.type}>; entity: ${component.otherEntity.type}; nullable: true; insert: \"never\"; update: false; }`;\n }\n }\n return columns;\n}\n\n/** Emits SQL write policy without using ORM defaults or derived-field restrictions. */\nfunction columnPolicyType(\n meta: EntityDbMetadata,\n column: Pick<PrimitiveField, \"columnNotNull\" | \"columnGenerated\"> & Partial<Pick<PrimitiveField, \"columnDefault\">>,\n): Code {\n const primaryKey = column === meta.primaryKey ? meta.primaryKey.columnType : undefined;\n const insert = column.columnGenerated\n ? \"never\"\n : !column.columnNotNull ||\n column.columnDefault != null ||\n column === meta.createdAt ||\n column === meta.updatedAt ||\n primaryKey === \"int\" ||\n primaryKey === \"bigint\"\n ? \"optional\"\n : \"required\";\n return code`nullable: ${!column.columnNotNull}; insert: \"${insert}\"; update: ${!primaryKey && !column.columnGenerated};`;\n}\n\n// We know the OptIds types are only used in partials, so we make everything optional.\n// This especially needs to be the case b/c both `book: ...` and `bookId: ...` will be\n// in the partial type and of course the caller will only be setting one.\nfunction generateOptIdsFields(meta: EntityDbMetadata): Code[] {\n const m2o = meta.manyToOnes\n .filter(({ derived }) => !derived) // Skip ReactiveReferences\n .map(({ fieldName, otherEntity }) => {\n return code`${fieldName}Id?: ${otherEntity.idType} | null;`;\n });\n const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}Id?: ${otherEntity.idType} | null;`;\n });\n const o2m = meta.oneToManys.map(({ singularName, otherEntity }) => {\n return code`${singularName}Ids?: ${otherEntity.idType}[] | null;`;\n });\n const m2m = meta.manyToManys\n .filter(({ derived }) => !derived) // Skip ReactiveManyToManys\n .map(({ singularName, otherEntity }) => {\n return code`${singularName}Ids?: ${otherEntity.idType}[] | null;`;\n });\n const polys = meta.polymorphics.map(({ fieldName, fieldType }) => {\n return code`${fieldName}Id?: ${IdOf}<${fieldType}> | null;`;\n });\n return [...m2o, ...polys, ...o2o, ...o2m, ...m2m];\n}\n\nfunction generateFilterFields(metasByName: Record<string, EntityDbMetadata>, meta: EntityDbMetadata): Code[] {\n // Always allow filtering on null to do \"child.id is null\" for detecting \"has no children\"\n const maybeId = meta.baseClassName ? [] : [code`id?: ${ValueFilter}<${meta.entity.idName}, never> | null;`];\n const primitives = meta.primitives.map(({ fieldName, fieldType, notNull }) => {\n if (fieldType === \"boolean\") {\n return code`${fieldName}?: ${BooleanFilter}<${nullOrNever(notNull)}>;`;\n } else {\n return code`${fieldName}?: ${ValueFilter}<${fieldType}, ${nullOrNever(notNull)}>;`;\n }\n });\n const enums = meta.enums.map(({ fieldName, enumType, notNull, isArray }) => {\n const maybeArray = isArray ? \"[]\" : \"\";\n return code`${fieldName}?: ${ValueFilter}<${enumType}${maybeArray}, ${nullOrNever(notNull)}>;`;\n });\n const pgEnums = meta.pgEnums.map(({ fieldName, enumType, notNull }) => {\n return code`${fieldName}?: ${ValueFilter}<${enumType}, ${nullOrNever(notNull)}>;`;\n });\n const m2o = meta.manyToOnes.flatMap(({ fieldName, otherEntity, notNull }) => {\n const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);\n return [\n code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${\n otherEntity.type\n }>, ${nullOrNever(notNull)}>;`,\n ...otherMeta.subTypes.map((st) => {\n return code`${fieldName}${st.name}?: ${EntityFilter}<${st.entity.type}, ${st.entity.idType}, ${FilterOf}<${\n st.entity.type\n }>, ${nullOrNever(notNull)}>;`;\n }),\n ];\n });\n const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`;\n });\n const o2m = meta.oneToManys.flatMap(({ fieldName, otherEntity, otherColumnNotNull }) => {\n const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);\n return [\n code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`,\n ...otherMeta.subTypes.map((st) => {\n return code`${fieldName}${st.name}?: ${EntityFilter}<${st.entity.type}, ${st.entity.idType}, ${FilterOf}<${\n st.entity.type\n }>, ${nullOrNever(otherColumnNotNull)}>;`;\n }),\n ];\n });\n const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`;\n });\n // Enum m2m filters are membership filters, e.g. `{ logoColors: Color.Red }` / `{ logoColors: [Red, Green] }`.\n const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {\n return code`${fieldName}?: ${ValueFilter}<${enumType}, null | undefined>;`;\n });\n const polys = meta.polymorphics.flatMap(({ fieldName, fieldType, components, notNull }) => {\n return [\n code`${fieldName}?: ${EntityFilter}<${fieldType}, ${IdOf}<${fieldType}>, never, ${nullOrNever(notNull)}>;`,\n ...components.map((comp) => {\n const { type } = comp.otherEntity;\n return code`${fieldName}${type}?: ${EntityFilter}<${type}, ${IdOf}<${type}>, ${FilterOf}<${type}>, null>;`;\n }),\n ];\n });\n return [...maybeId, ...primitives, ...enums, ...pgEnums, ...m2o, ...o2o, ...o2m, ...m2m, ...m2mEnum, ...polys];\n}\n\nfunction generateGraphQLFilterFields(metasByName: Record<string, EntityDbMetadata>, meta: EntityDbMetadata): Code[] {\n const maybeId = meta.baseClassName ? [] : [code`id?: ${ValueGraphQLFilter}<${meta.entity.idName}>;`];\n const primitives = meta.primitives.map(({ fieldName, fieldType }) => {\n if (fieldType === \"boolean\") {\n return code`${fieldName}?: ${BooleanGraphQLFilter};`;\n } else {\n return code`${fieldName}?: ${ValueGraphQLFilter}<${fieldType}>;`;\n }\n });\n const enums = meta.enums.map(({ fieldName, enumType, isArray }) => {\n const maybeArray = isArray ? \"[]\" : \"\";\n return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}${maybeArray}>;`;\n });\n const pgEnums = meta.pgEnums.map(({ fieldName, enumType }) => {\n return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}>;`;\n });\n const m2o = meta.manyToOnes.flatMap(({ fieldName, otherEntity, notNull }) => {\n const otherMeta = metasByName[otherEntity.name];\n return [\n code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${\n otherEntity.type\n }>, ${nullOrNever(notNull)}>;`,\n code`${fieldName}Id?: ${ValueGraphQLFilter}<${otherEntity.idType}>;`,\n ...otherMeta.subTypes.map((st) => {\n return code`${fieldName}${st.name}?: ${EntityGraphQLFilter}<${st.entity.type}, ${st.entity.idType}, ${GraphQLFilterOf}<${\n st.entity.type\n }>, ${nullOrNever(notNull)}>;`;\n }),\n ];\n });\n const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`;\n });\n const o2m = meta.oneToManys.flatMap(({ fieldName, otherEntity, otherColumnNotNull }) => {\n const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);\n return [\n code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`,\n ...otherMeta.subTypes.map((st) => {\n return code`${fieldName}${st.name}?: ${EntityGraphQLFilter}<${st.entity.type}, ${st.entity.idType}, ${GraphQLFilterOf}<${\n st.entity.type\n }>, ${nullOrNever(otherColumnNotNull)}>;`;\n }),\n ];\n });\n const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`;\n });\n const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {\n return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}>;`;\n });\n const polys = meta.polymorphics.flatMap(({ fieldName, fieldType, components, notNull }) => {\n return [\n code`${fieldName}?: ${EntityGraphQLFilter}<${fieldType}, ${IdOf}<${fieldType}>, never, ${nullOrNever(notNull)}>;`,\n code`${fieldName}Id?: ${ValueGraphQLFilter}<${IdOf}<${fieldType}>>;`,\n ...components.map((comp) => {\n const { type } = comp.otherEntity;\n return code`${fieldName}${type}?: ${EntityGraphQLFilter}<${type}, ${IdOf}<${type}>, ${FilterOf}<${type}>, null>;`;\n }),\n ];\n });\n return [...maybeId, ...primitives, ...enums, ...pgEnums, ...m2o, ...o2o, ...o2m, ...m2m, ...m2mEnum, ...polys];\n}\n\nfunction generateOrderFields(meta: EntityDbMetadata): Code[] {\n const maybeId = meta.baseClassName ? [] : [code`id?: ${OrderBy};`];\n const primitives = meta.primitives.map(({ fieldName }) => {\n return code`${fieldName}?: ${OrderBy};`;\n });\n const enums = meta.enums.map(({ fieldName }) => {\n return code`${fieldName}?: ${OrderBy};`;\n });\n const pgEnums = meta.pgEnums.map(({ fieldName }) => {\n return code`${fieldName}?: ${OrderBy};`;\n });\n const m2o = meta.manyToOnes.map(({ fieldName, otherEntity }) => {\n return code`${fieldName}?: ${otherEntity.orderType};`;\n });\n return [...maybeId, ...primitives, ...enums, ...pgEnums, ...m2o];\n}\n\nfunction generateFactoryExtrasType(meta: EntityDbMetadata): Code[] {\n function withName(fieldName: string): string {\n return `with${fieldName[0].toUpperCase() + fieldName.substring(1)}`;\n }\n const primitives = meta.primitives\n .filter((f) => f.derived === \"async\")\n .map((field) => {\n const { fieldName, fieldType, notNull } = field;\n return code`${withName(fieldName)}?: ${fieldType}${maybeUnionNull(notNull)};`;\n });\n const enums = meta.enums\n .filter((f) => f.derived === \"async\")\n .map((field) => {\n const { fieldName, enumType, notNull, isArray } = field;\n if (isArray) {\n return code`${withName(fieldName)}?: ${enumType}[];`;\n } else {\n return code`${withName(fieldName)}?: ${enumType}${maybeUnionNull(notNull)};`;\n }\n });\n return [...primitives, ...enums];\n}\n\nfunction createPrimitives(meta: EntityDbMetadata, entity: Entity, fieldDocs: Record<string, string>) {\n const primitives = meta.primitives.map((p) => {\n const { fieldName, fieldType, notNull } = p;\n const maybeOptional = notNull ? \"\" : \" | undefined\";\n\n // `lazy` columns are emitted as `LazyField` relations by `createLazyFields`, not as getters/setters\n if (p.lazy) return code``;\n\n let getter: Code;\n if (p.derived === \"async\") {\n getter = code`\n abstract readonly ${fieldName}: ${ReactiveField}<${entity.name}, ${p.fieldType}${maybeOptional}>;\n `;\n } else if (p.derived === \"sync\") {\n getter = code`\n abstract get ${fieldName}(): ${fieldType}${maybeOptional};\n `;\n } else if (p.zodSchema) {\n getter = code`\n get ${fieldName}(): ${Zod}.output<typeof ${p.zodSchema}>${maybeOptional} {\n return ${getField}(this, \"${fieldName}\");\n }\n `;\n } else {\n getter = code`\n get ${fieldName}(): ${fieldType}${maybeOptional} {\n return ${getField}(this, \"${fieldName}\");\n }\n `;\n }\n\n let setter: Code | string;\n // ...technically we should be checking a list of JS keywords\n const paramName = keywords.includes(fieldName) ? \"value\" : fieldName;\n if (p.protected) {\n // TODO Allow making the getter to be protected as well. And so probably remove it\n // from the Opts as well. Wonder how that works for required protected fields?\n //\n // We have to use a method of `set${fieldName}` because TS enforces getters/setters to have\n // same access level and currently we're leaving the getter as public.\n setter = code`\n protected set${pascalCase(fieldName)}(${paramName}: ${fieldType}${maybeOptional}) {\n ${setField}(this, \"${fieldName}\", ${paramName});\n }\n `;\n } else if (p.derived) {\n setter = \"\";\n } else if (p.superstruct) {\n // We use `value` as the param name to not potentially conflict with the\n // name of the imported superstruct const that is passed to assert.\n setter = code`\n set ${fieldName}(value: ${fieldType}${maybeOptional}) {\n if (value) {\n ${SSAssert}(value, ${p.superstruct});\n }\n ${setField}(this, \"${fieldName}\", value);\n }\n `;\n } else if (p.zodSchema) {\n // We use `value` as the param name to not potentially conflict with the\n // name of the imported zod schema that is passed to parse.\n setter = code`\n set ${fieldName}(value: ${Zod}.input<typeof ${p.zodSchema}>${maybeOptional}) {\n if (value) {\n ${setField}(this, \"${fieldName}\", ${p.zodSchema}.parse(value));\n } else {\n ${setField}(this, \"${fieldName}\", value);\n }\n }\n `;\n } else {\n setter = code`\n set ${fieldName}(${paramName}: ${fieldType}${maybeOptional}) {\n ${setField}(this, \"${fieldName}\", ${paramName});\n }\n `;\n }\n\n return code`${fieldDocBlock(fieldDocs, fieldName, entity.name)}${getter} ${setter}`;\n });\n return primitives;\n}\n\nfunction createRegularEnums(meta: EntityDbMetadata, entity: Entity, fieldDocs: Record<string, string>) {\n return meta.enums\n .filter((e) => !e.isArray)\n .flatMap((e) => {\n const { fieldName, enumType, enumDetailType, enumDetailsType, notNull, enumRows, derived } = e;\n const maybeOptional = notNull ? \"\" : \" | undefined\";\n const getByCode = code`${enumDetailType}.getByCode(this.${fieldName})`;\n\n let getter: Code;\n if (derived === \"async\") {\n getter = code`\n abstract readonly ${fieldName}: ${ReactiveField}<${entity.name}, ${enumType}${maybeOptional}>;\n `;\n } else if (derived === \"sync\") {\n getter = code`\n abstract get ${fieldName}(): ${enumType}${maybeOptional};\n `;\n } else {\n getter = code`\n get ${fieldName}(): ${enumType}${maybeOptional} {\n return ${getField}(this, \"${fieldName}\");\n }\n\n get ${fieldName}Details(): ${enumDetailsType}${maybeOptional} {\n return ${notNull ? getByCode : code`this.${fieldName} ? ${getByCode} : undefined`};\n }\n `;\n }\n\n let setter: Code;\n if (derived) {\n setter = code``;\n } else {\n setter = code`\n set ${fieldName}(${fieldName}: ${enumType}${maybeOptional}) {\n ${setField}(this, \"${fieldName}\", ${fieldName});\n }\n `;\n }\n\n const codes = new Set(enumRows.map((r) => r.code));\n const shouldPrefixAccessors = meta.enums\n .filter((other) => other !== e)\n .some((other) => other.enumRows.some((r) => codes.has(r.code)));\n\n const accessors = enumRows.map(\n (row) => code`\n get is${shouldPrefixAccessors ? pascalCase(fieldName) : \"\"}${pascalCase(row.code)}(): boolean {\n return ${getField}(this, \"${fieldName}\") === ${enumType}.${pascalCase(row.code)};\n }\n `,\n );\n return [code`${fieldDocBlock(fieldDocs, fieldName, entity.name)}${getter}`, setter, ...accessors];\n });\n}\n\nfunction createArrayEnums(meta: EntityDbMetadata, fieldDocs: Record<string, string>) {\n return meta.enums\n .filter((e) => e.isArray)\n .flatMap((e) => {\n const { fieldName, enumType, enumDetailType, enumDetailsType, enumRows } = e;\n const getter = code`\n get ${fieldName}(): ${enumType}[] {\n return ${getField}(this, \"${fieldName}\") || [];\n }\n\n get ${fieldName}Details(): ${enumDetailsType}[] {\n return this.${fieldName}.map(code => ${enumDetailType}.getByCode(code));\n }\n `;\n const setter = code`\n set ${fieldName}(${fieldName}: ${enumType}[]) {\n ${setField}(this, \"${fieldName}\", ${fieldName});\n }\n `;\n\n const codes = new Set(enumRows.map((r) => r.code));\n const shouldPrefixAccessors = meta.enums\n .filter((other) => other !== e)\n .some((other) => other.enumRows.some((r) => codes.has(r.code)));\n\n const accessors = enumRows.map(\n (row) => code`\n get is${shouldPrefixAccessors ? pascalCase(fieldName) : \"\"}${pascalCase(row.code)}(): boolean {\n return this.${fieldName}.includes(${enumType}.${pascalCase(row.code)});\n }\n `,\n );\n return [code`${fieldDocBlock(fieldDocs, fieldName, meta.entity.name)}${getter}`, setter, ...accessors];\n });\n}\n\nfunction createPgEnums(meta: EntityDbMetadata, fieldDocs: Record<string, string>) {\n return meta.pgEnums.flatMap((e) => {\n const { fieldName, enumType, enumValues, notNull } = e;\n const maybeOptional = notNull ? \"\" : \" | undefined\";\n\n const getter = code`\n get ${fieldName}(): ${enumType}${maybeOptional} {\n return ${getField}(this, \"${fieldName}\");\n }\n `;\n const setter = code`\n set ${fieldName}(${fieldName}: ${enumType}${maybeOptional}) {\n ${setField}(this, \"${fieldName}\", ${fieldName});\n }\n `;\n\n const codes = new Set(enumValues);\n const shouldPrefixAccessors = meta.pgEnums\n .filter((other) => other !== e)\n .some((other) => other.enumValues.some((r) => codes.has(r)));\n\n const accessors = enumValues.map(\n (row) => code`\n get is${shouldPrefixAccessors ? pascalCase(fieldName) : \"\"}${pascalCase(row)}(): boolean {\n return this.${fieldName} === ${enumType}.${pascalCase(row)};\n }\n `,\n );\n return [code`${fieldDocBlock(fieldDocs, fieldName, meta.entity.name)}${getter}`, setter, ...accessors];\n });\n}\n\nfunction createRelations(config: Config, meta: EntityDbMetadata, entity: Entity): Relation[] {\n // Add ManyToOne entities\n const m2o: Relation[] = meta.manyToOnes.map((m2o) => {\n const { fieldName, otherEntity, otherFieldName, notNull } = m2o;\n const maybeOptional = notNull ? \"never\" : \"undefined\";\n if (m2o.derived === \"async\") {\n const line = code`abstract readonly ${fieldName}: ${ReactiveReference}<${entity.name}, ${otherEntity.type}, ${maybeOptional}>;`;\n return { kind: \"abstract\", fieldName, line } as const;\n }\n const decl = code`${ManyToOneReference}<${entity.type}, ${otherEntity.type}, ${maybeOptional}>`;\n const init = code`${hasOne}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n // Specialize\n const m2oBase: Relation[] =\n meta.baseType?.manyToOnes\n // Skip m2os that are already specialized to a different otherEntity, i.e. `SmallPublisher.group: SmallPublisherGroup`\n .filter((m2o) => !meta.manyToOnes.find((o) => o.fieldName === m2o.fieldName))\n // Don't specialize hasReactiveReferences b/c they're fields, not getters\n .filter((m2o) => m2o.derived !== \"async\")\n .map((m2o) => {\n const { fieldName, otherEntity, notNull } = m2o;\n const maybeOptional = notNull ? \"never\" : \"undefined\";\n const decl = code`${ManyToOneReference}<${entity.type}, ${otherEntity.type}, ${maybeOptional}>`;\n return { kind: \"super\", fieldName, decl };\n }) ?? [];\n\n // Add any recursive ManyToOne entities\n const m2oRecursive: Relation[] = meta.manyToOnes\n .filter((m2o) => m2o.otherEntity.name === meta.name)\n // Allow disabling recursive relations\n .filter(\n (m2o) =>\n // STI subtypes don't have their own key in config.entities (stripped by stripStiPlaceholders),\n // so look up the base class name to find skipRecursiveRelations config\n !(\n config.entities[meta.inheritanceType == \"sti\" && meta.baseClassName ? meta.baseClassName : meta.name]\n ?.relations?.[m2o.fieldName]?.skipRecursiveRelations === true\n ),\n )\n // Skip ReactiveReferences because they don't have an `other` side for us to use\n .filter((m2o) => !m2o.derived)\n .flatMap((m2o) => {\n const { fieldName: m2oName, otherFieldName, otherEntity } = m2o;\n const parentsField = `${plural(m2oName)}Recursive`;\n const maybeOneToOne = meta.oneToOnes.find((o2o) => o2o.fieldName === otherFieldName);\n const childrenField = maybeOneToOne ? `${plural(otherFieldName)}Recursive` : `${otherFieldName}Recursive`;\n return [\n {\n kind: \"concrete\",\n fieldName: parentsField,\n decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,\n init: code`${hasRecursiveParents}(\"${m2oName}\", \"${childrenField}\")`,\n },\n {\n kind: \"concrete\",\n fieldName: childrenField,\n decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,\n init: code`${hasRecursiveChildren}(\"${otherFieldName}\", \"${parentsField}\")`,\n },\n ];\n });\n\n // Add any recursive ManyToMany entities (self-referential m2m)\n const m2mRecursive: Relation[] = meta.manyToManys\n .filter((m2m) => m2m.otherEntity.name === meta.name)\n .filter((m2m) => !m2m.derived)\n // STI subtypes don't have their own key in config.entities (stripped by stripStiPlaceholders),\n // so look up the base class name to find skipRecursiveRelations config\n .filter(\n (m2m) =>\n !(\n config.entities[meta.inheritanceType == \"sti\" && meta.baseClassName ? meta.baseClassName : meta.name]\n ?.relations?.[m2m.fieldName]?.skipRecursiveRelations === true\n ),\n )\n .map((m2m) => {\n const { fieldName, otherFieldName, otherEntity } = m2m;\n return {\n kind: \"concrete\",\n fieldName: `${fieldName}Recursive`,\n decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,\n init: code`${hasRecursiveM2m}(\"${fieldName}\", \"${otherFieldName}Recursive\")`,\n };\n });\n\n // Add OneToMany\n const o2m: Relation[] = meta.oneToManys.map((o2m) => {\n const { fieldName, otherEntity } = o2m;\n const decl = code`${Collection}<${entity.type}, ${otherEntity.type}>`;\n const init = code`${hasMany}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n // Specialize\n const o2mBase: Relation[] =\n meta.baseType?.oneToManys\n // Skip o2ms that are already specialized to a different otherEntity, i.e. `SmallPublisherGroup.publishers: SmallPublisher`\n .filter((o2m) => !meta.oneToManys.find((o) => o.fieldName === o2m.fieldName))\n .map((o2m) => {\n const { fieldName, otherEntity } = o2m;\n const decl = code`${Collection}<${entity.type}, ${otherEntity.type}>`;\n return { kind: \"super\", fieldName, decl };\n }) ?? [];\n\n // Add large OneToMany\n const lo2m: Relation[] = meta.largeOneToManys.map((o2m) => {\n const { fieldName, otherEntity } = o2m;\n const decl = code`${LargeCollection}<${entity.type}, ${otherEntity.type}>`;\n const init = code`${hasLargeMany}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n\n // Add OneToOne\n const o2o: Relation[] = meta.oneToOnes.map((o2o) => {\n const { fieldName, otherEntity } = o2o;\n const decl = code`${OneToOneReference}<${entity.type}, ${otherEntity.type}>`;\n const init = code`${hasOneToOne}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n // Specialize\n const o2oBase: Relation[] =\n meta.baseType?.oneToOnes.map((o2o) => {\n const { fieldName, otherEntity } = o2o;\n const decl = code`${OneToOneReference}<${entity.type}, ${otherEntity.type}>`;\n return { kind: \"super\", fieldName, decl };\n }) ?? [];\n\n // Add ManyToMany\n const m2m: Relation[] = meta.manyToManys.map((m2m) => {\n const { fieldName, otherEntity } = m2m;\n const comment = `// ${m2m.joinTableName} ${m2m.columnName} ${m2m.otherColumnName}`;\n if (m2m.derived === \"async\") {\n const line = code`abstract readonly ${fieldName}: ${ReactiveManyToMany}<${entity.name}, ${otherEntity.type}>;`;\n return { kind: \"abstract\", fieldName, line, comment } as const;\n } else if (m2m.derived === \"otherSide\") {\n const decl = code`${ReactiveManyToManyOtherSide}<${entity.type}, ${otherEntity.type}>`;\n const init = code`${hasReactiveManyToManyOtherSide}()`;\n return { kind: \"concrete\", fieldName, decl, init, comment };\n } else if (!m2m.derived) {\n const decl = code`${Collection}<${entity.type}, ${otherEntity.type}>`;\n const init = code`${hasManyToMany}()`;\n return { kind: \"concrete\", fieldName, decl, init, comment };\n } else {\n assertNever(m2m.derived);\n }\n });\n // Specialize\n const m2mBase: Relation[] =\n meta.baseType?.manyToManys\n // Don't specialize hasReactiveManyToMany or hasReactiveManyToManyOtherSide b/c they're fields, not getters\n .filter((m2m) => !m2m.derived)\n .map((m2m) => {\n const { fieldName, otherEntity } = m2m;\n const decl = code`${Collection}<${entity.type}, ${otherEntity.type}>`;\n return { kind: \"super\", fieldName, decl };\n }) ?? [];\n\n // Add enum-backed ManyToMany (i.e. `Publisher.logoColors`)\n const m2mEnum: Relation[] = meta.manyToManyEnums.map((m2m) => {\n const { fieldName, enumType } = m2m;\n const comment = `// ${m2m.joinTableName} ${m2m.columnName} ${m2m.otherColumnName}`;\n const decl = code`${EnumCollection}<${entity.type}, ${enumType}>`;\n const init = code`${hasEnumCollection}()`;\n return { kind: \"concrete\", fieldName, decl, init, comment };\n });\n const m2mEnumBase: Relation[] =\n meta.baseType?.manyToManyEnums.map((m2m) => {\n const { fieldName, enumType } = m2m;\n const decl = code`${EnumCollection}<${entity.type}, ${enumType}>`;\n return { kind: \"super\", fieldName, decl };\n }) ?? [];\n\n // Add large ManyToMany\n const lm2m: Relation[] = meta.largeManyToManys.map((m2m) => {\n const { joinTableName, fieldName, columnName, otherEntity, otherFieldName, otherColumnName } = m2m;\n const decl = code`${LargeCollection}<${entity.type}, ${otherEntity.type}>`;\n const init = code`\n ${hasLargeManyToMany}(\n \"${joinTableName}\",\n \"${columnName}\",\n \"${otherFieldName}\",\n \"${otherColumnName}\",\n ${m2m.hasJoinTableId},\n );\n `;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n\n // Add Polymorphic\n const polymorphic: Relation[] = meta.polymorphics.map((p) => {\n const { fieldName, notNull, fieldType } = p;\n const maybeOptional = notNull ? \"never\" : \"undefined\";\n const decl = code`${PolymorphicReference}<${entity.type}, ${fieldType}, ${maybeOptional}>`;\n const init = code`${hasOnePolymorphic}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n\n // Add `lazy` primitives, which are exposed as `LazyField`s instead of getters/setters\n const lazy: Relation[] = meta.primitives\n .filter((p) => p.lazy)\n .map((p) => {\n const { fieldName, fieldType, notNull } = p;\n const maybeOptional = notNull ? \"\" : \" | undefined\";\n const decl = code`${LazyField}<${entity.type}, ${fieldType}${maybeOptional}>`;\n const init = code`${hasLazyField}()`;\n return { kind: \"concrete\", fieldName, decl, init };\n });\n\n return [\n o2m,\n o2mBase,\n lo2m,\n m2o,\n m2oBase,\n m2oRecursive,\n m2mRecursive,\n o2o,\n o2oBase,\n m2m,\n m2mBase,\n m2mEnum,\n m2mEnumBase,\n lm2m,\n polymorphic,\n lazy,\n ].flat();\n}\n\n/** Makes the field required if there is a `NOT NULL` and no db-or-config default. */\nfunction maybeOptionalOrDefault(\n field: PrimitiveField | EnumField | PgEnumField | ManyToOneField | PolymorphicField,\n): string {\n const hasDefault =\n (field.kind !== \"m2o\" && field.kind !== \"poly\" && fieldHasDefaultValue(field)) || field.hasConfigDefault;\n return !field.notNull || hasDefault ? \"?\" : \"\";\n}\n\nfunction maybeUnionNull(notNull: boolean): string {\n return notNull ? \"\" : \" | null\";\n}\n\nfunction maybeUndefined(notNull: boolean): string {\n return notNull ? \"\" : \" | undefined\";\n}\n\nfunction undefinedOrNever(notNull: boolean): string {\n return notNull ? \"never\" : \"undefined\";\n}\n\nfunction nullOrNever(notNull: boolean): string {\n return notNull ? \"never\" : \"null\";\n}\n\n/** Returns the nowUTC call for the deleted-at field's generated timestamp type. */\nfunction nowUTCCall(config: Config, field: PrimitiveField): Code {\n if (!config.temporal) return code`${nowUTC}()`;\n switch (field.columnType) {\n case \"date\":\n return code`${nowUTC}(\"plainDate\")`;\n case \"timestamp without time zone\":\n return code`${nowUTC}(\"plainDateTime\")`;\n case \"timestamp with time zone\":\n return code`${nowUTC}(\"zonedDateTime\")`;\n default:\n return fail(`Unsupported deleted-at column type ${field.columnType}`);\n }\n}\n\n/** Prefixes the comment with a newline, so it gets its own line. */\nfunction maybeComment(comment: string | undefined): string {\n return comment ? ` ${comment}\\n` : \"\";\n}\n\n/**\n * Renders a field's `.md` doc (plus its `@generated` tag) as a bare JSDoc block, or `\"\"` if undocumented.\n *\n * Reuses the same {@link buildJSDocBlock} formatter the `.md` sync uses for hand-written `Entity.ts`\n * members. Used directly before a getter template (which supplies its own leading newline), so the\n * JSDoc lands immediately above the getter with no intervening blank line.\n */\nfunction fieldDocBlock(fieldDocs: Record<string, string>, fieldName: string, entityName: string): string {\n const doc = fieldDocs[fieldName];\n return doc ? buildJSDocBlock(`${doc}\\n${generatedTag(entityName)}`, 0) : \"\";\n}\n\n/** Like {@link fieldDocBlock} but wrapped in newlines, i.e. for inline `readonly x = ...` relation decls. */\nfunction relationDocBlock(fieldDocs: Record<string, string>, fieldName: string, entityName: string): string {\n const block = fieldDocBlock(fieldDocs, fieldName, entityName);\n return block ? `\\n${block}\\n` : \"\";\n}\n\nexport function getIdType(config: Config) {\n switch (config.idType) {\n case \"untagged-string\":\n case \"tagged-string\":\n case undefined:\n return \"string\";\n case \"number\":\n return \"number\";\n default:\n return assertNever(config.idType);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generateEntityCodegenFile.d.cts","names":[],"sources":["../src/generateEntityCodegenFile.ts"],"mappings":";;;;;;;UAqGiB;EACf,WAAW;;;iBAaG,0BACd,QAAQ,QACR,QAAQ,YACR,MAAM,kBACN,eAAc,eACd,OAAO,YACN;iBAstCa,UAAU,QAAQ"}
1
+ {"version":3,"file":"generateEntityCodegenFile.d.cts","names":[],"sources":["../src/generateEntityCodegenFile.ts"],"mappings":";;;;;;;UAqGiB;EACf,WAAW;;;iBAaG,0BACd,QAAQ,QACR,QAAQ,YACR,MAAM,kBACN,eAAc,eACd,OAAO,YACN;iBAotCa,UAAU,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"generateEntityCodegenFile.d.mts","names":[],"sources":["../src/generateEntityCodegenFile.ts"],"mappings":";;;;;;;UAqGiB;EACf,WAAW;;;iBAaG,0BACd,QAAQ,QACR,QAAQ,YACR,MAAM,kBACN,eAAc,eACd,OAAO,YACN;iBAstCa,UAAU,QAAQ"}
1
+ {"version":3,"file":"generateEntityCodegenFile.d.mts","names":[],"sources":["../src/generateEntityCodegenFile.ts"],"mappings":";;;;;;;UAqGiB;EACf,WAAW;;;iBAaG,0BACd,QAAQ,QACR,QAAQ,YACR,MAAM,kBACN,eAAc,eACd,OAAO,YACN;iBAotCa,UAAU,QAAQ"}
@@ -59,7 +59,7 @@ function generateEntityCodegenFile(config, dbMeta, meta, scopeMembers = [], docs
59
59
  const maybeBaseOpts = baseEntity ? code`extends ${baseEntity.entity.optsType}` : "";
60
60
  const physical = meta.physicalMetadata ?? meta;
61
61
  const sharedTable = meta.inheritanceType === "sti" && baseEntity;
62
- const columns = sharedTable ? {} : generateColumnsType(physical, idType);
62
+ const columns = sharedTable ? {} : generateColumnsType(physical);
63
63
  const maybeBaseColumns = sharedTable ? code`extends ${imp(`t:${baseEntity.name}Columns@./entities.ts`)}` : "";
64
64
  const maybeBaseIdOpts = baseEntity ? code`extends ${imp("t:" + baseEntity.entity.idsOptsName + "@./entities.ts")}` : "";
65
65
  const maybeBaseFilter = baseEntity ? code`extends ${imp("t:" + baseEntity.entity.filterName + "@./entities.ts")}` : "";
@@ -403,8 +403,8 @@ function generateFieldsType(meta, idType) {
403
403
  * I.e. Comment.parent_book_id is an optional Book reference, not the CommentParent union.
404
404
  * Polymorphic component writes remain unsupported, so their policies are conservative.
405
405
  */
406
- function generateColumnsType(meta, idType) {
407
- const columns = { id: code`{ kind: "primitive"; type: ${idType}; unique: true; ${columnPolicyType(meta, meta.primaryKey)} }` };
406
+ function generateColumnsType(meta) {
407
+ const columns = { id: code`{ type: ${IdOf}<${meta.entity.type}>; entity: ${meta.entity.type}; ${columnPolicyType(meta, meta.primaryKey)} }` };
408
408
  for (const field of [
409
409
  ...meta.primitives,
410
410
  ...meta.enums,
@@ -412,15 +412,14 @@ function generateColumnsType(meta, idType) {
412
412
  ...meta.manyToOnes
413
413
  ]) {
414
414
  const policy = columnPolicyType(meta, field);
415
- if (field.kind === "primitive") columns[field.columnName] = code`{ kind: "primitive"; type: ${field.fieldType}; unique: ${field.unique}; derived: ${field.derived !== false}; ${policy} }`;
416
- else if (field.kind === "m2o") columns[field.columnName] = code`{ kind: "m2o"; type: ${field.otherEntity.type}; derived: ${field.derived !== false}; ${policy} }`;
415
+ if (field.kind === "primitive") columns[field.columnName] = code`{ type: ${field.fieldType}; ${policy} }`;
416
+ else if (field.kind === "m2o") columns[field.columnName] = code`{ type: ${IdOf}<${field.otherEntity.type}>; entity: ${field.otherEntity.type}; ${policy} }`;
417
417
  else {
418
418
  const array = field.kind === "enum" && field.isArray ? "[]" : "";
419
- const native = field.kind === "pg-enum" ? "native: true;" : "";
420
- columns[field.columnName] = code`{ kind: "enum"; type: ${field.enumType}${array}; ${native} ${policy} }`;
419
+ columns[field.columnName] = code`{ type: ${field.enumType}${array}; ${policy} }`;
421
420
  }
422
421
  }
423
- for (const field of meta.polymorphics) for (const component of field.components) columns[component.columnName] = code`{ kind: "m2o"; type: ${component.otherEntity.type}; nullable: true; insert: "never"; update: false; }`;
422
+ for (const field of meta.polymorphics) for (const component of field.components) columns[component.columnName] = code`{ type: ${IdOf}<${component.otherEntity.type}>; entity: ${component.otherEntity.type}; nullable: true; insert: "never"; update: false; }`;
424
423
  return columns;
425
424
  }
426
425
  /** Emits SQL write policy without using ORM defaults or derived-field restrictions. */