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/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import { pascalCase } from \"change-case\";\nimport { isPlainObject } from \"joist-utils\";\nimport { type Table } from \"pg-structure\";\nimport pluralize from \"pluralize\";\nimport { code, imp } from \"ts-poet\";\n\nimport { type Config, getTimestampConfig } from \"./config.ts\";\nimport { type DatabaseColumnType, type PrimitiveTypescriptType } from \"./EntityDbMetadata.ts\";\n\nexport function assertNever(x: never): never {\n throw new Error(\"Unexpected object: \" + x);\n}\n\nexport function isEntityTable(config: Config, t: Table): boolean {\n if (isIgnored(config, t) || isJoinTable(config, t)) {\n return false;\n }\n\n // Depending on the config settings, we may/may not require the presence of timestamp\n // fields to determine whether a table is an entity.\n const columnNames = t.columns.map((c) => c.name);\n const { updatedAtConf, createdAtConf } = getTimestampConfig(config);\n const hasCreatedAt = createdAtConf.names.some((c) => columnNames.includes(c));\n const hasUpdatedAt = updatedAtConf.names.some((c) => columnNames.includes(c));\n\n // Entities always require an id column\n const hasIdColumn = columnNames.includes(\"id\");\n if (!hasIdColumn) return false;\n\n // If we have no timestamp columns, but do have `name` and `code`, we're probably an enum.\n if (hasIdColumn && !hasCreatedAt && !hasUpdatedAt) {\n if ([\"name\", \"code\"].every((c) => columnNames.includes(c))) {\n return false;\n }\n }\n\n // If the ID column is a FK then we're a subclass\n if (isSubClassTable(t)) return true;\n\n // Otherwise respect the created_at/updated_at required rules\n return hasIdColumn && (hasCreatedAt || !createdAtConf.required) && (hasUpdatedAt || !updatedAtConf.required);\n}\n\nexport function isSubClassTable(t: Table): boolean {\n // Note that `.get(\"id\")` will blow up if there is no id column\n return t.columns.get(\"id\").foreignKeys.length === 1;\n}\n\nexport function isEnumTable(config: Config, t: Table): boolean {\n if (isIgnored(config, t)) {\n return false;\n }\n const columnNames = t.columns.map((c) => c.name);\n return [\"id\", \"code\", \"name\"].every((c) => columnNames.includes(c)) && !isEntityTable(config, t);\n}\n\n// Oddly enough isJoinTable showed up as a hot spot, so cache its calculation.\nconst joinTables: Map<string, boolean> = new Map();\n\nexport function isJoinTable(config: Config, t: Table): boolean {\n if (isIgnored(config, t)) {\n return false;\n }\n return getOrElse(joinTables, t.name, () => {\n const { columns } = t;\n const fks = columns.filter((c) => c.isForeignKey);\n const pks = columns.filter((c) => c.isPrimaryKey);\n // Every join table is two FKs, plus either a surrogate `id` PK (\"id-ful\") or no surrogate\n // at all, in which case the two FKs are themselves the composite PK (\"id-less\").\n if (fks.length !== 2) return false;\n if (!joinTableHasId(t) && !(pks.length === 2 && pks.every((c) => c.isForeignKey))) return false;\n // Any column beyond the two FKs and the optional `id` PK must be a single created_at.\n const others = columns.length - fks.length - (joinTableHasId(t) ? 1 : 0);\n const createdAts = columns.filter((c) => c.name === \"created_at\" || c.name === \"createdAt\").length;\n return others === 0 || (others === 1 && createdAts === 1);\n });\n}\n\n/** Whether a join table has a surrogate `id` primary key (vs. an id-less FK-pair composite PK). */\nexport function joinTableHasId(t: Table): boolean {\n const pks = t.columns.filter((c) => c.isPrimaryKey);\n return pks.length === 1 && !pks[0].isForeignKey;\n}\n\nfunction getOrElse<K, V>(map: Map<K, V>, key: K, fn: () => V): V {\n let value = map.get(key);\n if (value === undefined) {\n value = fn();\n map.set(key, value);\n }\n return value;\n}\n\n/** Converts `projects` to `Project`. */\nexport function tableToEntityName(config: Config, table: Table): string {\n let entityName = config.__tableToEntityName?.[table.name];\n if (!entityName) {\n const configEntityName = Object.entries(config.entities)\n .filter(([, conf]) => conf.tableName === table.name)\n .map(([entityName]) => entityName)[0];\n entityName = configEntityName || pascalCase(pluralize.singular(table.name));\n (config.__tableToEntityName ??= {})[table.name] = entityName;\n }\n return entityName;\n}\n\nexport const dateCode = code`Date`;\nexport const plainDateCode = code`${imp(\"Temporal@joist-orm\")}.PlainDate`;\nexport const plainTimeCode = code`${imp(\"Temporal@joist-orm\")}.PlainTime`;\nexport const plainDateTimeCode = code`${imp(\"Temporal@joist-orm\")}.PlainDateTime`;\nexport const zonedDateTimeCode = code`${imp(\"Temporal@joist-orm\")}.ZonedDateTime`;\n\n/** Maps db types, i.e. `int`, to JS types, i.e. `number`. */\nexport function mapSimpleDbTypeToTypescriptType(config: Config, dbType: DatabaseColumnType): PrimitiveTypescriptType {\n switch (dbType) {\n case \"boolean\":\n return \"boolean\";\n case \"int\":\n case \"numeric\":\n case \"smallint\":\n case \"integer\":\n case \"decimal\":\n case \"real\":\n case \"smallserial\":\n case \"serial\":\n case \"double precision\":\n return \"number\";\n case \"bigserial\":\n case \"bigint\":\n return \"bigint\";\n case \"text\":\n case \"citext\":\n case \"character varying\":\n case \"varchar\":\n case \"uuid\":\n case \"tsvector\":\n case \"tstzrange\":\n return \"string\";\n case \"time without time zone\":\n return config.temporal\n ? plainTimeCode\n : fail(\"Joist doesn't support 'time without time zone' unless temporal is enabled\");\n case \"timestamp with time zone\":\n return config.temporal ? zonedDateTimeCode : dateCode;\n case \"timestamp without time zone\":\n return config.temporal ? plainDateTimeCode : dateCode;\n case \"date\":\n return config.temporal ? plainDateCode : dateCode;\n case \"jsonb\":\n return \"Object\";\n case \"bytea\":\n return \"Uint8Array\";\n default:\n assertNever(dbType);\n }\n}\n\nexport function merge<T>(a: T[], b: T[]): T[] {\n return [...a, ...b];\n}\n\n/** Returns true if `p` is resolved, otherwise false if it is rejected. */\nexport async function trueIfResolved(p: Promise<unknown>): Promise<boolean> {\n return p.then(\n () => true,\n () => false,\n );\n}\n\nexport function fail(message?: string): never {\n throw new Error(message || \"Failed\");\n}\n\nexport function sortKeys<T extends object>(o: T): T {\n return Object.keys(o)\n .sort()\n .reduce(\n (acc, key) => {\n const value = o[key as keyof T];\n const newValue = typeof value === \"object\" && isPlainObject(value) ? sortKeys(value as any as object) : value;\n acc[key as keyof T] = newValue as any;\n return acc;\n },\n {} as any as T,\n );\n}\n\nexport function parseOrder(order: string | undefined): { field: string; direction: \"ASC\" | \"DESC\" } | undefined {\n if (!order) {\n return undefined;\n }\n const [field, direction = \"ASC\"] = order.split(\" \");\n if (direction !== \"ASC\" && direction !== \"DESC\") {\n throw new Error(`Invalid direction: ${direction} (must be \"ASC\" or \"DESC\")`);\n }\n return { field, direction };\n}\n\nexport function q(s: string | undefined): string {\n return s === undefined ? \"undefined\" : `\"${s}\"`;\n}\n\nexport function uncapitalize(s: string): string {\n return s.charAt(0).toLowerCase() + s.slice(1);\n}\n\nfunction isIgnored(config: Config, t: Table): boolean {\n return (config.ignoredTables || [\"migrations\", \"pgmigrations\"]).includes(t.name) || !shouldIncludeSchema(config, t);\n}\n\nfunction shouldIncludeSchema(config: Config, t: Table): boolean {\n return config.schemas ? config.schemas.includes(t.schema.name) : t.schema.name === \"public\";\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_config = require("./config.cjs");
|
|
3
|
+
let fs = require("fs");
|
|
4
|
+
let _dprint_formatter = require("@dprint/formatter");
|
|
5
|
+
let _dprint_json = require("@dprint/json");
|
|
6
|
+
let zod = require("zod");
|
|
7
|
+
//#region src/write-json-schema.ts
|
|
8
|
+
const jsonFormatter = (0, _dprint_formatter.createFromBuffer)((0, fs.readFileSync)((0, _dprint_json.getPath)()));
|
|
9
|
+
async function main() {
|
|
10
|
+
const jsonSchema = zod.z.toJSONSchema(require_config.config, {
|
|
11
|
+
io: "input",
|
|
12
|
+
unrepresentable: "any"
|
|
13
|
+
});
|
|
14
|
+
const content = jsonFormatter.formatText({
|
|
15
|
+
filePath: "test.json",
|
|
16
|
+
fileText: JSON.stringify(jsonSchema)
|
|
17
|
+
});
|
|
18
|
+
await fs.promises.writeFile("./config-json-schema.json", content);
|
|
19
|
+
}
|
|
20
|
+
main();
|
|
21
|
+
//#endregion
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=write-json-schema.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-json-schema.cjs","names":["createFromBuffer","readFileSync","getPath","z","config"],"sources":["../src/write-json-schema.ts"],"sourcesContent":["import { promises as fs, readFileSync } from \"fs\";\n\nimport { createFromBuffer } from \"@dprint/formatter\";\nimport { getPath } from \"@dprint/json\";\nimport { z } from \"zod\";\n\nimport { config } from \"./config.ts\";\n\nconst jsonFormatter = createFromBuffer(readFileSync(getPath()));\n\nasync function main() {\n // `io: \"input\"` since the schema validates the user-authored joist-config.json, and\n // `unrepresentable: \"any\"` to skip the `uniqueBy` transform that has no JSON Schema form.\n const jsonSchema = z.toJSONSchema(config, { io: \"input\", unrepresentable: \"any\" });\n const content = jsonFormatter.formatText({ filePath: \"test.json\", fileText: JSON.stringify(jsonSchema) });\n await fs.writeFile(\"./config-json-schema.json\", content);\n}\n\nmain();\n"],"mappings":";;;;;;;AAQA,MAAM,iBAAA,GAAgBA,kBAAAA,iBAAAA,EAAAA,GAAiBC,GAAAA,aAAAA,EAAAA,GAAaC,aAAAA,QAAAA,CAAQ,CAAC,CAAC;AAE9D,eAAe,OAAO;CAGpB,MAAM,aAAaC,IAAAA,EAAE,aAAaC,eAAAA,QAAQ;EAAE,IAAI;EAAS,iBAAiB;CAAM,CAAC;CACjF,MAAM,UAAU,cAAc,WAAW;EAAE,UAAU;EAAa,UAAU,KAAK,UAAU,UAAU;CAAE,CAAC;CACxG,MAAM,GAAA,SAAG,UAAU,6BAA6B,OAAO;AACzD;AAEA,KAAK"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -1,17 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const jsonFormatter = (0, formatter_1.createFromBuffer)((0, fs_1.readFileSync)((0, json_1.getPath)()));
|
|
1
|
+
import { config } from "./config.js";
|
|
2
|
+
import { promises, readFileSync } from "fs";
|
|
3
|
+
import { createFromBuffer } from "@dprint/formatter";
|
|
4
|
+
import { getPath } from "@dprint/json";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
//#region src/write-json-schema.ts
|
|
7
|
+
const jsonFormatter = createFromBuffer(readFileSync(getPath()));
|
|
9
8
|
async function main() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
const jsonSchema = z.toJSONSchema(config, {
|
|
10
|
+
io: "input",
|
|
11
|
+
unrepresentable: "any"
|
|
12
|
+
});
|
|
13
|
+
const content = jsonFormatter.formatText({
|
|
14
|
+
filePath: "test.json",
|
|
15
|
+
fileText: JSON.stringify(jsonSchema)
|
|
16
|
+
});
|
|
17
|
+
await promises.writeFile("./config-json-schema.json", content);
|
|
15
18
|
}
|
|
16
19
|
main();
|
|
20
|
+
//#endregion
|
|
21
|
+
export {};
|
|
22
|
+
|
|
17
23
|
//# sourceMappingURL=write-json-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-json-schema.js","
|
|
1
|
+
{"version":3,"file":"write-json-schema.js","names":["fs"],"sources":["../src/write-json-schema.ts"],"sourcesContent":["import { promises as fs, readFileSync } from \"fs\";\n\nimport { createFromBuffer } from \"@dprint/formatter\";\nimport { getPath } from \"@dprint/json\";\nimport { z } from \"zod\";\n\nimport { config } from \"./config.ts\";\n\nconst jsonFormatter = createFromBuffer(readFileSync(getPath()));\n\nasync function main() {\n // `io: \"input\"` since the schema validates the user-authored joist-config.json, and\n // `unrepresentable: \"any\"` to skip the `uniqueBy` transform that has no JSON Schema form.\n const jsonSchema = z.toJSONSchema(config, { io: \"input\", unrepresentable: \"any\" });\n const content = jsonFormatter.formatText({ filePath: \"test.json\", fileText: JSON.stringify(jsonSchema) });\n await fs.writeFile(\"./config-json-schema.json\", content);\n}\n\nmain();\n"],"mappings":";;;;;;AAQA,MAAM,gBAAgB,iBAAiB,aAAa,QAAQ,CAAC,CAAC;AAE9D,eAAe,OAAO;CAGpB,MAAM,aAAa,EAAE,aAAa,QAAQ;EAAE,IAAI;EAAS,iBAAiB;CAAM,CAAC;CACjF,MAAM,UAAU,cAAc,WAAW;EAAE,UAAU;EAAa,UAAU,KAAK,UAAU,UAAU;CAAE,CAAC;CACxG,MAAMA,SAAG,UAAU,6BAA6B,OAAO;AACzD;AAEA,KAAK"}
|
package/package.json
CHANGED
|
@@ -1,50 +1,70 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "joist-codegen",
|
|
3
|
-
"version": "2.3.0-next.
|
|
3
|
+
"version": "2.3.0-next.91",
|
|
4
4
|
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"repository": {
|
|
6
7
|
"type": "git",
|
|
7
8
|
"url": "https://github.com/joist-orm/joist-orm.git",
|
|
8
9
|
"directory": "packages/codegen"
|
|
9
10
|
},
|
|
10
|
-
"main": "build/index.
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
11
|
+
"main": "build/index.cjs",
|
|
12
|
+
"module": "build/index.js",
|
|
13
|
+
"types": "build/index.d.mts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"bun": {
|
|
17
|
+
"types": "./build/index.d.mts",
|
|
18
|
+
"default": "./build/index.js"
|
|
19
|
+
},
|
|
20
|
+
"module-sync": {
|
|
21
|
+
"types": "./build/index.d.mts",
|
|
22
|
+
"default": "./build/index.js"
|
|
23
|
+
},
|
|
24
|
+
"import": {
|
|
25
|
+
"types": "./build/index.d.mts",
|
|
26
|
+
"default": "./build/index.js"
|
|
27
|
+
},
|
|
28
|
+
"require": {
|
|
29
|
+
"types": "./build/index.d.cts",
|
|
30
|
+
"default": "./build/index.cjs"
|
|
31
|
+
},
|
|
32
|
+
"default": "./build/index.js"
|
|
33
|
+
}
|
|
15
34
|
},
|
|
35
|
+
"bin": "build/index.cjs",
|
|
16
36
|
"files": [
|
|
17
|
-
"build"
|
|
37
|
+
"build",
|
|
38
|
+
"skills"
|
|
18
39
|
],
|
|
19
40
|
"peerDependencies": {
|
|
20
|
-
"joist-utils": "2.3.0-next.
|
|
41
|
+
"joist-utils": "2.3.0-next.91",
|
|
21
42
|
"knex": "^3.1.0",
|
|
22
|
-
"pg": "^8.
|
|
43
|
+
"pg": "^8.23.0"
|
|
23
44
|
},
|
|
24
45
|
"dependencies": {
|
|
25
46
|
"@dprint/formatter": "^0.5.1",
|
|
26
47
|
"@dprint/json": "^0.21.3",
|
|
27
|
-
"@inquirer/prompts": "^8.
|
|
48
|
+
"@inquirer/prompts": "^8.6.0",
|
|
28
49
|
"@types/jscodeshift": "^17.3.0",
|
|
29
50
|
"@types/pluralize": "^0.0.33",
|
|
30
51
|
"change-case": "^4.1.2",
|
|
31
52
|
"fast-glob": "^3.3.3",
|
|
32
|
-
"jscodeshift": "^17.
|
|
53
|
+
"jscodeshift": "^17.4.0",
|
|
54
|
+
"jsonc-parser": "^3.3.1",
|
|
33
55
|
"pg-structure": "^7.15.3",
|
|
34
56
|
"pluralize": "^8.0.0",
|
|
35
|
-
"prettier": "^3.
|
|
57
|
+
"prettier": "^3.9.6",
|
|
36
58
|
"ts-poet": "^6.12.0",
|
|
37
59
|
"zod": "^4.4.3"
|
|
38
60
|
},
|
|
39
61
|
"devDependencies": {
|
|
40
62
|
"@swc/jest": "^0.2.39",
|
|
41
63
|
"@types/jest": "^30.0.0",
|
|
42
|
-
"@types/node": "^26.0
|
|
64
|
+
"@types/node": "^26.2.0",
|
|
43
65
|
"jest": "30.4.2",
|
|
44
|
-
"prettier-plugin-organize-imports": "^4.3.0",
|
|
45
|
-
"ts-node-dev": "^2.0.0",
|
|
46
66
|
"tsconfig-paths": "^4.2.0",
|
|
47
|
-
"tsx": "^4.
|
|
48
|
-
"typescript": "
|
|
67
|
+
"tsx": "^4.23.12",
|
|
68
|
+
"typescript": "7.0.2"
|
|
49
69
|
}
|
|
50
70
|
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: entity-docs
|
|
3
|
+
description: Read the `src/entities/<Entity>.md` business-docs when working on an entity, its resolvers, jobs, or tests. Add only durable, non-obvious domain knowledge that helps readers understand a business rule or avoid a likely mistake; prioritize succinctness, clarity, and discretion. Also covers how `## Overview` and `## Fields`/`### fieldName` sections sync to JSDocs via `yarn joist-codegen`.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Entity docs (`src/entities/<Entity>.md`)
|
|
7
|
+
|
|
8
|
+
Many Joist entities have a sibling Markdown doc — `src/entities/Author.ts` ↔
|
|
9
|
+
`src/entities/Author.md` (same basename; enums under `src/entities/enums/` too). These files hold the
|
|
10
|
+
**"why"** that code can't: business rationale, worked scenarios, gotchas, domain vocabulary, and
|
|
11
|
+
cross-entity workflows. They are written for **both humans and agents** — you are a primary audience.
|
|
12
|
+
|
|
13
|
+
Read routinely; write selectively:
|
|
14
|
+
|
|
15
|
+
1. **Read** the sibling `.md` before/while you work on an entity, to get domain context.
|
|
16
|
+
2. **Write** only when a concise addition would give future readers important context they cannot
|
|
17
|
+
readily get from the code or existing docs. Leaving the docs unchanged is often the right outcome.
|
|
18
|
+
|
|
19
|
+
## 1. Read it first
|
|
20
|
+
|
|
21
|
+
Before editing an entity — its `src/entities/<Entity>.ts`, its resolvers, a job that touches it, or its
|
|
22
|
+
tests — open `src/entities/<Entity>.md` if one exists. It routinely explains things you would otherwise
|
|
23
|
+
have to reverse-engineer or would get subtly wrong:
|
|
24
|
+
|
|
25
|
+
- **Business rationale** — *why* a field/entity exists and what real-world thing it models
|
|
26
|
+
(e.g. `PurchaseOrder.md` on tracking "what and why" a project's cost changed).
|
|
27
|
+
- **Worked scenarios** — concrete `I.e.` walkthroughs with real values ("when an `Employee` is termined, the status workflow is...").
|
|
28
|
+
- **Gotchas & edge cases** — footguns, "this looks stale but isn't", exemptions
|
|
29
|
+
- **Domain vocabulary** — statuses, flags, and other "esoteric unless you know it" domain concepts
|
|
30
|
+
|
|
31
|
+
Follow relevant cross-links (`[Book](Book.md)`, sometimes with anchors like
|
|
32
|
+
`Book.md#Definitions`) into related docs. A missing or thin doc is not by itself a reason to add content.
|
|
33
|
+
|
|
34
|
+
## 2. How the file maps to code (the codegen doc-sync)
|
|
35
|
+
|
|
36
|
+
`joist-config.json` has `"docs": true`, so `yarn joist-codegen` keeps these `.md` files and the entity
|
|
37
|
+
JSDocs in sync. Understanding this is what makes your writing land in the right place.
|
|
38
|
+
|
|
39
|
+
**Only two heading shapes are parsed and synced; everything else is free-form narrative:**
|
|
40
|
+
|
|
41
|
+
| `.md` section | Syncs to | Notes |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `## Overview` (body) | the entity **class** JSDoc | exact heading `## Overview` |
|
|
44
|
+
| `## Fields` → `### <fieldName>` (body) | that field/property/relation's JSDoc | `### ` heading must be the **exact member name** |
|
|
45
|
+
| any other `## Section` (e.g. `## Hard vs. Soft Costs`, `## DB Constraints`, mermaid) | **nothing** | free-form; lives only in the `.md`, preserved verbatim |
|
|
46
|
+
|
|
47
|
+
Synced JSDocs are tagged `@generated <Entity>.md` in the `.ts` — that tag means "this comment came from
|
|
48
|
+
the `.md`; edit the `.md`, not here."
|
|
49
|
+
|
|
50
|
+
**Sync is bidirectional, but the `.md` wins.** `yarn joist-codegen`:
|
|
51
|
+
|
|
52
|
+
1. **Backfills** the `.md` from any hand-written `.ts` JSDoc that isn't in the `.md` yet (so a jsdoc you
|
|
53
|
+
write directly on a field gets pulled into `## Fields` for you), then
|
|
54
|
+
2. **Writes the `.md` back into the `.ts`** JSDocs — so for anything already in the `.md`, the `.md` is
|
|
55
|
+
the source of truth and will overwrite a divergent `.ts` comment.
|
|
56
|
+
|
|
57
|
+
Net rule: **to durably document an entity or field, edit the `.md`.** Hand-editing a `@generated` JSDoc
|
|
58
|
+
in the `.ts` gets stomped on the next codegen.
|
|
59
|
+
|
|
60
|
+
### Field-heading constraints (easy to get wrong)
|
|
61
|
+
|
|
62
|
+
- `### <fieldName>` must be a **single word** — the parser matches `\w+` only. `### excludeFromBudget`
|
|
63
|
+
works; `### is excluded`, `` ### `excludeFromBudget` ``, or `### excludeFromBudget (derived)` are **not**
|
|
64
|
+
recognized as field docs.
|
|
65
|
+
- It must be the **exact** name of a field, relation, or property on the entity, and must sit **under the
|
|
66
|
+
`## Fields` heading**. Any other `##` heading ends the fields section — so keep all `### fieldName`
|
|
67
|
+
entries together under the one `## Fields` section (conventionally at the bottom of the file).
|
|
68
|
+
- **Methods don't sync** — only fields/getters/properties/relations get their JSDoc updated.
|
|
69
|
+
|
|
70
|
+
## 3. Choose what is worth documenting
|
|
71
|
+
|
|
72
|
+
Add a note only when the knowledge is durable, non-obvious, and useful for a future domain decision or
|
|
73
|
+
for avoiding a likely mistake. Possible candidates, not a checklist to fill:
|
|
74
|
+
|
|
75
|
+
- You just figured out **why** an entity or field exists, or what it really models.
|
|
76
|
+
- A **non-obvious business rule**, invariant, or "this only applies to X clients" exemption.
|
|
77
|
+
- A **gotcha / footgun** — a value that looks stale but isn't, an ordering requirement, a special-cased
|
|
78
|
+
type.
|
|
79
|
+
- A **cross-entity interaction** or workflow that isn't visible from one file.
|
|
80
|
+
- **Domain vocabulary** a newcomer (human or agent) wouldn't know.
|
|
81
|
+
- A **worked scenario** needed to resolve an ambiguity that a short explanation cannot.
|
|
82
|
+
|
|
83
|
+
**Omit** what the code already says plainly, transient implementation details, exhaustive edge-case
|
|
84
|
+
lists, and a recap of the work just completed. Do not repeat knowledge already documented elsewhere;
|
|
85
|
+
link to it when readers need it. Correct outdated guidance rather than appending a competing explanation.
|
|
86
|
+
|
|
87
|
+
**Where to put it:**
|
|
88
|
+
|
|
89
|
+
- Something specific to one field → a `### <fieldName>` block under `## Fields`. It syncs to that
|
|
90
|
+
member's JSDoc, so it shows on hover/`@generated` in the `.ts`.
|
|
91
|
+
- The entity's purpose → a short `## Overview`, which syncs to the class JSDoc.
|
|
92
|
+
- Necessary longer explanations or cross-entity workflows → a free-form `##` section, linked from the
|
|
93
|
+
field doc if needed. Keep synced JSDocs small enough to read comfortably on hover.
|
|
94
|
+
|
|
95
|
+
**Style** (prioritize succinctness and clarity):
|
|
96
|
+
|
|
97
|
+
- Lead with business meaning and *why*. Use plain language and state each fact once.
|
|
98
|
+
- Default to one sentence for a field and one short paragraph for an overview. Add detail only when
|
|
99
|
+
shortening it would hide an important rule or make the meaning ambiguous.
|
|
100
|
+
- Use a single brief `I.e. ...` example with concrete values only when it clarifies a difficult rule.
|
|
101
|
+
Do not add examples, diagrams, or sections merely to make the doc look complete.
|
|
102
|
+
- Cross-link related entities with relative links: `[Book](Book.md)`.
|
|
103
|
+
- Reference field/entity names in backticks.
|
|
104
|
+
- Before finishing, remove any sentence that does not add necessary meaning. Match existing terminology,
|
|
105
|
+
but do not copy existing verbosity.
|
|
106
|
+
|
|
107
|
+
## 4. Workflow to add or update a doc
|
|
108
|
+
|
|
109
|
+
1. If an addition meets the criteria above, edit `src/entities/<Entity>.md` (create it only if needed — basename must equal the entity, e.g.
|
|
110
|
+
`Author.md`). For field docs, use the exact member name as a `### ` heading under `## Fields`.
|
|
111
|
+
2. Sync into the JSDocs:
|
|
112
|
+
```bash
|
|
113
|
+
mise exec -- yarn joist-codegen
|
|
114
|
+
```
|
|
115
|
+
(or `mise exec -- yarn codegen` to also run graphql-codegen.)
|
|
116
|
+
3. Verify the `@generated <Entity>.md` JSDoc now appears on the class / field in `src/entities/<Entity>.ts`.
|
|
117
|
+
4. Commit the `.md` **and** the regenerated `.ts` JSDoc changes together.
|
|
118
|
+
|
|
119
|
+
Never hand-edit a `@generated <Entity>.md` JSDoc in the `.ts` — edit the `.md` and re-run codegen. Do not
|
|
120
|
+
touch files under `src/entities/codegen/` (see the repo's generated-files rules).
|
|
121
|
+
|
|
122
|
+
## Skeleton for a new doc
|
|
123
|
+
|
|
124
|
+
Include only the sections and fields that need explanation; this is a structure, not a checklist.
|
|
125
|
+
|
|
126
|
+
```markdown
|
|
127
|
+
# <Entity>
|
|
128
|
+
|
|
129
|
+
## Overview
|
|
130
|
+
|
|
131
|
+
<What this entity models and *why* it exists, in business terms. One short paragraph.>
|
|
132
|
+
|
|
133
|
+
## <Some Business Concept> <!-- free-form: rationale, scenarios, gotchas, diagrams; NOT synced -->
|
|
134
|
+
|
|
135
|
+
<Only if needed: a concise explanation of a non-obvious business concept.>
|
|
136
|
+
|
|
137
|
+
## Fields <!-- each ### below syncs into that member's JSDoc -->
|
|
138
|
+
|
|
139
|
+
### someField
|
|
140
|
+
|
|
141
|
+
<Usually one sentence: why it exists or the important non-obvious rule.>
|
|
142
|
+
```
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: joist-em-basics
|
|
3
|
+
description: Create, load, find, mutate, and save entities with Joist's EntityManager. Use when writing data-access or business logic in a Joist project — anything using em.create, em.load, em.find, em.flush, or walking the entity graph.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- Managed by joist-codegen. Do not edit by hand; re-run codegen to update. -->
|
|
7
|
+
|
|
8
|
+
# Joist EntityManager basics
|
|
9
|
+
|
|
10
|
+
The `EntityManager` (`em`) is how entities are loaded from and saved to the
|
|
11
|
+
database. It is a Unit of Work: each request gets its own `em`, which tracks
|
|
12
|
+
the entities it has loaded/created and writes them all out on `em.flush()`.
|
|
13
|
+
|
|
14
|
+
Entities are always loaded/created _through_ the `em`, never via static methods
|
|
15
|
+
on the class (Joist is not ActiveRecord). IDs are tagged strings like `"a:1"`.
|
|
16
|
+
|
|
17
|
+
## Creating
|
|
18
|
+
|
|
19
|
+
`em.create` is synchronous and returns the new entity immediately:
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
const author = em.create(Author, { firstName: "a1" });
|
|
23
|
+
// Nested/related entities can be created inline
|
|
24
|
+
const author = em.create(Author, { firstName: "a1", address: { street: "123 Main" } });
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Loading by id
|
|
28
|
+
|
|
29
|
+
Use tagged ids. These throw if the id does not exist (except the `IfExists`
|
|
30
|
+
variants):
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
const a = await em.load(Author, "a:1");
|
|
34
|
+
const as = await em.loadAll(Author, ["a:1", "a:2"]);
|
|
35
|
+
const as = await em.loadAllIfExists(Author, ["a:1", "a:2"]); // skips missing ids
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
To eagerly load relations, pass a populate hint as the 3rd argument; the
|
|
39
|
+
returned entity is typed as "loaded" so the relations can be read synchronously:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
const a = await em.load(Author, "a:1", { books: "reviews" });
|
|
43
|
+
a.books.get.flatMap((b) => b.reviews.get);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Walking the graph
|
|
47
|
+
|
|
48
|
+
~90% of reads are just navigating relations from an entity you already have.
|
|
49
|
+
These are guaranteed N+1-safe, even in a loop:
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
const author = await book.author.load(); // load a single relation
|
|
53
|
+
const reviews = await publisher.load((p) => p.books.reviews); // lens
|
|
54
|
+
const loaded = await author.populate({ books: "reviews" }); // populate + .get
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Finding (filtered queries)
|
|
58
|
+
|
|
59
|
+
`em.find` issues a `SELECT` with a "join literal" of nested relations plus
|
|
60
|
+
inline `WHERE` conditions. It is batch/N+1-safe.
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
const books = await em.find(Book, { author: { firstName: "a1" } });
|
|
64
|
+
const recent = await em.find(Book, { publishedAt: { gte: jan1 } });
|
|
65
|
+
const some = await em.find(Author, { firstName: { in: ["a1", "a2"] } });
|
|
66
|
+
|
|
67
|
+
const one = await em.findOne(Book, { title: "b1" }); // undefined if none
|
|
68
|
+
const one = await em.findOneOrFail(Book, { title: "b1" }); // throws if none
|
|
69
|
+
const one = await em.findOrCreate(Author, { email: "a@b.com" });
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`undefined` values are pruned (the condition and any now-unused join are
|
|
73
|
+
dropped), so filters compose cleanly. To filter for null, pass `null`
|
|
74
|
+
explicitly, e.g. `{ firstName: null }`. For `OR` / nested boolean logic, use
|
|
75
|
+
`alias`/`aliases` with a `conditions` argument. For aggregates or group-bys,
|
|
76
|
+
drop down to Knex/Kysely — Joist's `find` only returns whole entities.
|
|
77
|
+
|
|
78
|
+
## Mutating
|
|
79
|
+
|
|
80
|
+
Assign fields directly, or use `.set` for a batch of changes:
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
author.firstName = "a2";
|
|
84
|
+
author.set({ firstName: "a2", lastName: "b2" });
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
For partial/RPC-style updates (treating `null` as "unset"), and for
|
|
88
|
+
incrementally updating children, see the `joist-upsert` skill.
|
|
89
|
+
|
|
90
|
+
## Deleting
|
|
91
|
+
|
|
92
|
+
```ts
|
|
93
|
+
const a = await em.load(Author, "a:1");
|
|
94
|
+
em.delete(a);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Saving with `em.flush()`
|
|
98
|
+
|
|
99
|
+
`em.flush()` is where everything happens. It is async and:
|
|
100
|
+
|
|
101
|
+
1. Runs lifecycle hooks and validation rules,
|
|
102
|
+
2. Opens a transaction,
|
|
103
|
+
3. Issues batched `INSERT`/`UPDATE`/`DELETE` (one batch per entity type),
|
|
104
|
+
4. Commits.
|
|
105
|
+
|
|
106
|
+
You don't write individual SQL statements — let Joist batch them. `flush` can
|
|
107
|
+
be called multiple times as you do more work:
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
const author = em.create(Author, { firstName: "a1" });
|
|
111
|
+
await em.flush();
|
|
112
|
+
author.firstName = "a2";
|
|
113
|
+
await em.flush();
|
|
114
|
+
```
|