99 lines
3.1 KiB
JavaScript
99 lines
3.1 KiB
JavaScript
const { types, toSentence, replaceSections, formatFile } = require('../../client/scripts/generate-updates')
|
|
|
|
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' : ''}>`
|
|
)
|
|
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.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)
|
|
}
|