joist-codegen 2.3.0-next.7 → 2.3.0-next.71
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 +1009 -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 +792 -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 +241 -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 +221 -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 +133 -0
- package/skills/joist-em-basics/SKILL.md +114 -0
- package/skills/joist-partial-updates/SKILL.md +352 -0
- package/skills/joist-reactive-hints/SKILL.md +150 -0
- package/skills/joist-test-factories/SKILL.md +397 -0
- package/skills/joist-upsert/SKILL.md +95 -0
- package/build/EntityDbMetadata.d.ts +0 -269
- package/build/EntityDbMetadata.d.ts.map +0 -1
- package/build/EntityDbMetadata.test.d.ts +0 -2
- package/build/EntityDbMetadata.test.d.ts.map +0 -1
- package/build/EntityDbMetadata.test.js +0 -211
- package/build/EntityDbMetadata.test.js.map +0 -1
- package/build/assignTags.d.ts.map +0 -1
- package/build/codemods/Codemod.d.ts +0 -14
- package/build/codemods/Codemod.d.ts.map +0 -1
- package/build/codemods/Codemod.js.map +0 -1
- package/build/codemods/JscodeshiftMod.d.ts +0 -11
- package/build/codemods/JscodeshiftMod.d.ts.map +0 -1
- package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.d.ts +0 -2
- package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.d.ts.map +0 -1
- package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.js +0 -9
- package/build/codemods/__tests__/codemod_0001-rename_has_async_property.test.js.map +0 -1
- package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.d.ts +0 -2
- package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.d.ts.map +0 -1
- package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.js +0 -9
- package/build/codemods/__tests__/codemod_0002-rename_async_query_fields.test.js.map +0 -1
- package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.d.ts +0 -2
- package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.d.ts.map +0 -1
- package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.js +0 -9
- package/build/codemods/__tests__/codemod_0003-rename_find_paginated.test.js.map +0 -1
- package/build/codemods/codemod_0001-rename_has_async_property.d.ts +0 -7
- package/build/codemods/codemod_0001-rename_has_async_property.d.ts.map +0 -1
- package/build/codemods/codemod_0002-rename_async_query_fields.d.ts +0 -7
- package/build/codemods/codemod_0002-rename_async_query_fields.d.ts.map +0 -1
- package/build/codemods/codemod_0003-rename_find_paginated.d.ts +0 -7
- package/build/codemods/codemod_0003-rename_find_paginated.d.ts.map +0 -1
- package/build/codemods/index.d.ts +0 -9
- package/build/codemods/index.d.ts.map +0 -1
- package/build/codemods/index.test.d.ts +0 -2
- package/build/codemods/index.test.d.ts.map +0 -1
- package/build/codemods/index.test.js +0 -24
- package/build/codemods/index.test.js.map +0 -1
- package/build/config.d.ts +0 -167
- package/build/config.d.ts.map +0 -1
- package/build/config.test.d.ts +0 -2
- package/build/config.test.d.ts.map +0 -1
- package/build/config.test.js +0 -78
- package/build/config.test.js.map +0 -1
- package/build/docs/cache.d.ts +0 -14
- package/build/docs/cache.d.ts.map +0 -1
- package/build/docs/cache.test.d.ts +0 -2
- package/build/docs/cache.test.d.ts.map +0 -1
- package/build/docs/cache.test.js +0 -47
- package/build/docs/cache.test.js.map +0 -1
- package/build/docs/generate-metadata-docs.d.ts +0 -6
- package/build/docs/generate-metadata-docs.d.ts.map +0 -1
- package/build/docs/index.d.ts +0 -9
- package/build/docs/index.d.ts.map +0 -1
- package/build/docs/index.test.d.ts +0 -2
- package/build/docs/index.test.d.ts.map +0 -1
- package/build/docs/index.test.js +0 -100
- package/build/docs/index.test.js.map +0 -1
- package/build/docs/markdown.d.ts.map +0 -1
- package/build/docs/markdown.test.d.ts +0 -2
- package/build/docs/markdown.test.d.ts.map +0 -1
- package/build/docs/markdown.test.js +0 -280
- package/build/docs/markdown.test.js.map +0 -1
- package/build/docs/parsing.d.ts +0 -42
- package/build/docs/parsing.d.ts.map +0 -1
- package/build/docs/parsing.test.d.ts +0 -2
- package/build/docs/parsing.test.d.ts.map +0 -1
- package/build/docs/parsing.test.js +0 -190
- package/build/docs/parsing.test.js.map +0 -1
- package/build/findEntityScopes.d.ts +0 -11
- package/build/findEntityScopes.d.ts.map +0 -1
- package/build/foreignKeyOrdering.d.ts +0 -3
- package/build/foreignKeyOrdering.d.ts.map +0 -1
- package/build/generate.d.ts +0 -12
- package/build/generate.d.ts.map +0 -1
- package/build/generateEntitiesFile.d.ts +0 -7
- package/build/generateEntitiesFile.d.ts.map +0 -1
- package/build/generateEntityCodegenFile.d.ts +0 -11
- package/build/generateEntityCodegenFile.d.ts.map +0 -1
- package/build/generateEntityFile.d.ts +0 -6
- package/build/generateEntityFile.d.ts.map +0 -1
- package/build/generateEntityTestFile.d.ts +0 -6
- package/build/generateEntityTestFile.d.ts.map +0 -1
- package/build/generateEnumFile.d.ts +0 -5
- package/build/generateEnumFile.d.ts.map +0 -1
- package/build/generateFactoriesFiles.d.ts +0 -4
- package/build/generateFactoriesFiles.d.ts.map +0 -1
- package/build/generateFlushFunction.d.ts.map +0 -1
- package/build/generateMetadataFile.d.ts +0 -5
- package/build/generateMetadataFile.d.ts.map +0 -1
- package/build/generatePgEnumFile.d.ts +0 -5
- package/build/generatePgEnumFile.d.ts.map +0 -1
- package/build/index.d.ts +0 -11
- package/build/index.d.ts.map +0 -1
- package/build/inheritance.d.ts +0 -10
- package/build/inheritance.d.ts.map +0 -1
- package/build/keywords.d.ts +0 -2
- package/build/keywords.d.ts.map +0 -1
- package/build/loadMetadata.d.ts +0 -26
- package/build/loadMetadata.d.ts.map +0 -1
- package/build/logger.d.ts +0 -10
- package/build/logger.d.ts.map +0 -1
- package/build/scanEntityFiles.d.ts +0 -5
- package/build/scanEntityFiles.d.ts.map +0 -1
- package/build/sortForeignKeys.d.ts.map +0 -1
- package/build/symbols.d.ts +0 -108
- package/build/symbols.d.ts.map +0 -1
- package/build/tsdoc.d.ts +0 -12
- package/build/tsdoc.d.ts.map +0 -1
- package/build/utils.d.ts +0 -31
- package/build/utils.d.ts.map +0 -1
- package/build/write-json-schema.d.ts +0 -2
- package/build/write-json-schema.d.ts.map +0 -1
package/build/docs/markdown.js
CHANGED
|
@@ -1,241 +1,173 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.testing = void 0;
|
|
37
|
-
exports.maybeReadMarkdownFile = maybeReadMarkdownFile;
|
|
38
|
-
exports.parseMarkdownContent = parseMarkdownContent;
|
|
39
|
-
exports.writeMarkdownDoc = writeMarkdownDoc;
|
|
40
|
-
exports.updateMarkdownDoc = updateMarkdownDoc;
|
|
41
|
-
exports.getMarkdownFilePath = getMarkdownFilePath;
|
|
42
|
-
const fs_1 = require("fs");
|
|
43
|
-
const path_1 = require("path");
|
|
44
|
-
const prettier_1 = __importStar(require("prettier"));
|
|
1
|
+
import { promises } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import prettier, { resolveConfig } from "prettier";
|
|
4
|
+
//#region src/docs/markdown.ts
|
|
45
5
|
/** Read and parse a .md file if it exists, returning undefined if it doesn't. */
|
|
46
6
|
async function maybeReadMarkdownFile(filePath) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return undefined;
|
|
53
|
-
}
|
|
7
|
+
try {
|
|
8
|
+
return parseMarkdownContent(await promises.readFile(filePath, "utf-8"));
|
|
9
|
+
} catch {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
54
12
|
}
|
|
55
13
|
/** Reads a basic `overview` and per-field docs out of md content. */
|
|
56
14
|
function parseMarkdownContent(content) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
return {
|
|
95
|
-
overview: trimBlankLines(overviewLines).join("\n"),
|
|
96
|
-
fields: Object.fromEntries(Object.entries(fields).map(([k, v]) => [k, trimBlankLines(v).join("\n")])),
|
|
97
|
-
};
|
|
15
|
+
const lines = content.split("\n");
|
|
16
|
+
let currentSection = null;
|
|
17
|
+
let currentField = null;
|
|
18
|
+
const overviewLines = [];
|
|
19
|
+
const fields = {};
|
|
20
|
+
for (const line of lines) {
|
|
21
|
+
if (/^## Overview\s*$/.test(line)) {
|
|
22
|
+
currentSection = "overview";
|
|
23
|
+
currentField = null;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (/^## Fields\s*$/.test(line)) {
|
|
27
|
+
currentSection = "fields";
|
|
28
|
+
currentField = null;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (line.startsWith("## ")) {
|
|
32
|
+
currentSection = null;
|
|
33
|
+
currentField = null;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (currentSection === "fields") {
|
|
37
|
+
const fieldMatch = line.match(/^### (\w+)\s*$/);
|
|
38
|
+
if (fieldMatch) {
|
|
39
|
+
currentField = fieldMatch[1];
|
|
40
|
+
fields[currentField] = [];
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (currentSection === "overview") overviewLines.push(line);
|
|
45
|
+
else if (currentSection === "fields" && currentField) fields[currentField].push(line);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
overview: trimBlankLines(overviewLines).join("\n"),
|
|
49
|
+
fields: Object.fromEntries(Object.entries(fields).map(([k, v]) => [k, trimBlankLines(v).join("\n")]))
|
|
50
|
+
};
|
|
98
51
|
}
|
|
99
52
|
/** Create a new .md file from scratch (used only for initial backfill when no .md exists). */
|
|
100
53
|
async function writeMarkdownDoc(filePath, overview, fields) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
54
|
+
const parts = [];
|
|
55
|
+
parts.push("## Overview");
|
|
56
|
+
parts.push(overview || "");
|
|
57
|
+
parts.push("");
|
|
58
|
+
if (fields && Object.keys(fields).length > 0) {
|
|
59
|
+
parts.push("## Fields");
|
|
60
|
+
parts.push("");
|
|
61
|
+
for (const [fieldName, fieldDoc] of Object.entries(fields)) {
|
|
62
|
+
parts.push(`### ${fieldName}`);
|
|
63
|
+
parts.push("");
|
|
64
|
+
parts.push(fieldDoc);
|
|
65
|
+
parts.push("");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const prettierConfig = await resolveConfig(filePath);
|
|
69
|
+
const content = await prettier.format(parts.join("\n"), {
|
|
70
|
+
...prettierConfig,
|
|
71
|
+
parser: "markdown",
|
|
72
|
+
plugins: []
|
|
73
|
+
});
|
|
74
|
+
await promises.writeFile(filePath, content, "utf-8");
|
|
122
75
|
}
|
|
123
76
|
/**
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
77
|
+
* Update an existing .md file, merging in new/changed content without stomping user content.
|
|
78
|
+
* If the file doesn't exist, creates it from scratch.
|
|
79
|
+
*/
|
|
127
80
|
async function updateMarkdownDoc(filePath, overview, fields) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
const updated = mergeMarkdownContent(existing, overview, fields);
|
|
137
|
-
if (updated !== existing) {
|
|
138
|
-
await fs_1.promises.writeFile(filePath, updated, "utf-8");
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
await writeMarkdownDoc(filePath, overview ?? "", Object.keys(fields).length > 0 ? fields : undefined);
|
|
143
|
-
}
|
|
81
|
+
let existing = null;
|
|
82
|
+
try {
|
|
83
|
+
existing = await promises.readFile(filePath, "utf-8");
|
|
84
|
+
} catch {}
|
|
85
|
+
if (existing !== null) {
|
|
86
|
+
const updated = mergeMarkdownContent(existing, overview, fields);
|
|
87
|
+
if (updated !== existing) await promises.writeFile(filePath, updated, "utf-8");
|
|
88
|
+
} else await writeMarkdownDoc(filePath, overview ?? "", Object.keys(fields).length > 0 ? fields : void 0);
|
|
144
89
|
}
|
|
145
90
|
function getMarkdownFilePath(entitiesDir, entityName) {
|
|
146
|
-
|
|
91
|
+
return join(entitiesDir, `${entityName}.md`);
|
|
147
92
|
}
|
|
148
93
|
/** Trim leading/trailing blank lines but preserve internal blank lines. */
|
|
149
94
|
function trimBlankLines(lines) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
end--;
|
|
156
|
-
return lines.slice(start, end + 1);
|
|
95
|
+
let start = 0;
|
|
96
|
+
while (start < lines.length && lines[start].trim() === "") start++;
|
|
97
|
+
let end = lines.length - 1;
|
|
98
|
+
while (end >= start && lines[end].trim() === "") end--;
|
|
99
|
+
return lines.slice(start, end + 1);
|
|
157
100
|
}
|
|
158
101
|
/**
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
102
|
+
* Merge updates into an existing .md file, preserving all user content.
|
|
103
|
+
*
|
|
104
|
+
* - If `overview` is provided and the file has `## Overview`, replaces its body
|
|
105
|
+
* - For each field in `fields`, if `### fieldName` exists, replaces its body;
|
|
106
|
+
* otherwise appends it to the `## Fields` section (creating the section if needed)
|
|
107
|
+
* - All other content (custom sections, tables, etc.) is preserved verbatim
|
|
108
|
+
*/
|
|
166
109
|
function mergeMarkdownContent(existing, overview, fields) {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
result.push("## Fields");
|
|
226
|
-
result.push("");
|
|
227
|
-
fieldsEndIndex = result.length;
|
|
228
|
-
}
|
|
229
|
-
const toInsert = [];
|
|
230
|
-
for (const [fieldName, fieldDoc] of newFields) {
|
|
231
|
-
toInsert.push(`### ${fieldName}`);
|
|
232
|
-
toInsert.push("");
|
|
233
|
-
toInsert.push(fieldDoc);
|
|
234
|
-
toInsert.push("");
|
|
235
|
-
}
|
|
236
|
-
result.splice(fieldsEndIndex, 0, ...toInsert);
|
|
237
|
-
}
|
|
238
|
-
return result.join("\n");
|
|
110
|
+
const lines = existing.split("\n");
|
|
111
|
+
const result = [];
|
|
112
|
+
const mergedFields = /* @__PURE__ */ new Set();
|
|
113
|
+
let fieldsEndIndex = -1;
|
|
114
|
+
let i = 0;
|
|
115
|
+
while (i < lines.length) {
|
|
116
|
+
const line = lines[i];
|
|
117
|
+
if (/^## Overview\s*$/.test(line) && overview !== void 0) {
|
|
118
|
+
result.push(line);
|
|
119
|
+
i++;
|
|
120
|
+
while (i < lines.length && !lines[i].startsWith("## ")) i++;
|
|
121
|
+
result.push(overview || "");
|
|
122
|
+
result.push("");
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (/^## Fields\s*$/.test(line)) {
|
|
126
|
+
result.push(line);
|
|
127
|
+
i++;
|
|
128
|
+
while (i < lines.length && !lines[i].startsWith("## ")) {
|
|
129
|
+
const fieldMatch = lines[i].match(/^### (\w+)\s*$/);
|
|
130
|
+
if (fieldMatch && fieldMatch[1] in fields) {
|
|
131
|
+
const fieldName = fieldMatch[1];
|
|
132
|
+
mergedFields.add(fieldName);
|
|
133
|
+
result.push(lines[i]);
|
|
134
|
+
i++;
|
|
135
|
+
while (i < lines.length && !/^###? /.test(lines[i]) && !lines[i].startsWith("## ")) i++;
|
|
136
|
+
result.push("");
|
|
137
|
+
result.push(fields[fieldName]);
|
|
138
|
+
result.push("");
|
|
139
|
+
} else {
|
|
140
|
+
result.push(lines[i]);
|
|
141
|
+
i++;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
fieldsEndIndex = result.length;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
result.push(line);
|
|
148
|
+
i++;
|
|
149
|
+
}
|
|
150
|
+
const newFields = Object.entries(fields).filter(([name]) => !mergedFields.has(name));
|
|
151
|
+
if (newFields.length > 0) {
|
|
152
|
+
if (fieldsEndIndex === -1) {
|
|
153
|
+
result.push("");
|
|
154
|
+
result.push("## Fields");
|
|
155
|
+
result.push("");
|
|
156
|
+
fieldsEndIndex = result.length;
|
|
157
|
+
}
|
|
158
|
+
const toInsert = [];
|
|
159
|
+
for (const [fieldName, fieldDoc] of newFields) {
|
|
160
|
+
toInsert.push(`### ${fieldName}`);
|
|
161
|
+
toInsert.push("");
|
|
162
|
+
toInsert.push(fieldDoc);
|
|
163
|
+
toInsert.push("");
|
|
164
|
+
}
|
|
165
|
+
result.splice(fieldsEndIndex, 0, ...toInsert);
|
|
166
|
+
}
|
|
167
|
+
return result.join("\n");
|
|
239
168
|
}
|
|
240
|
-
|
|
169
|
+
const testing = { mergeMarkdownContent };
|
|
170
|
+
//#endregion
|
|
171
|
+
export { getMarkdownFilePath, maybeReadMarkdownFile, parseMarkdownContent, testing, updateMarkdownDoc, writeMarkdownDoc };
|
|
172
|
+
|
|
241
173
|
//# sourceMappingURL=markdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/docs/markdown.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"markdown.js","names":["fs"],"sources":["../../src/docs/markdown.ts"],"sourcesContent":["import { promises as fs } from \"fs\";\nimport { join } from \"path\";\n\nimport prettier, { resolveConfig } from \"prettier\";\n\nexport interface ParsedDoc {\n overview: string;\n fields: Record<string, string>;\n}\n\n/** Read and parse a .md file if it exists, returning undefined if it doesn't. */\nexport async function maybeReadMarkdownFile(filePath: string): Promise<ParsedDoc | undefined> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n return parseMarkdownContent(content);\n } catch {\n return undefined;\n }\n}\n\n/** Reads a basic `overview` and per-field docs out of md content. */\nexport function parseMarkdownContent(content: string): ParsedDoc {\n const lines = content.split(\"\\n\");\n let currentSection: \"overview\" | \"fields\" | null = null;\n let currentField: string | null = null;\n\n const overviewLines: string[] = [];\n const fields: Record<string, string[]> = {};\n\n for (const line of lines) {\n if (/^## Overview\\s*$/.test(line)) {\n currentSection = \"overview\";\n currentField = null;\n continue;\n }\n if (/^## Fields\\s*$/.test(line)) {\n currentSection = \"fields\";\n currentField = null;\n continue;\n }\n // Any other ## resets us out of known sections\n if (line.startsWith(\"## \")) {\n currentSection = null;\n currentField = null;\n continue;\n }\n\n if (currentSection === \"fields\") {\n const fieldMatch = line.match(/^### (\\w+)\\s*$/);\n if (fieldMatch) {\n currentField = fieldMatch[1];\n fields[currentField] = [];\n continue;\n }\n }\n\n if (currentSection === \"overview\") {\n overviewLines.push(line);\n } else if (currentSection === \"fields\" && currentField) {\n fields[currentField].push(line);\n }\n }\n\n return {\n overview: trimBlankLines(overviewLines).join(\"\\n\"),\n fields: Object.fromEntries(Object.entries(fields).map(([k, v]) => [k, trimBlankLines(v).join(\"\\n\")])),\n };\n}\n\n/** Create a new .md file from scratch (used only for initial backfill when no .md exists). */\nexport async function writeMarkdownDoc(\n filePath: string,\n overview: string,\n fields?: Record<string, string>,\n): Promise<void> {\n const parts: string[] = [];\n\n parts.push(\"## Overview\");\n parts.push(overview || \"\");\n parts.push(\"\");\n\n if (fields && Object.keys(fields).length > 0) {\n parts.push(\"## Fields\");\n parts.push(\"\");\n for (const [fieldName, fieldDoc] of Object.entries(fields)) {\n parts.push(`### ${fieldName}`);\n parts.push(\"\");\n parts.push(fieldDoc);\n parts.push(\"\");\n }\n }\n\n const prettierConfig = await resolveConfig(filePath);\n const content = await prettier.format(parts.join(\"\\n\"), {\n ...prettierConfig,\n parser: \"markdown\",\n plugins: [],\n });\n\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Update an existing .md file, merging in new/changed content without stomping user content.\n * If the file doesn't exist, creates it from scratch.\n */\nexport async function updateMarkdownDoc(\n filePath: string,\n overview: string | undefined,\n fields: Record<string, string>,\n): Promise<void> {\n let existing: string | null = null;\n try {\n existing = await fs.readFile(filePath, \"utf-8\");\n } catch {\n // File doesn't exist\n }\n\n if (existing !== null) {\n const updated = mergeMarkdownContent(existing, overview, fields);\n if (updated !== existing) {\n await fs.writeFile(filePath, updated, \"utf-8\");\n }\n } else {\n await writeMarkdownDoc(filePath, overview ?? \"\", Object.keys(fields).length > 0 ? fields : undefined);\n }\n}\n\nexport function getMarkdownFilePath(entitiesDir: string, entityName: string): string {\n return join(entitiesDir, `${entityName}.md`);\n}\n\n/** Trim leading/trailing blank lines but preserve internal blank lines. */\nfunction trimBlankLines(lines: string[]): string[] {\n let start = 0;\n while (start < lines.length && lines[start].trim() === \"\") start++;\n let end = lines.length - 1;\n while (end >= start && lines[end].trim() === \"\") end--;\n return lines.slice(start, end + 1);\n}\n\n/**\n * Merge updates into an existing .md file, preserving all user content.\n *\n * - If `overview` is provided and the file has `## Overview`, replaces its body\n * - For each field in `fields`, if `### fieldName` exists, replaces its body;\n * otherwise appends it to the `## Fields` section (creating the section if needed)\n * - All other content (custom sections, tables, etc.) is preserved verbatim\n */\nfunction mergeMarkdownContent(existing: string, overview: string | undefined, fields: Record<string, string>): string {\n const lines = existing.split(\"\\n\");\n const result: string[] = [];\n\n // Track which fields we've already merged so we know what to append\n const mergedFields = new Set<string>();\n let fieldsEndIndex = -1;\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n\n // Replace ## Overview body\n if (/^## Overview\\s*$/.test(line) && overview !== undefined) {\n result.push(line);\n i++;\n // Skip over old overview body (until next ## or EOF)\n while (i < lines.length && !lines[i].startsWith(\"## \")) i++;\n // Write new overview body\n result.push(overview || \"\");\n result.push(\"\");\n continue;\n }\n\n // Track where ## Fields section ends (for appending new fields)\n if (/^## Fields\\s*$/.test(line)) {\n result.push(line);\n i++;\n // Process the fields section line by line\n while (i < lines.length && !lines[i].startsWith(\"## \")) {\n const fieldMatch = lines[i].match(/^### (\\w+)\\s*$/);\n if (fieldMatch && fieldMatch[1] in fields) {\n const fieldName = fieldMatch[1];\n mergedFields.add(fieldName);\n result.push(lines[i]); // ### fieldName\n i++;\n // Skip old field body (until next ### or ## or EOF)\n while (i < lines.length && !/^###? /.test(lines[i]) && !lines[i].startsWith(\"## \")) i++;\n // Write new field body\n result.push(\"\");\n result.push(fields[fieldName]);\n result.push(\"\");\n } else {\n // Keep any line that isn't a field we're replacing (other ### fields, blank lines, etc.)\n result.push(lines[i]);\n i++;\n }\n }\n fieldsEndIndex = result.length;\n continue;\n }\n\n result.push(line);\n i++;\n }\n\n // Append any fields that weren't already in the file\n const newFields = Object.entries(fields).filter(([name]) => !mergedFields.has(name));\n if (newFields.length > 0) {\n if (fieldsEndIndex === -1) {\n // No ## Fields section existed, create one\n result.push(\"\");\n result.push(\"## Fields\");\n result.push(\"\");\n fieldsEndIndex = result.length;\n }\n const toInsert: string[] = [];\n for (const [fieldName, fieldDoc] of newFields) {\n toInsert.push(`### ${fieldName}`);\n toInsert.push(\"\");\n toInsert.push(fieldDoc);\n toInsert.push(\"\");\n }\n result.splice(fieldsEndIndex, 0, ...toInsert);\n }\n\n return result.join(\"\\n\");\n}\n\nexport const testing = { mergeMarkdownContent };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
3
|
+
let jscodeshift = require("jscodeshift");
|
|
4
|
+
jscodeshift = require_runtime.__toESM(jscodeshift, 1);
|
|
5
|
+
//#region src/docs/parsing.ts
|
|
6
|
+
const j = jscodeshift.default.withParser("ts");
|
|
7
|
+
/** Parse an entity .ts file and extract class + member JSDoc. */
|
|
8
|
+
function parseEntityJSDocs(source) {
|
|
9
|
+
const root = j(source);
|
|
10
|
+
let classDoc;
|
|
11
|
+
let classNode;
|
|
12
|
+
const members = [];
|
|
13
|
+
root.find(j.ExportNamedDeclaration).forEach((p) => {
|
|
14
|
+
if (p.node.declaration?.type === "ClassDeclaration") {
|
|
15
|
+
classDoc = extractJSDoc(p.node);
|
|
16
|
+
classNode = p.node;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
root.find(j.ClassProperty).forEach((p) => {
|
|
20
|
+
const name = p.node.key?.name;
|
|
21
|
+
if (name) members.push({
|
|
22
|
+
name,
|
|
23
|
+
kind: "property",
|
|
24
|
+
doc: extractJSDoc(p.node),
|
|
25
|
+
node: p.node
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
root.find(j.ClassMethod).forEach((p) => {
|
|
29
|
+
const name = p.node.key?.name;
|
|
30
|
+
if (name) members.push({
|
|
31
|
+
name,
|
|
32
|
+
kind: classMethodKind(p.node),
|
|
33
|
+
doc: extractJSDoc(p.node),
|
|
34
|
+
node: p.node
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
classDoc,
|
|
39
|
+
classNode,
|
|
40
|
+
members,
|
|
41
|
+
fieldDocs: collectFieldDocs(members)
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Collect field docs from members for backfill.
|
|
46
|
+
* When a getter and setter share the same name, prefer the getter's doc.
|
|
47
|
+
*/
|
|
48
|
+
function collectFieldDocs(members) {
|
|
49
|
+
const result = {};
|
|
50
|
+
for (const m of members) {
|
|
51
|
+
if (!m.doc || m.kind === "method") continue;
|
|
52
|
+
if (result[m.name] && m.kind === "setter") continue;
|
|
53
|
+
result[m.name] = m.doc;
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Build a source edit that sets the JSDoc on a node (replacing existing or inserting new).
|
|
59
|
+
*
|
|
60
|
+
* (This is bizarre, but this `SourceEdit` + `applyEdits` leaves all existing formatting
|
|
61
|
+
* alone better than doing a `node.toSource()` or other AST-based updates. :grimmacing:)
|
|
62
|
+
*/
|
|
63
|
+
function buildJSDocEdit(node, text) {
|
|
64
|
+
const column = node.loc.start.column;
|
|
65
|
+
const existingComment = node.comments?.find((c) => c.leading && "value" in c && c.value.startsWith("*"));
|
|
66
|
+
if (existingComment) return {
|
|
67
|
+
start: existingComment.start,
|
|
68
|
+
end: existingComment.end,
|
|
69
|
+
text: buildJSDocBlock(text, column)
|
|
70
|
+
};
|
|
71
|
+
const indent = " ".repeat(column);
|
|
72
|
+
return {
|
|
73
|
+
start: node.start,
|
|
74
|
+
end: node.start,
|
|
75
|
+
text: buildJSDocBlock(text, column) + "\n" + indent
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** Apply edits to source by splicing in reverse order. */
|
|
79
|
+
function applyEdits(source, edits) {
|
|
80
|
+
const sorted = [...edits].sort((a, b) => b.start - a.start);
|
|
81
|
+
let result = source;
|
|
82
|
+
for (const edit of sorted) result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
/** Build a JSDoc block comment string from plain text. */
|
|
86
|
+
function buildJSDocBlock(text, indent) {
|
|
87
|
+
const pad = " ".repeat(indent);
|
|
88
|
+
const lines = text.split("\n");
|
|
89
|
+
if (lines.length === 1) return `/** ${lines[0]} */`;
|
|
90
|
+
return `/**\n` + lines.map((l) => l ? `${pad} * ${l}` : `${pad} *`).join("\n") + `\n${pad} */`;
|
|
91
|
+
}
|
|
92
|
+
/** The `@generated Entity.md` marker, i.e. so readers know a JSDoc is sourced from (and edited in) the `.md`. */
|
|
93
|
+
function generatedTag(entityName) {
|
|
94
|
+
return `@generated ${entityName}.md`;
|
|
95
|
+
}
|
|
96
|
+
/** Extract text from a JSDoc-style leading block comment (i.e. one starting with `*`). */
|
|
97
|
+
function extractJSDoc(node) {
|
|
98
|
+
const block = node.comments?.find((c) => c.leading && "value" in c && c.value.startsWith("*"));
|
|
99
|
+
if (!block || !("value" in block)) return void 0;
|
|
100
|
+
const lines = block.value.split("\n").map((l) => l.replace(/^\s*\*\s?/, "").trimEnd());
|
|
101
|
+
while (lines.length > 0 && lines[0].trim() === "") lines.shift();
|
|
102
|
+
while (lines.length > 0 && lines[lines.length - 1].trim() === "") lines.pop();
|
|
103
|
+
return lines.join("\n") || void 0;
|
|
104
|
+
}
|
|
105
|
+
function classMethodKind(node) {
|
|
106
|
+
if (node.kind === "get") return "getter";
|
|
107
|
+
if (node.kind === "set") return "setter";
|
|
108
|
+
return "method";
|
|
109
|
+
}
|
|
110
|
+
//#endregion
|
|
111
|
+
exports.applyEdits = applyEdits;
|
|
112
|
+
exports.buildJSDocBlock = buildJSDocBlock;
|
|
113
|
+
exports.buildJSDocEdit = buildJSDocEdit;
|
|
114
|
+
exports.generatedTag = generatedTag;
|
|
115
|
+
exports.parseEntityJSDocs = parseEntityJSDocs;
|
|
116
|
+
|
|
117
|
+
//# sourceMappingURL=parsing.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsing.cjs","names":[],"sources":["../../src/docs/parsing.ts"],"sourcesContent":["import type { namedTypes } from \"ast-types\";\nimport jscodeshift, { type ASTNode } from \"jscodeshift\";\n\nconst j = jscodeshift.withParser(\"ts\");\n\ntype CommentKind = (namedTypes.CommentBlock | namedTypes.CommentLine | namedTypes.Block | namedTypes.Line) & {\n start?: number;\n end?: number;\n};\nj;\ntype Commented = ASTNode & {\n comments?: CommentKind[] | null;\n start?: number;\n end?: number;\n loc?: namedTypes.SourceLocation | null;\n};\n\nexport type MemberKind = \"property\" | \"getter\" | \"setter\" | \"method\";\n\nexport interface MemberInfo {\n kind: MemberKind;\n name: string;\n doc: string | undefined;\n node: Commented;\n}\n\nexport interface SourceEdit {\n start: number;\n end: number;\n text: string;\n}\n\n/** Parse an entity .ts file and extract class + member JSDoc. */\nexport function parseEntityJSDocs(source: string) {\n const root = j(source);\n let classDoc: string | undefined;\n let classNode: Commented | undefined;\n const members: MemberInfo[] = [];\n\n root.find(j.ExportNamedDeclaration).forEach((p) => {\n if (p.node.declaration?.type === \"ClassDeclaration\") {\n classDoc = extractJSDoc(p.node as Commented);\n classNode = p.node as Commented;\n }\n });\n\n root.find(j.ClassProperty).forEach((p) => {\n const name = (p.node.key as namedTypes.Identifier)?.name;\n if (name) {\n members.push({ name, kind: \"property\", doc: extractJSDoc(p.node as Commented), node: p.node as Commented });\n }\n });\n\n root.find(j.ClassMethod).forEach((p) => {\n const name = (p.node.key as namedTypes.Identifier)?.name;\n if (name) {\n members.push({\n name,\n kind: classMethodKind(p.node),\n doc: extractJSDoc(p.node as Commented),\n node: p.node as Commented,\n });\n }\n });\n\n return { classDoc, classNode, members, fieldDocs: collectFieldDocs(members) };\n}\n\n/**\n * Collect field docs from members for backfill.\n * When a getter and setter share the same name, prefer the getter's doc.\n */\nfunction collectFieldDocs(members: MemberInfo[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const m of members) {\n if (!m.doc || m.kind === \"method\") continue;\n if (result[m.name] && m.kind === \"setter\") continue;\n result[m.name] = m.doc;\n }\n return result;\n}\n\n/**\n * Build a source edit that sets the JSDoc on a node (replacing existing or inserting new).\n *\n * (This is bizarre, but this `SourceEdit` + `applyEdits` leaves all existing formatting\n * alone better than doing a `node.toSource()` or other AST-based updates. :grimmacing:)\n */\nexport function buildJSDocEdit(node: Commented, text: string): SourceEdit {\n const column = node.loc!.start.column;\n const existingComment = node.comments?.find((c) => c.leading && \"value\" in c && c.value.startsWith(\"*\"));\n if (existingComment) {\n return { start: existingComment.start!, end: existingComment.end!, text: buildJSDocBlock(text, column) };\n }\n const indent = \" \".repeat(column);\n return { start: node.start!, end: node.start!, text: buildJSDocBlock(text, column) + \"\\n\" + indent };\n}\n\n/** Apply edits to source by splicing in reverse order. */\nexport function applyEdits(source: string, edits: SourceEdit[]): string {\n const sorted = [...edits].sort((a, b) => b.start - a.start);\n let result = source;\n for (const edit of sorted) {\n result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);\n }\n return result;\n}\n\n/** Build a JSDoc block comment string from plain text. */\nexport function buildJSDocBlock(text: string, indent: number): string {\n const pad = \" \".repeat(indent);\n const lines = text.split(\"\\n\");\n if (lines.length === 1) return `/** ${lines[0]} */`;\n return `/**\\n` + lines.map((l) => (l ? `${pad} * ${l}` : `${pad} *`)).join(\"\\n\") + `\\n${pad} */`;\n}\n\n/** The `@generated Entity.md` marker, i.e. so readers know a JSDoc is sourced from (and edited in) the `.md`. */\nexport function generatedTag(entityName: string): string {\n return `@generated ${entityName}.md`;\n}\n\n/** Extract text from a JSDoc-style leading block comment (i.e. one starting with `*`). */\nfunction extractJSDoc(node: Commented): string | undefined {\n const block = node.comments?.find((c) => c.leading && \"value\" in c && c.value.startsWith(\"*\"));\n if (!block || !(\"value\" in block)) return undefined;\n const lines = block.value.split(\"\\n\").map((l) => l.replace(/^\\s*\\*\\s?/, \"\").trimEnd());\n while (lines.length > 0 && lines[0].trim() === \"\") lines.shift();\n while (lines.length > 0 && lines[lines.length - 1].trim() === \"\") lines.pop();\n return lines.join(\"\\n\") || undefined;\n}\n\nfunction classMethodKind(node: namedTypes.ClassMethod): MemberKind {\n if (node.kind === \"get\") return \"getter\";\n if (node.kind === \"set\") return \"setter\";\n return \"method\";\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ASTNode } from "jscodeshift";
|
|
2
|
+
import { namedTypes } from "ast-types";
|
|
3
|
+
//#region src/docs/parsing.d.ts
|
|
4
|
+
type CommentKind = (namedTypes.CommentBlock | namedTypes.CommentLine | namedTypes.Block | namedTypes.Line) & {
|
|
5
|
+
start?: number;
|
|
6
|
+
end?: number;
|
|
7
|
+
};
|
|
8
|
+
type Commented = ASTNode & {
|
|
9
|
+
comments?: CommentKind[] | null;
|
|
10
|
+
start?: number;
|
|
11
|
+
end?: number;
|
|
12
|
+
loc?: namedTypes.SourceLocation | null;
|
|
13
|
+
};
|
|
14
|
+
type MemberKind = "property" | "getter" | "setter" | "method";
|
|
15
|
+
interface MemberInfo {
|
|
16
|
+
kind: MemberKind;
|
|
17
|
+
name: string;
|
|
18
|
+
doc: string | undefined;
|
|
19
|
+
node: Commented;
|
|
20
|
+
}
|
|
21
|
+
interface SourceEdit {
|
|
22
|
+
start: number;
|
|
23
|
+
end: number;
|
|
24
|
+
text: string;
|
|
25
|
+
}
|
|
26
|
+
/** Parse an entity .ts file and extract class + member JSDoc. */
|
|
27
|
+
declare function parseEntityJSDocs(source: string): {
|
|
28
|
+
classDoc: string | undefined;
|
|
29
|
+
classNode: Commented | undefined;
|
|
30
|
+
members: MemberInfo[];
|
|
31
|
+
fieldDocs: Record<string, string>;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Build a source edit that sets the JSDoc on a node (replacing existing or inserting new).
|
|
35
|
+
*
|
|
36
|
+
* (This is bizarre, but this `SourceEdit` + `applyEdits` leaves all existing formatting
|
|
37
|
+
* alone better than doing a `node.toSource()` or other AST-based updates. :grimmacing:)
|
|
38
|
+
*/
|
|
39
|
+
declare function buildJSDocEdit(node: Commented, text: string): SourceEdit;
|
|
40
|
+
/** Apply edits to source by splicing in reverse order. */
|
|
41
|
+
declare function applyEdits(source: string, edits: SourceEdit[]): string;
|
|
42
|
+
/** Build a JSDoc block comment string from plain text. */
|
|
43
|
+
declare function buildJSDocBlock(text: string, indent: number): string;
|
|
44
|
+
/** The `@generated Entity.md` marker, i.e. so readers know a JSDoc is sourced from (and edited in) the `.md`. */
|
|
45
|
+
declare function generatedTag(entityName: string): string;
|
|
46
|
+
//#endregion
|
|
47
|
+
export { MemberInfo, MemberKind, SourceEdit, applyEdits, buildJSDocBlock, buildJSDocEdit, generatedTag, parseEntityJSDocs };
|
|
48
|
+
//# sourceMappingURL=parsing.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsing.d.cts","names":[],"sources":["../../src/docs/parsing.ts"],"mappings":";;;KAKK,eAAe,WAAW,eAAe,WAAW,cAAc,WAAW,QAAQ,WAAW;EACnG;EACA;;KAGG,YAAY;EACf,WAAW;EACX;EACA;EACA,MAAM,WAAW;;KAGP;UAEK;EACf,MAAM;EACN;EACA;EACA,MAAM;;UAGS;EACf;EACA;EACA;;;iBAIc,kBAAkB;;;;;;;;;;;;iBAuDlB,eAAe,MAAM,WAAW,eAAe;;iBAW/C,WAAW,gBAAgB,OAAO;;iBAUlC,gBAAgB,cAAc;;iBAQ9B,aAAa"}
|