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