mtcute/packages/dispatcher/scripts/generate.js

99 lines
3.1 KiB
JavaScript
Raw Normal View History

const { types, toSentence, replaceSections, formatFile } = require('../../client/scripts/generate-updates')
2021-05-27 01:02:31 +03:00
function generateHandler() {
const lines = []
const names = ['RawUpdateHandler']
// imports must be added manually because yeah
types.forEach((type) => {
lines.push(
`export type ${type.handlerTypeName}Handler<T = ${type.updateType}` +
`${type.state ? ', S = never' : ''}> = ParsedUpdateHandler<` +
`'${type.typeName}', T${type.state ? ', S' : ''}>`,
2021-05-27 01:02:31 +03:00
)
names.push(`${type.handlerTypeName}Handler`)
})
replaceSections('handler.ts', {
codegen:
lines.join('\n') +
'\n\nexport type UpdateHandler = \n' +
names.map((i) => ` | ${i}\n`).join(''),
}, __dirname)
}
function generateDispatcher() {
const lines = []
const imports = ['UpdateHandler', 'RawUpdateHandler']
types.forEach((type) => {
imports.push(`${type.handlerTypeName}Handler`)
lines.push(`
/**
* Register ${toSentence(type)} without any filters
*
* @param handler ${toSentence(type, 'full')}
* @param group Handler group index
*/
on${type.handlerTypeName}(handler: ${type.handlerTypeName}Handler${type.state ? `<${type.updateType}, State extends never ? never : UpdateState<State, SceneName>>` : ''}['callback'], group?: number): void
${type.state ? `
/**
* Register ${toSentence(type)} with a filter
*
* @param filter Update filter
* @param handler ${toSentence(type, 'full')}
* @param group Handler group index
*/
on${type.handlerTypeName}<Mod>(
filter: UpdateFilter<${type.updateType}, Mod, State>,
handler: ${type.handlerTypeName}Handler<filters.Modify<${type.updateType}, Mod>, State extends never ? never : UpdateState<State, SceneName>>['callback'],
group?: number
): void
` : ''}
/**
* Register ${toSentence(type)} with a filter
*
* @param filter Update filter
* @param handler ${toSentence(type, 'full')}
* @param group Handler group index
*/
on${type.handlerTypeName}<Mod>(
filter: UpdateFilter<${type.updateType}, Mod>,
handler: ${type.handlerTypeName}Handler<filters.Modify<${type.updateType}, Mod>${type.state ? ', State extends never ? never : UpdateState<State, SceneName>' : ''}>['callback'],
group?: number
): void
/** @internal */
on${type.handlerTypeName}(filter: any, handler?: any, group?: number): void {
this._addKnownHandler('${type.typeName}', filter, handler, group)
}
`)
})
replaceSections('dispatcher.ts', {
codegen: lines.join('\n'),
'codegen-imports':
'import {\n' +
imports.sort().map((i) => ` ${i},\n`).join('') +
"} from './handler'",
}, __dirname)
}
async function main() {
generateHandler()
generateDispatcher()
await formatFile('handler.ts', __dirname)
await formatFile('dispatcher.ts', __dirname)
}
module.exports = { types, toSentence }
if (require.main === module) {
main().catch(console.error)
}