joist-codegen 2.3.0 → 2.4.0-next.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/EntityDbMetadata.cjs +672 -0
- package/build/EntityDbMetadata.cjs.map +1 -0
- package/build/EntityDbMetadata.d.cts +301 -0
- package/build/EntityDbMetadata.d.cts.map +1 -0
- package/build/EntityDbMetadata.d.mts +301 -0
- package/build/EntityDbMetadata.d.mts.map +1 -0
- package/build/EntityDbMetadata.js +550 -662
- package/build/EntityDbMetadata.js.map +1 -1
- package/build/_virtual/_rolldown/runtime.cjs +23 -0
- package/build/_virtual/_rolldown/runtime.js +5 -0
- package/build/assignTags.cjs +45 -0
- package/build/assignTags.cjs.map +1 -0
- package/build/{assignTags.d.ts → assignTags.d.cts} +8 -4
- package/build/assignTags.d.cts.map +1 -0
- package/build/assignTags.d.mts +16 -0
- package/build/assignTags.d.mts.map +1 -0
- package/build/assignTags.js +37 -59
- package/build/assignTags.js.map +1 -1
- package/build/codemods/Codemod.cjs +2 -0
- package/build/codemods/Codemod.d.cts +17 -0
- package/build/codemods/Codemod.d.cts.map +1 -0
- package/build/codemods/Codemod.d.mts +17 -0
- package/build/codemods/Codemod.d.mts.map +1 -0
- package/build/codemods/Codemod.js +2 -3
- package/build/codemods/JscodeshiftMod.cjs +42 -0
- package/build/codemods/JscodeshiftMod.cjs.map +1 -0
- package/build/codemods/JscodeshiftMod.d.cts +14 -0
- package/build/codemods/JscodeshiftMod.d.cts.map +1 -0
- package/build/codemods/JscodeshiftMod.d.mts +14 -0
- package/build/codemods/JscodeshiftMod.d.mts.map +1 -0
- package/build/codemods/JscodeshiftMod.js +33 -33
- package/build/codemods/JscodeshiftMod.js.map +1 -1
- package/build/codemods/codemod_0001-rename_has_async_property.cjs +30 -0
- package/build/codemods/codemod_0001-rename_has_async_property.cjs.map +1 -0
- package/build/codemods/codemod_0001-rename_has_async_property.d.cts +9 -0
- package/build/codemods/codemod_0001-rename_has_async_property.d.cts.map +1 -0
- package/build/codemods/codemod_0001-rename_has_async_property.d.mts +9 -0
- package/build/codemods/codemod_0001-rename_has_async_property.d.mts.map +1 -0
- package/build/codemods/codemod_0001-rename_has_async_property.js +21 -25
- package/build/codemods/codemod_0001-rename_has_async_property.js.map +1 -1
- package/build/codemods/codemod_0002-rename_async_query_fields.cjs +50 -0
- package/build/codemods/codemod_0002-rename_async_query_fields.cjs.map +1 -0
- package/build/codemods/codemod_0002-rename_async_query_fields.d.cts +9 -0
- package/build/codemods/codemod_0002-rename_async_query_fields.d.cts.map +1 -0
- package/build/codemods/codemod_0002-rename_async_query_fields.d.mts +9 -0
- package/build/codemods/codemod_0002-rename_async_query_fields.d.mts.map +1 -0
- package/build/codemods/codemod_0002-rename_async_query_fields.js +38 -52
- package/build/codemods/codemod_0002-rename_async_query_fields.js.map +1 -1
- package/build/codemods/codemod_0003-rename_find_paginated.cjs +25 -0
- package/build/codemods/codemod_0003-rename_find_paginated.cjs.map +1 -0
- package/build/codemods/codemod_0003-rename_find_paginated.d.cts +9 -0
- package/build/codemods/codemod_0003-rename_find_paginated.d.cts.map +1 -0
- package/build/codemods/codemod_0003-rename_find_paginated.d.mts +9 -0
- package/build/codemods/codemod_0003-rename_find_paginated.d.mts.map +1 -0
- package/build/codemods/codemod_0003-rename_find_paginated.js +17 -26
- package/build/codemods/codemod_0003-rename_find_paginated.js.map +1 -1
- package/build/codemods/index.cjs +49 -0
- package/build/codemods/index.cjs.map +1 -0
- package/build/codemods/index.d.cts +12 -0
- package/build/codemods/index.d.cts.map +1 -0
- package/build/codemods/index.d.mts +12 -0
- package/build/codemods/index.d.mts.map +1 -0
- package/build/codemods/index.js +34 -42
- package/build/codemods/index.js.map +1 -1
- package/build/config.cjs +377 -0
- package/build/config.cjs.map +1 -0
- package/build/config.d.cts +181 -0
- package/build/config.d.cts.map +1 -0
- package/build/config.d.mts +181 -0
- package/build/config.d.mts.map +1 -0
- package/build/config.js +309 -347
- package/build/config.js.map +1 -1
- package/build/docs/cache.cjs +62 -0
- package/build/docs/cache.cjs.map +1 -0
- package/build/docs/cache.d.cts +17 -0
- package/build/docs/cache.d.cts.map +1 -0
- package/build/docs/cache.d.mts +17 -0
- package/build/docs/cache.d.mts.map +1 -0
- package/build/docs/cache.js +52 -53
- package/build/docs/cache.js.map +1 -1
- package/build/docs/generate-metadata-docs.cjs +32 -0
- package/build/docs/generate-metadata-docs.cjs.map +1 -0
- package/build/docs/generate-metadata-docs.d.cts +9 -0
- package/build/docs/generate-metadata-docs.d.cts.map +1 -0
- package/build/docs/generate-metadata-docs.d.mts +9 -0
- package/build/docs/generate-metadata-docs.d.mts.map +1 -0
- package/build/docs/generate-metadata-docs.js +19 -24
- package/build/docs/generate-metadata-docs.js.map +1 -1
- package/build/docs/index.cjs +90 -0
- package/build/docs/index.cjs.map +1 -0
- package/build/docs/index.d.cts +16 -0
- package/build/docs/index.d.cts.map +1 -0
- package/build/docs/index.d.mts +16 -0
- package/build/docs/index.d.mts.map +1 -0
- package/build/docs/index.js +75 -80
- package/build/docs/index.js.map +1 -1
- package/build/docs/markdown.cjs +181 -0
- package/build/docs/markdown.cjs.map +1 -0
- package/build/docs/{markdown.d.ts → markdown.d.cts} +14 -12
- package/build/docs/markdown.d.cts.map +1 -0
- package/build/docs/markdown.d.mts +32 -0
- package/build/docs/markdown.d.mts.map +1 -0
- package/build/docs/markdown.js +152 -220
- package/build/docs/markdown.js.map +1 -1
- package/build/docs/parsing.cjs +117 -0
- package/build/docs/parsing.cjs.map +1 -0
- package/build/docs/parsing.d.cts +48 -0
- package/build/docs/parsing.d.cts.map +1 -0
- package/build/docs/parsing.d.mts +48 -0
- package/build/docs/parsing.d.mts.map +1 -0
- package/build/docs/parsing.js +89 -88
- package/build/docs/parsing.js.map +1 -1
- package/build/findEntityScopes.cjs +119 -0
- package/build/findEntityScopes.cjs.map +1 -0
- package/build/findEntityScopes.d.cts +14 -0
- package/build/findEntityScopes.d.cts.map +1 -0
- package/build/findEntityScopes.d.mts +14 -0
- package/build/findEntityScopes.d.mts.map +1 -0
- package/build/findEntityScopes.js +83 -111
- package/build/findEntityScopes.js.map +1 -1
- package/build/foreignKeyOrdering.cjs +52 -0
- package/build/foreignKeyOrdering.cjs.map +1 -0
- package/build/foreignKeyOrdering.d.cts +8 -0
- package/build/foreignKeyOrdering.d.cts.map +1 -0
- package/build/foreignKeyOrdering.d.mts +8 -0
- package/build/foreignKeyOrdering.d.mts.map +1 -0
- package/build/foreignKeyOrdering.js +46 -55
- package/build/foreignKeyOrdering.js.map +1 -1
- package/build/generate.cjs +128 -0
- package/build/generate.cjs.map +1 -0
- package/build/generate.d.cts +17 -0
- package/build/generate.d.cts.map +1 -0
- package/build/generate.d.mts +17 -0
- package/build/generate.d.mts.map +1 -0
- package/build/generate.js +111 -124
- package/build/generate.js.map +1 -1
- package/build/generateEntitiesFile.cjs +46 -0
- package/build/generateEntitiesFile.cjs.map +1 -0
- package/build/generateEntitiesFile.d.cts +11 -0
- package/build/generateEntitiesFile.d.cts.map +1 -0
- package/build/generateEntitiesFile.d.mts +11 -0
- package/build/generateEntitiesFile.d.mts.map +1 -0
- package/build/generateEntitiesFile.js +28 -25
- package/build/generateEntitiesFile.js.map +1 -1
- package/build/generateEntityCodegenFile.cjs +1011 -0
- package/build/generateEntityCodegenFile.cjs.map +1 -0
- package/build/generateEntityCodegenFile.d.cts +16 -0
- package/build/generateEntityCodegenFile.d.cts.map +1 -0
- package/build/generateEntityCodegenFile.d.mts +16 -0
- package/build/generateEntityCodegenFile.d.mts.map +1 -0
- package/build/generateEntityCodegenFile.js +794 -827
- package/build/generateEntityCodegenFile.js.map +1 -1
- package/build/generateEntityFile.cjs +23 -0
- package/build/generateEntityFile.cjs.map +1 -0
- package/build/generateEntityFile.d.cts +9 -0
- package/build/generateEntityFile.d.cts.map +1 -0
- package/build/generateEntityFile.d.mts +9 -0
- package/build/generateEntityFile.d.mts.map +1 -0
- package/build/generateEntityFile.js +11 -8
- package/build/generateEntityFile.js.map +1 -1
- package/build/generateEntityTestFile.cjs +25 -0
- package/build/generateEntityTestFile.cjs.map +1 -0
- package/build/generateEntityTestFile.d.cts +9 -0
- package/build/generateEntityTestFile.d.cts.map +1 -0
- package/build/generateEntityTestFile.d.mts +9 -0
- package/build/generateEntityTestFile.d.mts.map +1 -0
- package/build/generateEntityTestFile.js +10 -7
- package/build/generateEntityTestFile.js.map +1 -1
- package/build/generateEnumFile.cjs +73 -0
- package/build/generateEnumFile.cjs.map +1 -0
- package/build/generateEnumFile.d.cts +9 -0
- package/build/generateEnumFile.d.cts.map +1 -0
- package/build/generateEnumFile.d.mts +9 -0
- package/build/generateEnumFile.d.mts.map +1 -0
- package/build/generateEnumFile.js +33 -43
- package/build/generateEnumFile.js.map +1 -1
- package/build/generateFactoriesFiles.cjs +28 -0
- package/build/generateFactoriesFiles.cjs.map +1 -0
- package/build/generateFactoriesFiles.d.cts +7 -0
- package/build/generateFactoriesFiles.d.cts.map +1 -0
- package/build/generateFactoriesFiles.d.mts +7 -0
- package/build/generateFactoriesFiles.d.mts.map +1 -0
- package/build/generateFactoriesFiles.js +21 -16
- package/build/generateFactoriesFiles.js.map +1 -1
- package/build/generateFlushFunction.cjs +61 -0
- package/build/generateFlushFunction.cjs.map +1 -0
- package/build/{generateFlushFunction.d.ts → generateFlushFunction.d.cts} +8 -5
- package/build/generateFlushFunction.d.cts.map +1 -0
- package/build/generateFlushFunction.d.mts +23 -0
- package/build/generateFlushFunction.d.mts.map +1 -0
- package/build/generateFlushFunction.js +32 -78
- package/build/generateFlushFunction.js.map +1 -1
- package/build/generateMetadataFile.cjs +315 -0
- package/build/generateMetadataFile.cjs.map +1 -0
- package/build/generateMetadataFile.d.cts +10 -0
- package/build/generateMetadataFile.d.cts.map +1 -0
- package/build/generateMetadataFile.d.mts +10 -0
- package/build/generateMetadataFile.d.mts.map +1 -0
- package/build/generateMetadataFile.js +156 -156
- package/build/generateMetadataFile.js.map +1 -1
- package/build/generatePgEnumFile.cjs +21 -0
- package/build/generatePgEnumFile.cjs.map +1 -0
- package/build/generatePgEnumFile.d.cts +9 -0
- package/build/generatePgEnumFile.d.cts.map +1 -0
- package/build/generatePgEnumFile.d.mts +9 -0
- package/build/generatePgEnumFile.d.mts.map +1 -0
- package/build/generatePgEnumFile.js +12 -9
- package/build/generatePgEnumFile.js.map +1 -1
- package/build/index.cjs +135 -0
- package/build/index.cjs.map +1 -0
- package/build/index.d.cts +12 -0
- package/build/index.d.cts.map +1 -0
- package/build/index.d.mts +12 -0
- package/build/index.d.mts.map +1 -0
- package/build/index.js +109 -127
- package/build/index.js.map +1 -1
- package/build/inheritance.cjs +258 -0
- package/build/inheritance.cjs.map +1 -0
- package/build/inheritance.d.cts +13 -0
- package/build/inheritance.d.cts.map +1 -0
- package/build/inheritance.d.mts +13 -0
- package/build/inheritance.d.mts.map +1 -0
- package/build/inheritance.js +238 -247
- package/build/inheritance.js.map +1 -1
- package/build/installSkills.cjs +68 -0
- package/build/installSkills.cjs.map +1 -0
- package/build/installSkills.d.cts +16 -0
- package/build/installSkills.d.cts.map +1 -0
- package/build/installSkills.d.mts +16 -0
- package/build/installSkills.d.mts.map +1 -0
- package/build/installSkills.js +67 -0
- package/build/installSkills.js.map +1 -0
- package/build/keywords.cjs +7 -0
- package/build/keywords.cjs.map +1 -0
- package/build/keywords.d.cts +5 -0
- package/build/keywords.d.cts.map +1 -0
- package/build/keywords.d.mts +5 -0
- package/build/keywords.d.mts.map +1 -0
- package/build/keywords.js +5 -4
- package/build/keywords.js.map +1 -1
- package/build/loadMetadata.cjs +39 -0
- package/build/loadMetadata.cjs.map +1 -0
- package/build/loadMetadata.d.cts +31 -0
- package/build/loadMetadata.d.cts.map +1 -0
- package/build/loadMetadata.d.mts +31 -0
- package/build/loadMetadata.d.mts.map +1 -0
- package/build/loadMetadata.js +32 -39
- package/build/loadMetadata.js.map +1 -1
- package/build/logger.cjs +28 -0
- package/build/logger.cjs.map +1 -0
- package/build/logger.d.cts +13 -0
- package/build/logger.d.cts.map +1 -0
- package/build/logger.d.mts +13 -0
- package/build/logger.d.mts.map +1 -0
- package/build/logger.js +17 -16
- package/build/logger.js.map +1 -1
- package/build/pgMetadata.cjs +332 -0
- package/build/pgMetadata.cjs.map +1 -0
- package/build/pgMetadata.d.cts +128 -0
- package/build/pgMetadata.d.cts.map +1 -0
- package/build/pgMetadata.d.mts +128 -0
- package/build/pgMetadata.d.mts.map +1 -0
- package/build/pgMetadata.js +320 -0
- package/build/pgMetadata.js.map +1 -0
- package/build/scanEntityFiles.cjs +46 -0
- package/build/scanEntityFiles.cjs.map +1 -0
- package/build/scanEntityFiles.d.cts +8 -0
- package/build/scanEntityFiles.d.cts.map +1 -0
- package/build/scanEntityFiles.d.mts +8 -0
- package/build/scanEntityFiles.d.mts.map +1 -0
- package/build/scanEntityFiles.js +37 -42
- package/build/scanEntityFiles.js.map +1 -1
- package/build/sortForeignKeys.cjs +99 -0
- package/build/sortForeignKeys.cjs.map +1 -0
- package/build/{sortForeignKeys.d.ts → sortForeignKeys.d.cts} +8 -5
- package/build/sortForeignKeys.d.cts.map +1 -0
- package/build/sortForeignKeys.d.mts +35 -0
- package/build/sortForeignKeys.d.mts.map +1 -0
- package/build/sortForeignKeys.js +88 -117
- package/build/sortForeignKeys.js.map +1 -1
- package/build/symbols.cjs +238 -0
- package/build/symbols.cjs.map +1 -0
- package/build/symbols.d.cts +120 -0
- package/build/symbols.d.cts.map +1 -0
- package/build/symbols.d.mts +120 -0
- package/build/symbols.d.mts.map +1 -0
- package/build/symbols.js +121 -113
- package/build/symbols.js.map +1 -1
- package/build/tsdoc.cjs +22 -0
- package/build/tsdoc.cjs.map +1 -0
- package/build/tsdoc.d.cts +15 -0
- package/build/tsdoc.d.cts.map +1 -0
- package/build/tsdoc.d.mts +15 -0
- package/build/tsdoc.d.mts.map +1 -0
- package/build/tsdoc.js +18 -15
- package/build/tsdoc.js.map +1 -1
- package/build/utils.cjs +175 -0
- package/build/utils.cjs.map +1 -0
- package/build/utils.d.cts +36 -0
- package/build/utils.d.cts.map +1 -0
- package/build/utils.d.mts +36 -0
- package/build/utils.d.mts.map +1 -0
- package/build/utils.js +113 -166
- package/build/utils.js.map +1 -1
- package/build/write-json-schema.cjs +23 -0
- package/build/write-json-schema.cjs.map +1 -0
- package/build/write-json-schema.d.cts +1 -0
- package/build/write-json-schema.d.mts +1 -0
- package/build/write-json-schema.js +19 -13
- package/build/write-json-schema.js.map +1 -1
- package/package.json +47 -18
- package/skills/joist-docs/SKILL.md +142 -0
- package/skills/joist-em-basics/SKILL.md +114 -0
- package/skills/joist-em-execute/SKILL.md +35 -0
- package/skills/joist-em-find/SKILL.md +27 -0
- package/skills/joist-em-query/SKILL.md +32 -0
- package/skills/joist-partial-updates/SKILL.md +352 -0
- package/skills/joist-reactive-hints/SKILL.md +150 -0
- package/skills/joist-test-factories/SKILL.md +397 -0
- package/skills/joist-upsert/SKILL.md +95 -0
- package/build/EntityDbMetadata.d.ts +0 -269
- package/build/EntityDbMetadata.d.ts.map +0 -1
- package/build/EntityDbMetadata.test.d.ts +0 -2
- package/build/EntityDbMetadata.test.d.ts.map +0 -1
- package/build/EntityDbMetadata.test.js +0 -211
- package/build/EntityDbMetadata.test.js.map +0 -1
- package/build/assignTags.d.ts.map +0 -1
- package/build/codemods/Codemod.d.ts +0 -14
- package/build/codemods/Codemod.d.ts.map +0 -1
- package/build/codemods/Codemod.js.map +0 -1
- package/build/codemods/JscodeshiftMod.d.ts +0 -11
- package/build/codemods/JscodeshiftMod.d.ts.map +0 -1
- package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.d.ts +0 -2
- package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.d.ts.map +0 -1
- package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.js +0 -9
- package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.js.map +0 -1
- package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.d.ts +0 -2
- package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.d.ts.map +0 -1
- package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.js +0 -9
- package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.js.map +0 -1
- package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.d.ts +0 -2
- package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.d.ts.map +0 -1
- package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.js +0 -9
- package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.js.map +0 -1
- package/build/codemods/codemod_0001-rename_has_async_property.d.ts +0 -7
- package/build/codemods/codemod_0001-rename_has_async_property.d.ts.map +0 -1
- package/build/codemods/codemod_0002-rename_async_query_fields.d.ts +0 -7
- package/build/codemods/codemod_0002-rename_async_query_fields.d.ts.map +0 -1
- package/build/codemods/codemod_0003-rename_find_paginated.d.ts +0 -7
- package/build/codemods/codemod_0003-rename_find_paginated.d.ts.map +0 -1
- package/build/codemods/index.d.ts +0 -9
- package/build/codemods/index.d.ts.map +0 -1
- package/build/codemods/index.test.d.ts +0 -2
- package/build/codemods/index.test.d.ts.map +0 -1
- package/build/codemods/index.test.js +0 -24
- package/build/codemods/index.test.js.map +0 -1
- package/build/config.d.ts +0 -167
- package/build/config.d.ts.map +0 -1
- package/build/config.test.d.ts +0 -2
- package/build/config.test.d.ts.map +0 -1
- package/build/config.test.js +0 -78
- package/build/config.test.js.map +0 -1
- package/build/docs/cache.d.ts +0 -14
- package/build/docs/cache.d.ts.map +0 -1
- package/build/docs/cache.test.d.ts +0 -2
- package/build/docs/cache.test.d.ts.map +0 -1
- package/build/docs/cache.test.js +0 -47
- package/build/docs/cache.test.js.map +0 -1
- package/build/docs/generate-metadata-docs.d.ts +0 -6
- package/build/docs/generate-metadata-docs.d.ts.map +0 -1
- package/build/docs/index.d.ts +0 -9
- package/build/docs/index.d.ts.map +0 -1
- package/build/docs/index.test.d.ts +0 -2
- package/build/docs/index.test.d.ts.map +0 -1
- package/build/docs/index.test.js +0 -100
- package/build/docs/index.test.js.map +0 -1
- package/build/docs/markdown.d.ts.map +0 -1
- package/build/docs/markdown.test.d.ts +0 -2
- package/build/docs/markdown.test.d.ts.map +0 -1
- package/build/docs/markdown.test.js +0 -280
- package/build/docs/markdown.test.js.map +0 -1
- package/build/docs/parsing.d.ts +0 -42
- package/build/docs/parsing.d.ts.map +0 -1
- package/build/docs/parsing.test.d.ts +0 -2
- package/build/docs/parsing.test.d.ts.map +0 -1
- package/build/docs/parsing.test.js +0 -190
- package/build/docs/parsing.test.js.map +0 -1
- package/build/findEntityScopes.d.ts +0 -11
- package/build/findEntityScopes.d.ts.map +0 -1
- package/build/foreignKeyOrdering.d.ts +0 -3
- package/build/foreignKeyOrdering.d.ts.map +0 -1
- package/build/generate.d.ts +0 -12
- package/build/generate.d.ts.map +0 -1
- package/build/generateEntitiesFile.d.ts +0 -7
- package/build/generateEntitiesFile.d.ts.map +0 -1
- package/build/generateEntityCodegenFile.d.ts +0 -11
- package/build/generateEntityCodegenFile.d.ts.map +0 -1
- package/build/generateEntityFile.d.ts +0 -6
- package/build/generateEntityFile.d.ts.map +0 -1
- package/build/generateEntityTestFile.d.ts +0 -6
- package/build/generateEntityTestFile.d.ts.map +0 -1
- package/build/generateEnumFile.d.ts +0 -5
- package/build/generateEnumFile.d.ts.map +0 -1
- package/build/generateFactoriesFiles.d.ts +0 -4
- package/build/generateFactoriesFiles.d.ts.map +0 -1
- package/build/generateFlushFunction.d.ts.map +0 -1
- package/build/generateMetadataFile.d.ts +0 -5
- package/build/generateMetadataFile.d.ts.map +0 -1
- package/build/generatePgEnumFile.d.ts +0 -5
- package/build/generatePgEnumFile.d.ts.map +0 -1
- package/build/index.d.ts +0 -11
- package/build/index.d.ts.map +0 -1
- package/build/inheritance.d.ts +0 -10
- package/build/inheritance.d.ts.map +0 -1
- package/build/keywords.d.ts +0 -2
- package/build/keywords.d.ts.map +0 -1
- package/build/loadMetadata.d.ts +0 -26
- package/build/loadMetadata.d.ts.map +0 -1
- package/build/logger.d.ts +0 -10
- package/build/logger.d.ts.map +0 -1
- package/build/scanEntityFiles.d.ts +0 -5
- package/build/scanEntityFiles.d.ts.map +0 -1
- package/build/sortForeignKeys.d.ts.map +0 -1
- package/build/symbols.d.ts +0 -108
- package/build/symbols.d.ts.map +0 -1
- package/build/tsdoc.d.ts +0 -12
- package/build/tsdoc.d.ts.map +0 -1
- package/build/utils.d.ts +0 -31
- package/build/utils.d.ts.map +0 -1
- package/build/write-json-schema.d.ts +0 -2
- package/build/write-json-schema.d.ts.map +0 -1
|
@@ -1,99 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import { assertNever, fail, uncapitalize } from "./utils.js";
|
|
2
|
+
import { getStiEntities } from "./inheritance.js";
|
|
3
|
+
import "./config.js";
|
|
4
|
+
import { buildJSDocBlock, generatedTag } from "./docs/parsing.js";
|
|
5
|
+
import "./docs/index.js";
|
|
6
|
+
import "./findEntityScopes.js";
|
|
7
|
+
import { keywords } from "./keywords.js";
|
|
8
|
+
import { BaseEntity, BooleanFilter, BooleanGraphQLFilter, Changes, Collection, ConfigApi, DeepPartialOrNull, EntityFilter, EntityGraphQLFilter, EntityManager, EntityMetadata, EnumCollection, FieldsOf, FilterOf, Flavor, GraphQLFilterOf, IdOf, JsonPayload, LargeCollection, LazyField, Lens, LoadHint, Loaded, ManyToOneReference, MaybeAbstractEntityConstructor, OneToOneReference, OptsOf, OrderBy, PartialOrNull, PolymorphicReference, ProjectEntity, ReactiveField, ReactiveManyToMany, ReactiveManyToManyOtherSide, ReactiveReference, ReadOnlyCollection, RelationsOf, SSAssert, Scope, TaggedId, ToJsonHint, ValueFilter, ValueGraphQLFilter, Zod, cannotBeUpdated, failNoIdYet, getField, hasEnumCollection, hasLargeMany, hasLargeManyToMany, hasLazyField, hasMany, hasManyToMany, hasOne, hasOnePolymorphic, hasOneToOne, hasReactiveManyToManyOtherSide, hasRecursiveChildren, hasRecursiveM2m, hasRecursiveParents, isEntity, isLoaded, loadLens, mustBeSubType, newChangesProxy, newRequiredLazyFieldRule, newRequiredRule, newScopeFn, nowUTC, setField, setOpts, toIdOf, toJSON, updatePartial } from "./symbols.js";
|
|
9
|
+
import { tsdocComments } from "./tsdoc.js";
|
|
10
|
+
import "./EntityDbMetadata.js";
|
|
11
|
+
import { camelCase, pascalCase } from "change-case";
|
|
12
|
+
import pluralize from "pluralize";
|
|
13
|
+
import { code, imp, joinCode } from "ts-poet";
|
|
14
|
+
//#region src/generateEntityCodegenFile.ts
|
|
15
|
+
const { plural } = pluralize;
|
|
13
16
|
/** Creates the base class with the boilerplate annotations. */
|
|
14
|
-
function generateEntityCodegenFile(config, dbMeta, meta, scopeMembers = []) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
: (0, ts_poet_1.code) `return ${symbols_1.toIdOf}(${metadata}, this.idTaggedMaybe);`;
|
|
34
|
-
const idType = getIdType(config);
|
|
35
|
-
const maybeIsSoftDeleted = meta.deletedAt
|
|
36
|
-
? (0, ts_poet_1.code) `
|
|
17
|
+
function generateEntityCodegenFile(config, dbMeta, meta, scopeMembers = [], docs) {
|
|
18
|
+
const { entitiesByName: metasByName } = dbMeta;
|
|
19
|
+
const { entity, tagName } = meta;
|
|
20
|
+
const entityName = entity.name;
|
|
21
|
+
const fieldDocs = docs?.fields ?? {};
|
|
22
|
+
const varName = keywords.includes(tagName) ? uncapitalize(entityName) : tagName;
|
|
23
|
+
const primitives = createPrimitives(meta, entity, fieldDocs);
|
|
24
|
+
primitives.push(...createRegularEnums(meta, entity, fieldDocs));
|
|
25
|
+
primitives.push(...createArrayEnums(meta, fieldDocs));
|
|
26
|
+
primitives.push(...createPgEnums(meta, fieldDocs));
|
|
27
|
+
const relations = createRelations(config, meta, entity);
|
|
28
|
+
const configName = `${camelCase(entityName)}Config`;
|
|
29
|
+
const scopeFnName = `${camelCase(entityName)}Scope`;
|
|
30
|
+
const metadata = imp(`${camelCase(entityName)}Meta@./entities.ts`);
|
|
31
|
+
const contextType = config.contextType ? imp(`t:${config.contextType}`) : "{}";
|
|
32
|
+
const factoryMethod = imp(`new${entity.name}@./entities.ts`);
|
|
33
|
+
const idMaybeCode = config.idType === "tagged-string" ? code`return this.idTaggedMaybe;` : code`return ${toIdOf}(${metadata}, this.idTaggedMaybe);`;
|
|
34
|
+
const idType = getIdType(config);
|
|
35
|
+
const maybeSoftDeleteMethods = meta.deletedAt ? code`
|
|
37
36
|
get isSoftDeletedEntity(): boolean {
|
|
38
37
|
return this.${meta.deletedAt.fieldName} !== undefined;
|
|
39
38
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
39
|
+
|
|
40
|
+
softDelete(): void {
|
|
41
|
+
if (this.isSoftDeletedEntity) return;
|
|
42
|
+
this.${meta.deletedAt.fieldName} = ${nowUTCCall(config, meta.deletedAt)};
|
|
43
|
+
}
|
|
44
|
+
` : "";
|
|
45
|
+
const baseEntity = dbMeta.entities.find((e) => e.name === meta.baseClassName);
|
|
46
|
+
const subEntities = dbMeta.entities.filter((e) => e.baseClassName === meta.name);
|
|
47
|
+
const base = baseEntity?.entity.typeSymbol ?? code`${BaseEntity}<${EntityManager}, ${idType}>`;
|
|
48
|
+
const maybeBaseFields = baseEntity ? code`extends Omit<${imp("t:" + baseEntity.entity.fieldsName + "@./entities.ts")}, "id"${[
|
|
49
|
+
...meta.primitives,
|
|
50
|
+
...meta.enums,
|
|
51
|
+
...meta.pgEnums,
|
|
52
|
+
...meta.manyToOnes
|
|
53
|
+
].filter((field) => [
|
|
54
|
+
...baseEntity.primitives,
|
|
55
|
+
...baseEntity.enums,
|
|
56
|
+
...baseEntity.pgEnums,
|
|
57
|
+
...baseEntity.manyToOnes
|
|
58
|
+
].some((baseField) => baseField.fieldName === field.fieldName)).map((field) => code` | "${field.fieldName}"`)}>` : "";
|
|
59
|
+
const maybeBaseOpts = baseEntity ? code`extends ${baseEntity.entity.optsType}` : "";
|
|
60
|
+
const physical = meta.physicalMetadata ?? meta;
|
|
61
|
+
const sharedTable = meta.inheritanceType === "sti" && baseEntity;
|
|
62
|
+
const columns = sharedTable ? {} : generateColumnsType(physical);
|
|
63
|
+
const maybeBaseColumns = sharedTable ? code`extends ${imp(`t:${baseEntity.name}Columns@./entities.ts`)}` : "";
|
|
64
|
+
const maybeBaseIdOpts = baseEntity ? code`extends ${imp("t:" + baseEntity.entity.idsOptsName + "@./entities.ts")}` : "";
|
|
65
|
+
const maybeBaseFilter = baseEntity ? code`extends ${imp("t:" + baseEntity.entity.filterName + "@./entities.ts")}` : "";
|
|
66
|
+
const maybeBaseGqlFilter = baseEntity ? code`extends ${imp("t:" + baseEntity.entity.graphqlFilterName + "@./entities.ts")}` : "";
|
|
67
|
+
const maybeBaseOrder = baseEntity ? code`extends ${baseEntity.entity.orderType}` : "";
|
|
68
|
+
meta.abstract && code`
|
|
62
69
|
if (this.constructor === ${entity.type} && !(em as any).fakeInstance) {
|
|
63
70
|
throw new Error(\`${entity.type} must be instantiated via a subtype\`);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// type A1 = { foo: 1 | 2 };
|
|
74
|
-
// type A2 = { foo: 1 | 2 | 3 };
|
|
75
|
-
// type A3 = A2 extends A1 ? 1 : 2;
|
|
76
|
-
//
|
|
77
|
-
// A3 will be 2 because the extra 3 breaks code written against A1.foo.
|
|
78
|
-
//
|
|
79
|
-
// So essentially we're pre-emptively our subtypes "3".
|
|
80
|
-
[
|
|
81
|
-
(0, ts_poet_1.code) `, `,
|
|
82
|
-
...[meta, ...subEntities].map((e) => (0, ts_poet_1.code) `keyof (${symbols_1.FieldsOf}<${e.entity.type}> & ${symbols_1.RelationsOf}<${e.entity.type}>)`),
|
|
83
|
-
], { on: "|" });
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
maybeOtherTypeChanges = "";
|
|
87
|
-
}
|
|
88
|
-
let maybeOtherLoaded;
|
|
89
|
-
if (baseEntity) {
|
|
90
|
-
maybeOtherLoaded = (0, ts_poet_1.code) `| ${baseEntity.entity.type}`;
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
maybeOtherLoaded = "";
|
|
94
|
-
}
|
|
95
|
-
return (0, ts_poet_1.code) `
|
|
96
|
-
export type ${entity.idName} = ${symbols_1.Flavor}<${idType}, "${baseEntity ? baseEntity.name : entityName}">;
|
|
71
|
+
}`;
|
|
72
|
+
let maybeOtherTypeChanges;
|
|
73
|
+
if (subEntities.length > 0) maybeOtherTypeChanges = joinCode([code`, `, ...[meta, ...subEntities].map((e) => code`keyof (${FieldsOf}<${e.entity.type}> & ${RelationsOf}<${e.entity.type}>)`)], { on: "|" });
|
|
74
|
+
else maybeOtherTypeChanges = "";
|
|
75
|
+
let maybeOtherLoaded;
|
|
76
|
+
if (baseEntity) maybeOtherLoaded = code`| ${baseEntity.entity.type}`;
|
|
77
|
+
else maybeOtherLoaded = "";
|
|
78
|
+
return code`
|
|
79
|
+
export type ${entity.idName} = ${Flavor}<${idType}, "${baseEntity ? baseEntity.name : entityName}">;
|
|
97
80
|
|
|
98
81
|
${generatePolymorphicTypes(meta)}
|
|
99
82
|
|
|
@@ -101,6 +84,10 @@ function generateEntityCodegenFile(config, dbMeta, meta, scopeMembers = []) {
|
|
|
101
84
|
${generateFieldsType(meta, idType)}
|
|
102
85
|
}
|
|
103
86
|
|
|
87
|
+
export interface ${entityName}Columns ${maybeBaseColumns} {
|
|
88
|
+
${Object.entries(columns).map(([name, descriptor]) => code`${camelCase(name)}: ${descriptor};`)}
|
|
89
|
+
}
|
|
90
|
+
|
|
104
91
|
export interface ${entity.optsName} ${maybeBaseOpts} {
|
|
105
92
|
${generateOptsFields(meta)}
|
|
106
93
|
}
|
|
@@ -126,14 +113,14 @@ function generateEntityCodegenFile(config, dbMeta, meta, scopeMembers = []) {
|
|
|
126
113
|
}
|
|
127
114
|
|
|
128
115
|
export interface ${entity.scopesName} {
|
|
129
|
-
${scopeMembers.map((member) =>
|
|
116
|
+
${scopeMembers.map((member) => code`${member.name}: ${member.type};`)}
|
|
130
117
|
}
|
|
131
118
|
|
|
132
|
-
export type ${entity.scopeName} = ${
|
|
119
|
+
export type ${entity.scopeName} = ${Scope}<${entity.type}, ${entity.scopesName}>;
|
|
133
120
|
|
|
134
|
-
export const ${configName} = new ${
|
|
121
|
+
export const ${configName} = new ${ConfigApi}<${entity.type}, ${contextType}>();
|
|
135
122
|
|
|
136
|
-
export const ${scopeFnName} = ${
|
|
123
|
+
export const ${scopeFnName} = ${newScopeFn}<${entity.type}, ${entity.scopeName}>("${entityName}");
|
|
137
124
|
|
|
138
125
|
${generateDefaultValidationRules(dbMeta, meta, configName)}
|
|
139
126
|
${generateDefaultValues(config, meta, configName)};
|
|
@@ -147,6 +134,9 @@ function generateEntityCodegenFile(config, dbMeta, meta, scopeMembers = []) {
|
|
|
147
134
|
orderType: ${entity.orderName};
|
|
148
135
|
optsType: ${entity.optsName};
|
|
149
136
|
fieldsType: ${entity.fieldsName};
|
|
137
|
+
columnsType: ${entityName}Columns;
|
|
138
|
+
inheritanceType: ${meta.inheritanceType ? code`"${meta.inheritanceType}"` : "never"};
|
|
139
|
+
supportsEmExecute: ${!meta.inheritanceType && meta.supportsEmExecute === true};
|
|
150
140
|
optIdsType: ${entity.idsOptsName};
|
|
151
141
|
factoryExtrasType: ${entity.factoryExtrasName};
|
|
152
142
|
factoryOptsType: Parameters<typeof ${factoryMethod}>[1];
|
|
@@ -154,887 +144,864 @@ function generateEntityCodegenFile(config, dbMeta, meta, scopeMembers = []) {
|
|
|
154
144
|
}
|
|
155
145
|
}
|
|
156
146
|
|
|
157
|
-
export abstract class ${entityName}Codegen extends ${base} implements ${
|
|
147
|
+
export abstract class ${entityName}Codegen extends ${base} implements ${ProjectEntity} {
|
|
158
148
|
static readonly tagName = "${tagName}";
|
|
159
|
-
static readonly metadata: ${
|
|
149
|
+
static readonly metadata: ${EntityMetadata}<${entity.type}>;
|
|
160
150
|
|
|
161
151
|
declare readonly __type: {
|
|
162
152
|
${baseEntity ? `0: "${baseEntity.name}",` : ""}
|
|
163
153
|
${baseEntity ? 1 : 0}: "${entityName}",
|
|
164
154
|
};
|
|
165
155
|
|
|
166
|
-
${relations
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
})}
|
|
176
|
-
${relations
|
|
177
|
-
.filter((r) => r.kind === "super")
|
|
178
|
-
.map((r) => {
|
|
179
|
-
return (0, ts_poet_1.code) `declare readonly ${r.fieldName}: ${r.decl};${maybeComment(r.comment)}`;
|
|
180
|
-
})}
|
|
156
|
+
${relations.filter((r) => r.kind === "abstract").map((r) => {
|
|
157
|
+
return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}${r.line}${maybeComment(r.comment)}`;
|
|
158
|
+
})}
|
|
159
|
+
${relations.filter((r) => r.kind === "concrete").map((r) => {
|
|
160
|
+
return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}readonly ${r.fieldName}: ${r.decl} = ${r.init};${maybeComment(r.comment)}`;
|
|
161
|
+
})}
|
|
162
|
+
${relations.filter((r) => r.kind === "super").map((r) => {
|
|
163
|
+
return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}declare readonly ${r.fieldName}: ${r.decl};${maybeComment(r.comment)}`;
|
|
164
|
+
})}
|
|
181
165
|
|
|
182
166
|
get id(): ${entity.idName} {
|
|
183
|
-
return this.idMaybe || ${
|
|
167
|
+
return this.idMaybe || ${failNoIdYet}("${entityName}");
|
|
184
168
|
}
|
|
185
169
|
|
|
186
170
|
get idMaybe(): ${entity.idName} | undefined {
|
|
187
171
|
${idMaybeCode}
|
|
188
172
|
}
|
|
189
173
|
|
|
190
|
-
get idTagged(): ${
|
|
191
|
-
return this.idTaggedMaybe || ${
|
|
174
|
+
get idTagged(): ${TaggedId} {
|
|
175
|
+
return this.idTaggedMaybe || ${failNoIdYet}("${entityName}");
|
|
192
176
|
}
|
|
193
177
|
|
|
194
|
-
get idTaggedMaybe(): ${
|
|
195
|
-
return ${
|
|
178
|
+
get idTaggedMaybe(): ${TaggedId} | undefined {
|
|
179
|
+
return ${getField}(this, "id");
|
|
196
180
|
}
|
|
197
181
|
|
|
198
182
|
${primitives}
|
|
199
183
|
|
|
200
|
-
${
|
|
184
|
+
${tsdocComments.entity.setPartial}
|
|
201
185
|
set(opts: Partial<${entity.optsName}>): void {
|
|
202
|
-
${
|
|
186
|
+
${setOpts}(this as any as ${entityName}, opts);
|
|
203
187
|
}
|
|
204
188
|
|
|
205
|
-
${
|
|
206
|
-
setPartial(opts: ${
|
|
207
|
-
${
|
|
189
|
+
${tsdocComments.entity.setPartial}
|
|
190
|
+
setPartial(opts: ${PartialOrNull}<${entity.optsName}>): void {
|
|
191
|
+
${setOpts}(this as any as ${entityName}, opts as ${OptsOf}<${entityName}>, { partial: true });
|
|
208
192
|
}
|
|
209
193
|
|
|
210
|
-
${
|
|
211
|
-
setDeepPartial(opts: ${
|
|
212
|
-
return ${
|
|
194
|
+
${tsdocComments.entity.setDeepPartial}
|
|
195
|
+
setDeepPartial(opts: ${DeepPartialOrNull}<${entityName}>): Promise<void> {
|
|
196
|
+
return ${updatePartial}(this as any as ${entityName}, opts);
|
|
213
197
|
}
|
|
214
198
|
|
|
215
|
-
${
|
|
216
|
-
get changes(): ${
|
|
217
|
-
return ${
|
|
199
|
+
${tsdocComments.entity.changes}
|
|
200
|
+
get changes(): ${Changes}<${entityName}${maybeOtherTypeChanges}> {
|
|
201
|
+
return ${newChangesProxy}(this) as any;
|
|
218
202
|
}
|
|
219
203
|
|
|
220
|
-
${
|
|
204
|
+
${maybeSoftDeleteMethods}
|
|
221
205
|
|
|
222
|
-
${
|
|
223
|
-
load<U, V>(fn: (lens: ${
|
|
224
|
-
return ${
|
|
206
|
+
${tsdocComments.entity.load}
|
|
207
|
+
load<U, V>(fn: (lens: ${Lens}<${entity.type}>) => ${Lens}<U, V>, opts: { sql?: boolean } = {}): Promise<V> {
|
|
208
|
+
return ${loadLens}(this as any as ${entityName}, fn, opts);
|
|
225
209
|
}
|
|
226
210
|
|
|
227
|
-
${
|
|
228
|
-
populate<const H extends ${
|
|
229
|
-
populate<const H extends ${
|
|
230
|
-
populate<const H extends ${
|
|
231
|
-
populate<const H extends ${
|
|
232
|
-
populate<const H extends ${
|
|
211
|
+
${tsdocComments.entity.populate}
|
|
212
|
+
populate<const H extends ${LoadHint}<${entityName}>>(hint: H): Promise<${Loaded}<${entityName}, H>>;
|
|
213
|
+
populate<const H extends ${LoadHint}<${entityName}>>(opts: { hint: H, forceReload?: boolean }): Promise<${Loaded}<${entityName}, H>>;
|
|
214
|
+
populate<const H extends ${LoadHint}<${entityName}>, V>(hint: H, fn: (${varName}: Loaded<${entityName}, H>) => V): Promise<V>;
|
|
215
|
+
populate<const H extends ${LoadHint}<${entityName}>, V>(opts: { hint: H, forceReload?: boolean }, fn: (${varName}: Loaded<${entityName}, H>) => V): Promise<V>;
|
|
216
|
+
populate<const H extends ${LoadHint}<${entityName}>, V>(hintOrOpts: any, fn?: (${varName}: Loaded<${entityName}, H>) => V): Promise<${Loaded}<${entityName}, H> | V> {
|
|
233
217
|
return this.em.populate(this as any as ${entityName}, hintOrOpts, fn);
|
|
234
218
|
}
|
|
235
219
|
|
|
236
|
-
${
|
|
237
|
-
isLoaded<const H extends ${
|
|
238
|
-
return ${
|
|
220
|
+
${tsdocComments.entity.isLoaded}
|
|
221
|
+
isLoaded<const H extends ${LoadHint}<${entityName}>>(hint: H): this is ${Loaded}<${entityName}${maybeOtherLoaded}, H> {
|
|
222
|
+
return ${isLoaded}(this as any as ${entityName}, hint);
|
|
239
223
|
}
|
|
240
224
|
|
|
241
|
-
${
|
|
225
|
+
${tsdocComments.entity.toJSON}
|
|
242
226
|
toJSON(): object;
|
|
243
|
-
toJSON<const H extends ${
|
|
227
|
+
toJSON<const H extends ${ToJsonHint}<${entityName}>>(hint: H): Promise<${JsonPayload}<${entityName}, H>>;
|
|
244
228
|
toJSON(hint?: any): object {
|
|
245
|
-
return !hint || typeof hint === "string" ? super.toJSON() : ${
|
|
229
|
+
return !hint || typeof hint === "string" ? super.toJSON() : ${toJSON}(this, hint);
|
|
246
230
|
}
|
|
247
231
|
}
|
|
248
232
|
`;
|
|
249
233
|
}
|
|
250
234
|
function fieldHasDefaultValue(field) {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
// Even though default is defined as a `number | boolean | string | null`, in reality pg-structure
|
|
257
|
-
// only ever returns a `string | null`, so we handle that here
|
|
258
|
-
columnDefault = columnDefault.toString();
|
|
259
|
-
const fieldType = field.kind === "primitive" ? field.fieldType : "number";
|
|
260
|
-
// Try to validate that we actually got a primitive value and not arbitrary SQL
|
|
261
|
-
return ((fieldType === "number" && !isNaN(parseInt(columnDefault))) ||
|
|
262
|
-
(fieldType === "bigint" && !isNaN(parseInt(columnDefault))) ||
|
|
263
|
-
(fieldType === "string" && /^'.*'$/.test(columnDefault)) ||
|
|
264
|
-
(fieldType === "boolean" && ["true", "false"].includes(columnDefault)));
|
|
235
|
+
let { columnDefault } = field;
|
|
236
|
+
if (columnDefault === null) return false;
|
|
237
|
+
columnDefault = columnDefault.toString();
|
|
238
|
+
const fieldType = field.kind === "primitive" ? field.fieldType : "number";
|
|
239
|
+
return fieldType === "number" && !isNaN(parseInt(columnDefault)) || fieldType === "bigint" && !isNaN(parseInt(columnDefault)) || fieldType === "string" && /^'.*'$/.test(columnDefault) || fieldType === "boolean" && ["true", "false"].includes(columnDefault);
|
|
265
240
|
}
|
|
266
241
|
function generatePolymorphicTypes(meta) {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
return [${pf.components.map((c) =>
|
|
242
|
+
return meta.polymorphics.flatMap((pf) => [
|
|
243
|
+
code`export type ${pf.fieldType} = ${pf.components.map((c) => code`| ${c.otherEntity.type}`)};`,
|
|
244
|
+
code`export function get${pf.fieldType}Constructors(): ${MaybeAbstractEntityConstructor}<${pf.fieldType}>[] {
|
|
245
|
+
return [${pf.components.map((c) => code`${c.otherEntity.typeSymbol},`)}];
|
|
271
246
|
}`,
|
|
272
|
-
|
|
273
|
-
return ${
|
|
274
|
-
}
|
|
275
|
-
|
|
247
|
+
code`export function is${pf.fieldType}(maybeEntity: unknown): maybeEntity is ${pf.fieldType} {
|
|
248
|
+
return ${isEntity}(maybeEntity) && get${pf.fieldType}Constructors().some((type) => maybeEntity instanceof type);
|
|
249
|
+
}`
|
|
250
|
+
]);
|
|
276
251
|
}
|
|
277
252
|
function generateDefaultValues(config, meta, configName) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
.filter(notSync)
|
|
297
|
-
.map(({ fieldName, columnDefault, enumRows, enumType, columnName }) => {
|
|
298
|
-
const defaultRow = enumRows.find((r) => r.id === Number(columnDefault)) ||
|
|
299
|
-
(0, utils_1.fail)(`Invalid default value ${columnDefault} for ${meta.tableName}.${columnName}`);
|
|
300
|
-
return (0, ts_poet_1.code) `${configName}.setDefault("${fieldName}", ${enumType}.${(0, change_case_1.pascalCase)(defaultRow.code)});`;
|
|
301
|
-
});
|
|
302
|
-
return [...primitives, ...enums, ...pgEnums];
|
|
253
|
+
function notSync(field) {
|
|
254
|
+
return "derived" in field && field.derived !== "sync";
|
|
255
|
+
}
|
|
256
|
+
const primitives = meta.primitives.filter((field) => fieldHasDefaultValue(field)).filter(notSync).map(({ fieldName, columnDefault }) => {
|
|
257
|
+
return code`${configName}.setDefault("${fieldName}", ${columnDefault});`;
|
|
258
|
+
});
|
|
259
|
+
const pgEnums = meta.pgEnums.filter((field) => !!field.columnDefault).map(({ fieldName, columnDefault }) => {
|
|
260
|
+
return code`${configName}.setDefault("${fieldName}", ${columnDefault});`;
|
|
261
|
+
});
|
|
262
|
+
const enums = meta.enums.filter((field) => !!field.columnDefault && !field.isArray).filter(notSync).map(({ fieldName, columnDefault, enumRows, enumType, columnName }) => {
|
|
263
|
+
const defaultRow = enumRows.find((r) => r.id === Number(columnDefault)) || fail(`Invalid default value ${columnDefault} for ${meta.tableName}.${columnName}`);
|
|
264
|
+
return code`${configName}.setDefault("${fieldName}", ${enumType}.${pascalCase(defaultRow.code)});`;
|
|
265
|
+
});
|
|
266
|
+
return [
|
|
267
|
+
...primitives,
|
|
268
|
+
...enums,
|
|
269
|
+
...pgEnums
|
|
270
|
+
];
|
|
303
271
|
}
|
|
304
272
|
function generateDefaultValidationRules(db, meta, configName) {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
if (target && m2o.otherEntity.name !== target.base.name) {
|
|
331
|
-
rules.push((0, ts_poet_1.code) `${configName}.addRule("${m2o.fieldName}", ${symbols_1.mustBeSubType}("${m2o.fieldName}"));`);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
// Add subtype specialization must match
|
|
336
|
-
if (meta.baseType) {
|
|
337
|
-
meta.manyToOnes
|
|
338
|
-
.filter((m2o) => meta.baseType?.manyToOnes?.find((o) => o.fieldName === m2o.fieldName && o.otherEntity.name !== m2o.otherEntity.name))
|
|
339
|
-
.forEach((m2o) => {
|
|
340
|
-
rules.push((0, ts_poet_1.code) `${configName}.addRule("${m2o.fieldName}", ${symbols_1.mustBeSubType}("${m2o.fieldName}"));`);
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
return rules;
|
|
273
|
+
const rules = [
|
|
274
|
+
...meta.primitives,
|
|
275
|
+
...meta.enums,
|
|
276
|
+
...meta.manyToOnes,
|
|
277
|
+
...meta.polymorphics
|
|
278
|
+
].filter((p) => p.notNull).map((p) => {
|
|
279
|
+
const { fieldName } = p;
|
|
280
|
+
const isReactive = "derived" in p && p.derived === "async";
|
|
281
|
+
if ("lazy" in p && p.lazy) return code`${configName}.addRule(${newRequiredLazyFieldRule}("${fieldName}"));`;
|
|
282
|
+
else if (isReactive) return code`${configName}.addRule("${fieldName}", ${newRequiredRule}("${fieldName}"));`;
|
|
283
|
+
else return code`${configName}.addRule(${newRequiredRule}("${fieldName}"));`;
|
|
284
|
+
});
|
|
285
|
+
if (meta.stiDiscriminatorField) {
|
|
286
|
+
const field = meta.enums.find((e) => e.fieldName === meta.stiDiscriminatorField) ?? fail("STI field not found");
|
|
287
|
+
rules.push(code`${configName}.addRule(${cannotBeUpdated}("${field.fieldName}"));`);
|
|
288
|
+
}
|
|
289
|
+
const stiEntities = getStiEntities(db.entities);
|
|
290
|
+
if (stiEntities.size > 0) for (const m2o of meta.manyToOnes) {
|
|
291
|
+
const target = stiEntities.get(m2o.otherEntity.name);
|
|
292
|
+
if (target && m2o.otherEntity.name !== target.base.name) rules.push(code`${configName}.addRule("${m2o.fieldName}", ${mustBeSubType}("${m2o.fieldName}"));`);
|
|
293
|
+
}
|
|
294
|
+
if (meta.baseType) meta.manyToOnes.filter((m2o) => meta.baseType?.manyToOnes?.find((o) => o.fieldName === m2o.fieldName && o.otherEntity.name !== m2o.otherEntity.name)).forEach((m2o) => {
|
|
295
|
+
rules.push(code`${configName}.addRule("${m2o.fieldName}", ${mustBeSubType}("${m2o.fieldName}"));`);
|
|
296
|
+
});
|
|
297
|
+
return rules;
|
|
344
298
|
}
|
|
345
|
-
// Make our opts type
|
|
346
299
|
function generateOptsFields(meta) {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
return (0, ts_poet_1.code) `${fieldName}?: ${enumType}[];`;
|
|
395
|
-
});
|
|
396
|
-
const polys = meta.polymorphics.map((field) => {
|
|
397
|
-
const { fieldName, notNull, fieldType } = field;
|
|
398
|
-
return (0, ts_poet_1.code) `${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType};`;
|
|
399
|
-
});
|
|
400
|
-
return [...primitives, ...enums, ...pgEnums, ...m2o, ...polys, ...o2o, ...o2m, ...m2m, ...m2mEnum];
|
|
300
|
+
const primitives = meta.primitives.map((field) => {
|
|
301
|
+
const { fieldName, fieldType, notNull, derived } = field;
|
|
302
|
+
if (derived) return code``;
|
|
303
|
+
return code`${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType}${maybeUnionNull(notNull)};`;
|
|
304
|
+
});
|
|
305
|
+
const enums = meta.enums.map((field) => {
|
|
306
|
+
const { fieldName, enumType, notNull, isArray, derived } = field;
|
|
307
|
+
if (meta.stiDiscriminatorField === fieldName || derived) return code``;
|
|
308
|
+
else if (isArray) return code`${fieldName}?: ${enumType}[];`;
|
|
309
|
+
else return code`${fieldName}${maybeOptionalOrDefault(field)}: ${enumType}${maybeUnionNull(notNull)};`;
|
|
310
|
+
});
|
|
311
|
+
const pgEnums = meta.pgEnums.map((field) => {
|
|
312
|
+
const { fieldName, enumType, notNull } = field;
|
|
313
|
+
return code`${fieldName}${maybeOptionalOrDefault(field)}: ${enumType}${maybeUnionNull(notNull)};`;
|
|
314
|
+
});
|
|
315
|
+
const m2o = meta.manyToOnes.filter(({ derived }) => !derived).filter(({ fieldName }) => !meta.baseType?.manyToOnes.find((o) => o.fieldName === fieldName)).map((field) => {
|
|
316
|
+
const { fieldName, otherEntity, notNull } = field;
|
|
317
|
+
const maybeNull = maybeUnionNull(notNull);
|
|
318
|
+
return code`${fieldName}${maybeOptionalOrDefault(field)}: ${otherEntity.type} | ${otherEntity.idType} ${maybeNull};`;
|
|
319
|
+
});
|
|
320
|
+
const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
|
|
321
|
+
return code`${fieldName}?: ${otherEntity.type} | null;`;
|
|
322
|
+
});
|
|
323
|
+
const o2m = meta.oneToManys.map(({ fieldName, otherEntity }) => {
|
|
324
|
+
return code`${fieldName}?: ${otherEntity.type}[];`;
|
|
325
|
+
});
|
|
326
|
+
const m2m = meta.manyToManys.filter(({ derived }) => !derived).map(({ fieldName, otherEntity }) => {
|
|
327
|
+
return code`${fieldName}?: ${otherEntity.type}[];`;
|
|
328
|
+
});
|
|
329
|
+
const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
|
|
330
|
+
return code`${fieldName}?: ${enumType}[];`;
|
|
331
|
+
});
|
|
332
|
+
const polys = meta.polymorphics.map((field) => {
|
|
333
|
+
const { fieldName, notNull, fieldType } = field;
|
|
334
|
+
return code`${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType};`;
|
|
335
|
+
});
|
|
336
|
+
return [
|
|
337
|
+
...primitives,
|
|
338
|
+
...enums,
|
|
339
|
+
...pgEnums,
|
|
340
|
+
...m2o,
|
|
341
|
+
...polys,
|
|
342
|
+
...o2o,
|
|
343
|
+
...o2m,
|
|
344
|
+
...m2m,
|
|
345
|
+
...m2mEnum
|
|
346
|
+
];
|
|
401
347
|
}
|
|
402
|
-
// Make our fields type
|
|
403
348
|
function generateFieldsType(meta, idType) {
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
349
|
+
const id = code`id: { kind: "primitive"; type: ${idType}; unique: ${true}; nullable: never; };`;
|
|
350
|
+
const primitives = meta.primitives.map((field) => {
|
|
351
|
+
const { fieldName, fieldType, notNull, unique, derived } = field;
|
|
352
|
+
return code`${fieldName}: { kind: "primitive"; type: ${fieldType}; unique: ${unique}; nullable: ${undefinedOrNever(notNull)}, derived: ${derived !== false}; };`;
|
|
353
|
+
});
|
|
354
|
+
const enums = meta.enums.map((field) => {
|
|
355
|
+
const { fieldName, enumType, notNull, isArray } = field;
|
|
356
|
+
if (isArray) return code`${fieldName}: { kind: "enum"; type: ${enumType}[]; nullable: never; };`;
|
|
357
|
+
else return code`${fieldName}: { kind: "enum"; type: ${enumType}; nullable: ${undefinedOrNever(notNull)}; };`;
|
|
358
|
+
});
|
|
359
|
+
const pgEnums = meta.pgEnums.map((field) => {
|
|
360
|
+
const { fieldName, enumType, notNull } = field;
|
|
361
|
+
const nullable = undefinedOrNever(notNull);
|
|
362
|
+
return code`${fieldName}: { kind: "enum"; type: ${enumType}; nullable: ${nullable}; native: true; };`;
|
|
363
|
+
});
|
|
364
|
+
const m2o = meta.manyToOnes.map((field) => {
|
|
365
|
+
const { fieldName, otherEntity, notNull, derived } = field;
|
|
366
|
+
return code`${fieldName}: { kind: "m2o"; type: ${otherEntity.type}; nullable: ${undefinedOrNever(notNull)}, derived: ${derived !== false}; };`;
|
|
367
|
+
});
|
|
368
|
+
const polys = meta.polymorphics.map((field) => {
|
|
369
|
+
const { fieldName, notNull, fieldType } = field;
|
|
370
|
+
return code`${fieldName}: { kind: "poly"; type: ${fieldType}; nullable: ${undefinedOrNever(notNull)} };`;
|
|
371
|
+
});
|
|
372
|
+
const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {
|
|
373
|
+
return code`${fieldName}: { kind: "m2m"; type: ${otherEntity.type} };`;
|
|
374
|
+
});
|
|
375
|
+
const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
|
|
376
|
+
return code`${fieldName}: { kind: "m2mEnum"; type: ${enumType} };`;
|
|
377
|
+
});
|
|
378
|
+
const o2m = meta.oneToManys.map(({ fieldName, otherEntity }) => {
|
|
379
|
+
return code`${fieldName}: { kind: "o2m"; type: ${otherEntity.type} };`;
|
|
380
|
+
});
|
|
381
|
+
const o2o = meta.oneToOnes.map((field) => {
|
|
382
|
+
return code`${field.fieldName}: { kind: "o2o"; type: ${field.otherEntity.type} };`;
|
|
383
|
+
});
|
|
384
|
+
const lo2m = meta.largeOneToManys.map(({ fieldName, otherEntity }) => {
|
|
385
|
+
return code`${fieldName}: { kind: "o2m"; type: ${otherEntity.type} };`;
|
|
386
|
+
});
|
|
387
|
+
return [
|
|
388
|
+
id,
|
|
389
|
+
...primitives,
|
|
390
|
+
...enums,
|
|
391
|
+
...pgEnums,
|
|
392
|
+
...m2o,
|
|
393
|
+
...polys,
|
|
394
|
+
...m2m,
|
|
395
|
+
...m2mEnum,
|
|
396
|
+
...o2m,
|
|
397
|
+
...o2o,
|
|
398
|
+
...lo2m
|
|
399
|
+
];
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Emits physical columns with domain value types and database nullability.
|
|
403
|
+
* I.e. Comment.parent_book_id is an optional Book reference, not the CommentParent union.
|
|
404
|
+
* fieldName identifies direct local domain filters; polymorphic components have no eligible name.
|
|
405
|
+
* Polymorphic component writes remain unsupported, so their policies are conservative.
|
|
406
|
+
*/
|
|
407
|
+
function generateColumnsType(meta) {
|
|
408
|
+
const columns = { id: code`{ fieldName: "id"; type: ${IdOf}<${meta.entity.type}>; entity: ${meta.entity.type}; ${columnPolicyType(meta, meta.primaryKey)} }` };
|
|
409
|
+
for (const field of [
|
|
410
|
+
...meta.primitives,
|
|
411
|
+
...meta.enums,
|
|
412
|
+
...meta.pgEnums,
|
|
413
|
+
...meta.manyToOnes
|
|
414
|
+
]) {
|
|
415
|
+
const policy = code`fieldName: "${field.fieldName}"; ${columnPolicyType(meta, field)}`;
|
|
416
|
+
if (field.kind === "primitive") columns[field.columnName] = code`{ type: ${field.fieldType}; ${policy} }`;
|
|
417
|
+
else if (field.kind === "m2o") columns[field.columnName] = code`{ type: ${IdOf}<${field.otherEntity.type}>; entity: ${field.otherEntity.type}; ${policy} }`;
|
|
418
|
+
else {
|
|
419
|
+
const array = field.kind === "enum" && field.isArray ? "[]" : "";
|
|
420
|
+
columns[field.columnName] = code`{ type: ${field.enumType}${array}; ${policy} }`;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
for (const column of meta.ignoredColumns) columns[column.columnName] = code`{ type: ${column.fieldType}; fieldName: never; ${columnPolicyType(meta, column)} }`;
|
|
424
|
+
for (const field of meta.polymorphics) for (const component of field.components) columns[component.columnName] = code`{ fieldName: never; type: ${IdOf}<${component.otherEntity.type}>; entity: ${component.otherEntity.type}; nullable: true; insert: "never"; update: false; }`;
|
|
425
|
+
return columns;
|
|
426
|
+
}
|
|
427
|
+
/** Emits SQL write policy without using ORM defaults or derived-field restrictions. */
|
|
428
|
+
function columnPolicyType(meta, column) {
|
|
429
|
+
const primaryKey = column === meta.primaryKey ? meta.primaryKey.columnType : void 0;
|
|
430
|
+
const insert = column.columnGenerated ? "never" : !column.columnNotNull || column.columnDefault != null || column === meta.createdAt || column === meta.updatedAt || primaryKey === "int" || primaryKey === "bigint" ? "optional" : "required";
|
|
431
|
+
return code`nullable: ${!column.columnNotNull}; insert: "${insert}"; update: ${!primaryKey && !column.columnGenerated};`;
|
|
442
432
|
}
|
|
443
|
-
// We know the OptIds types are only used in partials, so we make everything optional.
|
|
444
|
-
// This especially needs to be the case b/c both `book: ...` and `bookId: ...` will be
|
|
445
|
-
// in the partial type and of course the caller will only be setting one.
|
|
446
433
|
function generateOptIdsFields(meta) {
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
434
|
+
const m2o = meta.manyToOnes.filter(({ derived }) => !derived).map(({ fieldName, otherEntity }) => {
|
|
435
|
+
return code`${fieldName}Id?: ${otherEntity.idType} | null;`;
|
|
436
|
+
});
|
|
437
|
+
const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
|
|
438
|
+
return code`${fieldName}Id?: ${otherEntity.idType} | null;`;
|
|
439
|
+
});
|
|
440
|
+
const o2m = meta.oneToManys.map(({ singularName, otherEntity }) => {
|
|
441
|
+
return code`${singularName}Ids?: ${otherEntity.idType}[] | null;`;
|
|
442
|
+
});
|
|
443
|
+
const m2m = meta.manyToManys.filter(({ derived }) => !derived).map(({ singularName, otherEntity }) => {
|
|
444
|
+
return code`${singularName}Ids?: ${otherEntity.idType}[] | null;`;
|
|
445
|
+
});
|
|
446
|
+
const polys = meta.polymorphics.map(({ fieldName, fieldType }) => {
|
|
447
|
+
return code`${fieldName}Id?: ${IdOf}<${fieldType}> | null;`;
|
|
448
|
+
});
|
|
449
|
+
return [
|
|
450
|
+
...m2o,
|
|
451
|
+
...polys,
|
|
452
|
+
...o2o,
|
|
453
|
+
...o2m,
|
|
454
|
+
...m2m
|
|
455
|
+
];
|
|
467
456
|
}
|
|
468
457
|
function generateFilterFields(metasByName, meta) {
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
return (0, ts_poet_1.code) `${fieldName}${type}?: ${symbols_1.EntityFilter}<${type}, ${symbols_1.IdOf}<${type}>, ${symbols_1.FilterOf}<${type}>, null>;`;
|
|
520
|
-
}),
|
|
521
|
-
];
|
|
522
|
-
});
|
|
523
|
-
return [...maybeId, ...primitives, ...enums, ...pgEnums, ...m2o, ...o2o, ...o2m, ...m2m, ...m2mEnum, ...polys];
|
|
458
|
+
const maybeId = meta.baseClassName ? [] : [code`id?: ${ValueFilter}<${meta.entity.idName}, never> | null;`];
|
|
459
|
+
const primitives = meta.primitives.map(({ fieldName, fieldType, notNull }) => {
|
|
460
|
+
if (fieldType === "boolean") return code`${fieldName}?: ${BooleanFilter}<${nullOrNever(notNull)}>;`;
|
|
461
|
+
else return code`${fieldName}?: ${ValueFilter}<${fieldType}, ${nullOrNever(notNull)}>;`;
|
|
462
|
+
});
|
|
463
|
+
const enums = meta.enums.map(({ fieldName, enumType, notNull, isArray }) => {
|
|
464
|
+
return code`${fieldName}?: ${ValueFilter}<${enumType}${isArray ? "[]" : ""}, ${nullOrNever(notNull)}>;`;
|
|
465
|
+
});
|
|
466
|
+
const pgEnums = meta.pgEnums.map(({ fieldName, enumType, notNull }) => {
|
|
467
|
+
return code`${fieldName}?: ${ValueFilter}<${enumType}, ${nullOrNever(notNull)}>;`;
|
|
468
|
+
});
|
|
469
|
+
const m2o = meta.manyToOnes.flatMap(({ fieldName, otherEntity, notNull }) => {
|
|
470
|
+
const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);
|
|
471
|
+
return [code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, ${nullOrNever(notNull)}>;`, ...otherMeta.subTypes.map((st) => {
|
|
472
|
+
return code`${fieldName}${st.name}?: ${EntityFilter}<${st.entity.type}, ${st.entity.idType}, ${FilterOf}<${st.entity.type}>, ${nullOrNever(notNull)}>;`;
|
|
473
|
+
})];
|
|
474
|
+
});
|
|
475
|
+
const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
|
|
476
|
+
return code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`;
|
|
477
|
+
});
|
|
478
|
+
const o2m = meta.oneToManys.flatMap(({ fieldName, otherEntity, otherColumnNotNull }) => {
|
|
479
|
+
const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);
|
|
480
|
+
return [code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`, ...otherMeta.subTypes.map((st) => {
|
|
481
|
+
return code`${fieldName}${st.name}?: ${EntityFilter}<${st.entity.type}, ${st.entity.idType}, ${FilterOf}<${st.entity.type}>, ${nullOrNever(otherColumnNotNull)}>;`;
|
|
482
|
+
})];
|
|
483
|
+
});
|
|
484
|
+
const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {
|
|
485
|
+
return code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`;
|
|
486
|
+
});
|
|
487
|
+
const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
|
|
488
|
+
return code`${fieldName}?: ${ValueFilter}<${enumType}, null | undefined>;`;
|
|
489
|
+
});
|
|
490
|
+
const polys = meta.polymorphics.flatMap(({ fieldName, fieldType, components, notNull }) => {
|
|
491
|
+
return [code`${fieldName}?: ${EntityFilter}<${fieldType}, ${IdOf}<${fieldType}>, never, ${nullOrNever(notNull)}>;`, ...components.map((comp) => {
|
|
492
|
+
const { type } = comp.otherEntity;
|
|
493
|
+
return code`${fieldName}${type}?: ${EntityFilter}<${type}, ${IdOf}<${type}>, ${FilterOf}<${type}>, null>;`;
|
|
494
|
+
})];
|
|
495
|
+
});
|
|
496
|
+
return [
|
|
497
|
+
...maybeId,
|
|
498
|
+
...primitives,
|
|
499
|
+
...enums,
|
|
500
|
+
...pgEnums,
|
|
501
|
+
...m2o,
|
|
502
|
+
...o2o,
|
|
503
|
+
...o2m,
|
|
504
|
+
...m2m,
|
|
505
|
+
...m2mEnum,
|
|
506
|
+
...polys
|
|
507
|
+
];
|
|
524
508
|
}
|
|
525
509
|
function generateGraphQLFilterFields(metasByName, meta) {
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
510
|
+
const maybeId = meta.baseClassName ? [] : [code`id?: ${ValueGraphQLFilter}<${meta.entity.idName}>;`];
|
|
511
|
+
const primitives = meta.primitives.map(({ fieldName, fieldType }) => {
|
|
512
|
+
if (fieldType === "boolean") return code`${fieldName}?: ${BooleanGraphQLFilter};`;
|
|
513
|
+
else return code`${fieldName}?: ${ValueGraphQLFilter}<${fieldType}>;`;
|
|
514
|
+
});
|
|
515
|
+
const enums = meta.enums.map(({ fieldName, enumType, isArray }) => {
|
|
516
|
+
return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}${isArray ? "[]" : ""}>;`;
|
|
517
|
+
});
|
|
518
|
+
const pgEnums = meta.pgEnums.map(({ fieldName, enumType }) => {
|
|
519
|
+
return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}>;`;
|
|
520
|
+
});
|
|
521
|
+
const m2o = meta.manyToOnes.flatMap(({ fieldName, otherEntity, notNull }) => {
|
|
522
|
+
const otherMeta = metasByName[otherEntity.name];
|
|
523
|
+
return [
|
|
524
|
+
code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, ${nullOrNever(notNull)}>;`,
|
|
525
|
+
code`${fieldName}Id?: ${ValueGraphQLFilter}<${otherEntity.idType}>;`,
|
|
526
|
+
...otherMeta.subTypes.map((st) => {
|
|
527
|
+
return code`${fieldName}${st.name}?: ${EntityGraphQLFilter}<${st.entity.type}, ${st.entity.idType}, ${GraphQLFilterOf}<${st.entity.type}>, ${nullOrNever(notNull)}>;`;
|
|
528
|
+
})
|
|
529
|
+
];
|
|
530
|
+
});
|
|
531
|
+
const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
|
|
532
|
+
return code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`;
|
|
533
|
+
});
|
|
534
|
+
const o2m = meta.oneToManys.flatMap(({ fieldName, otherEntity, otherColumnNotNull }) => {
|
|
535
|
+
const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);
|
|
536
|
+
return [code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`, ...otherMeta.subTypes.map((st) => {
|
|
537
|
+
return code`${fieldName}${st.name}?: ${EntityGraphQLFilter}<${st.entity.type}, ${st.entity.idType}, ${GraphQLFilterOf}<${st.entity.type}>, ${nullOrNever(otherColumnNotNull)}>;`;
|
|
538
|
+
})];
|
|
539
|
+
});
|
|
540
|
+
const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {
|
|
541
|
+
return code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`;
|
|
542
|
+
});
|
|
543
|
+
const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
|
|
544
|
+
return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}>;`;
|
|
545
|
+
});
|
|
546
|
+
const polys = meta.polymorphics.flatMap(({ fieldName, fieldType, components, notNull }) => {
|
|
547
|
+
return [
|
|
548
|
+
code`${fieldName}?: ${EntityGraphQLFilter}<${fieldType}, ${IdOf}<${fieldType}>, never, ${nullOrNever(notNull)}>;`,
|
|
549
|
+
code`${fieldName}Id?: ${ValueGraphQLFilter}<${IdOf}<${fieldType}>>;`,
|
|
550
|
+
...components.map((comp) => {
|
|
551
|
+
const { type } = comp.otherEntity;
|
|
552
|
+
return code`${fieldName}${type}?: ${EntityGraphQLFilter}<${type}, ${IdOf}<${type}>, ${FilterOf}<${type}>, null>;`;
|
|
553
|
+
})
|
|
554
|
+
];
|
|
555
|
+
});
|
|
556
|
+
return [
|
|
557
|
+
...maybeId,
|
|
558
|
+
...primitives,
|
|
559
|
+
...enums,
|
|
560
|
+
...pgEnums,
|
|
561
|
+
...m2o,
|
|
562
|
+
...o2o,
|
|
563
|
+
...o2m,
|
|
564
|
+
...m2m,
|
|
565
|
+
...m2mEnum,
|
|
566
|
+
...polys
|
|
567
|
+
];
|
|
581
568
|
}
|
|
582
569
|
function generateOrderFields(meta) {
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
570
|
+
const maybeId = meta.baseClassName ? [] : [code`id?: ${OrderBy};`];
|
|
571
|
+
const primitives = meta.primitives.map(({ fieldName }) => {
|
|
572
|
+
return code`${fieldName}?: ${OrderBy};`;
|
|
573
|
+
});
|
|
574
|
+
const enums = meta.enums.map(({ fieldName }) => {
|
|
575
|
+
return code`${fieldName}?: ${OrderBy};`;
|
|
576
|
+
});
|
|
577
|
+
const pgEnums = meta.pgEnums.map(({ fieldName }) => {
|
|
578
|
+
return code`${fieldName}?: ${OrderBy};`;
|
|
579
|
+
});
|
|
580
|
+
const m2o = meta.manyToOnes.map(({ fieldName, otherEntity }) => {
|
|
581
|
+
return code`${fieldName}?: ${otherEntity.orderType};`;
|
|
582
|
+
});
|
|
583
|
+
return [
|
|
584
|
+
...maybeId,
|
|
585
|
+
...primitives,
|
|
586
|
+
...enums,
|
|
587
|
+
...pgEnums,
|
|
588
|
+
...m2o
|
|
589
|
+
];
|
|
597
590
|
}
|
|
598
591
|
function generateFactoryExtrasType(meta) {
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
if (isArray) {
|
|
613
|
-
return (0, ts_poet_1.code) `${withName(fieldName)}?: ${enumType}[];`;
|
|
614
|
-
}
|
|
615
|
-
else {
|
|
616
|
-
return (0, ts_poet_1.code) `${withName(fieldName)}?: ${enumType}${maybeUnionNull(notNull)};`;
|
|
617
|
-
}
|
|
618
|
-
});
|
|
619
|
-
return [...primitives, ...enums];
|
|
592
|
+
function withName(fieldName) {
|
|
593
|
+
return `with${fieldName[0].toUpperCase() + fieldName.substring(1)}`;
|
|
594
|
+
}
|
|
595
|
+
const primitives = meta.primitives.filter((f) => f.derived === "async").map((field) => {
|
|
596
|
+
const { fieldName, fieldType, notNull } = field;
|
|
597
|
+
return code`${withName(fieldName)}?: ${fieldType}${maybeUnionNull(notNull)};`;
|
|
598
|
+
});
|
|
599
|
+
const enums = meta.enums.filter((f) => f.derived === "async").map((field) => {
|
|
600
|
+
const { fieldName, enumType, notNull, isArray } = field;
|
|
601
|
+
if (isArray) return code`${withName(fieldName)}?: ${enumType}[];`;
|
|
602
|
+
else return code`${withName(fieldName)}?: ${enumType}${maybeUnionNull(notNull)};`;
|
|
603
|
+
});
|
|
604
|
+
return [...primitives, ...enums];
|
|
620
605
|
}
|
|
621
|
-
function createPrimitives(meta, entity) {
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
abstract readonly ${fieldName}: ${
|
|
606
|
+
function createPrimitives(meta, entity, fieldDocs) {
|
|
607
|
+
return meta.primitives.map((p) => {
|
|
608
|
+
const { fieldName, fieldType, notNull } = p;
|
|
609
|
+
const maybeOptional = notNull ? "" : " | undefined";
|
|
610
|
+
if (p.lazy) return code``;
|
|
611
|
+
let getter;
|
|
612
|
+
if (p.derived === "async") getter = code`
|
|
613
|
+
abstract readonly ${fieldName}: ${ReactiveField}<${entity.name}, ${p.fieldType}${maybeOptional}>;
|
|
629
614
|
`;
|
|
630
|
-
|
|
631
|
-
else if (p.derived === "sync") {
|
|
632
|
-
getter = (0, ts_poet_1.code) `
|
|
615
|
+
else if (p.derived === "sync") getter = code`
|
|
633
616
|
abstract get ${fieldName}(): ${fieldType}${maybeOptional};
|
|
634
617
|
`;
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
get ${fieldName}(): ${symbols_1.Zod}.output<typeof ${p.zodSchema}>${maybeOptional} {
|
|
639
|
-
return ${symbols_1.getField}(this, "${fieldName}");
|
|
618
|
+
else if (p.zodSchema) getter = code`
|
|
619
|
+
get ${fieldName}(): ${Zod}.output<typeof ${p.zodSchema}>${maybeOptional} {
|
|
620
|
+
return ${getField}(this, "${fieldName}");
|
|
640
621
|
}
|
|
641
622
|
`;
|
|
642
|
-
|
|
643
|
-
else {
|
|
644
|
-
getter = (0, ts_poet_1.code) `
|
|
623
|
+
else getter = code`
|
|
645
624
|
get ${fieldName}(): ${fieldType}${maybeOptional} {
|
|
646
|
-
return ${
|
|
625
|
+
return ${getField}(this, "${fieldName}");
|
|
647
626
|
}
|
|
648
627
|
`;
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
// TODO Allow making the getter to be protected as well. And so probably remove it
|
|
655
|
-
// from the Opts as well. Wonder how that works for required protected fields?
|
|
656
|
-
//
|
|
657
|
-
// We have to use a method of `set${fieldName}` because TS enforces getters/setters to have
|
|
658
|
-
// same access level and currently we're leaving the getter as public.
|
|
659
|
-
setter = (0, ts_poet_1.code) `
|
|
660
|
-
protected set${(0, change_case_1.pascalCase)(fieldName)}(${paramName}: ${fieldType}${maybeOptional}) {
|
|
661
|
-
${symbols_1.setField}(this, "${fieldName}", ${paramName});
|
|
628
|
+
let setter;
|
|
629
|
+
const paramName = keywords.includes(fieldName) ? "value" : fieldName;
|
|
630
|
+
if (p.protected) setter = code`
|
|
631
|
+
protected set${pascalCase(fieldName)}(${paramName}: ${fieldType}${maybeOptional}) {
|
|
632
|
+
${setField}(this, "${fieldName}", ${paramName});
|
|
662
633
|
}
|
|
663
634
|
`;
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
setter = "";
|
|
667
|
-
}
|
|
668
|
-
else if (p.superstruct) {
|
|
669
|
-
// We use `value` as the param name to not potentially conflict with the
|
|
670
|
-
// name of the imported superstruct const that is passed to assert.
|
|
671
|
-
setter = (0, ts_poet_1.code) `
|
|
635
|
+
else if (p.derived) setter = "";
|
|
636
|
+
else if (p.superstruct) setter = code`
|
|
672
637
|
set ${fieldName}(value: ${fieldType}${maybeOptional}) {
|
|
673
638
|
if (value) {
|
|
674
|
-
${
|
|
639
|
+
${SSAssert}(value, ${p.superstruct});
|
|
675
640
|
}
|
|
676
|
-
${
|
|
641
|
+
${setField}(this, "${fieldName}", value);
|
|
677
642
|
}
|
|
678
643
|
`;
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
// We use `value` as the param name to not potentially conflict with the
|
|
682
|
-
// name of the imported zod schema that is passed to parse.
|
|
683
|
-
setter = (0, ts_poet_1.code) `
|
|
684
|
-
set ${fieldName}(value: ${symbols_1.Zod}.input<typeof ${p.zodSchema}>${maybeOptional}) {
|
|
644
|
+
else if (p.zodSchema) setter = code`
|
|
645
|
+
set ${fieldName}(value: ${Zod}.input<typeof ${p.zodSchema}>${maybeOptional}) {
|
|
685
646
|
if (value) {
|
|
686
|
-
${
|
|
647
|
+
${setField}(this, "${fieldName}", ${p.zodSchema}.parse(value));
|
|
687
648
|
} else {
|
|
688
|
-
${
|
|
649
|
+
${setField}(this, "${fieldName}", value);
|
|
689
650
|
}
|
|
690
651
|
}
|
|
691
652
|
`;
|
|
692
|
-
|
|
693
|
-
else {
|
|
694
|
-
setter = (0, ts_poet_1.code) `
|
|
653
|
+
else setter = code`
|
|
695
654
|
set ${fieldName}(${paramName}: ${fieldType}${maybeOptional}) {
|
|
696
|
-
${
|
|
655
|
+
${setField}(this, "${fieldName}", ${paramName});
|
|
697
656
|
}
|
|
698
657
|
`;
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
});
|
|
702
|
-
return primitives;
|
|
658
|
+
return code`${fieldDocBlock(fieldDocs, fieldName, entity.name)}${getter} ${setter}`;
|
|
659
|
+
});
|
|
703
660
|
}
|
|
704
|
-
function createRegularEnums(meta, entity) {
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
if (derived === "async") {
|
|
713
|
-
getter = (0, ts_poet_1.code) `
|
|
714
|
-
abstract readonly ${fieldName}: ${symbols_1.ReactiveField}<${entity.name}, ${enumType}${maybeOptional}>;
|
|
661
|
+
function createRegularEnums(meta, entity, fieldDocs) {
|
|
662
|
+
return meta.enums.filter((e) => !e.isArray).flatMap((e) => {
|
|
663
|
+
const { fieldName, enumType, enumDetailType, enumDetailsType, notNull, enumRows, derived } = e;
|
|
664
|
+
const maybeOptional = notNull ? "" : " | undefined";
|
|
665
|
+
const getByCode = code`${enumDetailType}.getByCode(this.${fieldName})`;
|
|
666
|
+
let getter;
|
|
667
|
+
if (derived === "async") getter = code`
|
|
668
|
+
abstract readonly ${fieldName}: ${ReactiveField}<${entity.name}, ${enumType}${maybeOptional}>;
|
|
715
669
|
`;
|
|
716
|
-
|
|
717
|
-
else if (derived === "sync") {
|
|
718
|
-
getter = (0, ts_poet_1.code) `
|
|
670
|
+
else if (derived === "sync") getter = code`
|
|
719
671
|
abstract get ${fieldName}(): ${enumType}${maybeOptional};
|
|
720
672
|
`;
|
|
721
|
-
|
|
722
|
-
else {
|
|
723
|
-
getter = (0, ts_poet_1.code) `
|
|
673
|
+
else getter = code`
|
|
724
674
|
get ${fieldName}(): ${enumType}${maybeOptional} {
|
|
725
|
-
return ${
|
|
675
|
+
return ${getField}(this, "${fieldName}");
|
|
726
676
|
}
|
|
727
677
|
|
|
728
678
|
get ${fieldName}Details(): ${enumDetailsType}${maybeOptional} {
|
|
729
|
-
return ${notNull ? getByCode :
|
|
679
|
+
return ${notNull ? getByCode : code`this.${fieldName} ? ${getByCode} : undefined`};
|
|
730
680
|
}
|
|
731
681
|
`;
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
setter = (0, ts_poet_1.code) ``;
|
|
736
|
-
}
|
|
737
|
-
else {
|
|
738
|
-
setter = (0, ts_poet_1.code) `
|
|
682
|
+
let setter;
|
|
683
|
+
if (derived) setter = code``;
|
|
684
|
+
else setter = code`
|
|
739
685
|
set ${fieldName}(${fieldName}: ${enumType}${maybeOptional}) {
|
|
740
|
-
${
|
|
686
|
+
${setField}(this, "${fieldName}", ${fieldName});
|
|
741
687
|
}
|
|
742
688
|
`;
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
const accessors = enumRows.map((row) => (0, ts_poet_1.code) `
|
|
749
|
-
get is${shouldPrefixAccessors ? (0, change_case_1.pascalCase)(fieldName) : ""}${(0, change_case_1.pascalCase)(row.code)}(): boolean {
|
|
750
|
-
return ${symbols_1.getField}(this, "${fieldName}") === ${enumType}.${(0, change_case_1.pascalCase)(row.code)};
|
|
689
|
+
const codes = new Set(enumRows.map((r) => r.code));
|
|
690
|
+
const shouldPrefixAccessors = meta.enums.filter((other) => other !== e).some((other) => other.enumRows.some((r) => codes.has(r.code)));
|
|
691
|
+
const accessors = enumRows.map((row) => code`
|
|
692
|
+
get is${shouldPrefixAccessors ? pascalCase(fieldName) : ""}${pascalCase(row.code)}(): boolean {
|
|
693
|
+
return ${getField}(this, "${fieldName}") === ${enumType}.${pascalCase(row.code)};
|
|
751
694
|
}
|
|
752
695
|
`);
|
|
753
|
-
|
|
754
|
-
|
|
696
|
+
return [
|
|
697
|
+
code`${fieldDocBlock(fieldDocs, fieldName, entity.name)}${getter}`,
|
|
698
|
+
setter,
|
|
699
|
+
...accessors
|
|
700
|
+
];
|
|
701
|
+
});
|
|
755
702
|
}
|
|
756
|
-
function createArrayEnums(meta) {
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
const { fieldName, enumType, enumDetailType, enumDetailsType, enumRows } = e;
|
|
761
|
-
const getter = (0, ts_poet_1.code) `
|
|
703
|
+
function createArrayEnums(meta, fieldDocs) {
|
|
704
|
+
return meta.enums.filter((e) => e.isArray).flatMap((e) => {
|
|
705
|
+
const { fieldName, enumType, enumDetailType, enumDetailsType, enumRows } = e;
|
|
706
|
+
const getter = code`
|
|
762
707
|
get ${fieldName}(): ${enumType}[] {
|
|
763
|
-
return ${
|
|
708
|
+
return ${getField}(this, "${fieldName}") || [];
|
|
764
709
|
}
|
|
765
710
|
|
|
766
711
|
get ${fieldName}Details(): ${enumDetailsType}[] {
|
|
767
712
|
return this.${fieldName}.map(code => ${enumDetailType}.getByCode(code));
|
|
768
713
|
}
|
|
769
714
|
`;
|
|
770
|
-
|
|
715
|
+
const setter = code`
|
|
771
716
|
set ${fieldName}(${fieldName}: ${enumType}[]) {
|
|
772
|
-
${
|
|
717
|
+
${setField}(this, "${fieldName}", ${fieldName});
|
|
773
718
|
}
|
|
774
719
|
`;
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
get is${shouldPrefixAccessors ? (0, change_case_1.pascalCase)(fieldName) : ""}${(0, change_case_1.pascalCase)(row.code)}(): boolean {
|
|
781
|
-
return this.${fieldName}.includes(${enumType}.${(0, change_case_1.pascalCase)(row.code)});
|
|
720
|
+
const codes = new Set(enumRows.map((r) => r.code));
|
|
721
|
+
const shouldPrefixAccessors = meta.enums.filter((other) => other !== e).some((other) => other.enumRows.some((r) => codes.has(r.code)));
|
|
722
|
+
const accessors = enumRows.map((row) => code`
|
|
723
|
+
get is${shouldPrefixAccessors ? pascalCase(fieldName) : ""}${pascalCase(row.code)}(): boolean {
|
|
724
|
+
return this.${fieldName}.includes(${enumType}.${pascalCase(row.code)});
|
|
782
725
|
}
|
|
783
726
|
`);
|
|
784
|
-
|
|
785
|
-
|
|
727
|
+
return [
|
|
728
|
+
code`${fieldDocBlock(fieldDocs, fieldName, meta.entity.name)}${getter}`,
|
|
729
|
+
setter,
|
|
730
|
+
...accessors
|
|
731
|
+
];
|
|
732
|
+
});
|
|
786
733
|
}
|
|
787
|
-
function createPgEnums(meta) {
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
734
|
+
function createPgEnums(meta, fieldDocs) {
|
|
735
|
+
return meta.pgEnums.flatMap((e) => {
|
|
736
|
+
const { fieldName, enumType, enumValues, notNull } = e;
|
|
737
|
+
const maybeOptional = notNull ? "" : " | undefined";
|
|
738
|
+
const getter = code`
|
|
792
739
|
get ${fieldName}(): ${enumType}${maybeOptional} {
|
|
793
|
-
return ${
|
|
740
|
+
return ${getField}(this, "${fieldName}");
|
|
794
741
|
}
|
|
795
742
|
`;
|
|
796
|
-
|
|
743
|
+
const setter = code`
|
|
797
744
|
set ${fieldName}(${fieldName}: ${enumType}${maybeOptional}) {
|
|
798
|
-
${
|
|
745
|
+
${setField}(this, "${fieldName}", ${fieldName});
|
|
799
746
|
}
|
|
800
747
|
`;
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
get is${shouldPrefixAccessors ? (0, change_case_1.pascalCase)(fieldName) : ""}${(0, change_case_1.pascalCase)(row)}(): boolean {
|
|
807
|
-
return this.${fieldName} === ${enumType}.${(0, change_case_1.pascalCase)(row)};
|
|
748
|
+
const codes = new Set(enumValues);
|
|
749
|
+
const shouldPrefixAccessors = meta.pgEnums.filter((other) => other !== e).some((other) => other.enumValues.some((r) => codes.has(r)));
|
|
750
|
+
const accessors = enumValues.map((row) => code`
|
|
751
|
+
get is${shouldPrefixAccessors ? pascalCase(fieldName) : ""}${pascalCase(row)}(): boolean {
|
|
752
|
+
return this.${fieldName} === ${enumType}.${pascalCase(row)};
|
|
808
753
|
}
|
|
809
754
|
`);
|
|
810
|
-
|
|
811
|
-
|
|
755
|
+
return [
|
|
756
|
+
code`${fieldDocBlock(fieldDocs, fieldName, meta.entity.name)}${getter}`,
|
|
757
|
+
setter,
|
|
758
|
+
...accessors
|
|
759
|
+
];
|
|
760
|
+
});
|
|
812
761
|
}
|
|
813
762
|
function createRelations(config, meta, entity) {
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
${symbols_1.hasLargeManyToMany}(
|
|
763
|
+
const m2o = meta.manyToOnes.map((m2o) => {
|
|
764
|
+
const { fieldName, otherEntity, otherFieldName, notNull } = m2o;
|
|
765
|
+
const maybeOptional = notNull ? "never" : "undefined";
|
|
766
|
+
if (m2o.derived === "async") return {
|
|
767
|
+
kind: "abstract",
|
|
768
|
+
fieldName,
|
|
769
|
+
line: code`abstract readonly ${fieldName}: ${ReactiveReference}<${entity.name}, ${otherEntity.type}, ${maybeOptional}>;`
|
|
770
|
+
};
|
|
771
|
+
return {
|
|
772
|
+
kind: "concrete",
|
|
773
|
+
fieldName,
|
|
774
|
+
decl: code`${ManyToOneReference}<${entity.type}, ${otherEntity.type}, ${maybeOptional}>`,
|
|
775
|
+
init: code`${hasOne}()`
|
|
776
|
+
};
|
|
777
|
+
});
|
|
778
|
+
const m2oBase = meta.baseType?.manyToOnes.filter((m2o) => !meta.manyToOnes.find((o) => o.fieldName === m2o.fieldName)).filter((m2o) => m2o.derived !== "async").map((m2o) => {
|
|
779
|
+
const { fieldName, otherEntity, notNull } = m2o;
|
|
780
|
+
const maybeOptional = notNull ? "never" : "undefined";
|
|
781
|
+
return {
|
|
782
|
+
kind: "super",
|
|
783
|
+
fieldName,
|
|
784
|
+
decl: code`${ManyToOneReference}<${entity.type}, ${otherEntity.type}, ${maybeOptional}>`
|
|
785
|
+
};
|
|
786
|
+
}) ?? [];
|
|
787
|
+
const m2oRecursive = meta.manyToOnes.filter((m2o) => m2o.otherEntity.name === meta.name).filter((m2o) => !(config.entities[meta.inheritanceType == "sti" && meta.baseClassName ? meta.baseClassName : meta.name]?.relations?.[m2o.fieldName]?.skipRecursiveRelations === true)).filter((m2o) => !m2o.derived).flatMap((m2o) => {
|
|
788
|
+
const { fieldName: m2oName, otherFieldName, otherEntity } = m2o;
|
|
789
|
+
const parentsField = `${plural(m2oName)}Recursive`;
|
|
790
|
+
const childrenField = meta.oneToOnes.find((o2o) => o2o.fieldName === otherFieldName) ? `${plural(otherFieldName)}Recursive` : `${otherFieldName}Recursive`;
|
|
791
|
+
return [{
|
|
792
|
+
kind: "concrete",
|
|
793
|
+
fieldName: parentsField,
|
|
794
|
+
decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,
|
|
795
|
+
init: code`${hasRecursiveParents}("${m2oName}", "${childrenField}")`
|
|
796
|
+
}, {
|
|
797
|
+
kind: "concrete",
|
|
798
|
+
fieldName: childrenField,
|
|
799
|
+
decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,
|
|
800
|
+
init: code`${hasRecursiveChildren}("${otherFieldName}", "${parentsField}")`
|
|
801
|
+
}];
|
|
802
|
+
});
|
|
803
|
+
const m2mRecursive = meta.manyToManys.filter((m2m) => m2m.otherEntity.name === meta.name).filter((m2m) => !m2m.derived).filter((m2m) => !(config.entities[meta.inheritanceType == "sti" && meta.baseClassName ? meta.baseClassName : meta.name]?.relations?.[m2m.fieldName]?.skipRecursiveRelations === true)).map((m2m) => {
|
|
804
|
+
const { fieldName, otherFieldName, otherEntity } = m2m;
|
|
805
|
+
return {
|
|
806
|
+
kind: "concrete",
|
|
807
|
+
fieldName: `${fieldName}Recursive`,
|
|
808
|
+
decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,
|
|
809
|
+
init: code`${hasRecursiveM2m}("${fieldName}", "${otherFieldName}Recursive")`
|
|
810
|
+
};
|
|
811
|
+
});
|
|
812
|
+
return [
|
|
813
|
+
meta.oneToManys.map((o2m) => {
|
|
814
|
+
const { fieldName, otherEntity } = o2m;
|
|
815
|
+
return {
|
|
816
|
+
kind: "concrete",
|
|
817
|
+
fieldName,
|
|
818
|
+
decl: code`${Collection}<${entity.type}, ${otherEntity.type}>`,
|
|
819
|
+
init: code`${hasMany}()`
|
|
820
|
+
};
|
|
821
|
+
}),
|
|
822
|
+
meta.baseType?.oneToManys.filter((o2m) => !meta.oneToManys.find((o) => o.fieldName === o2m.fieldName)).map((o2m) => {
|
|
823
|
+
const { fieldName, otherEntity } = o2m;
|
|
824
|
+
return {
|
|
825
|
+
kind: "super",
|
|
826
|
+
fieldName,
|
|
827
|
+
decl: code`${Collection}<${entity.type}, ${otherEntity.type}>`
|
|
828
|
+
};
|
|
829
|
+
}) ?? [],
|
|
830
|
+
meta.largeOneToManys.map((o2m) => {
|
|
831
|
+
const { fieldName, otherEntity } = o2m;
|
|
832
|
+
return {
|
|
833
|
+
kind: "concrete",
|
|
834
|
+
fieldName,
|
|
835
|
+
decl: code`${LargeCollection}<${entity.type}, ${otherEntity.type}>`,
|
|
836
|
+
init: code`${hasLargeMany}()`
|
|
837
|
+
};
|
|
838
|
+
}),
|
|
839
|
+
m2o,
|
|
840
|
+
m2oBase,
|
|
841
|
+
m2oRecursive,
|
|
842
|
+
m2mRecursive,
|
|
843
|
+
meta.oneToOnes.map((o2o) => {
|
|
844
|
+
const { fieldName, otherEntity } = o2o;
|
|
845
|
+
return {
|
|
846
|
+
kind: "concrete",
|
|
847
|
+
fieldName,
|
|
848
|
+
decl: code`${OneToOneReference}<${entity.type}, ${otherEntity.type}>`,
|
|
849
|
+
init: code`${hasOneToOne}()`
|
|
850
|
+
};
|
|
851
|
+
}),
|
|
852
|
+
meta.baseType?.oneToOnes.map((o2o) => {
|
|
853
|
+
const { fieldName, otherEntity } = o2o;
|
|
854
|
+
return {
|
|
855
|
+
kind: "super",
|
|
856
|
+
fieldName,
|
|
857
|
+
decl: code`${OneToOneReference}<${entity.type}, ${otherEntity.type}>`
|
|
858
|
+
};
|
|
859
|
+
}) ?? [],
|
|
860
|
+
meta.manyToManys.map((m2m) => {
|
|
861
|
+
const { fieldName, otherEntity } = m2m;
|
|
862
|
+
const comment = `// ${m2m.joinTableName} ${m2m.columnName} ${m2m.otherColumnName}`;
|
|
863
|
+
if (m2m.derived === "async") return {
|
|
864
|
+
kind: "abstract",
|
|
865
|
+
fieldName,
|
|
866
|
+
line: code`abstract readonly ${fieldName}: ${ReactiveManyToMany}<${entity.name}, ${otherEntity.type}>;`,
|
|
867
|
+
comment
|
|
868
|
+
};
|
|
869
|
+
else if (m2m.derived === "otherSide") return {
|
|
870
|
+
kind: "concrete",
|
|
871
|
+
fieldName,
|
|
872
|
+
decl: code`${ReactiveManyToManyOtherSide}<${entity.type}, ${otherEntity.type}>`,
|
|
873
|
+
init: code`${hasReactiveManyToManyOtherSide}()`,
|
|
874
|
+
comment
|
|
875
|
+
};
|
|
876
|
+
else if (!m2m.derived) return {
|
|
877
|
+
kind: "concrete",
|
|
878
|
+
fieldName,
|
|
879
|
+
decl: code`${Collection}<${entity.type}, ${otherEntity.type}>`,
|
|
880
|
+
init: code`${hasManyToMany}()`,
|
|
881
|
+
comment
|
|
882
|
+
};
|
|
883
|
+
else assertNever(m2m.derived);
|
|
884
|
+
}),
|
|
885
|
+
meta.baseType?.manyToManys.filter((m2m) => !m2m.derived).map((m2m) => {
|
|
886
|
+
const { fieldName, otherEntity } = m2m;
|
|
887
|
+
return {
|
|
888
|
+
kind: "super",
|
|
889
|
+
fieldName,
|
|
890
|
+
decl: code`${Collection}<${entity.type}, ${otherEntity.type}>`
|
|
891
|
+
};
|
|
892
|
+
}) ?? [],
|
|
893
|
+
meta.manyToManyEnums.map((m2m) => {
|
|
894
|
+
const { fieldName, enumType } = m2m;
|
|
895
|
+
const comment = `// ${m2m.joinTableName} ${m2m.columnName} ${m2m.otherColumnName}`;
|
|
896
|
+
return {
|
|
897
|
+
kind: "concrete",
|
|
898
|
+
fieldName,
|
|
899
|
+
decl: code`${EnumCollection}<${entity.type}, ${enumType}>`,
|
|
900
|
+
init: code`${hasEnumCollection}()`,
|
|
901
|
+
comment
|
|
902
|
+
};
|
|
903
|
+
}),
|
|
904
|
+
meta.baseType?.manyToManyEnums.map((m2m) => {
|
|
905
|
+
const { fieldName, enumType } = m2m;
|
|
906
|
+
return {
|
|
907
|
+
kind: "super",
|
|
908
|
+
fieldName,
|
|
909
|
+
decl: code`${EnumCollection}<${entity.type}, ${enumType}>`
|
|
910
|
+
};
|
|
911
|
+
}) ?? [],
|
|
912
|
+
meta.largeManyToManys.map((m2m) => {
|
|
913
|
+
const { joinTableName, fieldName, columnName, otherEntity, otherFieldName, otherColumnName } = m2m;
|
|
914
|
+
return {
|
|
915
|
+
kind: "concrete",
|
|
916
|
+
fieldName,
|
|
917
|
+
decl: code`${LargeCollection}<${entity.type}, ${otherEntity.type}>`,
|
|
918
|
+
init: code`
|
|
919
|
+
${hasLargeManyToMany}(
|
|
972
920
|
"${joinTableName}",
|
|
973
921
|
"${columnName}",
|
|
974
922
|
"${otherFieldName}",
|
|
975
923
|
"${otherColumnName}",
|
|
976
924
|
${m2m.hasJoinTableId},
|
|
977
925
|
);
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
m2mEnumBase,
|
|
1003
|
-
lm2m,
|
|
1004
|
-
polymorphic,
|
|
1005
|
-
].flat();
|
|
926
|
+
`
|
|
927
|
+
};
|
|
928
|
+
}),
|
|
929
|
+
meta.polymorphics.map((p) => {
|
|
930
|
+
const { fieldName, notNull, fieldType } = p;
|
|
931
|
+
const maybeOptional = notNull ? "never" : "undefined";
|
|
932
|
+
return {
|
|
933
|
+
kind: "concrete",
|
|
934
|
+
fieldName,
|
|
935
|
+
decl: code`${PolymorphicReference}<${entity.type}, ${fieldType}, ${maybeOptional}>`,
|
|
936
|
+
init: code`${hasOnePolymorphic}()`
|
|
937
|
+
};
|
|
938
|
+
}),
|
|
939
|
+
meta.primitives.filter((p) => p.lazy).map((p) => {
|
|
940
|
+
const { fieldName, fieldType, notNull } = p;
|
|
941
|
+
const maybeOptional = notNull ? "" : " | undefined";
|
|
942
|
+
return {
|
|
943
|
+
kind: "concrete",
|
|
944
|
+
fieldName,
|
|
945
|
+
decl: code`${LazyField}<${entity.type}, ${fieldType}${maybeOptional}>`,
|
|
946
|
+
init: code`${hasLazyField}()`
|
|
947
|
+
};
|
|
948
|
+
})
|
|
949
|
+
].flat();
|
|
1006
950
|
}
|
|
1007
951
|
/** Makes the field required if there is a `NOT NULL` and no db-or-config default. */
|
|
1008
952
|
function maybeOptionalOrDefault(field) {
|
|
1009
|
-
|
|
1010
|
-
|
|
953
|
+
const hasDefault = field.kind !== "m2o" && field.kind !== "poly" && fieldHasDefaultValue(field) || field.hasConfigDefault;
|
|
954
|
+
return !field.notNull || hasDefault ? "?" : "";
|
|
1011
955
|
}
|
|
1012
956
|
function maybeUnionNull(notNull) {
|
|
1013
|
-
|
|
1014
|
-
}
|
|
1015
|
-
function maybeUndefined(notNull) {
|
|
1016
|
-
return notNull ? "" : " | undefined";
|
|
957
|
+
return notNull ? "" : " | null";
|
|
1017
958
|
}
|
|
1018
959
|
function undefinedOrNever(notNull) {
|
|
1019
|
-
|
|
960
|
+
return notNull ? "never" : "undefined";
|
|
1020
961
|
}
|
|
1021
962
|
function nullOrNever(notNull) {
|
|
1022
|
-
|
|
963
|
+
return notNull ? "never" : "null";
|
|
964
|
+
}
|
|
965
|
+
/** Returns the nowUTC call for the deleted-at field's generated timestamp type. */
|
|
966
|
+
function nowUTCCall(config, field) {
|
|
967
|
+
if (!config.temporal) return code`${nowUTC}()`;
|
|
968
|
+
switch (field.columnType) {
|
|
969
|
+
case "date": return code`${nowUTC}("plainDate")`;
|
|
970
|
+
case "timestamp without time zone": return code`${nowUTC}("plainDateTime")`;
|
|
971
|
+
case "timestamp with time zone": return code`${nowUTC}("zonedDateTime")`;
|
|
972
|
+
default: return fail(`Unsupported deleted-at column type ${field.columnType}`);
|
|
973
|
+
}
|
|
1023
974
|
}
|
|
1024
975
|
/** Prefixes the comment with a newline, so it gets its own line. */
|
|
1025
976
|
function maybeComment(comment) {
|
|
1026
|
-
|
|
977
|
+
return comment ? ` ${comment}\n` : "";
|
|
978
|
+
}
|
|
979
|
+
/**
|
|
980
|
+
* Renders a field's `.md` doc (plus its `@generated` tag) as a bare JSDoc block, or `""` if undocumented.
|
|
981
|
+
*
|
|
982
|
+
* Reuses the same {@link buildJSDocBlock} formatter the `.md` sync uses for hand-written `Entity.ts`
|
|
983
|
+
* members. Used directly before a getter template (which supplies its own leading newline), so the
|
|
984
|
+
* JSDoc lands immediately above the getter with no intervening blank line.
|
|
985
|
+
*/
|
|
986
|
+
function fieldDocBlock(fieldDocs, fieldName, entityName) {
|
|
987
|
+
const doc = fieldDocs[fieldName];
|
|
988
|
+
return doc ? buildJSDocBlock(`${doc}\n${generatedTag(entityName)}`, 0) : "";
|
|
989
|
+
}
|
|
990
|
+
/** Like {@link fieldDocBlock} but wrapped in newlines, i.e. for inline `readonly x = ...` relation decls. */
|
|
991
|
+
function relationDocBlock(fieldDocs, fieldName, entityName) {
|
|
992
|
+
const block = fieldDocBlock(fieldDocs, fieldName, entityName);
|
|
993
|
+
return block ? `\n${block}\n` : "";
|
|
1027
994
|
}
|
|
1028
995
|
function getIdType(config) {
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
default:
|
|
1037
|
-
return (0, utils_1.assertNever)(config.idType);
|
|
1038
|
-
}
|
|
996
|
+
switch (config.idType) {
|
|
997
|
+
case "untagged-string":
|
|
998
|
+
case "tagged-string":
|
|
999
|
+
case void 0: return "string";
|
|
1000
|
+
case "number": return "number";
|
|
1001
|
+
default: return assertNever(config.idType);
|
|
1002
|
+
}
|
|
1039
1003
|
}
|
|
1004
|
+
//#endregion
|
|
1005
|
+
export { generateEntityCodegenFile, getIdType };
|
|
1006
|
+
|
|
1040
1007
|
//# sourceMappingURL=generateEntityCodegenFile.js.map
|