joist-codegen 2.3.0-next.6 → 2.3.0-next.61
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 +608 -0
- package/build/EntityDbMetadata.cjs.map +1 -0
- package/build/EntityDbMetadata.d.cts +274 -0
- package/build/EntityDbMetadata.d.cts.map +1 -0
- package/build/EntityDbMetadata.d.mts +274 -0
- package/build/EntityDbMetadata.d.mts.map +1 -0
- package/build/EntityDbMetadata.js +485 -661
- 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 +127 -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 +110 -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 +955 -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 +738 -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 +290 -0
- package/build/generateMetadataFile.cjs.map +1 -0
- package/build/generateMetadataFile.d.cts +8 -0
- package/build/generateMetadataFile.d.cts.map +1 -0
- package/build/generateMetadataFile.d.mts +8 -0
- package/build/generateMetadataFile.d.mts.map +1 -0
- package/build/generateMetadataFile.js +116 -140
- 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 +108 -127
- package/build/index.js.map +1 -1
- package/build/inheritance.cjs +213 -0
- package/build/inheritance.cjs.map +1 -0
- package/build/inheritance.d.cts +12 -0
- package/build/inheritance.d.cts.map +1 -0
- package/build/inheritance.d.mts +12 -0
- package/build/inheritance.d.mts.map +1 -0
- package/build/inheritance.js +193 -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/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 +228 -0
- package/build/symbols.cjs.map +1 -0
- package/build/symbols.d.cts +115 -0
- package/build/symbols.d.cts.map +1 -0
- package/build/symbols.d.mts +115 -0
- package/build/symbols.d.mts.map +1 -0
- package/build/symbols.js +116 -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 +173 -0
- package/build/utils.cjs.map +1 -0
- package/build/utils.d.cts +34 -0
- package/build/utils.d.cts.map +1 -0
- package/build/utils.d.mts +34 -0
- package/build/utils.d.mts.map +1 -0
- package/build/utils.js +112 -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 +37 -17
- package/skills/joist-docs/SKILL.md +133 -0
- package/skills/joist-em-basics/SKILL.md +114 -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,68 @@
|
|
|
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
|
-
const maybeBaseGqlFilter = baseEntity
|
|
57
|
-
? (0, ts_poet_1.code) `extends ${(0, ts_poet_1.imp)("t:" + baseEntity.entity.graphqlFilterName + "@./entities.ts")}`
|
|
58
|
-
: "";
|
|
59
|
-
const maybeBaseOrder = baseEntity ? (0, ts_poet_1.code) `extends ${baseEntity.entity.orderType}` : "";
|
|
60
|
-
const maybePreventBaseTypeInstantiation = meta.abstract
|
|
61
|
-
? (0, ts_poet_1.code) `
|
|
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 ${imp("t:" + baseEntity.entity.fieldsName + "@./entities.ts")}` : "";
|
|
49
|
+
const maybeBaseOpts = baseEntity ? code`extends ${baseEntity.entity.optsType}` : "";
|
|
50
|
+
const maybeBaseIdOpts = baseEntity ? code`extends ${imp("t:" + baseEntity.entity.idsOptsName + "@./entities.ts")}` : "";
|
|
51
|
+
const maybeBaseFilter = baseEntity ? code`extends ${imp("t:" + baseEntity.entity.filterName + "@./entities.ts")}` : "";
|
|
52
|
+
const maybeBaseGqlFilter = baseEntity ? code`extends ${imp("t:" + baseEntity.entity.graphqlFilterName + "@./entities.ts")}` : "";
|
|
53
|
+
const maybeBaseOrder = baseEntity ? code`extends ${baseEntity.entity.orderType}` : "";
|
|
54
|
+
meta.abstract && code`
|
|
62
55
|
if (this.constructor === ${entity.type} && !(em as any).fakeInstance) {
|
|
63
56
|
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}">;
|
|
57
|
+
}`;
|
|
58
|
+
let maybeOtherTypeChanges;
|
|
59
|
+
if (subEntities.length > 0) maybeOtherTypeChanges = joinCode([code`, `, ...[meta, ...subEntities].map((e) => code`keyof (${FieldsOf}<${e.entity.type}> & ${RelationsOf}<${e.entity.type}>)`)], { on: "|" });
|
|
60
|
+
else maybeOtherTypeChanges = "";
|
|
61
|
+
let maybeOtherLoaded;
|
|
62
|
+
if (baseEntity) maybeOtherLoaded = code`| ${baseEntity.entity.type}`;
|
|
63
|
+
else maybeOtherLoaded = "";
|
|
64
|
+
return code`
|
|
65
|
+
export type ${entity.idName} = ${Flavor}<${idType}, "${baseEntity ? baseEntity.name : entityName}">;
|
|
97
66
|
|
|
98
67
|
${generatePolymorphicTypes(meta)}
|
|
99
68
|
|
|
@@ -126,14 +95,14 @@ function generateEntityCodegenFile(config, dbMeta, meta, scopeMembers = []) {
|
|
|
126
95
|
}
|
|
127
96
|
|
|
128
97
|
export interface ${entity.scopesName} {
|
|
129
|
-
${scopeMembers.map((member) =>
|
|
98
|
+
${scopeMembers.map((member) => code`${member.name}: ${member.type};`)}
|
|
130
99
|
}
|
|
131
100
|
|
|
132
|
-
export type ${entity.scopeName} = ${
|
|
101
|
+
export type ${entity.scopeName} = ${Scope}<${entity.type}, ${entity.scopesName}>;
|
|
133
102
|
|
|
134
|
-
export const ${configName} = new ${
|
|
103
|
+
export const ${configName} = new ${ConfigApi}<${entity.type}, ${contextType}>();
|
|
135
104
|
|
|
136
|
-
export const ${scopeFnName} = ${
|
|
105
|
+
export const ${scopeFnName} = ${newScopeFn}<${entity.type}, ${entity.scopeName}>("${entityName}");
|
|
137
106
|
|
|
138
107
|
${generateDefaultValidationRules(dbMeta, meta, configName)}
|
|
139
108
|
${generateDefaultValues(config, meta, configName)};
|
|
@@ -154,887 +123,829 @@ function generateEntityCodegenFile(config, dbMeta, meta, scopeMembers = []) {
|
|
|
154
123
|
}
|
|
155
124
|
}
|
|
156
125
|
|
|
157
|
-
export abstract class ${entityName}Codegen extends ${base} implements ${
|
|
126
|
+
export abstract class ${entityName}Codegen extends ${base} implements ${ProjectEntity} {
|
|
158
127
|
static readonly tagName = "${tagName}";
|
|
159
|
-
static readonly metadata: ${
|
|
128
|
+
static readonly metadata: ${EntityMetadata}<${entity.type}>;
|
|
160
129
|
|
|
161
130
|
declare readonly __type: {
|
|
162
131
|
${baseEntity ? `0: "${baseEntity.name}",` : ""}
|
|
163
132
|
${baseEntity ? 1 : 0}: "${entityName}",
|
|
164
133
|
};
|
|
165
134
|
|
|
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
|
-
})}
|
|
135
|
+
${relations.filter((r) => r.kind === "abstract").map((r) => {
|
|
136
|
+
return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}${r.line}${maybeComment(r.comment)}`;
|
|
137
|
+
})}
|
|
138
|
+
${relations.filter((r) => r.kind === "concrete").map((r) => {
|
|
139
|
+
return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}readonly ${r.fieldName}: ${r.decl} = ${r.init};${maybeComment(r.comment)}`;
|
|
140
|
+
})}
|
|
141
|
+
${relations.filter((r) => r.kind === "super").map((r) => {
|
|
142
|
+
return code`${relationDocBlock(fieldDocs, r.fieldName, entityName)}declare readonly ${r.fieldName}: ${r.decl};${maybeComment(r.comment)}`;
|
|
143
|
+
})}
|
|
181
144
|
|
|
182
145
|
get id(): ${entity.idName} {
|
|
183
|
-
return this.idMaybe || ${
|
|
146
|
+
return this.idMaybe || ${failNoIdYet}("${entityName}");
|
|
184
147
|
}
|
|
185
148
|
|
|
186
149
|
get idMaybe(): ${entity.idName} | undefined {
|
|
187
150
|
${idMaybeCode}
|
|
188
151
|
}
|
|
189
152
|
|
|
190
|
-
get idTagged(): ${
|
|
191
|
-
return this.idTaggedMaybe || ${
|
|
153
|
+
get idTagged(): ${TaggedId} {
|
|
154
|
+
return this.idTaggedMaybe || ${failNoIdYet}("${entityName}");
|
|
192
155
|
}
|
|
193
156
|
|
|
194
|
-
get idTaggedMaybe(): ${
|
|
195
|
-
return ${
|
|
157
|
+
get idTaggedMaybe(): ${TaggedId} | undefined {
|
|
158
|
+
return ${getField}(this, "id");
|
|
196
159
|
}
|
|
197
160
|
|
|
198
161
|
${primitives}
|
|
199
162
|
|
|
200
|
-
${
|
|
163
|
+
${tsdocComments.entity.setPartial}
|
|
201
164
|
set(opts: Partial<${entity.optsName}>): void {
|
|
202
|
-
${
|
|
165
|
+
${setOpts}(this as any as ${entityName}, opts);
|
|
203
166
|
}
|
|
204
167
|
|
|
205
|
-
${
|
|
206
|
-
setPartial(opts: ${
|
|
207
|
-
${
|
|
168
|
+
${tsdocComments.entity.setPartial}
|
|
169
|
+
setPartial(opts: ${PartialOrNull}<${entity.optsName}>): void {
|
|
170
|
+
${setOpts}(this as any as ${entityName}, opts as ${OptsOf}<${entityName}>, { partial: true });
|
|
208
171
|
}
|
|
209
172
|
|
|
210
|
-
${
|
|
211
|
-
setDeepPartial(opts: ${
|
|
212
|
-
return ${
|
|
173
|
+
${tsdocComments.entity.setDeepPartial}
|
|
174
|
+
setDeepPartial(opts: ${DeepPartialOrNull}<${entityName}>): Promise<void> {
|
|
175
|
+
return ${updatePartial}(this as any as ${entityName}, opts);
|
|
213
176
|
}
|
|
214
177
|
|
|
215
|
-
${
|
|
216
|
-
get changes(): ${
|
|
217
|
-
return ${
|
|
178
|
+
${tsdocComments.entity.changes}
|
|
179
|
+
get changes(): ${Changes}<${entityName}${maybeOtherTypeChanges}> {
|
|
180
|
+
return ${newChangesProxy}(this) as any;
|
|
218
181
|
}
|
|
219
182
|
|
|
220
|
-
${
|
|
183
|
+
${maybeSoftDeleteMethods}
|
|
221
184
|
|
|
222
|
-
${
|
|
223
|
-
load<U, V>(fn: (lens: ${
|
|
224
|
-
return ${
|
|
185
|
+
${tsdocComments.entity.load}
|
|
186
|
+
load<U, V>(fn: (lens: ${Lens}<${entity.type}>) => ${Lens}<U, V>, opts: { sql?: boolean } = {}): Promise<V> {
|
|
187
|
+
return ${loadLens}(this as any as ${entityName}, fn, opts);
|
|
225
188
|
}
|
|
226
189
|
|
|
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 ${
|
|
190
|
+
${tsdocComments.entity.populate}
|
|
191
|
+
populate<const H extends ${LoadHint}<${entityName}>>(hint: H): Promise<${Loaded}<${entityName}, H>>;
|
|
192
|
+
populate<const H extends ${LoadHint}<${entityName}>>(opts: { hint: H, forceReload?: boolean }): Promise<${Loaded}<${entityName}, H>>;
|
|
193
|
+
populate<const H extends ${LoadHint}<${entityName}>, V>(hint: H, fn: (${varName}: Loaded<${entityName}, H>) => V): Promise<V>;
|
|
194
|
+
populate<const H extends ${LoadHint}<${entityName}>, V>(opts: { hint: H, forceReload?: boolean }, fn: (${varName}: Loaded<${entityName}, H>) => V): Promise<V>;
|
|
195
|
+
populate<const H extends ${LoadHint}<${entityName}>, V>(hintOrOpts: any, fn?: (${varName}: Loaded<${entityName}, H>) => V): Promise<${Loaded}<${entityName}, H> | V> {
|
|
233
196
|
return this.em.populate(this as any as ${entityName}, hintOrOpts, fn);
|
|
234
197
|
}
|
|
235
198
|
|
|
236
|
-
${
|
|
237
|
-
isLoaded<const H extends ${
|
|
238
|
-
return ${
|
|
199
|
+
${tsdocComments.entity.isLoaded}
|
|
200
|
+
isLoaded<const H extends ${LoadHint}<${entityName}>>(hint: H): this is ${Loaded}<${entityName}${maybeOtherLoaded}, H> {
|
|
201
|
+
return ${isLoaded}(this as any as ${entityName}, hint);
|
|
239
202
|
}
|
|
240
203
|
|
|
241
|
-
${
|
|
204
|
+
${tsdocComments.entity.toJSON}
|
|
242
205
|
toJSON(): object;
|
|
243
|
-
toJSON<const H extends ${
|
|
206
|
+
toJSON<const H extends ${ToJsonHint}<${entityName}>>(hint: H): Promise<${JsonPayload}<${entityName}, H>>;
|
|
244
207
|
toJSON(hint?: any): object {
|
|
245
|
-
return !hint || typeof hint === "string" ? super.toJSON() : ${
|
|
208
|
+
return !hint || typeof hint === "string" ? super.toJSON() : ${toJSON}(this, hint);
|
|
246
209
|
}
|
|
247
210
|
}
|
|
248
211
|
`;
|
|
249
212
|
}
|
|
250
213
|
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)));
|
|
214
|
+
let { columnDefault } = field;
|
|
215
|
+
if (columnDefault === null) return false;
|
|
216
|
+
columnDefault = columnDefault.toString();
|
|
217
|
+
const fieldType = field.kind === "primitive" ? field.fieldType : "number";
|
|
218
|
+
return fieldType === "number" && !isNaN(parseInt(columnDefault)) || fieldType === "bigint" && !isNaN(parseInt(columnDefault)) || fieldType === "string" && /^'.*'$/.test(columnDefault) || fieldType === "boolean" && ["true", "false"].includes(columnDefault);
|
|
265
219
|
}
|
|
266
220
|
function generatePolymorphicTypes(meta) {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
return [${pf.components.map((c) =>
|
|
271
|
-
}`,
|
|
272
|
-
(0, ts_poet_1.code) `export function is${pf.fieldType}(maybeEntity: unknown): maybeEntity is ${pf.fieldType} {
|
|
273
|
-
return ${symbols_1.isEntity}(maybeEntity) && get${pf.fieldType}Constructors().some((type) => maybeEntity instanceof type);
|
|
221
|
+
return meta.polymorphics.flatMap((pf) => [
|
|
222
|
+
code`export type ${pf.fieldType} = ${pf.components.map((c) => code`| ${c.otherEntity.type}`)};`,
|
|
223
|
+
code`export function get${pf.fieldType}Constructors(): ${MaybeAbstractEntityConstructor}<${pf.fieldType}>[] {
|
|
224
|
+
return [${pf.components.map((c) => code`${c.otherEntity.typeSymbol},`)}];
|
|
274
225
|
}`,
|
|
275
|
-
|
|
226
|
+
code`export function is${pf.fieldType}(maybeEntity: unknown): maybeEntity is ${pf.fieldType} {
|
|
227
|
+
return ${isEntity}(maybeEntity) && get${pf.fieldType}Constructors().some((type) => maybeEntity instanceof type);
|
|
228
|
+
}`
|
|
229
|
+
]);
|
|
276
230
|
}
|
|
277
231
|
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];
|
|
232
|
+
function notSync(field) {
|
|
233
|
+
return "derived" in field && field.derived !== "sync";
|
|
234
|
+
}
|
|
235
|
+
const primitives = meta.primitives.filter((field) => fieldHasDefaultValue(field)).filter(notSync).map(({ fieldName, columnDefault }) => {
|
|
236
|
+
return code`${configName}.setDefault("${fieldName}", ${columnDefault});`;
|
|
237
|
+
});
|
|
238
|
+
const pgEnums = meta.pgEnums.filter((field) => !!field.columnDefault).map(({ fieldName, columnDefault }) => {
|
|
239
|
+
return code`${configName}.setDefault("${fieldName}", ${columnDefault});`;
|
|
240
|
+
});
|
|
241
|
+
const enums = meta.enums.filter((field) => !!field.columnDefault && !field.isArray).filter(notSync).map(({ fieldName, columnDefault, enumRows, enumType, columnName }) => {
|
|
242
|
+
const defaultRow = enumRows.find((r) => r.id === Number(columnDefault)) || fail(`Invalid default value ${columnDefault} for ${meta.tableName}.${columnName}`);
|
|
243
|
+
return code`${configName}.setDefault("${fieldName}", ${enumType}.${pascalCase(defaultRow.code)});`;
|
|
244
|
+
});
|
|
245
|
+
return [
|
|
246
|
+
...primitives,
|
|
247
|
+
...enums,
|
|
248
|
+
...pgEnums
|
|
249
|
+
];
|
|
303
250
|
}
|
|
304
251
|
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;
|
|
252
|
+
const rules = [
|
|
253
|
+
...meta.primitives,
|
|
254
|
+
...meta.enums,
|
|
255
|
+
...meta.manyToOnes,
|
|
256
|
+
...meta.polymorphics
|
|
257
|
+
].filter((p) => p.notNull).map((p) => {
|
|
258
|
+
const { fieldName } = p;
|
|
259
|
+
const isReactive = "derived" in p && p.derived === "async";
|
|
260
|
+
if ("lazy" in p && p.lazy) return code`${configName}.addRule(${newRequiredLazyFieldRule}("${fieldName}"));`;
|
|
261
|
+
else if (isReactive) return code`${configName}.addRule("${fieldName}", ${newRequiredRule}("${fieldName}"));`;
|
|
262
|
+
else return code`${configName}.addRule(${newRequiredRule}("${fieldName}"));`;
|
|
263
|
+
});
|
|
264
|
+
if (meta.stiDiscriminatorField) {
|
|
265
|
+
const field = meta.enums.find((e) => e.fieldName === meta.stiDiscriminatorField) ?? fail("STI field not found");
|
|
266
|
+
rules.push(code`${configName}.addRule(${cannotBeUpdated}("${field.fieldName}"));`);
|
|
267
|
+
}
|
|
268
|
+
const stiEntities = getStiEntities(db.entities);
|
|
269
|
+
if (stiEntities.size > 0) for (const m2o of meta.manyToOnes) {
|
|
270
|
+
const target = stiEntities.get(m2o.otherEntity.name);
|
|
271
|
+
if (target && m2o.otherEntity.name !== target.base.name) rules.push(code`${configName}.addRule("${m2o.fieldName}", ${mustBeSubType}("${m2o.fieldName}"));`);
|
|
272
|
+
}
|
|
273
|
+
if (meta.baseType) meta.manyToOnes.filter((m2o) => meta.baseType?.manyToOnes?.find((o) => o.fieldName === m2o.fieldName && o.otherEntity.name !== m2o.otherEntity.name)).forEach((m2o) => {
|
|
274
|
+
rules.push(code`${configName}.addRule("${m2o.fieldName}", ${mustBeSubType}("${m2o.fieldName}"));`);
|
|
275
|
+
});
|
|
276
|
+
return rules;
|
|
344
277
|
}
|
|
345
|
-
// Make our opts type
|
|
346
278
|
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];
|
|
279
|
+
const primitives = meta.primitives.map((field) => {
|
|
280
|
+
const { fieldName, fieldType, notNull, derived } = field;
|
|
281
|
+
if (derived) return code``;
|
|
282
|
+
return code`${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType}${maybeUnionNull(notNull)};`;
|
|
283
|
+
});
|
|
284
|
+
const enums = meta.enums.map((field) => {
|
|
285
|
+
const { fieldName, enumType, notNull, isArray, derived } = field;
|
|
286
|
+
if (meta.stiDiscriminatorField === fieldName || derived) return code``;
|
|
287
|
+
else if (isArray) return code`${fieldName}?: ${enumType}[];`;
|
|
288
|
+
else return code`${fieldName}${maybeOptionalOrDefault(field)}: ${enumType}${maybeUnionNull(notNull)};`;
|
|
289
|
+
});
|
|
290
|
+
const pgEnums = meta.pgEnums.map((field) => {
|
|
291
|
+
const { fieldName, enumType, notNull } = field;
|
|
292
|
+
return code`${fieldName}${maybeOptionalOrDefault(field)}: ${enumType}${maybeUnionNull(notNull)};`;
|
|
293
|
+
});
|
|
294
|
+
const m2o = meta.manyToOnes.filter(({ derived }) => !derived).filter(({ fieldName }) => !meta.baseType?.manyToOnes.find((o) => o.fieldName === fieldName)).map((field) => {
|
|
295
|
+
const { fieldName, otherEntity, notNull } = field;
|
|
296
|
+
const maybeNull = maybeUnionNull(notNull);
|
|
297
|
+
return code`${fieldName}${maybeOptionalOrDefault(field)}: ${otherEntity.type} | ${otherEntity.idType} ${maybeNull};`;
|
|
298
|
+
});
|
|
299
|
+
const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
|
|
300
|
+
return code`${fieldName}?: ${otherEntity.type} | null;`;
|
|
301
|
+
});
|
|
302
|
+
const o2m = meta.oneToManys.map(({ fieldName, otherEntity }) => {
|
|
303
|
+
return code`${fieldName}?: ${otherEntity.type}[];`;
|
|
304
|
+
});
|
|
305
|
+
const m2m = meta.manyToManys.filter(({ derived }) => !derived).map(({ fieldName, otherEntity }) => {
|
|
306
|
+
return code`${fieldName}?: ${otherEntity.type}[];`;
|
|
307
|
+
});
|
|
308
|
+
const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
|
|
309
|
+
return code`${fieldName}?: ${enumType}[];`;
|
|
310
|
+
});
|
|
311
|
+
const polys = meta.polymorphics.map((field) => {
|
|
312
|
+
const { fieldName, notNull, fieldType } = field;
|
|
313
|
+
return code`${fieldName}${maybeOptionalOrDefault(field)}: ${fieldType};`;
|
|
314
|
+
});
|
|
315
|
+
return [
|
|
316
|
+
...primitives,
|
|
317
|
+
...enums,
|
|
318
|
+
...pgEnums,
|
|
319
|
+
...m2o,
|
|
320
|
+
...polys,
|
|
321
|
+
...o2o,
|
|
322
|
+
...o2m,
|
|
323
|
+
...m2m,
|
|
324
|
+
...m2mEnum
|
|
325
|
+
];
|
|
401
326
|
}
|
|
402
|
-
// Make our fields type
|
|
403
327
|
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
|
-
|
|
328
|
+
const id = code`id: { kind: "primitive"; type: ${idType}; unique: ${true}; nullable: never };`;
|
|
329
|
+
const primitives = meta.primitives.map((field) => {
|
|
330
|
+
const { fieldName, fieldType, notNull, unique, derived } = field;
|
|
331
|
+
return code`${fieldName}: { kind: "primitive"; type: ${fieldType}; unique: ${unique}; nullable: ${undefinedOrNever(notNull)}, derived: ${derived !== false} };`;
|
|
332
|
+
});
|
|
333
|
+
const enums = meta.enums.map((field) => {
|
|
334
|
+
const { fieldName, enumType, notNull, isArray } = field;
|
|
335
|
+
if (isArray) return code`${fieldName}: { kind: "enum"; type: ${enumType}[]; nullable: never };`;
|
|
336
|
+
else return code`${fieldName}: { kind: "enum"; type: ${enumType}; nullable: ${undefinedOrNever(notNull)} };`;
|
|
337
|
+
});
|
|
338
|
+
const pgEnums = meta.pgEnums.map(({ fieldName, enumType, notNull }) => {
|
|
339
|
+
const nullable = undefinedOrNever(notNull);
|
|
340
|
+
return code`${fieldName}: { kind: "enum"; type: ${enumType}; nullable: ${nullable}; native: true };`;
|
|
341
|
+
});
|
|
342
|
+
const m2o = meta.manyToOnes.map(({ fieldName, otherEntity, notNull, derived }) => {
|
|
343
|
+
return code`${fieldName}: { kind: "m2o"; type: ${otherEntity.type}; nullable: ${undefinedOrNever(notNull)}, derived: ${derived !== false} };`;
|
|
344
|
+
});
|
|
345
|
+
const polys = meta.polymorphics.map(({ fieldName, notNull, fieldType }) => {
|
|
346
|
+
return code`${fieldName}: { kind: "poly"; type: ${fieldType}; nullable: ${undefinedOrNever(notNull)} };`;
|
|
347
|
+
});
|
|
348
|
+
const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {
|
|
349
|
+
return code`${fieldName}: { kind: "m2m"; type: ${otherEntity.type} };`;
|
|
350
|
+
});
|
|
351
|
+
const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
|
|
352
|
+
return code`${fieldName}: { kind: "m2mEnum"; type: ${enumType} };`;
|
|
353
|
+
});
|
|
354
|
+
const o2m = meta.oneToManys.map(({ fieldName, otherEntity }) => {
|
|
355
|
+
return code`${fieldName}: { kind: "o2m"; type: ${otherEntity.type} };`;
|
|
356
|
+
});
|
|
357
|
+
const o2o = meta.oneToOnes.map((field) => {
|
|
358
|
+
return code`${field.fieldName}: { kind: "o2o"; type: ${field.otherEntity.type} };`;
|
|
359
|
+
});
|
|
360
|
+
const lo2m = meta.largeOneToManys.map(({ fieldName, otherEntity }) => {
|
|
361
|
+
return code`${fieldName}: { kind: "o2m"; type: ${otherEntity.type} };`;
|
|
362
|
+
});
|
|
363
|
+
return [
|
|
364
|
+
id,
|
|
365
|
+
...primitives,
|
|
366
|
+
...enums,
|
|
367
|
+
...pgEnums,
|
|
368
|
+
...m2o,
|
|
369
|
+
...polys,
|
|
370
|
+
...m2m,
|
|
371
|
+
...m2mEnum,
|
|
372
|
+
...o2m,
|
|
373
|
+
...o2o,
|
|
374
|
+
...lo2m
|
|
375
|
+
];
|
|
442
376
|
}
|
|
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
377
|
function generateOptIdsFields(meta) {
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
378
|
+
const m2o = meta.manyToOnes.filter(({ derived }) => !derived).map(({ fieldName, otherEntity }) => {
|
|
379
|
+
return code`${fieldName}Id?: ${otherEntity.idType} | null;`;
|
|
380
|
+
});
|
|
381
|
+
const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
|
|
382
|
+
return code`${fieldName}Id?: ${otherEntity.idType} | null;`;
|
|
383
|
+
});
|
|
384
|
+
const o2m = meta.oneToManys.map(({ singularName, otherEntity }) => {
|
|
385
|
+
return code`${singularName}Ids?: ${otherEntity.idType}[] | null;`;
|
|
386
|
+
});
|
|
387
|
+
const m2m = meta.manyToManys.filter(({ derived }) => !derived).map(({ singularName, otherEntity }) => {
|
|
388
|
+
return code`${singularName}Ids?: ${otherEntity.idType}[] | null;`;
|
|
389
|
+
});
|
|
390
|
+
const polys = meta.polymorphics.map(({ fieldName, fieldType }) => {
|
|
391
|
+
return code`${fieldName}Id?: ${IdOf}<${fieldType}> | null;`;
|
|
392
|
+
});
|
|
393
|
+
return [
|
|
394
|
+
...m2o,
|
|
395
|
+
...polys,
|
|
396
|
+
...o2o,
|
|
397
|
+
...o2m,
|
|
398
|
+
...m2m
|
|
399
|
+
];
|
|
467
400
|
}
|
|
468
401
|
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];
|
|
402
|
+
const maybeId = meta.baseClassName ? [] : [code`id?: ${ValueFilter}<${meta.entity.idName}, never> | null;`];
|
|
403
|
+
const primitives = meta.primitives.map(({ fieldName, fieldType, notNull }) => {
|
|
404
|
+
if (fieldType === "boolean") return code`${fieldName}?: ${BooleanFilter}<${nullOrNever(notNull)}>;`;
|
|
405
|
+
else return code`${fieldName}?: ${ValueFilter}<${fieldType}, ${nullOrNever(notNull)}>;`;
|
|
406
|
+
});
|
|
407
|
+
const enums = meta.enums.map(({ fieldName, enumType, notNull, isArray }) => {
|
|
408
|
+
return code`${fieldName}?: ${ValueFilter}<${enumType}${isArray ? "[]" : ""}, ${nullOrNever(notNull)}>;`;
|
|
409
|
+
});
|
|
410
|
+
const pgEnums = meta.pgEnums.map(({ fieldName, enumType, notNull }) => {
|
|
411
|
+
return code`${fieldName}?: ${ValueFilter}<${enumType}, ${nullOrNever(notNull)}>;`;
|
|
412
|
+
});
|
|
413
|
+
const m2o = meta.manyToOnes.flatMap(({ fieldName, otherEntity, notNull }) => {
|
|
414
|
+
const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);
|
|
415
|
+
return [code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, ${nullOrNever(notNull)}>;`, ...otherMeta.subTypes.map((st) => {
|
|
416
|
+
return code`${fieldName}${st.name}?: ${EntityFilter}<${st.entity.type}, ${st.entity.idType}, ${FilterOf}<${st.entity.type}>, ${nullOrNever(notNull)}>;`;
|
|
417
|
+
})];
|
|
418
|
+
});
|
|
419
|
+
const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
|
|
420
|
+
return code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`;
|
|
421
|
+
});
|
|
422
|
+
const o2m = meta.oneToManys.flatMap(({ fieldName, otherEntity, otherColumnNotNull }) => {
|
|
423
|
+
const otherMeta = metasByName[otherEntity.name] ?? fail(`Could not find metadata for ${otherEntity.name}`);
|
|
424
|
+
return [code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`, ...otherMeta.subTypes.map((st) => {
|
|
425
|
+
return code`${fieldName}${st.name}?: ${EntityFilter}<${st.entity.type}, ${st.entity.idType}, ${FilterOf}<${st.entity.type}>, ${nullOrNever(otherColumnNotNull)}>;`;
|
|
426
|
+
})];
|
|
427
|
+
});
|
|
428
|
+
const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {
|
|
429
|
+
return code`${fieldName}?: ${EntityFilter}<${otherEntity.type}, ${otherEntity.idType}, ${FilterOf}<${otherEntity.type}>, null | undefined>;`;
|
|
430
|
+
});
|
|
431
|
+
const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
|
|
432
|
+
return code`${fieldName}?: ${ValueFilter}<${enumType}, null | undefined>;`;
|
|
433
|
+
});
|
|
434
|
+
const polys = meta.polymorphics.flatMap(({ fieldName, fieldType, components, notNull }) => {
|
|
435
|
+
return [code`${fieldName}?: ${EntityFilter}<${fieldType}, ${IdOf}<${fieldType}>, never, ${nullOrNever(notNull)}>;`, ...components.map((comp) => {
|
|
436
|
+
const { type } = comp.otherEntity;
|
|
437
|
+
return code`${fieldName}${type}?: ${EntityFilter}<${type}, ${IdOf}<${type}>, ${FilterOf}<${type}>, null>;`;
|
|
438
|
+
})];
|
|
439
|
+
});
|
|
440
|
+
return [
|
|
441
|
+
...maybeId,
|
|
442
|
+
...primitives,
|
|
443
|
+
...enums,
|
|
444
|
+
...pgEnums,
|
|
445
|
+
...m2o,
|
|
446
|
+
...o2o,
|
|
447
|
+
...o2m,
|
|
448
|
+
...m2m,
|
|
449
|
+
...m2mEnum,
|
|
450
|
+
...polys
|
|
451
|
+
];
|
|
524
452
|
}
|
|
525
453
|
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
|
-
|
|
454
|
+
const maybeId = meta.baseClassName ? [] : [code`id?: ${ValueGraphQLFilter}<${meta.entity.idName}>;`];
|
|
455
|
+
const primitives = meta.primitives.map(({ fieldName, fieldType }) => {
|
|
456
|
+
if (fieldType === "boolean") return code`${fieldName}?: ${BooleanGraphQLFilter};`;
|
|
457
|
+
else return code`${fieldName}?: ${ValueGraphQLFilter}<${fieldType}>;`;
|
|
458
|
+
});
|
|
459
|
+
const enums = meta.enums.map(({ fieldName, enumType, isArray }) => {
|
|
460
|
+
return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}${isArray ? "[]" : ""}>;`;
|
|
461
|
+
});
|
|
462
|
+
const pgEnums = meta.pgEnums.map(({ fieldName, enumType }) => {
|
|
463
|
+
return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}>;`;
|
|
464
|
+
});
|
|
465
|
+
const m2o = meta.manyToOnes.flatMap(({ fieldName, otherEntity, notNull }) => {
|
|
466
|
+
const otherMeta = metasByName[otherEntity.name];
|
|
467
|
+
return [
|
|
468
|
+
code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, ${nullOrNever(notNull)}>;`,
|
|
469
|
+
code`${fieldName}Id?: ${ValueGraphQLFilter}<${otherEntity.idType}>;`,
|
|
470
|
+
...otherMeta.subTypes.map((st) => {
|
|
471
|
+
return code`${fieldName}${st.name}?: ${EntityGraphQLFilter}<${st.entity.type}, ${st.entity.idType}, ${GraphQLFilterOf}<${st.entity.type}>, ${nullOrNever(notNull)}>;`;
|
|
472
|
+
})
|
|
473
|
+
];
|
|
474
|
+
});
|
|
475
|
+
const o2o = meta.oneToOnes.map(({ fieldName, otherEntity }) => {
|
|
476
|
+
return code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${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}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`, ...otherMeta.subTypes.map((st) => {
|
|
481
|
+
return code`${fieldName}${st.name}?: ${EntityGraphQLFilter}<${st.entity.type}, ${st.entity.idType}, ${GraphQLFilterOf}<${st.entity.type}>, ${nullOrNever(otherColumnNotNull)}>;`;
|
|
482
|
+
})];
|
|
483
|
+
});
|
|
484
|
+
const m2m = meta.manyToManys.map(({ fieldName, otherEntity }) => {
|
|
485
|
+
return code`${fieldName}?: ${EntityGraphQLFilter}<${otherEntity.type}, ${otherEntity.idType}, ${GraphQLFilterOf}<${otherEntity.type}>, null | undefined>;`;
|
|
486
|
+
});
|
|
487
|
+
const m2mEnum = meta.manyToManyEnums.map(({ fieldName, enumType }) => {
|
|
488
|
+
return code`${fieldName}?: ${ValueGraphQLFilter}<${enumType}>;`;
|
|
489
|
+
});
|
|
490
|
+
const polys = meta.polymorphics.flatMap(({ fieldName, fieldType, components, notNull }) => {
|
|
491
|
+
return [
|
|
492
|
+
code`${fieldName}?: ${EntityGraphQLFilter}<${fieldType}, ${IdOf}<${fieldType}>, never, ${nullOrNever(notNull)}>;`,
|
|
493
|
+
code`${fieldName}Id?: ${ValueGraphQLFilter}<${IdOf}<${fieldType}>>;`,
|
|
494
|
+
...components.map((comp) => {
|
|
495
|
+
const { type } = comp.otherEntity;
|
|
496
|
+
return code`${fieldName}${type}?: ${EntityGraphQLFilter}<${type}, ${IdOf}<${type}>, ${FilterOf}<${type}>, null>;`;
|
|
497
|
+
})
|
|
498
|
+
];
|
|
499
|
+
});
|
|
500
|
+
return [
|
|
501
|
+
...maybeId,
|
|
502
|
+
...primitives,
|
|
503
|
+
...enums,
|
|
504
|
+
...pgEnums,
|
|
505
|
+
...m2o,
|
|
506
|
+
...o2o,
|
|
507
|
+
...o2m,
|
|
508
|
+
...m2m,
|
|
509
|
+
...m2mEnum,
|
|
510
|
+
...polys
|
|
511
|
+
];
|
|
581
512
|
}
|
|
582
513
|
function generateOrderFields(meta) {
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
514
|
+
const maybeId = meta.baseClassName ? [] : [code`id?: ${OrderBy};`];
|
|
515
|
+
const primitives = meta.primitives.map(({ fieldName }) => {
|
|
516
|
+
return code`${fieldName}?: ${OrderBy};`;
|
|
517
|
+
});
|
|
518
|
+
const enums = meta.enums.map(({ fieldName }) => {
|
|
519
|
+
return code`${fieldName}?: ${OrderBy};`;
|
|
520
|
+
});
|
|
521
|
+
const pgEnums = meta.pgEnums.map(({ fieldName }) => {
|
|
522
|
+
return code`${fieldName}?: ${OrderBy};`;
|
|
523
|
+
});
|
|
524
|
+
const m2o = meta.manyToOnes.map(({ fieldName, otherEntity }) => {
|
|
525
|
+
return code`${fieldName}?: ${otherEntity.orderType};`;
|
|
526
|
+
});
|
|
527
|
+
return [
|
|
528
|
+
...maybeId,
|
|
529
|
+
...primitives,
|
|
530
|
+
...enums,
|
|
531
|
+
...pgEnums,
|
|
532
|
+
...m2o
|
|
533
|
+
];
|
|
597
534
|
}
|
|
598
535
|
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];
|
|
536
|
+
function withName(fieldName) {
|
|
537
|
+
return `with${fieldName[0].toUpperCase() + fieldName.substring(1)}`;
|
|
538
|
+
}
|
|
539
|
+
const primitives = meta.primitives.filter((f) => f.derived === "async").map((field) => {
|
|
540
|
+
const { fieldName, fieldType, notNull } = field;
|
|
541
|
+
return code`${withName(fieldName)}?: ${fieldType}${maybeUnionNull(notNull)};`;
|
|
542
|
+
});
|
|
543
|
+
const enums = meta.enums.filter((f) => f.derived === "async").map((field) => {
|
|
544
|
+
const { fieldName, enumType, notNull, isArray } = field;
|
|
545
|
+
if (isArray) return code`${withName(fieldName)}?: ${enumType}[];`;
|
|
546
|
+
else return code`${withName(fieldName)}?: ${enumType}${maybeUnionNull(notNull)};`;
|
|
547
|
+
});
|
|
548
|
+
return [...primitives, ...enums];
|
|
620
549
|
}
|
|
621
|
-
function createPrimitives(meta, entity) {
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
abstract readonly ${fieldName}: ${
|
|
550
|
+
function createPrimitives(meta, entity, fieldDocs) {
|
|
551
|
+
return meta.primitives.map((p) => {
|
|
552
|
+
const { fieldName, fieldType, notNull } = p;
|
|
553
|
+
const maybeOptional = notNull ? "" : " | undefined";
|
|
554
|
+
if (p.lazy) return code``;
|
|
555
|
+
let getter;
|
|
556
|
+
if (p.derived === "async") getter = code`
|
|
557
|
+
abstract readonly ${fieldName}: ${ReactiveField}<${entity.name}, ${p.fieldType}${maybeOptional}>;
|
|
629
558
|
`;
|
|
630
|
-
|
|
631
|
-
else if (p.derived === "sync") {
|
|
632
|
-
getter = (0, ts_poet_1.code) `
|
|
559
|
+
else if (p.derived === "sync") getter = code`
|
|
633
560
|
abstract get ${fieldName}(): ${fieldType}${maybeOptional};
|
|
634
561
|
`;
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
get ${fieldName}(): ${symbols_1.Zod}.output<typeof ${p.zodSchema}>${maybeOptional} {
|
|
639
|
-
return ${symbols_1.getField}(this, "${fieldName}");
|
|
562
|
+
else if (p.zodSchema) getter = code`
|
|
563
|
+
get ${fieldName}(): ${Zod}.output<typeof ${p.zodSchema}>${maybeOptional} {
|
|
564
|
+
return ${getField}(this, "${fieldName}");
|
|
640
565
|
}
|
|
641
566
|
`;
|
|
642
|
-
|
|
643
|
-
else {
|
|
644
|
-
getter = (0, ts_poet_1.code) `
|
|
567
|
+
else getter = code`
|
|
645
568
|
get ${fieldName}(): ${fieldType}${maybeOptional} {
|
|
646
|
-
return ${
|
|
569
|
+
return ${getField}(this, "${fieldName}");
|
|
647
570
|
}
|
|
648
571
|
`;
|
|
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});
|
|
572
|
+
let setter;
|
|
573
|
+
const paramName = keywords.includes(fieldName) ? "value" : fieldName;
|
|
574
|
+
if (p.protected) setter = code`
|
|
575
|
+
protected set${pascalCase(fieldName)}(${paramName}: ${fieldType}${maybeOptional}) {
|
|
576
|
+
${setField}(this, "${fieldName}", ${paramName});
|
|
662
577
|
}
|
|
663
578
|
`;
|
|
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) `
|
|
579
|
+
else if (p.derived) setter = "";
|
|
580
|
+
else if (p.superstruct) setter = code`
|
|
672
581
|
set ${fieldName}(value: ${fieldType}${maybeOptional}) {
|
|
673
582
|
if (value) {
|
|
674
|
-
${
|
|
583
|
+
${SSAssert}(value, ${p.superstruct});
|
|
675
584
|
}
|
|
676
|
-
${
|
|
585
|
+
${setField}(this, "${fieldName}", value);
|
|
677
586
|
}
|
|
678
587
|
`;
|
|
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}) {
|
|
588
|
+
else if (p.zodSchema) setter = code`
|
|
589
|
+
set ${fieldName}(value: ${Zod}.input<typeof ${p.zodSchema}>${maybeOptional}) {
|
|
685
590
|
if (value) {
|
|
686
|
-
${
|
|
591
|
+
${setField}(this, "${fieldName}", ${p.zodSchema}.parse(value));
|
|
687
592
|
} else {
|
|
688
|
-
${
|
|
593
|
+
${setField}(this, "${fieldName}", value);
|
|
689
594
|
}
|
|
690
595
|
}
|
|
691
596
|
`;
|
|
692
|
-
|
|
693
|
-
else {
|
|
694
|
-
setter = (0, ts_poet_1.code) `
|
|
597
|
+
else setter = code`
|
|
695
598
|
set ${fieldName}(${paramName}: ${fieldType}${maybeOptional}) {
|
|
696
|
-
${
|
|
599
|
+
${setField}(this, "${fieldName}", ${paramName});
|
|
697
600
|
}
|
|
698
601
|
`;
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
});
|
|
702
|
-
return primitives;
|
|
602
|
+
return code`${fieldDocBlock(fieldDocs, fieldName, entity.name)}${getter} ${setter}`;
|
|
603
|
+
});
|
|
703
604
|
}
|
|
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}>;
|
|
605
|
+
function createRegularEnums(meta, entity, fieldDocs) {
|
|
606
|
+
return meta.enums.filter((e) => !e.isArray).flatMap((e) => {
|
|
607
|
+
const { fieldName, enumType, enumDetailType, enumDetailsType, notNull, enumRows, derived } = e;
|
|
608
|
+
const maybeOptional = notNull ? "" : " | undefined";
|
|
609
|
+
const getByCode = code`${enumDetailType}.getByCode(this.${fieldName})`;
|
|
610
|
+
let getter;
|
|
611
|
+
if (derived === "async") getter = code`
|
|
612
|
+
abstract readonly ${fieldName}: ${ReactiveField}<${entity.name}, ${enumType}${maybeOptional}>;
|
|
715
613
|
`;
|
|
716
|
-
|
|
717
|
-
else if (derived === "sync") {
|
|
718
|
-
getter = (0, ts_poet_1.code) `
|
|
614
|
+
else if (derived === "sync") getter = code`
|
|
719
615
|
abstract get ${fieldName}(): ${enumType}${maybeOptional};
|
|
720
616
|
`;
|
|
721
|
-
|
|
722
|
-
else {
|
|
723
|
-
getter = (0, ts_poet_1.code) `
|
|
617
|
+
else getter = code`
|
|
724
618
|
get ${fieldName}(): ${enumType}${maybeOptional} {
|
|
725
|
-
return ${
|
|
619
|
+
return ${getField}(this, "${fieldName}");
|
|
726
620
|
}
|
|
727
621
|
|
|
728
622
|
get ${fieldName}Details(): ${enumDetailsType}${maybeOptional} {
|
|
729
|
-
return ${notNull ? getByCode :
|
|
623
|
+
return ${notNull ? getByCode : code`this.${fieldName} ? ${getByCode} : undefined`};
|
|
730
624
|
}
|
|
731
625
|
`;
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
setter = (0, ts_poet_1.code) ``;
|
|
736
|
-
}
|
|
737
|
-
else {
|
|
738
|
-
setter = (0, ts_poet_1.code) `
|
|
626
|
+
let setter;
|
|
627
|
+
if (derived) setter = code``;
|
|
628
|
+
else setter = code`
|
|
739
629
|
set ${fieldName}(${fieldName}: ${enumType}${maybeOptional}) {
|
|
740
|
-
${
|
|
630
|
+
${setField}(this, "${fieldName}", ${fieldName});
|
|
741
631
|
}
|
|
742
632
|
`;
|
|
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)};
|
|
633
|
+
const codes = new Set(enumRows.map((r) => r.code));
|
|
634
|
+
const shouldPrefixAccessors = meta.enums.filter((other) => other !== e).some((other) => other.enumRows.some((r) => codes.has(r.code)));
|
|
635
|
+
const accessors = enumRows.map((row) => code`
|
|
636
|
+
get is${shouldPrefixAccessors ? pascalCase(fieldName) : ""}${pascalCase(row.code)}(): boolean {
|
|
637
|
+
return ${getField}(this, "${fieldName}") === ${enumType}.${pascalCase(row.code)};
|
|
751
638
|
}
|
|
752
639
|
`);
|
|
753
|
-
|
|
754
|
-
|
|
640
|
+
return [
|
|
641
|
+
code`${fieldDocBlock(fieldDocs, fieldName, entity.name)}${getter}`,
|
|
642
|
+
setter,
|
|
643
|
+
...accessors
|
|
644
|
+
];
|
|
645
|
+
});
|
|
755
646
|
}
|
|
756
|
-
function createArrayEnums(meta) {
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
const { fieldName, enumType, enumDetailType, enumDetailsType, enumRows } = e;
|
|
761
|
-
const getter = (0, ts_poet_1.code) `
|
|
647
|
+
function createArrayEnums(meta, fieldDocs) {
|
|
648
|
+
return meta.enums.filter((e) => e.isArray).flatMap((e) => {
|
|
649
|
+
const { fieldName, enumType, enumDetailType, enumDetailsType, enumRows } = e;
|
|
650
|
+
const getter = code`
|
|
762
651
|
get ${fieldName}(): ${enumType}[] {
|
|
763
|
-
return ${
|
|
652
|
+
return ${getField}(this, "${fieldName}") || [];
|
|
764
653
|
}
|
|
765
654
|
|
|
766
655
|
get ${fieldName}Details(): ${enumDetailsType}[] {
|
|
767
656
|
return this.${fieldName}.map(code => ${enumDetailType}.getByCode(code));
|
|
768
657
|
}
|
|
769
658
|
`;
|
|
770
|
-
|
|
659
|
+
const setter = code`
|
|
771
660
|
set ${fieldName}(${fieldName}: ${enumType}[]) {
|
|
772
|
-
${
|
|
661
|
+
${setField}(this, "${fieldName}", ${fieldName});
|
|
773
662
|
}
|
|
774
663
|
`;
|
|
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)});
|
|
664
|
+
const codes = new Set(enumRows.map((r) => r.code));
|
|
665
|
+
const shouldPrefixAccessors = meta.enums.filter((other) => other !== e).some((other) => other.enumRows.some((r) => codes.has(r.code)));
|
|
666
|
+
const accessors = enumRows.map((row) => code`
|
|
667
|
+
get is${shouldPrefixAccessors ? pascalCase(fieldName) : ""}${pascalCase(row.code)}(): boolean {
|
|
668
|
+
return this.${fieldName}.includes(${enumType}.${pascalCase(row.code)});
|
|
782
669
|
}
|
|
783
670
|
`);
|
|
784
|
-
|
|
785
|
-
|
|
671
|
+
return [
|
|
672
|
+
code`${fieldDocBlock(fieldDocs, fieldName, meta.entity.name)}${getter}`,
|
|
673
|
+
setter,
|
|
674
|
+
...accessors
|
|
675
|
+
];
|
|
676
|
+
});
|
|
786
677
|
}
|
|
787
|
-
function createPgEnums(meta) {
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
678
|
+
function createPgEnums(meta, fieldDocs) {
|
|
679
|
+
return meta.pgEnums.flatMap((e) => {
|
|
680
|
+
const { fieldName, enumType, enumValues, notNull } = e;
|
|
681
|
+
const maybeOptional = notNull ? "" : " | undefined";
|
|
682
|
+
const getter = code`
|
|
792
683
|
get ${fieldName}(): ${enumType}${maybeOptional} {
|
|
793
|
-
return ${
|
|
684
|
+
return ${getField}(this, "${fieldName}");
|
|
794
685
|
}
|
|
795
686
|
`;
|
|
796
|
-
|
|
687
|
+
const setter = code`
|
|
797
688
|
set ${fieldName}(${fieldName}: ${enumType}${maybeOptional}) {
|
|
798
|
-
${
|
|
689
|
+
${setField}(this, "${fieldName}", ${fieldName});
|
|
799
690
|
}
|
|
800
691
|
`;
|
|
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)};
|
|
692
|
+
const codes = new Set(enumValues);
|
|
693
|
+
const shouldPrefixAccessors = meta.pgEnums.filter((other) => other !== e).some((other) => other.enumValues.some((r) => codes.has(r)));
|
|
694
|
+
const accessors = enumValues.map((row) => code`
|
|
695
|
+
get is${shouldPrefixAccessors ? pascalCase(fieldName) : ""}${pascalCase(row)}(): boolean {
|
|
696
|
+
return this.${fieldName} === ${enumType}.${pascalCase(row)};
|
|
808
697
|
}
|
|
809
698
|
`);
|
|
810
|
-
|
|
811
|
-
|
|
699
|
+
return [
|
|
700
|
+
code`${fieldDocBlock(fieldDocs, fieldName, meta.entity.name)}${getter}`,
|
|
701
|
+
setter,
|
|
702
|
+
...accessors
|
|
703
|
+
];
|
|
704
|
+
});
|
|
812
705
|
}
|
|
813
706
|
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}(
|
|
707
|
+
const m2o = meta.manyToOnes.map((m2o) => {
|
|
708
|
+
const { fieldName, otherEntity, otherFieldName, notNull } = m2o;
|
|
709
|
+
const maybeOptional = notNull ? "never" : "undefined";
|
|
710
|
+
if (m2o.derived === "async") return {
|
|
711
|
+
kind: "abstract",
|
|
712
|
+
fieldName,
|
|
713
|
+
line: code`abstract readonly ${fieldName}: ${ReactiveReference}<${entity.name}, ${otherEntity.type}, ${maybeOptional}>;`
|
|
714
|
+
};
|
|
715
|
+
return {
|
|
716
|
+
kind: "concrete",
|
|
717
|
+
fieldName,
|
|
718
|
+
decl: code`${ManyToOneReference}<${entity.type}, ${otherEntity.type}, ${maybeOptional}>`,
|
|
719
|
+
init: code`${hasOne}()`
|
|
720
|
+
};
|
|
721
|
+
});
|
|
722
|
+
const m2oBase = meta.baseType?.manyToOnes.filter((m2o) => !meta.manyToOnes.find((o) => o.fieldName === m2o.fieldName)).filter((m2o) => m2o.derived !== "async").map((m2o) => {
|
|
723
|
+
const { fieldName, otherEntity, notNull } = m2o;
|
|
724
|
+
const maybeOptional = notNull ? "never" : "undefined";
|
|
725
|
+
return {
|
|
726
|
+
kind: "super",
|
|
727
|
+
fieldName,
|
|
728
|
+
decl: code`${ManyToOneReference}<${entity.type}, ${otherEntity.type}, ${maybeOptional}>`
|
|
729
|
+
};
|
|
730
|
+
}) ?? [];
|
|
731
|
+
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) => {
|
|
732
|
+
const { fieldName: m2oName, otherFieldName, otherEntity } = m2o;
|
|
733
|
+
const parentsField = `${plural(m2oName)}Recursive`;
|
|
734
|
+
const childrenField = meta.oneToOnes.find((o2o) => o2o.fieldName === otherFieldName) ? `${plural(otherFieldName)}Recursive` : `${otherFieldName}Recursive`;
|
|
735
|
+
return [{
|
|
736
|
+
kind: "concrete",
|
|
737
|
+
fieldName: parentsField,
|
|
738
|
+
decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,
|
|
739
|
+
init: code`${hasRecursiveParents}("${m2oName}", "${childrenField}")`
|
|
740
|
+
}, {
|
|
741
|
+
kind: "concrete",
|
|
742
|
+
fieldName: childrenField,
|
|
743
|
+
decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,
|
|
744
|
+
init: code`${hasRecursiveChildren}("${otherFieldName}", "${parentsField}")`
|
|
745
|
+
}];
|
|
746
|
+
});
|
|
747
|
+
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) => {
|
|
748
|
+
const { fieldName, otherFieldName, otherEntity } = m2m;
|
|
749
|
+
return {
|
|
750
|
+
kind: "concrete",
|
|
751
|
+
fieldName: `${fieldName}Recursive`,
|
|
752
|
+
decl: code`${ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,
|
|
753
|
+
init: code`${hasRecursiveM2m}("${fieldName}", "${otherFieldName}Recursive")`
|
|
754
|
+
};
|
|
755
|
+
});
|
|
756
|
+
return [
|
|
757
|
+
meta.oneToManys.map((o2m) => {
|
|
758
|
+
const { fieldName, otherEntity } = o2m;
|
|
759
|
+
return {
|
|
760
|
+
kind: "concrete",
|
|
761
|
+
fieldName,
|
|
762
|
+
decl: code`${Collection}<${entity.type}, ${otherEntity.type}>`,
|
|
763
|
+
init: code`${hasMany}()`
|
|
764
|
+
};
|
|
765
|
+
}),
|
|
766
|
+
meta.baseType?.oneToManys.filter((o2m) => !meta.oneToManys.find((o) => o.fieldName === o2m.fieldName)).map((o2m) => {
|
|
767
|
+
const { fieldName, otherEntity } = o2m;
|
|
768
|
+
return {
|
|
769
|
+
kind: "super",
|
|
770
|
+
fieldName,
|
|
771
|
+
decl: code`${Collection}<${entity.type}, ${otherEntity.type}>`
|
|
772
|
+
};
|
|
773
|
+
}) ?? [],
|
|
774
|
+
meta.largeOneToManys.map((o2m) => {
|
|
775
|
+
const { fieldName, otherEntity } = o2m;
|
|
776
|
+
return {
|
|
777
|
+
kind: "concrete",
|
|
778
|
+
fieldName,
|
|
779
|
+
decl: code`${LargeCollection}<${entity.type}, ${otherEntity.type}>`,
|
|
780
|
+
init: code`${hasLargeMany}()`
|
|
781
|
+
};
|
|
782
|
+
}),
|
|
783
|
+
m2o,
|
|
784
|
+
m2oBase,
|
|
785
|
+
m2oRecursive,
|
|
786
|
+
m2mRecursive,
|
|
787
|
+
meta.oneToOnes.map((o2o) => {
|
|
788
|
+
const { fieldName, otherEntity } = o2o;
|
|
789
|
+
return {
|
|
790
|
+
kind: "concrete",
|
|
791
|
+
fieldName,
|
|
792
|
+
decl: code`${OneToOneReference}<${entity.type}, ${otherEntity.type}>`,
|
|
793
|
+
init: code`${hasOneToOne}()`
|
|
794
|
+
};
|
|
795
|
+
}),
|
|
796
|
+
meta.baseType?.oneToOnes.map((o2o) => {
|
|
797
|
+
const { fieldName, otherEntity } = o2o;
|
|
798
|
+
return {
|
|
799
|
+
kind: "super",
|
|
800
|
+
fieldName,
|
|
801
|
+
decl: code`${OneToOneReference}<${entity.type}, ${otherEntity.type}>`
|
|
802
|
+
};
|
|
803
|
+
}) ?? [],
|
|
804
|
+
meta.manyToManys.map((m2m) => {
|
|
805
|
+
const { fieldName, otherEntity } = m2m;
|
|
806
|
+
const comment = `// ${m2m.joinTableName} ${m2m.columnName} ${m2m.otherColumnName}`;
|
|
807
|
+
if (m2m.derived === "async") return {
|
|
808
|
+
kind: "abstract",
|
|
809
|
+
fieldName,
|
|
810
|
+
line: code`abstract readonly ${fieldName}: ${ReactiveManyToMany}<${entity.name}, ${otherEntity.type}>;`,
|
|
811
|
+
comment
|
|
812
|
+
};
|
|
813
|
+
else if (m2m.derived === "otherSide") return {
|
|
814
|
+
kind: "concrete",
|
|
815
|
+
fieldName,
|
|
816
|
+
decl: code`${ReactiveManyToManyOtherSide}<${entity.type}, ${otherEntity.type}>`,
|
|
817
|
+
init: code`${hasReactiveManyToManyOtherSide}()`,
|
|
818
|
+
comment
|
|
819
|
+
};
|
|
820
|
+
else if (!m2m.derived) return {
|
|
821
|
+
kind: "concrete",
|
|
822
|
+
fieldName,
|
|
823
|
+
decl: code`${Collection}<${entity.type}, ${otherEntity.type}>`,
|
|
824
|
+
init: code`${hasManyToMany}()`,
|
|
825
|
+
comment
|
|
826
|
+
};
|
|
827
|
+
else assertNever(m2m.derived);
|
|
828
|
+
}),
|
|
829
|
+
meta.baseType?.manyToManys.filter((m2m) => !m2m.derived).map((m2m) => {
|
|
830
|
+
const { fieldName, otherEntity } = m2m;
|
|
831
|
+
return {
|
|
832
|
+
kind: "super",
|
|
833
|
+
fieldName,
|
|
834
|
+
decl: code`${Collection}<${entity.type}, ${otherEntity.type}>`
|
|
835
|
+
};
|
|
836
|
+
}) ?? [],
|
|
837
|
+
meta.manyToManyEnums.map((m2m) => {
|
|
838
|
+
const { fieldName, enumType } = m2m;
|
|
839
|
+
const comment = `// ${m2m.joinTableName} ${m2m.columnName} ${m2m.otherColumnName}`;
|
|
840
|
+
return {
|
|
841
|
+
kind: "concrete",
|
|
842
|
+
fieldName,
|
|
843
|
+
decl: code`${EnumCollection}<${entity.type}, ${enumType}>`,
|
|
844
|
+
init: code`${hasEnumCollection}()`,
|
|
845
|
+
comment
|
|
846
|
+
};
|
|
847
|
+
}),
|
|
848
|
+
meta.baseType?.manyToManyEnums.map((m2m) => {
|
|
849
|
+
const { fieldName, enumType } = m2m;
|
|
850
|
+
return {
|
|
851
|
+
kind: "super",
|
|
852
|
+
fieldName,
|
|
853
|
+
decl: code`${EnumCollection}<${entity.type}, ${enumType}>`
|
|
854
|
+
};
|
|
855
|
+
}) ?? [],
|
|
856
|
+
meta.largeManyToManys.map((m2m) => {
|
|
857
|
+
const { joinTableName, fieldName, columnName, otherEntity, otherFieldName, otherColumnName } = m2m;
|
|
858
|
+
return {
|
|
859
|
+
kind: "concrete",
|
|
860
|
+
fieldName,
|
|
861
|
+
decl: code`${LargeCollection}<${entity.type}, ${otherEntity.type}>`,
|
|
862
|
+
init: code`
|
|
863
|
+
${hasLargeManyToMany}(
|
|
972
864
|
"${joinTableName}",
|
|
973
865
|
"${columnName}",
|
|
974
866
|
"${otherFieldName}",
|
|
975
867
|
"${otherColumnName}",
|
|
976
868
|
${m2m.hasJoinTableId},
|
|
977
869
|
);
|
|
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();
|
|
870
|
+
`
|
|
871
|
+
};
|
|
872
|
+
}),
|
|
873
|
+
meta.polymorphics.map((p) => {
|
|
874
|
+
const { fieldName, notNull, fieldType } = p;
|
|
875
|
+
const maybeOptional = notNull ? "never" : "undefined";
|
|
876
|
+
return {
|
|
877
|
+
kind: "concrete",
|
|
878
|
+
fieldName,
|
|
879
|
+
decl: code`${PolymorphicReference}<${entity.type}, ${fieldType}, ${maybeOptional}>`,
|
|
880
|
+
init: code`${hasOnePolymorphic}()`
|
|
881
|
+
};
|
|
882
|
+
}),
|
|
883
|
+
meta.primitives.filter((p) => p.lazy).map((p) => {
|
|
884
|
+
const { fieldName, fieldType, notNull } = p;
|
|
885
|
+
const maybeOptional = notNull ? "" : " | undefined";
|
|
886
|
+
return {
|
|
887
|
+
kind: "concrete",
|
|
888
|
+
fieldName,
|
|
889
|
+
decl: code`${LazyField}<${entity.type}, ${fieldType}${maybeOptional}>`,
|
|
890
|
+
init: code`${hasLazyField}()`
|
|
891
|
+
};
|
|
892
|
+
})
|
|
893
|
+
].flat();
|
|
1006
894
|
}
|
|
1007
895
|
/** Makes the field required if there is a `NOT NULL` and no db-or-config default. */
|
|
1008
896
|
function maybeOptionalOrDefault(field) {
|
|
1009
|
-
|
|
1010
|
-
|
|
897
|
+
const hasDefault = field.kind !== "m2o" && field.kind !== "poly" && fieldHasDefaultValue(field) || field.hasConfigDefault;
|
|
898
|
+
return !field.notNull || hasDefault ? "?" : "";
|
|
1011
899
|
}
|
|
1012
900
|
function maybeUnionNull(notNull) {
|
|
1013
|
-
|
|
1014
|
-
}
|
|
1015
|
-
function maybeUndefined(notNull) {
|
|
1016
|
-
return notNull ? "" : " | undefined";
|
|
901
|
+
return notNull ? "" : " | null";
|
|
1017
902
|
}
|
|
1018
903
|
function undefinedOrNever(notNull) {
|
|
1019
|
-
|
|
904
|
+
return notNull ? "never" : "undefined";
|
|
1020
905
|
}
|
|
1021
906
|
function nullOrNever(notNull) {
|
|
1022
|
-
|
|
907
|
+
return notNull ? "never" : "null";
|
|
908
|
+
}
|
|
909
|
+
/** Returns the nowUTC call for the deleted-at field's generated timestamp type. */
|
|
910
|
+
function nowUTCCall(config, field) {
|
|
911
|
+
if (!config.temporal) return code`${nowUTC}()`;
|
|
912
|
+
switch (field.columnType) {
|
|
913
|
+
case "date": return code`${nowUTC}("plainDate")`;
|
|
914
|
+
case "timestamp without time zone": return code`${nowUTC}("plainDateTime")`;
|
|
915
|
+
case "timestamp with time zone": return code`${nowUTC}("zonedDateTime")`;
|
|
916
|
+
default: return fail(`Unsupported deleted-at column type ${field.columnType}`);
|
|
917
|
+
}
|
|
1023
918
|
}
|
|
1024
919
|
/** Prefixes the comment with a newline, so it gets its own line. */
|
|
1025
920
|
function maybeComment(comment) {
|
|
1026
|
-
|
|
921
|
+
return comment ? ` ${comment}\n` : "";
|
|
922
|
+
}
|
|
923
|
+
/**
|
|
924
|
+
* Renders a field's `.md` doc (plus its `@generated` tag) as a bare JSDoc block, or `""` if undocumented.
|
|
925
|
+
*
|
|
926
|
+
* Reuses the same {@link buildJSDocBlock} formatter the `.md` sync uses for hand-written `Entity.ts`
|
|
927
|
+
* members. Used directly before a getter template (which supplies its own leading newline), so the
|
|
928
|
+
* JSDoc lands immediately above the getter with no intervening blank line.
|
|
929
|
+
*/
|
|
930
|
+
function fieldDocBlock(fieldDocs, fieldName, entityName) {
|
|
931
|
+
const doc = fieldDocs[fieldName];
|
|
932
|
+
return doc ? buildJSDocBlock(`${doc}\n${generatedTag(entityName)}`, 0) : "";
|
|
933
|
+
}
|
|
934
|
+
/** Like {@link fieldDocBlock} but wrapped in newlines, i.e. for inline `readonly x = ...` relation decls. */
|
|
935
|
+
function relationDocBlock(fieldDocs, fieldName, entityName) {
|
|
936
|
+
const block = fieldDocBlock(fieldDocs, fieldName, entityName);
|
|
937
|
+
return block ? `\n${block}\n` : "";
|
|
1027
938
|
}
|
|
1028
939
|
function getIdType(config) {
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
default:
|
|
1037
|
-
return (0, utils_1.assertNever)(config.idType);
|
|
1038
|
-
}
|
|
940
|
+
switch (config.idType) {
|
|
941
|
+
case "untagged-string":
|
|
942
|
+
case "tagged-string":
|
|
943
|
+
case void 0: return "string";
|
|
944
|
+
case "number": return "number";
|
|
945
|
+
default: return assertNever(config.idType);
|
|
946
|
+
}
|
|
1039
947
|
}
|
|
948
|
+
//#endregion
|
|
949
|
+
export { generateEntityCodegenFile, getIdType };
|
|
950
|
+
|
|
1040
951
|
//# sourceMappingURL=generateEntityCodegenFile.js.map
|