joist-codegen 2.3.0-next.9 → 2.3.0-next.91
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 +642 -0
- package/build/EntityDbMetadata.cjs.map +1 -0
- package/build/EntityDbMetadata.d.cts +299 -0
- package/build/EntityDbMetadata.d.cts.map +1 -0
- package/build/EntityDbMetadata.d.mts +299 -0
- package/build/EntityDbMetadata.d.mts.map +1 -0
- package/build/EntityDbMetadata.js +519 -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 +128 -0
- package/build/generate.cjs.map +1 -0
- package/build/generate.d.cts +17 -0
- package/build/generate.d.cts.map +1 -0
- package/build/generate.d.mts +17 -0
- package/build/generate.d.mts.map +1 -0
- package/build/generate.js +111 -124
- package/build/generate.js.map +1 -1
- package/build/generateEntitiesFile.cjs +46 -0
- package/build/generateEntitiesFile.cjs.map +1 -0
- package/build/generateEntitiesFile.d.cts +11 -0
- package/build/generateEntitiesFile.d.cts.map +1 -0
- package/build/generateEntitiesFile.d.mts +11 -0
- package/build/generateEntitiesFile.d.mts.map +1 -0
- package/build/generateEntitiesFile.js +28 -25
- package/build/generateEntitiesFile.js.map +1 -1
- package/build/generateEntityCodegenFile.cjs +1010 -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 +793 -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 +307 -0
- package/build/generateMetadataFile.cjs.map +1 -0
- package/build/generateMetadataFile.d.cts +10 -0
- package/build/generateMetadataFile.d.cts.map +1 -0
- package/build/generateMetadataFile.d.mts +10 -0
- package/build/generateMetadataFile.d.mts.map +1 -0
- package/build/generateMetadataFile.js +148 -156
- package/build/generateMetadataFile.js.map +1 -1
- package/build/generatePgEnumFile.cjs +21 -0
- package/build/generatePgEnumFile.cjs.map +1 -0
- package/build/generatePgEnumFile.d.cts +9 -0
- package/build/generatePgEnumFile.d.cts.map +1 -0
- package/build/generatePgEnumFile.d.mts +9 -0
- package/build/generatePgEnumFile.d.mts.map +1 -0
- package/build/generatePgEnumFile.js +12 -9
- package/build/generatePgEnumFile.js.map +1 -1
- package/build/index.cjs +135 -0
- package/build/index.cjs.map +1 -0
- package/build/index.d.cts +12 -0
- package/build/index.d.cts.map +1 -0
- package/build/index.d.mts +12 -0
- package/build/index.d.mts.map +1 -0
- package/build/index.js +108 -127
- package/build/index.js.map +1 -1
- package/build/inheritance.cjs +257 -0
- package/build/inheritance.cjs.map +1 -0
- package/build/inheritance.d.cts +13 -0
- package/build/inheritance.d.cts.map +1 -0
- package/build/inheritance.d.mts +13 -0
- package/build/inheritance.d.mts.map +1 -0
- package/build/inheritance.js +237 -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 +238 -0
- package/build/symbols.cjs.map +1 -0
- package/build/symbols.d.cts +120 -0
- package/build/symbols.d.cts.map +1 -0
- package/build/symbols.d.mts +120 -0
- package/build/symbols.d.mts.map +1 -0
- package/build/symbols.js +121 -113
- package/build/symbols.js.map +1 -1
- package/build/tsdoc.cjs +22 -0
- package/build/tsdoc.cjs.map +1 -0
- package/build/tsdoc.d.cts +15 -0
- package/build/tsdoc.d.cts.map +1 -0
- package/build/tsdoc.d.mts +15 -0
- package/build/tsdoc.d.mts.map +1 -0
- package/build/tsdoc.js +18 -15
- package/build/tsdoc.js.map +1 -1
- package/build/utils.cjs +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 +142 -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
package/build/index.cjs
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
4
|
+
const require_codemods_index = require("./codemods/index.cjs");
|
|
5
|
+
const require_utils = require("./utils.cjs");
|
|
6
|
+
const require_inheritance = require("./inheritance.cjs");
|
|
7
|
+
const require_logger = require("./logger.cjs");
|
|
8
|
+
const require_config = require("./config.cjs");
|
|
9
|
+
const require_assignTags = require("./assignTags.cjs");
|
|
10
|
+
const require_foreignKeyOrdering = require("./foreignKeyOrdering.cjs");
|
|
11
|
+
const require_generate = require("./generate.cjs");
|
|
12
|
+
const require_generateFlushFunction = require("./generateFlushFunction.cjs");
|
|
13
|
+
const require_installSkills = require("./installSkills.cjs");
|
|
14
|
+
const require_scanEntityFiles = require("./scanEntityFiles.cjs");
|
|
15
|
+
const require_loadMetadata = require("./loadMetadata.cjs");
|
|
16
|
+
const require_EntityDbMetadata = require("./EntityDbMetadata.cjs");
|
|
17
|
+
let joist_utils = require("joist-utils");
|
|
18
|
+
let pg_structure = require("pg-structure");
|
|
19
|
+
pg_structure = require_runtime.__toESM(pg_structure, 1);
|
|
20
|
+
let ts_poet = require("ts-poet");
|
|
21
|
+
let pg = require("pg");
|
|
22
|
+
let node_process = require("node:process");
|
|
23
|
+
node_process = require_runtime.__toESM(node_process, 1);
|
|
24
|
+
//#region src/index.ts
|
|
25
|
+
const { default: pgStructure } = pg_structure.default;
|
|
26
|
+
async function joistCodegen() {
|
|
27
|
+
const config = await require_config.loadConfig();
|
|
28
|
+
maybeSetDatabaseUrl(config);
|
|
29
|
+
if (!node_process.default.env.DATABASE_URL && !node_process.default.env.DB_USER) {
|
|
30
|
+
console.log(`Database connection information not found, please set either:`);
|
|
31
|
+
console.log(` - the DATABASE_URL env variable (i.e. using .env and dotenv), or`);
|
|
32
|
+
console.log(` - the databaseUrl key in joist-config.json`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const pgConfig = (0, joist_utils.newPgConnectionConfig)();
|
|
36
|
+
const client = new pg.Client(pgConfig);
|
|
37
|
+
await client.connect();
|
|
38
|
+
const dbMetadata = await loadSchemaMetadata(config, client);
|
|
39
|
+
const { entities, enums, totalTables } = dbMetadata;
|
|
40
|
+
console.log(`Found ${totalTables} total tables, ${entities.length} entity tables, ${Object.entries(enums).length} enum tables`);
|
|
41
|
+
console.log("");
|
|
42
|
+
require_inheritance.applyInheritanceUpdates(config, dbMetadata);
|
|
43
|
+
require_EntityDbMetadata.resolveNameConflicts(config, dbMetadata);
|
|
44
|
+
require_assignTags.assignTags(config, dbMetadata);
|
|
45
|
+
validateTagDelimiter(config, entities);
|
|
46
|
+
await require_scanEntityFiles.scanEntityFiles(config, dbMetadata);
|
|
47
|
+
await require_foreignKeyOrdering.maybeSetForeignKeyOrdering(config, dbMetadata.entities);
|
|
48
|
+
await maybeGenerateFlushFunctions(config, client, pgConfig, dbMetadata);
|
|
49
|
+
await client.end();
|
|
50
|
+
await require_codemods_index.maybeRunTransforms(config);
|
|
51
|
+
for (const entity of entities) require_EntityDbMetadata.failIfOverlappingFieldNames(entity);
|
|
52
|
+
require_config.warnInvalidConfigEntries(config, dbMetadata);
|
|
53
|
+
await generateAndSaveFiles(config, dbMetadata);
|
|
54
|
+
if (config.skills !== false) await require_installSkills.installSkills();
|
|
55
|
+
require_config.stripStiPlaceholders(config, entities);
|
|
56
|
+
await require_config.writeConfig(config);
|
|
57
|
+
}
|
|
58
|
+
/** Uses entities and enums from the `db` schema and saves them into our entities directory. */
|
|
59
|
+
async function generateAndSaveFiles(config, dbMeta) {
|
|
60
|
+
const files = await require_generate.generateFiles(config, dbMeta);
|
|
61
|
+
const esmExt = config.esm ? config.allowImportingTsExtensions ? "ts" : "js" : "";
|
|
62
|
+
await (0, ts_poet.saveFiles)({
|
|
63
|
+
toolName: "joist-codegen",
|
|
64
|
+
directory: config.entitiesDirectory,
|
|
65
|
+
files,
|
|
66
|
+
toStringOpts: { importExtensions: esmExt || false }
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async function maybeGenerateFlushFunctions(config, client, pgConfig, db) {
|
|
70
|
+
if (config.createFlushFunction !== false) {
|
|
71
|
+
if (Array.isArray(config.createFlushFunction)) {
|
|
72
|
+
console.log("Creating flush_database functions");
|
|
73
|
+
await Promise.all(config.createFlushFunction.map(async (dbName) => {
|
|
74
|
+
const client = new pg.Client({
|
|
75
|
+
...pgConfig,
|
|
76
|
+
database: dbName
|
|
77
|
+
});
|
|
78
|
+
await client.connect();
|
|
79
|
+
await require_generateFlushFunction.createFlushFunction(client, db);
|
|
80
|
+
await client.end();
|
|
81
|
+
}));
|
|
82
|
+
} else {
|
|
83
|
+
console.log("Creating flush_database function");
|
|
84
|
+
await require_generateFlushFunction.createFlushFunction(client, db);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function loadSchemaMetadata(config, client) {
|
|
89
|
+
const db = await pgStructure(client);
|
|
90
|
+
const enums = await require_loadMetadata.loadEnumMetadata(db, client, config);
|
|
91
|
+
const pgEnums = await require_loadMetadata.loadPgEnumMetadata(db, client, config);
|
|
92
|
+
const entities = db.tables.filter((t) => require_utils.isEntityTable(config, t)).sortBy("name").map((table) => new require_EntityDbMetadata.EntityDbMetadata(config, table, enums));
|
|
93
|
+
const totalTables = db.tables.length;
|
|
94
|
+
const joinTables = db.tables.filter((t) => require_utils.isJoinTable(config, t)).map((t) => t.name);
|
|
95
|
+
const otherTables = db.tables.filter((t) => !require_utils.isEntityTable(config, t) && !require_utils.isEnumTable(config, t) && !require_utils.isJoinTable(config, t)).map((t) => t.name);
|
|
96
|
+
return {
|
|
97
|
+
entities,
|
|
98
|
+
entitiesByName: Object.fromEntries(entities.map((e) => [e.name, e])),
|
|
99
|
+
enums,
|
|
100
|
+
pgEnums,
|
|
101
|
+
totalTables,
|
|
102
|
+
joinTables,
|
|
103
|
+
otherTables
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function maybeSetDatabaseUrl(config) {
|
|
107
|
+
if (!node_process.default.env.DATABASE_URL && config.databaseUrl) node_process.default.env.DATABASE_URL = config.databaseUrl;
|
|
108
|
+
}
|
|
109
|
+
function maybeSetExitCode() {
|
|
110
|
+
if (!node_process.default.argv.includes("--always-exit-code-zero") && (node_process.default.argv.includes("--strict") && require_logger.loggerMaxWarningLevelHit >= require_logger.LOG_LEVELS.warn || require_logger.loggerMaxWarningLevelHit >= require_logger.LOG_LEVELS.error)) node_process.default.exitCode = 1;
|
|
111
|
+
}
|
|
112
|
+
/** Validates that tags can be parsed unambiguously with the configured delimiter. */
|
|
113
|
+
function validateTagDelimiter(config, entities) {
|
|
114
|
+
const tagDelimiter = config.tagDelimiter ?? ":";
|
|
115
|
+
for (const entity of entities) if (tagDelimiter !== "" && `${entity.tagName}${tagDelimiter}`.indexOf(tagDelimiter) !== entity.tagName.length) throw new Error(`Tagged id delimiter '${tagDelimiter}' cannot occur in or overlap tag '${entity.tagName}' for ${entity.name}`);
|
|
116
|
+
else if (tagDelimiter === "" && !/^[a-z]+$/i.test(entity.tagName)) throw new Error(`Delimiterless ids require an alphabetic tag, got '${entity.tagName}' for ${entity.name}`);
|
|
117
|
+
else if (tagDelimiter === "" && entity.primaryKey.columnType !== "int" && entity.primaryKey.columnType !== "bigint") throw new Error(`Delimiterless ids require an int or bigint primary key, got '${entity.primaryKey.columnType}' for ${entity.name}`);
|
|
118
|
+
}
|
|
119
|
+
if (typeof module !== "undefined" && require.main === module) joistCodegen().then(() => maybeSetExitCode()).catch((err) => {
|
|
120
|
+
console.error(err);
|
|
121
|
+
node_process.default.exit(1);
|
|
122
|
+
});
|
|
123
|
+
//#endregion
|
|
124
|
+
exports.EntityDbMetadata = require_EntityDbMetadata.EntityDbMetadata;
|
|
125
|
+
exports.dateCode = require_utils.dateCode;
|
|
126
|
+
exports.generateAndSaveFiles = generateAndSaveFiles;
|
|
127
|
+
exports.joistCodegen = joistCodegen;
|
|
128
|
+
exports.makeEntity = require_EntityDbMetadata.makeEntity;
|
|
129
|
+
exports.mapSimpleDbTypeToTypescriptType = require_utils.mapSimpleDbTypeToTypescriptType;
|
|
130
|
+
exports.maybeSetExitCode = maybeSetExitCode;
|
|
131
|
+
exports.plainDateCode = require_utils.plainDateCode;
|
|
132
|
+
exports.plainDateTimeCode = require_utils.plainDateTimeCode;
|
|
133
|
+
exports.zonedDateTimeCode = require_utils.zonedDateTimeCode;
|
|
134
|
+
|
|
135
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["pgStructureModule","loadConfig","process","newPgConnectionConfig","Client","scanEntityFiles","maybeSetForeignKeyOrdering","maybeRunTransforms","installSkills","writeConfig","generateFiles","saveFiles","createFlushFunction","loadEnumMetadata","loadPgEnumMetadata","isEntityTable","EntityDbMetadata","isJoinTable","isEnumTable","loggerMaxWarningLevelHit","LOG_LEVELS"],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\n\nimport { type ConnectionConfig, newPgConnectionConfig } from \"joist-utils\";\nimport { Client } from \"pg\";\nimport pgStructureModule from \"pg-structure\";\nimport { saveFiles } from \"ts-poet\";\n\nimport { assignTags } from \"./assignTags.ts\";\nimport { maybeRunTransforms } from \"./codemods/index.ts\";\nimport { type Config, loadConfig, stripStiPlaceholders, warnInvalidConfigEntries, writeConfig } from \"./config.ts\";\nimport {\n type DbMetadata,\n EntityDbMetadata,\n failIfOverlappingFieldNames,\n resolveNameConflicts,\n} from \"./EntityDbMetadata.ts\";\nimport { maybeSetForeignKeyOrdering } from \"./foreignKeyOrdering.ts\";\nimport { generateFiles } from \"./generate.ts\";\nimport { createFlushFunction } from \"./generateFlushFunction.ts\";\nimport { applyInheritanceUpdates } from \"./inheritance.ts\";\nimport { installSkills } from \"./installSkills.ts\";\nimport { loadEnumMetadata, loadPgEnumMetadata } from \"./loadMetadata.ts\";\nimport { LOG_LEVELS, loggerMaxWarningLevelHit } from \"./logger.ts\";\nimport { scanEntityFiles } from \"./scanEntityFiles.ts\";\nimport { isEntityTable, isEnumTable, isJoinTable, mapSimpleDbTypeToTypescriptType } from \"./utils.ts\";\n\nconst { default: pgStructure } = pgStructureModule;\n\nexport {\n type DbMetadata,\n type EnumField,\n makeEntity,\n type ManyToManyField,\n type ManyToOneField,\n type OneToManyField,\n type OneToOneField,\n type PolymorphicField,\n type PrimitiveField,\n type PrimitiveTypescriptType,\n} from \"./EntityDbMetadata.ts\";\nexport type { EnumMetadata, EnumRow, EnumTableData, PgEnumData, PgEnumMetadata } from \"./loadMetadata.ts\";\nexport { dateCode, plainDateCode, plainDateTimeCode, zonedDateTimeCode } from \"./utils.ts\";\nexport { type Config, EntityDbMetadata, mapSimpleDbTypeToTypescriptType };\n\nexport async function joistCodegen() {\n const config = await loadConfig();\n\n maybeSetDatabaseUrl(config);\n if (!process.env.DATABASE_URL && !process.env.DB_USER) {\n console.log(`Database connection information not found, please set either:`);\n console.log(` - the DATABASE_URL env variable (i.e. using .env and dotenv), or`);\n console.log(` - the databaseUrl key in joist-config.json`);\n return;\n }\n const pgConfig = newPgConnectionConfig();\n\n const client = new Client(pgConfig);\n await client.connect();\n\n const dbMetadata = await loadSchemaMetadata(config, client);\n const { entities, enums, totalTables } = dbMetadata;\n console.log(\n `Found ${totalTables} total tables, ${entities.length} entity tables, ${Object.entries(enums).length} enum tables`,\n );\n console.log(\"\");\n\n // Look for STI tables to synthesize separate metas\n applyInheritanceUpdates(config, dbMetadata);\n\n // Now that all entities (incl. STI subtypes) are known, fix up any colliding codegen'd type names\n resolveNameConflicts(config, dbMetadata);\n\n // Assign any new tags and write them back to the config file\n assignTags(config, dbMetadata);\n validateTagDelimiter(config, entities);\n\n // Scan `*.ts` files after we've expanded `Task` -> `TaskOld.ts`\n await scanEntityFiles(config, dbMetadata);\n\n // If we're not using deferred FKs, determine our DAG insert order\n await maybeSetForeignKeyOrdering(config, dbMetadata.entities);\n\n // Generate the flush function for tests\n await maybeGenerateFlushFunctions(config, client, pgConfig, dbMetadata);\n\n await client.end();\n\n // Apply any codemods to the user's codebase, if we have them\n await maybeRunTransforms(config);\n\n // Do some warnings\n for (const entity of entities) failIfOverlappingFieldNames(entity);\n warnInvalidConfigEntries(config, dbMetadata);\n\n // Finally actually generate the files (even if we found a fatal error)\n await generateAndSaveFiles(config, dbMetadata);\n\n // Install our bundled Agent Skills so coding agents can find them, unless explicitly disabled\n if (config.skills !== false) await installSkills();\n\n stripStiPlaceholders(config, entities);\n await writeConfig(config);\n}\n\n/** Uses entities and enums from the `db` schema and saves them into our entities directory. */\nexport async function generateAndSaveFiles(config: Config, dbMeta: DbMetadata): Promise<void> {\n const files = await generateFiles(config, dbMeta);\n const esmExt = config.esm ? (config.allowImportingTsExtensions ? \"ts\" : \"js\") : \"\";\n await saveFiles({\n toolName: \"joist-codegen\",\n directory: config.entitiesDirectory,\n files,\n toStringOpts: { importExtensions: esmExt || false },\n });\n}\n\nasync function maybeGenerateFlushFunctions(config: Config, client: Client, pgConfig: ConnectionConfig, db: DbMetadata) {\n // In graphql-service we have our own custom flush function, so allow skipping this\n if (config.createFlushFunction !== false) {\n // Look for multiple test databases\n if (Array.isArray(config.createFlushFunction)) {\n console.log(\"Creating flush_database functions\");\n await Promise.all(\n config.createFlushFunction.map(async (dbName) => {\n const client = new Client({ ...pgConfig, database: dbName });\n await client.connect();\n await createFlushFunction(client, db);\n await client.end();\n }),\n );\n } else {\n console.log(\"Creating flush_database function\");\n await createFlushFunction(client, db);\n }\n }\n}\n\nasync function loadSchemaMetadata(config: Config, client: Client): Promise<DbMetadata> {\n // Here we load all schemas, to avoid pg-structure failing on cross-schema foreign keys\n // like our cyanaudit triggers (https://github.com/ozum/pg-structure/issues/85), and then\n // later filter them non-public schema tables out.\n const db = await pgStructure(client);\n const enums = await loadEnumMetadata(db, client, config);\n const pgEnums = await loadPgEnumMetadata(db, client, config);\n const entities = db.tables\n .filter((t) => isEntityTable(config, t))\n .sortBy(\"name\")\n .map((table) => new EntityDbMetadata(config, table, enums));\n const totalTables = db.tables.length;\n const joinTables = db.tables.filter((t) => isJoinTable(config, t)).map((t) => t.name);\n const otherTables = db.tables\n .filter((t) => !isEntityTable(config, t) && !isEnumTable(config, t) && !isJoinTable(config, t))\n .map((t) => t.name);\n const entitiesByName = Object.fromEntries(entities.map((e) => [e.name, e]));\n return { entities, entitiesByName, enums, pgEnums, totalTables, joinTables, otherTables };\n}\n\nfunction maybeSetDatabaseUrl(config: Config): void {\n if (!process.env.DATABASE_URL && config.databaseUrl) {\n process.env.DATABASE_URL = config.databaseUrl;\n }\n}\n\nexport function maybeSetExitCode(): void {\n if (\n !process.argv.includes(\"--always-exit-code-zero\") &&\n // strict mode + warnings or greater\n ((process.argv.includes(\"--strict\") && loggerMaxWarningLevelHit >= LOG_LEVELS.warn) ||\n // otherwise errors or greater\n loggerMaxWarningLevelHit >= LOG_LEVELS.error)\n ) {\n process.exitCode = 1;\n }\n}\n\n/** Validates that tags can be parsed unambiguously with the configured delimiter. */\nfunction validateTagDelimiter(config: Config, entities: EntityDbMetadata[]): void {\n const tagDelimiter = config.tagDelimiter ?? \":\";\n for (const entity of entities) {\n if (tagDelimiter !== \"\" && `${entity.tagName}${tagDelimiter}`.indexOf(tagDelimiter) !== entity.tagName.length) {\n throw new Error(\n `Tagged id delimiter '${tagDelimiter}' cannot occur in or overlap tag '${entity.tagName}' for ${entity.name}`,\n );\n } else if (tagDelimiter === \"\" && !/^[a-z]+$/i.test(entity.tagName)) {\n throw new Error(`Delimiterless ids require an alphabetic tag, got '${entity.tagName}' for ${entity.name}`);\n } else if (\n tagDelimiter === \"\" &&\n entity.primaryKey.columnType !== \"int\" &&\n entity.primaryKey.columnType !== \"bigint\"\n ) {\n throw new Error(\n `Delimiterless ids require an int or bigint primary key, got '${entity.primaryKey.columnType}' for ${entity.name}`,\n );\n }\n }\n}\n\nif (typeof module !== \"undefined\" && require.main === module) {\n joistCodegen()\n .then(() => maybeSetExitCode())\n .catch((err) => {\n console.error(err);\n process.exit(1);\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Config } from "./config.cjs";
|
|
2
|
+
import { dateCode, mapSimpleDbTypeToTypescriptType, plainDateCode, plainDateTimeCode, zonedDateTimeCode } from "./utils.cjs";
|
|
3
|
+
import { EnumMetadata, EnumRow, EnumTableData, PgEnumData, PgEnumMetadata } from "./loadMetadata.cjs";
|
|
4
|
+
import { DbMetadata, EntityDbMetadata, EnumField, ManyToManyField, ManyToOneField, OneToManyField, OneToOneField, PolymorphicField, PrimitiveField, PrimitiveTypescriptType, makeEntity } from "./EntityDbMetadata.cjs";
|
|
5
|
+
//#region src/index.d.ts
|
|
6
|
+
declare function joistCodegen(): Promise<void>;
|
|
7
|
+
/** Uses entities and enums from the `db` schema and saves them into our entities directory. */
|
|
8
|
+
declare function generateAndSaveFiles(config: Config, dbMeta: DbMetadata): Promise<void>;
|
|
9
|
+
declare function maybeSetExitCode(): void;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { type Config, type DbMetadata, EntityDbMetadata, type EnumField, type EnumMetadata, type EnumRow, type EnumTableData, type ManyToManyField, type ManyToOneField, type OneToManyField, type OneToOneField, type PgEnumData, type PgEnumMetadata, type PolymorphicField, type PrimitiveField, type PrimitiveTypescriptType, dateCode, generateAndSaveFiles, joistCodegen, makeEntity, mapSimpleDbTypeToTypescriptType, maybeSetExitCode, plainDateCode, plainDateTimeCode, zonedDateTimeCode };
|
|
12
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;iBA8CsB,gBAAY;;iBA6DZ,qBAAqB,QAAQ,QAAQ,QAAQ,aAAa;iBA0DhE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Config } from "./config.mjs";
|
|
2
|
+
import { dateCode, mapSimpleDbTypeToTypescriptType, plainDateCode, plainDateTimeCode, zonedDateTimeCode } from "./utils.mjs";
|
|
3
|
+
import { EnumMetadata, EnumRow, EnumTableData, PgEnumData, PgEnumMetadata } from "./loadMetadata.mjs";
|
|
4
|
+
import { DbMetadata, EntityDbMetadata, EnumField, ManyToManyField, ManyToOneField, OneToManyField, OneToOneField, PolymorphicField, PrimitiveField, PrimitiveTypescriptType, makeEntity } from "./EntityDbMetadata.mjs";
|
|
5
|
+
//#region src/index.d.ts
|
|
6
|
+
declare function joistCodegen(): Promise<void>;
|
|
7
|
+
/** Uses entities and enums from the `db` schema and saves them into our entities directory. */
|
|
8
|
+
declare function generateAndSaveFiles(config: Config, dbMeta: DbMetadata): Promise<void>;
|
|
9
|
+
declare function maybeSetExitCode(): void;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { type Config, type DbMetadata, EntityDbMetadata, type EnumField, type EnumMetadata, type EnumRow, type EnumTableData, type ManyToManyField, type ManyToOneField, type OneToManyField, type OneToOneField, type PgEnumData, type PgEnumMetadata, type PolymorphicField, type PrimitiveField, type PrimitiveTypescriptType, dateCode, generateAndSaveFiles, joistCodegen, makeEntity, mapSimpleDbTypeToTypescriptType, maybeSetExitCode, plainDateCode, plainDateTimeCode, zonedDateTimeCode };
|
|
12
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;iBA8CsB,gBAAY;;iBA6DZ,qBAAqB,QAAQ,QAAQ,QAAQ,aAAa;iBA0DhE"}
|
package/build/index.js
CHANGED
|
@@ -1,142 +1,123 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
const inheritance_1 = require("./inheritance");
|
|
24
|
-
const loadMetadata_1 = require("./loadMetadata");
|
|
25
|
-
const logger_1 = require("./logger");
|
|
26
|
-
const scanEntityFiles_1 = require("./scanEntityFiles");
|
|
27
|
-
const utils_1 = require("./utils");
|
|
28
|
-
Object.defineProperty(exports, "mapSimpleDbTypeToTypescriptType", { enumerable: true, get: function () { return utils_1.mapSimpleDbTypeToTypescriptType; } });
|
|
29
|
-
var EntityDbMetadata_2 = require("./EntityDbMetadata");
|
|
30
|
-
Object.defineProperty(exports, "makeEntity", { enumerable: true, get: function () { return EntityDbMetadata_2.makeEntity; } });
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { __require } from "./_virtual/_rolldown/runtime.js";
|
|
3
|
+
import { maybeRunTransforms } from "./codemods/index.js";
|
|
4
|
+
import { dateCode, isEntityTable, isEnumTable, isJoinTable, mapSimpleDbTypeToTypescriptType, plainDateCode, plainDateTimeCode, zonedDateTimeCode } from "./utils.js";
|
|
5
|
+
import { applyInheritanceUpdates } from "./inheritance.js";
|
|
6
|
+
import { LOG_LEVELS, loggerMaxWarningLevelHit } from "./logger.js";
|
|
7
|
+
import { loadConfig, stripStiPlaceholders, warnInvalidConfigEntries, writeConfig } from "./config.js";
|
|
8
|
+
import { assignTags } from "./assignTags.js";
|
|
9
|
+
import { maybeSetForeignKeyOrdering } from "./foreignKeyOrdering.js";
|
|
10
|
+
import { generateFiles } from "./generate.js";
|
|
11
|
+
import { createFlushFunction } from "./generateFlushFunction.js";
|
|
12
|
+
import { installSkills } from "./installSkills.js";
|
|
13
|
+
import { scanEntityFiles } from "./scanEntityFiles.js";
|
|
14
|
+
import { loadEnumMetadata, loadPgEnumMetadata } from "./loadMetadata.js";
|
|
15
|
+
import { EntityDbMetadata, failIfOverlappingFieldNames, makeEntity, resolveNameConflicts } from "./EntityDbMetadata.js";
|
|
16
|
+
import { newPgConnectionConfig } from "joist-utils";
|
|
17
|
+
import pgStructureModule from "pg-structure";
|
|
18
|
+
import { saveFiles } from "ts-poet";
|
|
19
|
+
import { Client } from "pg";
|
|
20
|
+
import process from "node:process";
|
|
21
|
+
//#region src/index.ts
|
|
22
|
+
const { default: pgStructure } = pgStructureModule;
|
|
31
23
|
async function joistCodegen() {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
// Do some warnings
|
|
63
|
-
for (const entity of entities)
|
|
64
|
-
(0, EntityDbMetadata_1.failIfOverlappingFieldNames)(entity);
|
|
65
|
-
(0, config_1.warnInvalidConfigEntries)(config, dbMetadata);
|
|
66
|
-
// Finally actually generate the files (even if we found a fatal error)
|
|
67
|
-
await generateAndSaveFiles(config, dbMetadata);
|
|
68
|
-
(0, config_1.stripStiPlaceholders)(config, entities);
|
|
69
|
-
await (0, config_1.writeConfig)(config);
|
|
24
|
+
const config = await loadConfig();
|
|
25
|
+
maybeSetDatabaseUrl(config);
|
|
26
|
+
if (!process.env.DATABASE_URL && !process.env.DB_USER) {
|
|
27
|
+
console.log(`Database connection information not found, please set either:`);
|
|
28
|
+
console.log(` - the DATABASE_URL env variable (i.e. using .env and dotenv), or`);
|
|
29
|
+
console.log(` - the databaseUrl key in joist-config.json`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const pgConfig = newPgConnectionConfig();
|
|
33
|
+
const client = new Client(pgConfig);
|
|
34
|
+
await client.connect();
|
|
35
|
+
const dbMetadata = await loadSchemaMetadata(config, client);
|
|
36
|
+
const { entities, enums, totalTables } = dbMetadata;
|
|
37
|
+
console.log(`Found ${totalTables} total tables, ${entities.length} entity tables, ${Object.entries(enums).length} enum tables`);
|
|
38
|
+
console.log("");
|
|
39
|
+
applyInheritanceUpdates(config, dbMetadata);
|
|
40
|
+
resolveNameConflicts(config, dbMetadata);
|
|
41
|
+
assignTags(config, dbMetadata);
|
|
42
|
+
validateTagDelimiter(config, entities);
|
|
43
|
+
await scanEntityFiles(config, dbMetadata);
|
|
44
|
+
await maybeSetForeignKeyOrdering(config, dbMetadata.entities);
|
|
45
|
+
await maybeGenerateFlushFunctions(config, client, pgConfig, dbMetadata);
|
|
46
|
+
await client.end();
|
|
47
|
+
await maybeRunTransforms(config);
|
|
48
|
+
for (const entity of entities) failIfOverlappingFieldNames(entity);
|
|
49
|
+
warnInvalidConfigEntries(config, dbMetadata);
|
|
50
|
+
await generateAndSaveFiles(config, dbMetadata);
|
|
51
|
+
if (config.skills !== false) await installSkills();
|
|
52
|
+
stripStiPlaceholders(config, entities);
|
|
53
|
+
await writeConfig(config);
|
|
70
54
|
}
|
|
71
55
|
/** Uses entities and enums from the `db` schema and saves them into our entities directory. */
|
|
72
56
|
async function generateAndSaveFiles(config, dbMeta) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
57
|
+
const files = await generateFiles(config, dbMeta);
|
|
58
|
+
const esmExt = config.esm ? config.allowImportingTsExtensions ? "ts" : "js" : "";
|
|
59
|
+
await saveFiles({
|
|
60
|
+
toolName: "joist-codegen",
|
|
61
|
+
directory: config.entitiesDirectory,
|
|
62
|
+
files,
|
|
63
|
+
toStringOpts: { importExtensions: esmExt || false }
|
|
64
|
+
});
|
|
81
65
|
}
|
|
82
66
|
async function maybeGenerateFlushFunctions(config, client, pgConfig, db) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
67
|
+
if (config.createFlushFunction !== false) {
|
|
68
|
+
if (Array.isArray(config.createFlushFunction)) {
|
|
69
|
+
console.log("Creating flush_database functions");
|
|
70
|
+
await Promise.all(config.createFlushFunction.map(async (dbName) => {
|
|
71
|
+
const client = new Client({
|
|
72
|
+
...pgConfig,
|
|
73
|
+
database: dbName
|
|
74
|
+
});
|
|
75
|
+
await client.connect();
|
|
76
|
+
await createFlushFunction(client, db);
|
|
77
|
+
await client.end();
|
|
78
|
+
}));
|
|
79
|
+
} else {
|
|
80
|
+
console.log("Creating flush_database function");
|
|
81
|
+
await createFlushFunction(client, db);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
100
84
|
}
|
|
101
85
|
async function loadSchemaMetadata(config, client) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return { entities, entitiesByName, enums, pgEnums, totalTables, joinTables, otherTables };
|
|
86
|
+
const db = await pgStructure(client);
|
|
87
|
+
const enums = await loadEnumMetadata(db, client, config);
|
|
88
|
+
const pgEnums = await loadPgEnumMetadata(db, client, config);
|
|
89
|
+
const entities = db.tables.filter((t) => isEntityTable(config, t)).sortBy("name").map((table) => new EntityDbMetadata(config, table, enums));
|
|
90
|
+
const totalTables = db.tables.length;
|
|
91
|
+
const joinTables = db.tables.filter((t) => isJoinTable(config, t)).map((t) => t.name);
|
|
92
|
+
const otherTables = db.tables.filter((t) => !isEntityTable(config, t) && !isEnumTable(config, t) && !isJoinTable(config, t)).map((t) => t.name);
|
|
93
|
+
return {
|
|
94
|
+
entities,
|
|
95
|
+
entitiesByName: Object.fromEntries(entities.map((e) => [e.name, e])),
|
|
96
|
+
enums,
|
|
97
|
+
pgEnums,
|
|
98
|
+
totalTables,
|
|
99
|
+
joinTables,
|
|
100
|
+
otherTables
|
|
101
|
+
};
|
|
119
102
|
}
|
|
120
103
|
function maybeSetDatabaseUrl(config) {
|
|
121
|
-
|
|
122
|
-
node_process_1.default.env.DATABASE_URL = config.databaseUrl;
|
|
123
|
-
}
|
|
104
|
+
if (!process.env.DATABASE_URL && config.databaseUrl) process.env.DATABASE_URL = config.databaseUrl;
|
|
124
105
|
}
|
|
125
106
|
function maybeSetExitCode() {
|
|
126
|
-
|
|
127
|
-
// strict mode + warnings or greater
|
|
128
|
-
((node_process_1.default.argv.includes("--strict") && logger_1.loggerMaxWarningLevelHit >= logger_1.LOG_LEVELS.warn) ||
|
|
129
|
-
// otherwise errors or greater
|
|
130
|
-
logger_1.loggerMaxWarningLevelHit >= logger_1.LOG_LEVELS.error)) {
|
|
131
|
-
node_process_1.default.exitCode = 1;
|
|
132
|
-
}
|
|
107
|
+
if (!process.argv.includes("--always-exit-code-zero") && (process.argv.includes("--strict") && loggerMaxWarningLevelHit >= LOG_LEVELS.warn || loggerMaxWarningLevelHit >= LOG_LEVELS.error)) process.exitCode = 1;
|
|
133
108
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
});
|
|
109
|
+
/** Validates that tags can be parsed unambiguously with the configured delimiter. */
|
|
110
|
+
function validateTagDelimiter(config, entities) {
|
|
111
|
+
const tagDelimiter = config.tagDelimiter ?? ":";
|
|
112
|
+
for (const entity of entities) if (tagDelimiter !== "" && `${entity.tagName}${tagDelimiter}`.indexOf(tagDelimiter) !== entity.tagName.length) throw new Error(`Tagged id delimiter '${tagDelimiter}' cannot occur in or overlap tag '${entity.tagName}' for ${entity.name}`);
|
|
113
|
+
else if (tagDelimiter === "" && !/^[a-z]+$/i.test(entity.tagName)) throw new Error(`Delimiterless ids require an alphabetic tag, got '${entity.tagName}' for ${entity.name}`);
|
|
114
|
+
else if (tagDelimiter === "" && entity.primaryKey.columnType !== "int" && entity.primaryKey.columnType !== "bigint") throw new Error(`Delimiterless ids require an int or bigint primary key, got '${entity.primaryKey.columnType}' for ${entity.name}`);
|
|
141
115
|
}
|
|
116
|
+
if (typeof module !== "undefined" && __require.main === module) joistCodegen().then(() => maybeSetExitCode()).catch((err) => {
|
|
117
|
+
console.error(err);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
});
|
|
120
|
+
//#endregion
|
|
121
|
+
export { EntityDbMetadata, dateCode, generateAndSaveFiles, joistCodegen, makeEntity, mapSimpleDbTypeToTypescriptType, maybeSetExitCode, plainDateCode, plainDateTimeCode, zonedDateTimeCode };
|
|
122
|
+
|
|
142
123
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\n\nimport { type ConnectionConfig, newPgConnectionConfig } from \"joist-utils\";\nimport { Client } from \"pg\";\nimport pgStructureModule from \"pg-structure\";\nimport { saveFiles } from \"ts-poet\";\n\nimport { assignTags } from \"./assignTags.ts\";\nimport { maybeRunTransforms } from \"./codemods/index.ts\";\nimport { type Config, loadConfig, stripStiPlaceholders, warnInvalidConfigEntries, writeConfig } from \"./config.ts\";\nimport {\n type DbMetadata,\n EntityDbMetadata,\n failIfOverlappingFieldNames,\n resolveNameConflicts,\n} from \"./EntityDbMetadata.ts\";\nimport { maybeSetForeignKeyOrdering } from \"./foreignKeyOrdering.ts\";\nimport { generateFiles } from \"./generate.ts\";\nimport { createFlushFunction } from \"./generateFlushFunction.ts\";\nimport { applyInheritanceUpdates } from \"./inheritance.ts\";\nimport { installSkills } from \"./installSkills.ts\";\nimport { loadEnumMetadata, loadPgEnumMetadata } from \"./loadMetadata.ts\";\nimport { LOG_LEVELS, loggerMaxWarningLevelHit } from \"./logger.ts\";\nimport { scanEntityFiles } from \"./scanEntityFiles.ts\";\nimport { isEntityTable, isEnumTable, isJoinTable, mapSimpleDbTypeToTypescriptType } from \"./utils.ts\";\n\nconst { default: pgStructure } = pgStructureModule;\n\nexport {\n type DbMetadata,\n type EnumField,\n makeEntity,\n type ManyToManyField,\n type ManyToOneField,\n type OneToManyField,\n type OneToOneField,\n type PolymorphicField,\n type PrimitiveField,\n type PrimitiveTypescriptType,\n} from \"./EntityDbMetadata.ts\";\nexport type { EnumMetadata, EnumRow, EnumTableData, PgEnumData, PgEnumMetadata } from \"./loadMetadata.ts\";\nexport { dateCode, plainDateCode, plainDateTimeCode, zonedDateTimeCode } from \"./utils.ts\";\nexport { type Config, EntityDbMetadata, mapSimpleDbTypeToTypescriptType };\n\nexport async function joistCodegen() {\n const config = await loadConfig();\n\n maybeSetDatabaseUrl(config);\n if (!process.env.DATABASE_URL && !process.env.DB_USER) {\n console.log(`Database connection information not found, please set either:`);\n console.log(` - the DATABASE_URL env variable (i.e. using .env and dotenv), or`);\n console.log(` - the databaseUrl key in joist-config.json`);\n return;\n }\n const pgConfig = newPgConnectionConfig();\n\n const client = new Client(pgConfig);\n await client.connect();\n\n const dbMetadata = await loadSchemaMetadata(config, client);\n const { entities, enums, totalTables } = dbMetadata;\n console.log(\n `Found ${totalTables} total tables, ${entities.length} entity tables, ${Object.entries(enums).length} enum tables`,\n );\n console.log(\"\");\n\n // Look for STI tables to synthesize separate metas\n applyInheritanceUpdates(config, dbMetadata);\n\n // Now that all entities (incl. STI subtypes) are known, fix up any colliding codegen'd type names\n resolveNameConflicts(config, dbMetadata);\n\n // Assign any new tags and write them back to the config file\n assignTags(config, dbMetadata);\n validateTagDelimiter(config, entities);\n\n // Scan `*.ts` files after we've expanded `Task` -> `TaskOld.ts`\n await scanEntityFiles(config, dbMetadata);\n\n // If we're not using deferred FKs, determine our DAG insert order\n await maybeSetForeignKeyOrdering(config, dbMetadata.entities);\n\n // Generate the flush function for tests\n await maybeGenerateFlushFunctions(config, client, pgConfig, dbMetadata);\n\n await client.end();\n\n // Apply any codemods to the user's codebase, if we have them\n await maybeRunTransforms(config);\n\n // Do some warnings\n for (const entity of entities) failIfOverlappingFieldNames(entity);\n warnInvalidConfigEntries(config, dbMetadata);\n\n // Finally actually generate the files (even if we found a fatal error)\n await generateAndSaveFiles(config, dbMetadata);\n\n // Install our bundled Agent Skills so coding agents can find them, unless explicitly disabled\n if (config.skills !== false) await installSkills();\n\n stripStiPlaceholders(config, entities);\n await writeConfig(config);\n}\n\n/** Uses entities and enums from the `db` schema and saves them into our entities directory. */\nexport async function generateAndSaveFiles(config: Config, dbMeta: DbMetadata): Promise<void> {\n const files = await generateFiles(config, dbMeta);\n const esmExt = config.esm ? (config.allowImportingTsExtensions ? \"ts\" : \"js\") : \"\";\n await saveFiles({\n toolName: \"joist-codegen\",\n directory: config.entitiesDirectory,\n files,\n toStringOpts: { importExtensions: esmExt || false },\n });\n}\n\nasync function maybeGenerateFlushFunctions(config: Config, client: Client, pgConfig: ConnectionConfig, db: DbMetadata) {\n // In graphql-service we have our own custom flush function, so allow skipping this\n if (config.createFlushFunction !== false) {\n // Look for multiple test databases\n if (Array.isArray(config.createFlushFunction)) {\n console.log(\"Creating flush_database functions\");\n await Promise.all(\n config.createFlushFunction.map(async (dbName) => {\n const client = new Client({ ...pgConfig, database: dbName });\n await client.connect();\n await createFlushFunction(client, db);\n await client.end();\n }),\n );\n } else {\n console.log(\"Creating flush_database function\");\n await createFlushFunction(client, db);\n }\n }\n}\n\nasync function loadSchemaMetadata(config: Config, client: Client): Promise<DbMetadata> {\n // Here we load all schemas, to avoid pg-structure failing on cross-schema foreign keys\n // like our cyanaudit triggers (https://github.com/ozum/pg-structure/issues/85), and then\n // later filter them non-public schema tables out.\n const db = await pgStructure(client);\n const enums = await loadEnumMetadata(db, client, config);\n const pgEnums = await loadPgEnumMetadata(db, client, config);\n const entities = db.tables\n .filter((t) => isEntityTable(config, t))\n .sortBy(\"name\")\n .map((table) => new EntityDbMetadata(config, table, enums));\n const totalTables = db.tables.length;\n const joinTables = db.tables.filter((t) => isJoinTable(config, t)).map((t) => t.name);\n const otherTables = db.tables\n .filter((t) => !isEntityTable(config, t) && !isEnumTable(config, t) && !isJoinTable(config, t))\n .map((t) => t.name);\n const entitiesByName = Object.fromEntries(entities.map((e) => [e.name, e]));\n return { entities, entitiesByName, enums, pgEnums, totalTables, joinTables, otherTables };\n}\n\nfunction maybeSetDatabaseUrl(config: Config): void {\n if (!process.env.DATABASE_URL && config.databaseUrl) {\n process.env.DATABASE_URL = config.databaseUrl;\n }\n}\n\nexport function maybeSetExitCode(): void {\n if (\n !process.argv.includes(\"--always-exit-code-zero\") &&\n // strict mode + warnings or greater\n ((process.argv.includes(\"--strict\") && loggerMaxWarningLevelHit >= LOG_LEVELS.warn) ||\n // otherwise errors or greater\n loggerMaxWarningLevelHit >= LOG_LEVELS.error)\n ) {\n process.exitCode = 1;\n }\n}\n\n/** Validates that tags can be parsed unambiguously with the configured delimiter. */\nfunction validateTagDelimiter(config: Config, entities: EntityDbMetadata[]): void {\n const tagDelimiter = config.tagDelimiter ?? \":\";\n for (const entity of entities) {\n if (tagDelimiter !== \"\" && `${entity.tagName}${tagDelimiter}`.indexOf(tagDelimiter) !== entity.tagName.length) {\n throw new Error(\n `Tagged id delimiter '${tagDelimiter}' cannot occur in or overlap tag '${entity.tagName}' for ${entity.name}`,\n );\n } else if (tagDelimiter === \"\" && !/^[a-z]+$/i.test(entity.tagName)) {\n throw new Error(`Delimiterless ids require an alphabetic tag, got '${entity.tagName}' for ${entity.name}`);\n } else if (\n tagDelimiter === \"\" &&\n entity.primaryKey.columnType !== \"int\" &&\n entity.primaryKey.columnType !== \"bigint\"\n ) {\n throw new Error(\n `Delimiterless ids require an int or bigint primary key, got '${entity.primaryKey.columnType}' for ${entity.name}`,\n );\n }\n }\n}\n\nif (typeof module !== \"undefined\" && require.main === module) {\n joistCodegen()\n .then(() => maybeSetExitCode())\n .catch((err) => {\n console.error(err);\n process.exit(1);\n });\n}\n"],"mappings":"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"}
|