Skip to content

Commit b55323c

Browse files
committed
feat: implement auto-generated composables based on module config
1 parent 799ae23 commit b55323c

File tree

4 files changed

+41
-3
lines changed

4 files changed

+41
-3
lines changed

Diff for: package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@
3939
"docs:dev": "nuxi dev docs"
4040
},
4141
"dependencies": {
42-
"@nuxt/kit": "^3.10.3"
42+
"@nuxt/kit": "^3.10.3",
43+
"scule": "^1.3.0"
4344
},
4445
"devDependencies": {
4546
"@nuxt/devtools": "latest",

Diff for: pnpm-lock.yaml

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/module.ts

+35-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
import { addComponentsDir, addImportsDir, createResolver, defineNuxtModule } from '@nuxt/kit'
1+
import {
2+
addComponentsDir,
3+
addImports,
4+
addImportsDir,
5+
addTemplate,
6+
createResolver,
7+
defineNuxtModule,
8+
} from '@nuxt/kit'
9+
import type { ABTest } from './runtime/types'
10+
import { pascalCase } from 'scule'
211

312
export interface ModuleOptions {
413
/**
@@ -8,6 +17,13 @@ export interface ModuleOptions {
817
* @default true
918
*/
1019
persistVariants: boolean
20+
/**
21+
* List of A/B tests.
22+
* This will be used to automatically generate components and composables
23+
*
24+
* @default []
25+
*/
26+
tests: ABTest[]
1127
}
1228

1329
export default defineNuxtModule<ModuleOptions>({
@@ -20,6 +36,7 @@ export default defineNuxtModule<ModuleOptions>({
2036
},
2137
defaults: {
2238
persistVariants: true,
39+
tests: [],
2340
},
2441
async setup(options, nuxt) {
2542
const resolver = createResolver(import.meta.url)
@@ -30,6 +47,23 @@ export default defineNuxtModule<ModuleOptions>({
3047

3148
addImportsDir(resolver.resolve('./runtime/composables'))
3249

50+
const composables: string[] = []
51+
for (const test of options.tests) {
52+
const composableName = `use${pascalCase(test.id)}ABTest`
53+
addImports({
54+
from: '#build/ab-test-composables',
55+
name: composableName,
56+
})
57+
composables.push(`export function ${composableName}() {
58+
return useABTest(${JSON.stringify(test)});
59+
}`)
60+
}
61+
addTemplate({
62+
filename: `./ab-test-composables.ts`,
63+
write: true,
64+
getContents: () => composables.join('\n\n'),
65+
})
66+
3367
nuxt.options.runtimeConfig.public.abTesting = {
3468
persistVariants: options.persistVariants,
3569
}

Diff for: src/runtime/types/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export interface Variant<TVariantValue extends JSONValue> {
1919
weight?: number
2020
}
2121

22-
export interface ABTest<TVariantValue extends JSONValue> {
22+
export interface ABTest<TVariantValue extends JSONValue = JSONValue> {
2323
id: string
2424
variants: Variant<TVariantValue>[]
2525
}

0 commit comments

Comments
 (0)