presta
Version:
Hyper minimal framework for the modern web.
68 lines (55 loc) • 1.7 kB
text/typescript
import fs from 'fs-extra'
import path from 'path'
import rsort from 'route-sort'
import { hashContent } from './hashContent'
import * as logger from './log'
import { Presta } from './types'
import { Env } from './constants'
export function outputLambda(input: string, config: Presta): [string, string] {
const { route } = require(input)
const name = path.basename(input).split('.').reverse().slice(1).reverse().join('.')
const output = path.join(
config.functionsOutputDir,
config.env === Env.PRODUCTION ? name + '-' + hashContent(fs.readFileSync(input, 'utf8')) + '.js' : name + '.js'
)
logger.debug({
label: 'debug',
message: `generating ${name} lambda`,
})
// important for watch task
delete require.cache[input]
delete require.cache[output]
fs.outputFileSync(
output,
`import { wrapHandler } from 'presta';
import * as file from '${input}';
export const route = file.route
export const handler = wrapHandler(file)`
)
return [route, output]
}
export function outputLambdas(inputs: string[], config: Presta) {
const lambdas = inputs
.map((input) => {
try {
return outputLambda(input, config)
} catch (e) {
logger.error({
label: 'error',
error: e as Error,
})
return null
}
})
.filter(Boolean) as [string, string][]
const sorted = rsort(lambdas.map((l) => l[0]))
const manifest: { [route: string]: string } = {}
for (const route of sorted) {
const match = lambdas.find((l) => l[0] === route)
if (match) {
manifest[route] = match[1]
}
}
fs.outputFileSync(config.functionsManifest, JSON.stringify(manifest))
return lambdas
}