@coursebuilder/astro
Version:
The official Course Builder integration for Astro projects!
58 lines (51 loc) • 1.7 kB
text/typescript
import { dirname, join } from 'node:path'
import type { AstroIntegration } from 'astro'
import { virtualConfigModule, type CoursebuilderConfig } from './config'
export default (config: CoursebuilderConfig = {}): AstroIntegration => ({
name: 'coursebuilder-astro',
hooks: {
'astro:config:setup': async ({
config: coursebuilderConfig,
injectRoute,
injectScript,
updateConfig,
logger,
}) => {
console.log('coursebuilderConfig', config)
updateConfig({
vite: {
plugins: [virtualConfigModule(config.configFile)],
optimizeDeps: { exclude: ['coursebuilder:config'] },
},
})
config.prefix ??= '/api/coursebuilder'
if (config.injectEndpoints !== false) {
const currentDir = dirname(import.meta.url.replace('file://', ''))
const entrypoint = join(`${currentDir}/api/[...coursebuilder].ts`)
injectRoute({
pattern: `${config.prefix}/[...coursebuilder]`,
entrypoint,
})
}
if (!coursebuilderConfig.adapter) {
logger.error('No Adapter found, please make sure you provide one in your Astro config')
}
const edge = ['@astrojs/vercel/edge', '@astrojs/cloudflare'].includes(
coursebuilderConfig.adapter.name
)
if (
(!edge && globalThis.process && process.versions.node < '19.0.0') ||
(process.env.NODE_ENV === 'development' && edge)
) {
injectScript(
'page-ssr',
`import crypto from "node:crypto";
if (!globalThis.crypto) globalThis.crypto = crypto;
if (typeof globalThis.crypto.subtle === "undefined") globalThis.crypto.subtle = crypto.webcrypto.subtle;
if (typeof globalThis.crypto.randomUUID === "undefined") globalThis.crypto.randomUUID = crypto.randomUUID;
`
)
}
},
},
})