Build the TypeScript source for one emit file (one schema, or the legacy monolith). Hoists and de-duplicates two kinds of import into the file header: the generated base class each entity extends, and the embedded-record peers an entity references. Emitting each once per file — instead of once per entity — prevents a TS2300 duplicate-identifier error in a file holding 2+ external entities.
Entities without primary keys are excluded because generateEntitySubClass
emits nothing for them; hoisting their imports would leave an unused import that
fails a downstream consumer's noUnusedLocals.
ProtectedemitDelegates so both generators write identically; override to change that.
when set to true, no updates are written back to the database - which happens after code generation when newly generated code from AI has been generated, but in the case where this flag is true, we don't ever write back to the DB because the assumption is we are only emitting code to the file that was already in the DB.
Optionaloptions: SchemaEmitOptionsper-schema emit / dirty-schema / parallelism. Defaults come from configInfo.fileEmit.
Generates the description string for a Zod schema field, including field metadata, value list documentation, and JSONType annotations with entity-prefixed type names.
The entity field to generate a description for
Optionalentity: EntityInfoOptional entity context, used to compute the entity-prefixed JSONType name
A formatted description string for the Zod .describe() call
ProtectedgetFinds the source parent entity for an IS-A inherited field by walking the parent chain. Returns the name of the parent entity that originally defines the field (as a non-virtual column).
ProtectedresolveDelegates so both generators share one set of defaults; override to change them.
Optionaloptions: SchemaEmitOptionsProtectedresolveResolves an entity's generated base class and the import statement that class requires.
Pure (no side effects) so BOTH generateEntitySubClass and the file assembler can call it —
the assembler uses it to hoist and DE-DUPLICATE these imports into the file header. Emitting the
import once per file instead of once per entity avoids a TS2300 duplicate-identifier error when a
file contains 2+ external entities (each previously emitted import { ReadOnlyExternalBaseEntity }).
Precedence: explicit custom subclass → ReadOnlyExternalBaseEntity (external entities) → BaseEntity.
StaticCollectOptionalconfig: {OptionaladditionalSchemaInfo?: stringPath to JSON file containing soft PK/FK definitions for tables without database constraints
OptionaladvancedGeneration?: When true, CodeGen cascade-delete SQL walks FKs pointing at the entity in EVERY schema in metadata. Default false: only same-schema children. Turning this on (and CascadeDeletes on an entity) will bake consumer schemas into a publisher's delete proc — a dangerous escape hatch. Leave off for Open Apps.
OptionalcodegenPool?: {Optional CodeGen-time database connection pool configuration.
Per-provider applicability — not all fields apply to both providers today:
| Field | SQL Server | PostgreSQL |
|---|---|---|
statementTimeoutMs |
✅ mssql requestTimeout |
✅ libpq -c statement_timeout |
max / min / idleTimeoutMillis / connectionTimeoutMillis |
❌ ignored | ✅ pg.Pool config |
ssl |
❌ ignored (SQL Server uses dbTrustServerCertificate + mssql's own SSL) |
✅ pg.Pool ssl |
The PG-only pool-sizing knobs reflect the asymmetry between mssql and pg.Pool
configurability today; they'll converge in a follow-up. When omitted, each
driver's own defaults apply (mssql: 10 max; PGConnectionManager: 20 max, 2 min).
For runtime (MJAPI) pool settings, see
@memberjunction/server's databaseSettings.connectionPool — that is
a separate, long-lived service pool and is independent of CodeGen.
OptionalconnectionTimeoutMillis?: numberPostgreSQL only today. New-connection acquisition timeout in ms.
OptionalidleTimeoutMillis?: numberPostgreSQL only today. Idle timeout in ms before a pooled connection is closed.
Optionalmax?: numberPostgreSQL only today. Max pool connections; pg.Pool default 20 when unset.
Optionalmin?: numberPostgreSQL only today. Min idle connections kept open; pg.Pool default 2.
Optionalssl?: boolean | Record<string, unknown>PostgreSQL only. SSL configuration for the codegen pool. Defaults to false
(matches the pre-multi-provider-refactor inline pg.Pool behavior that ran
codegen plaintext locally). Set to true for managed PostgreSQL with default
trust (e.g. AWS Aurora rds.force_ssl=1); pass an object for full control
(e.g. { rejectUnauthorized: true, ca: <CA bundle> }).
Note: the runtime MJAPI pool (databaseSettings.connectionPool) has its own
SSL handling that defaults ON in NODE_ENV=production — this field only
governs the short-lived codegen pool.
OptionalstatementTimeoutMs?: numberPer-statement timeout in milliseconds, applied to both providers:
requestTimeout on the pool config.
Takes precedence over the legacy top-level dbRequestTimeout when both
are set; falls back to dbRequestTimeout (and ultimately mssql's 120000ms
default) when unset.-c statement_timeout=<ms>
(carried in pg's connection startup packet), so every backend — including the
verify-SELECT-1 connection — honors it from the very first query. When unset,
PostgreSQL applies no statement timeout (its default).OptionaldbInstanceName?: string | nullDatabase platform: 'sqlserver' or 'postgresql'.
OptionaldbRequestTimeout?: numberLegacy — SQL Server request timeout in milliseconds applied to the
CodeGen connection pool. Set in mj.config.cjs or via the
MJ_CODEGEN_REQUEST_TIMEOUT environment variable when long-running CodeGen
steps (e.g. spUpdateExistingEntityFieldsFromSchema) exceed the default of
120000 (2 minutes).
Prefer the cross-platform codegenPool.statementTimeoutMs for new
configs — it applies to both SQL Server (as requestTimeout) and
PostgreSQL (as the per-connection statement_timeout GUC). When both are
set on a SQL Server install, codegenPool.statementTimeoutMs wins;
dbRequestTimeout remains as a backward-compatible fallback so existing
configs keep working unchanged.
OptionalentityImportPackages?: Record<string, string>Schema → npm package map for peer entity classes this emit does not generate (cross-schema embedded records and related-record collections).
This is a different knob from entityPackageName and includeSchemas:
includeSchemas — what this run generatesentityPackageName — the npm package this run writes those classes intoentityPackageName — install-time host map; those schemas are also skipped
for local generation (getExternalEntitySchemas). Do not overload it on an
Open App under development: listing a sibling schema there would skip generating
this app if you also listed your own schema, and converting a custom string
entityPackageName into a Record silently re-routes every unmapped schema.entityImportPackages — where to import { PeerEntity } from when the peer's
schema is not in this filePublishers (Open Apps under development) use string entityPackageName +
includeSchemas and must list sibling app schemas here. Hosts that already use
Record entityPackageName do not need this — that map is the fallback after this
one. Case-insensitive schema keys. Mapping a foreign schema to this emit's own
package is an error (that would self-import a class this file does not emit).
Entity and field name normalization settings for ALL CAPS database identifiers
Additional domain-specific words for the compound word splitter
Normalize ALL CAPS table/entity names to Title Case (e.g., PAYMENT -> Payment). Default: true
Normalize ALL CAPS column/field names the same way. Default: true
Split compound ALL CAPS words using dictionary matching (e.g., INDIVIDUALDESIGNATION -> Individual Designation). Default: true
File-emit behaviour for entity subclasses and GraphQL resolvers.
Schema is the incremental unit — see guides/CODEGEN_LARGE_SCHEMA_GUIDE.md.
Max schemas assembled at once when parallel is true. Default 8.
Rebuild only schemas that contain a new/modified entity (plus any schema
whose file is missing). --skipdb file-only runs ignore this and rebuild
every schema, still gated by write-if-changed. Default true.
Assemble independent schema files in parallel. Default true.
Emit one TypeScript file per schema plus a barrel. Default true.
SQL Server per-entity SQL generation width. PostgreSQL stays serial (1) regardless — catalog deadlocks under parallel phased DDL. Default 8.
Skip the disk write when generated bytes are identical. Default true.
Force regeneration of all stored procedures
Force regeneration of base views
Force regeneration of all SQL objects even if no schema changes are detected
OptionalentityWhereClause?: stringOptional SQL WHERE clause to filter entities for forced regeneration Example: "SchemaName = 'dbo' AND Name LIKE 'User%'"
Force regeneration of full text search components
Force regeneration of indexes for foreign keys
Force regeneration of spCreate procedures
Force regeneration of spDelete procedures
Force regeneration of spUpdate procedures
OptionalincludeSchemas?: string[]Opt-in POSITIVE scope list. When set (non-empty), CodeGen processes ONLY these schemas — every
other schema present in the DATABASE is treated as excluded, including schemas MJ has never seen
before. It is pure sugar over excludeSchemas: it is resolved into excludeSchemas (see
applyIncludeSchemaScope) before metadata management and again before file generation, so
nothing downstream changes. In-scope ⇔ named in includeSchemas AND not in excludeSchemas
(include shrinks the addressable space; exclude overlays on top). No hidden auto-includes — a
schema, including the MJ core schema, is in scope ONLY if listed explicitly. Leave
undefined/empty for the classic exclude-only behavior (unchanged).
Primary use: scope an Open App's CodeGen to just its own schema without hand-maintaining an exclude list naming every other installed app — a list that is O(N²) to maintain and, more importantly, cannot name schemas the app does not know about (such as a client's own schemas in a deployed instance).
The in-memory compile into excludeSchemas is for THIS CodeGen run only (which entities to
generate). Heal stored-procedure EXEC statements logged into migrations use authored
excludeSchemas plus @IncludedSchemaNames from this list — they must not snapshot sibling
apps that happened to be installed on the publisher database.
Whether to also log to console
Whether logging is enabled
File path for log output
OptionalmetadataDirectory?: stringRoot directory containing metadata files for sync (e.g. './metadata')
Number of metadata INSERT statements CodeGen joins into a single batched
round-trip when syncing newly-discovered entity fields into the metadata
tables (createNewEntityFieldsFromSchema). Each row's INSERT SQL is
unchanged and conflict-guarded; this knob only controls how many are
terminated, joined, and sent — plus logged to the migration file — per DB
round-trip.
Larger values mean fewer round-trips but a larger SQL string per batch;
smaller values trade throughput for smaller batches. These are independent
statements (not a multi-row VALUES), so no SQL Server row/parameter limit
bounds the value. Defaults to 250, a good balance on large-schema installs
(thousands of tables). Applies to both SQL Server and PostgreSQL.
Per-schema overrides for the AllowCaching default. When CodeGen creates a new
Entity row, the schema is matched (case-insensitive) against this list and the
matching entry's AllowCaching value wins over the global AllowCaching default.
Schema names support the ${mj_core_schema} placeholder. Defaults to enabling
caching for the MJ core schema.
OptionalnewUserSetup?: OptionaloutputCode?: string | nullOptionalschemaOutput?: {Route (or skip) generated artifacts for matching schemas to a directory
other than the default output.* entry. First match wins.
If set to true, then we append to the existing file, if one exists, otherwise we create a new file.
If true, all mention of the core schema within the log file will be replaced with the flyway schema, ${flyway:defaultSchema}
Whether or not sql statements generated while managing metadata should be written to a file
OptionalfileName?: stringOptional, the file name that will be written WITHIN the folderPath specified.
The path of the folder to use when logging is enabled. If provided, a file will be created with the format "CodeGen_Run_yyyy-mm-dd_hh-mm-ss.sql"
If true, scripts that are being emitted via SQL logging that are marked by CodeGen as recurring will be SKIPPED. Defaults to true
OptionalschemaPlaceholders?: { placeholder: string; schema: string }[]Optional array of schema-to-placeholder mappings for Flyway migrations. Each mapping specifies a database schema name and its corresponding Flyway placeholder. If not provided, defaults to replacing the MJ core schema with ${flyway:defaultSchema}.
Example: [ { schema: '__mj', placeholder: '${mjSchema}' }, { schema: '__BCSaaS', placeholder: '${flyway:defaultSchema}' } ]
Optionalstartup?: { mode?: "full" | "task" }Startup mode for engine pre-warm during CodeGen's provider bootstrap: 'full' pre-warms all
Use CollectPeerClassImports + FormatPeerImportStatements. Kept so existing call sites still compile; includes related-record collections as well as embeds.
StaticCollectOne peer class that must be imported because it is referenced by an embed or related-record collection and is not being emitted in this file.
Optionalconfig: {OptionaladditionalSchemaInfo?: stringPath to JSON file containing soft PK/FK definitions for tables without database constraints
OptionaladvancedGeneration?: When true, CodeGen cascade-delete SQL walks FKs pointing at the entity in EVERY schema in metadata. Default false: only same-schema children. Turning this on (and CascadeDeletes on an entity) will bake consumer schemas into a publisher's delete proc — a dangerous escape hatch. Leave off for Open Apps.
OptionalcodegenPool?: {Optional CodeGen-time database connection pool configuration.
Per-provider applicability — not all fields apply to both providers today:
| Field | SQL Server | PostgreSQL |
|---|---|---|
statementTimeoutMs |
✅ mssql requestTimeout |
✅ libpq -c statement_timeout |
max / min / idleTimeoutMillis / connectionTimeoutMillis |
❌ ignored | ✅ pg.Pool config |
ssl |
❌ ignored (SQL Server uses dbTrustServerCertificate + mssql's own SSL) |
✅ pg.Pool ssl |
The PG-only pool-sizing knobs reflect the asymmetry between mssql and pg.Pool
configurability today; they'll converge in a follow-up. When omitted, each
driver's own defaults apply (mssql: 10 max; PGConnectionManager: 20 max, 2 min).
For runtime (MJAPI) pool settings, see
@memberjunction/server's databaseSettings.connectionPool — that is
a separate, long-lived service pool and is independent of CodeGen.
OptionalconnectionTimeoutMillis?: numberPostgreSQL only today. New-connection acquisition timeout in ms.
OptionalidleTimeoutMillis?: numberPostgreSQL only today. Idle timeout in ms before a pooled connection is closed.
Optionalmax?: numberPostgreSQL only today. Max pool connections; pg.Pool default 20 when unset.
Optionalmin?: numberPostgreSQL only today. Min idle connections kept open; pg.Pool default 2.
Optionalssl?: boolean | Record<string, unknown>PostgreSQL only. SSL configuration for the codegen pool. Defaults to false
(matches the pre-multi-provider-refactor inline pg.Pool behavior that ran
codegen plaintext locally). Set to true for managed PostgreSQL with default
trust (e.g. AWS Aurora rds.force_ssl=1); pass an object for full control
(e.g. { rejectUnauthorized: true, ca: <CA bundle> }).
Note: the runtime MJAPI pool (databaseSettings.connectionPool) has its own
SSL handling that defaults ON in NODE_ENV=production — this field only
governs the short-lived codegen pool.
OptionalstatementTimeoutMs?: numberPer-statement timeout in milliseconds, applied to both providers:
requestTimeout on the pool config.
Takes precedence over the legacy top-level dbRequestTimeout when both
are set; falls back to dbRequestTimeout (and ultimately mssql's 120000ms
default) when unset.-c statement_timeout=<ms>
(carried in pg's connection startup packet), so every backend — including the
verify-SELECT-1 connection — honors it from the very first query. When unset,
PostgreSQL applies no statement timeout (its default).OptionaldbInstanceName?: string | nullDatabase platform: 'sqlserver' or 'postgresql'.
OptionaldbRequestTimeout?: numberLegacy — SQL Server request timeout in milliseconds applied to the
CodeGen connection pool. Set in mj.config.cjs or via the
MJ_CODEGEN_REQUEST_TIMEOUT environment variable when long-running CodeGen
steps (e.g. spUpdateExistingEntityFieldsFromSchema) exceed the default of
120000 (2 minutes).
Prefer the cross-platform codegenPool.statementTimeoutMs for new
configs — it applies to both SQL Server (as requestTimeout) and
PostgreSQL (as the per-connection statement_timeout GUC). When both are
set on a SQL Server install, codegenPool.statementTimeoutMs wins;
dbRequestTimeout remains as a backward-compatible fallback so existing
configs keep working unchanged.
OptionalentityImportPackages?: Record<string, string>Schema → npm package map for peer entity classes this emit does not generate (cross-schema embedded records and related-record collections).
This is a different knob from entityPackageName and includeSchemas:
includeSchemas — what this run generatesentityPackageName — the npm package this run writes those classes intoentityPackageName — install-time host map; those schemas are also skipped
for local generation (getExternalEntitySchemas). Do not overload it on an
Open App under development: listing a sibling schema there would skip generating
this app if you also listed your own schema, and converting a custom string
entityPackageName into a Record silently re-routes every unmapped schema.entityImportPackages — where to import { PeerEntity } from when the peer's
schema is not in this filePublishers (Open Apps under development) use string entityPackageName +
includeSchemas and must list sibling app schemas here. Hosts that already use
Record entityPackageName do not need this — that map is the fallback after this
one. Case-insensitive schema keys. Mapping a foreign schema to this emit's own
package is an error (that would self-import a class this file does not emit).
Entity and field name normalization settings for ALL CAPS database identifiers
Additional domain-specific words for the compound word splitter
Normalize ALL CAPS table/entity names to Title Case (e.g., PAYMENT -> Payment). Default: true
Normalize ALL CAPS column/field names the same way. Default: true
Split compound ALL CAPS words using dictionary matching (e.g., INDIVIDUALDESIGNATION -> Individual Designation). Default: true
File-emit behaviour for entity subclasses and GraphQL resolvers.
Schema is the incremental unit — see guides/CODEGEN_LARGE_SCHEMA_GUIDE.md.
Max schemas assembled at once when parallel is true. Default 8.
Rebuild only schemas that contain a new/modified entity (plus any schema
whose file is missing). --skipdb file-only runs ignore this and rebuild
every schema, still gated by write-if-changed. Default true.
Assemble independent schema files in parallel. Default true.
Emit one TypeScript file per schema plus a barrel. Default true.
SQL Server per-entity SQL generation width. PostgreSQL stays serial (1) regardless — catalog deadlocks under parallel phased DDL. Default 8.
Skip the disk write when generated bytes are identical. Default true.
Force regeneration of all stored procedures
Force regeneration of base views
Force regeneration of all SQL objects even if no schema changes are detected
OptionalentityWhereClause?: stringOptional SQL WHERE clause to filter entities for forced regeneration Example: "SchemaName = 'dbo' AND Name LIKE 'User%'"
Force regeneration of full text search components
Force regeneration of indexes for foreign keys
Force regeneration of spCreate procedures
Force regeneration of spDelete procedures
Force regeneration of spUpdate procedures
OptionalincludeSchemas?: string[]Opt-in POSITIVE scope list. When set (non-empty), CodeGen processes ONLY these schemas — every
other schema present in the DATABASE is treated as excluded, including schemas MJ has never seen
before. It is pure sugar over excludeSchemas: it is resolved into excludeSchemas (see
applyIncludeSchemaScope) before metadata management and again before file generation, so
nothing downstream changes. In-scope ⇔ named in includeSchemas AND not in excludeSchemas
(include shrinks the addressable space; exclude overlays on top). No hidden auto-includes — a
schema, including the MJ core schema, is in scope ONLY if listed explicitly. Leave
undefined/empty for the classic exclude-only behavior (unchanged).
Primary use: scope an Open App's CodeGen to just its own schema without hand-maintaining an exclude list naming every other installed app — a list that is O(N²) to maintain and, more importantly, cannot name schemas the app does not know about (such as a client's own schemas in a deployed instance).
The in-memory compile into excludeSchemas is for THIS CodeGen run only (which entities to
generate). Heal stored-procedure EXEC statements logged into migrations use authored
excludeSchemas plus @IncludedSchemaNames from this list — they must not snapshot sibling
apps that happened to be installed on the publisher database.
Whether to also log to console
Whether logging is enabled
File path for log output
OptionalmetadataDirectory?: stringRoot directory containing metadata files for sync (e.g. './metadata')
Number of metadata INSERT statements CodeGen joins into a single batched
round-trip when syncing newly-discovered entity fields into the metadata
tables (createNewEntityFieldsFromSchema). Each row's INSERT SQL is
unchanged and conflict-guarded; this knob only controls how many are
terminated, joined, and sent — plus logged to the migration file — per DB
round-trip.
Larger values mean fewer round-trips but a larger SQL string per batch;
smaller values trade throughput for smaller batches. These are independent
statements (not a multi-row VALUES), so no SQL Server row/parameter limit
bounds the value. Defaults to 250, a good balance on large-schema installs
(thousands of tables). Applies to both SQL Server and PostgreSQL.
Per-schema overrides for the AllowCaching default. When CodeGen creates a new
Entity row, the schema is matched (case-insensitive) against this list and the
matching entry's AllowCaching value wins over the global AllowCaching default.
Schema names support the ${mj_core_schema} placeholder. Defaults to enabling
caching for the MJ core schema.
OptionalnewUserSetup?: OptionaloutputCode?: string | nullOptionalschemaOutput?: {Route (or skip) generated artifacts for matching schemas to a directory
other than the default output.* entry. First match wins.
If set to true, then we append to the existing file, if one exists, otherwise we create a new file.
If true, all mention of the core schema within the log file will be replaced with the flyway schema, ${flyway:defaultSchema}
Whether or not sql statements generated while managing metadata should be written to a file
OptionalfileName?: stringOptional, the file name that will be written WITHIN the folderPath specified.
The path of the folder to use when logging is enabled. If provided, a file will be created with the format "CodeGen_Run_yyyy-mm-dd_hh-mm-ss.sql"
If true, scripts that are being emitted via SQL logging that are marked by CodeGen as recurring will be SKIPPED. Defaults to true
OptionalschemaPlaceholders?: { placeholder: string; schema: string }[]Optional array of schema-to-placeholder mappings for Flyway migrations. Each mapping specifies a database schema name and its corresponding Flyway placeholder. If not provided, defaults to replacing the MJ core schema with ${flyway:defaultSchema}.
Example: [ { schema: '__mj', placeholder: '${mjSchema}' }, { schema: '__BCSaaS', placeholder: '${flyway:defaultSchema}' } ]
Optionalstartup?: { mode?: "full" | "task" }Startup mode for engine pre-warm during CodeGen's provider bootstrap: 'full' pre-warms all
Protected StaticEscapeEscapes a value for safe embedding in a single-quoted TypeScript string literal.
The raw value.
The escaped value.
StaticFormatGroups peer imports into one import { A, B } from 'pkg' line per npm package.
@memberjunction/core-entities is emitted first; remaining packages are alphabetical.
StaticGenerateEmits {Field}_Object / {Field}_EnsureObject() for every FK field whose
EmbeddedRecord column holds a config object.
RelatedEntity and the FK field name come from the row (RelatedEntityID, Name),
not the JSON. AllowsNull on the same row decides the getter's nullability.
The entity being generated.
The declarations block, or an empty string when none are declared.
StaticGenerateEmits strongly-typed hierarchy traversal helper methods (GetDescendants, GetAncestors, GetChildren)
for entities with recursive self-referencing foreign keys.
The entity being generated.
The generated subclass name.
The generated methods block, or an empty string when the entity has no recursive FKs.
StaticGenerateEmits DeclareRelatedRecords(...) declarations for every relationship on this entity whose
RelatedRecordCollection column holds a config object.
A related-record collection makes a parent and its related rows load, validate and persist as
one unit — see guides/TRANSACTIONS_AND_BATCHING_GUIDE.md. Before this generator, every
application hand-wrote the declaration on a subclass; now two columns plus one JSON blob on
EntityRelationship produce it.
Two option values come from the row's own columns, not the JSON: RelatedEntity and
RelatedEntityJoinField. Duplicating them inside the blob would create two sources of truth
that can disagree, with the JSON copy winning silently.
Emitted as a field initialiser rather than constructor code because generated subclasses have
no constructor — TypeScript runs initialisers immediately after super(), by which point
EntityInfo and the provider are both set, which is everything DeclareRelatedRecords needs.
The entity being generated.
The declarations block, or an empty string when the entity declares none (the overwhelmingly common case, which must add nothing to the generated output).
StaticParseParses and validates one field's EmbeddedRecord JSON.
Invalid metadata is skipped with a logged error rather than throwing.
StaticParseParses and validates one relationship's RelatedRecordCollection JSON.
Invalid metadata is skipped with a logged error rather than throwing: a single malformed row must not abort a whole CodeGen run and leave the repository with no generated entities at all. The property simply does not appear, and the log names the row.
The owning entity, for error messages.
The relationship carrying the config.
The validated config, or null when it cannot be used.
Protected StaticRenderRenders the private companion plus the public {Field}_Object / {Field}_EnsureObject API.
Protected StaticRenderRenders one validated declaration.
The owning entity.
The relationship supplying RelatedEntity / RelatedEntityJoinField.
The validated policy object.
The TypeScript field initialiser.
Protected StaticSanitizeEscapes sequences in description text that would break generated code. Handles JSDoc comment terminators, nested comment openers, backticks, and template literal interpolation sequences.
Protected StaticValidateValidates that a JSONTypeDefinition string contains valid TypeScript and (optionally) exports the expected type name. Uses the TypeScript compiler API to parse without writing any files to disk.
The raw TypeScript code from EntityField.JSONTypeDefinition
The JSONType name that should be defined/exported in the definition
Entity name for error messages
Field name for error messages
An object with valid boolean and optional errors array of diagnostic messages
Base class for generating entity sub-classes, you can sub-class this class to modify/extend your own entity sub-class generator logic