Files
core/packages/webhook/scripts/generate.js
2025-04-06 22:18:48 +08:00

112 lines
3.5 KiB
JavaScript

// const fs = require('fs')
// const path = require('path')
import fs from 'node:fs'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import prettier from 'prettier'
import ts from 'typescript'
function generateGenericEventType(fileName) {
const program = ts.createProgram([fileName], {})
const sourceFile = program.getSourceFile(fileName)
let genericEventType = '// Auto Generaged type.\nexport type GenericEvent =\n'
ts.forEachChild(sourceFile, (node) => {
if (
ts.isInterfaceDeclaration(node) &&
node.name.text === 'EventPayloadMapping'
) {
node.members.forEach((member) => {
if (ts.isPropertySignature(member) && member.type) {
const key = member.name
let eventType = ''
let isLiteralType = false
if (
ts.isComputedPropertyName(key) &&
ts.isPropertyAccessExpression(key.expression)
) {
eventType = key.expression.name.text
} else if (ts.isIdentifier(key) && key.escapedText) {
// Handle string key like 'health_check'
eventType = key.escapedText
isLiteralType = true
} else if (ts.isStringLiteral(key)) {
// Handle string literal types like 'health-check'
eventType = key.text
isLiteralType = true
}
// if (eventType && eventType !== '*') {
// const payloadType = member.type.getText(sourceFile)
// genericEventType += ` | { type: BusinessEvents.${eventType}; payload: ${payloadType} }\n`
// }
if (eventType) {
const payloadType = member.type.getText(sourceFile)
if (isLiteralType) {
// For string literals, use the literal value directly
genericEventType += ` | { type: '${eventType}'; payload: ${payloadType} }\n`
} else {
// For regular event types
genericEventType += ` | { type: BusinessEvents.${eventType}; payload: ${payloadType} }\n`
}
}
}
})
}
})
return genericEventType
}
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const fileName = path.resolve(__dirname, '../src/types.ts')
const newGenericEventType = generateGenericEventType(fileName)
function replaceGenericEventType(fileName, newGenericEventType) {
const fileContent = fs.readFileSync(fileName, 'utf8')
const sourceFile = ts.createSourceFile(
fileName,
fileContent,
ts.ScriptTarget.Latest,
true,
)
let startPos = -1
let endPos = -1
ts.forEachChild(sourceFile, (node) => {
if (ts.isTypeAliasDeclaration(node) && node.name.text === 'GenericEvent') {
startPos = node.pos
endPos = node.end
}
})
if (startPos === -1 || endPos === -1) {
throw new Error('GenericEvent type not found in the file.')
}
// Replace the specified part of the file content with the new type string
return `${fileContent.slice(0, startPos)}\n\n${
// Add a new line before the new type
newGenericEventType
}${fileContent.slice(endPos)}\n`
}
// const newFileContent = replaceGenericEventType(fileName, newGenericEventType)
const newFileContent = replaceGenericEventType(fileName, newGenericEventType)
async function main() {
fs.writeFileSync(
path.resolve(__dirname, '../src/types.ts'),
await prettier.format(newFileContent, {
parser: 'typescript',
semi: false,
tabWidth: 2,
printWidth: 80,
singleQuote: true,
trailingComma: 'all',
}),
)
}
main()