diff --git a/modules/cloudflare-vars.ts b/modules/cloudflare-vars.ts new file mode 100644 index 00000000..58ba0be3 --- /dev/null +++ b/modules/cloudflare-vars.ts @@ -0,0 +1,37 @@ +import { useRuntimeConfig, defineNuxtModule, useNuxt } from 'nuxt/kit' +import { kebabCase } from 'scule' + +export default defineNuxtModule({ + meta: { + name: 'cloudflare-vars', + }, + setup () { + const nuxt = useNuxt() + + nuxt.hook('nitro:config', config => { + const runtimeConfig = useRuntimeConfig() + const vars: Record = {} + + function walkConfig (obj: Record, prefix = '') { + for (const [key, value] of Object.entries(obj)) { + if (typeof value === 'object' && value !== null) { + walkConfig(value, `${prefix}${key}.`) + } + else if (typeof value !== 'object') { + const varKey = kebabCase(`${prefix}${key}`).toUpperCase().replace(/-/g, '_') + vars[varKey] = value + } + } + } + + walkConfig(runtimeConfig) + + config.cloudflare ||= {} + config.cloudflare.wrangler ||= {} + config.cloudflare.wrangler.vars = { + ...vars, + ...config.cloudflare.wrangler.vars, + } + }) + }, +})