@se-studio/ab-testing 1.0.44 → 1.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/codegen/generator.d.ts +42 -0
- package/dist/codegen/generator.d.ts.map +1 -0
- package/dist/codegen/generator.js +56 -0
- package/dist/codegen/generator.js.map +1 -0
- package/dist/codegen/index.d.ts +9 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +8 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/components/AbTestReporter.d.ts +2 -0
- package/dist/components/AbTestReporter.d.ts.map +1 -0
- package/dist/components/AbTestReporter.js +28 -0
- package/dist/components/AbTestReporter.js.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/cache.d.ts +4 -0
- package/dist/middleware/cache.d.ts.map +1 -1
- package/dist/middleware/cache.js +1 -1
- package/dist/middleware/cache.js.map +1 -1
- package/dist/middleware/handler.d.ts +49 -1
- package/dist/middleware/handler.d.ts.map +1 -1
- package/dist/middleware/handler.js +100 -6
- package/dist/middleware/handler.js.map +1 -1
- package/dist/middleware/index.d.ts +3 -2
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +2 -2
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/types.d.ts +7 -0
- package/dist/middleware/types.d.ts.map +1 -1
- package/package.json +11 -3
package/CHANGELOG.md
CHANGED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { CachedAbTest } from '../middleware/types';
|
|
2
|
+
import type { AbTest } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Build a plain-object testsByPath map suitable for static generation.
|
|
5
|
+
*
|
|
6
|
+
* This is the Record-based equivalent of the internal Map used at runtime.
|
|
7
|
+
* The result is JSON-serialisable and can be written to a generated TypeScript file
|
|
8
|
+
* with `generateAbTestsFileContent`.
|
|
9
|
+
*
|
|
10
|
+
* @param tests - Array of AbTest entries (e.g. from `transformPageTest`)
|
|
11
|
+
* @returns Record of normalised control path → CachedAbTest[]
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildStaticTestsByPath(tests: AbTest[]): Record<string, CachedAbTest[]>;
|
|
14
|
+
export interface GenerateAbTestsFileOptions {
|
|
15
|
+
/**
|
|
16
|
+
* The package to import `CachedAbTest` from in the generated file.
|
|
17
|
+
* @default "@se-studio/ab-testing"
|
|
18
|
+
*/
|
|
19
|
+
importPath?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generate the content of a static TypeScript file exporting a `testsByPath` constant.
|
|
23
|
+
*
|
|
24
|
+
* Apps write this content to e.g. `src/lib/__generated/abTests.ts` at build time,
|
|
25
|
+
* then import `testsByPath` directly in their middleware — zero async overhead, no KV store needed.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* // management/generateAbTests.ts
|
|
30
|
+
* import { writeFile } from 'node:fs/promises';
|
|
31
|
+
* import { transformPageTest } from '@se-studio/ab-testing/webhook';
|
|
32
|
+
* import { buildStaticTestsByPath, generateAbTestsFileContent } from '@se-studio/ab-testing/codegen';
|
|
33
|
+
* import { fetchRawPageTests } from '../src/cms/pageTests';
|
|
34
|
+
*
|
|
35
|
+
* const raw = await fetchRawPageTests();
|
|
36
|
+
* const tests = raw.map(r => transformPageTest(r)).filter(t => t !== null);
|
|
37
|
+
* const testsByPath = buildStaticTestsByPath(tests);
|
|
38
|
+
* await writeFile('./src/lib/__generated/abTests.ts', generateAbTestsFileContent(testsByPath));
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateAbTestsFileContent(testsByPath: Record<string, CachedAbTest[]>, options?: GenerateAbTestsFileOptions): string;
|
|
42
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/codegen/generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAetF;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EAC3C,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAWR"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { computeCachedTest, normalizePath } from '../middleware/cache';
|
|
2
|
+
/**
|
|
3
|
+
* Build a plain-object testsByPath map suitable for static generation.
|
|
4
|
+
*
|
|
5
|
+
* This is the Record-based equivalent of the internal Map used at runtime.
|
|
6
|
+
* The result is JSON-serialisable and can be written to a generated TypeScript file
|
|
7
|
+
* with `generateAbTestsFileContent`.
|
|
8
|
+
*
|
|
9
|
+
* @param tests - Array of AbTest entries (e.g. from `transformPageTest`)
|
|
10
|
+
* @returns Record of normalised control path → CachedAbTest[]
|
|
11
|
+
*/
|
|
12
|
+
export function buildStaticTestsByPath(tests) {
|
|
13
|
+
const result = {};
|
|
14
|
+
for (const test of tests) {
|
|
15
|
+
if (!test.enabled)
|
|
16
|
+
continue;
|
|
17
|
+
const path = normalizePath(test.controlSlug);
|
|
18
|
+
const cached = computeCachedTest(test);
|
|
19
|
+
const existing = result[path] ?? [];
|
|
20
|
+
existing.push(cached);
|
|
21
|
+
result[path] = existing;
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Generate the content of a static TypeScript file exporting a `testsByPath` constant.
|
|
27
|
+
*
|
|
28
|
+
* Apps write this content to e.g. `src/lib/__generated/abTests.ts` at build time,
|
|
29
|
+
* then import `testsByPath` directly in their middleware — zero async overhead, no KV store needed.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* // management/generateAbTests.ts
|
|
34
|
+
* import { writeFile } from 'node:fs/promises';
|
|
35
|
+
* import { transformPageTest } from '@se-studio/ab-testing/webhook';
|
|
36
|
+
* import { buildStaticTestsByPath, generateAbTestsFileContent } from '@se-studio/ab-testing/codegen';
|
|
37
|
+
* import { fetchRawPageTests } from '../src/cms/pageTests';
|
|
38
|
+
*
|
|
39
|
+
* const raw = await fetchRawPageTests();
|
|
40
|
+
* const tests = raw.map(r => transformPageTest(r)).filter(t => t !== null);
|
|
41
|
+
* const testsByPath = buildStaticTestsByPath(tests);
|
|
42
|
+
* await writeFile('./src/lib/__generated/abTests.ts', generateAbTestsFileContent(testsByPath));
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export function generateAbTestsFileContent(testsByPath, options = {}) {
|
|
46
|
+
const { importPath = '@se-studio/ab-testing' } = options;
|
|
47
|
+
const json = JSON.stringify(testsByPath, null, 2);
|
|
48
|
+
return `// This file is automatically generated — do not edit manually.
|
|
49
|
+
// Re-generate by running your management/generateAbTests script.
|
|
50
|
+
|
|
51
|
+
import type { CachedAbTest } from '${importPath}';
|
|
52
|
+
|
|
53
|
+
export const testsByPath: Record<string, CachedAbTest[]> = ${json};
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/codegen/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIvE;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAe;IACpD,MAAM,MAAM,GAAmC,EAAE,CAAC;IAElD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,SAAS;QAE5B,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAUD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAA2C,EAC3C,UAAsC,EAAE;IAExC,MAAM,EAAE,UAAU,GAAG,uBAAuB,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAElD,OAAO;;;qCAG4B,UAAU;;6DAEc,IAAI;CAChE,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @se-studio/ab-testing/codegen
|
|
3
|
+
*
|
|
4
|
+
* Build-time utilities for generating a static A/B test configuration file.
|
|
5
|
+
* Import these in a Node.js management script, not in edge/browser code.
|
|
6
|
+
*/
|
|
7
|
+
export type { GenerateAbTestsFileOptions } from './generator';
|
|
8
|
+
export { buildStaticTestsByPath, generateAbTestsFileContent, } from './generator';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @se-studio/ab-testing/codegen
|
|
3
|
+
*
|
|
4
|
+
* Build-time utilities for generating a static A/B test configuration file.
|
|
5
|
+
* Import these in a Node.js management script, not in edge/browser code.
|
|
6
|
+
*/
|
|
7
|
+
export { buildStaticTestsByPath, generateAbTestsFileContent, } from './generator';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbTestReporter.d.ts","sourceRoot":"","sources":["../../src/components/AbTestReporter.tsx"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,SA0B7B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noConsole: A/B test debug logging */
|
|
2
|
+
'use client';
|
|
3
|
+
import { useEffect } from 'react';
|
|
4
|
+
import { useAbTestAssignments } from '../hooks/useAbTestAssignments';
|
|
5
|
+
export function AbTestReporter() {
|
|
6
|
+
const assignments = useAbTestAssignments();
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (assignments.length === 0) {
|
|
9
|
+
console.log('[A/B reporter] No active tests on this page');
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
for (const assignment of assignments) {
|
|
13
|
+
console.log(`[A/B reporter] Test "${assignment.test_label}" (${assignment.testId})`, {
|
|
14
|
+
variant: assignment.test_path,
|
|
15
|
+
path: assignment.original_path,
|
|
16
|
+
});
|
|
17
|
+
// Push to GTM dataLayer
|
|
18
|
+
window.dataLayer?.push({
|
|
19
|
+
event: 'experiment_impression',
|
|
20
|
+
experiment_id: assignment.testId,
|
|
21
|
+
experiment_name: assignment.test_label,
|
|
22
|
+
variant_id: assignment.test_path,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}, [assignments]);
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=AbTestReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbTestReporter.js","sourceRoot":"","sources":["../../src/components/AbTestReporter.tsx"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,UAAU,cAAc;IAC5B,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAE3C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,UAAU,MAAM,UAAU,CAAC,MAAM,GAAG,EAAE;gBACnF,OAAO,EAAE,UAAU,CAAC,SAAS;gBAC7B,IAAI,EAAE,UAAU,CAAC,aAAa;aAC/B,CAAC,CAAC;YAEH,wBAAwB;YACtB,MAA6C,CAAC,SAAmC,EAAE,IAAI,CAAC;gBACxF,KAAK,EAAE,uBAAuB;gBAC9B,aAAa,EAAE,UAAU,CAAC,MAAM;gBAChC,eAAe,EAAE,UAAU,CAAC,UAAU;gBACtC,UAAU,EAAE,UAAU,CAAC,SAAS;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export type { ActiveAbTestAssignment, UseAbTestAssignmentsOptions } from './hooks';
|
|
9
9
|
export { useAbTestAssignments } from './hooks';
|
|
10
|
-
export type { AbTestMiddlewareConfig, AbTestResult, CachedAbTest, TestsCache, } from './middleware';
|
|
11
|
-
export { clearTestCache, createAbTestMiddleware, createAssignment, DEFAULT_COOKIE_MAX_AGE, DEFAULT_COOKIE_NAME, getAssignment, getCachedTests, getTestCacheState, isValidAssignment, normalizePath, parseCookie, processAbTestRequest, readCookieFromDocument, selectVariant, serializeCookie, setAssignment, } from './middleware';
|
|
10
|
+
export type { AbTestMiddlewareConfig, AbTestResult, CachedAbTest, StaticAbTestMiddlewareOptions, TestsCache, } from './middleware';
|
|
11
|
+
export { clearTestCache, computeCachedTest, createAbTestMiddleware, createAssignment, createStaticAbTestMiddleware, DEFAULT_COOKIE_MAX_AGE, DEFAULT_COOKIE_NAME, getAssignment, getCachedTests, getTestCacheState, isValidAssignment, normalizePath, parseCookie, processAbTestRequest, readCookieFromDocument, selectVariant, serializeCookie, setAssignment, } from './middleware';
|
|
12
12
|
export type { AbTest, AbTestAssignment, AbTestCookie, AbTestVariant, AbTestVariantConfig, IBlobStore, } from './types';
|
|
13
13
|
export type { RawPageTest, WebhookHandlerConfig, WebhookResult, } from './webhook';
|
|
14
14
|
export { createWebhookHandler, processAbTestWebhook, transformPageTest, } from './webhook';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAEnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EACV,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,MAAM,EACN,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,aAAa,GACd,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAEnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EACV,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,6BAA6B,EAC7B,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,4BAA4B,EAC5B,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,MAAM,EACN,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,aAAa,GACd,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// Re-export hooks
|
|
9
9
|
export { useAbTestAssignments } from './hooks';
|
|
10
10
|
// Re-export middleware utilities
|
|
11
|
-
export { clearTestCache, createAbTestMiddleware, createAssignment, DEFAULT_COOKIE_MAX_AGE, DEFAULT_COOKIE_NAME, getAssignment, getCachedTests, getTestCacheState, isValidAssignment, normalizePath, parseCookie, processAbTestRequest, readCookieFromDocument, selectVariant, serializeCookie, setAssignment, } from './middleware';
|
|
11
|
+
export { clearTestCache, computeCachedTest, createAbTestMiddleware, createAssignment, createStaticAbTestMiddleware, DEFAULT_COOKIE_MAX_AGE, DEFAULT_COOKIE_NAME, getAssignment, getCachedTests, getTestCacheState, isValidAssignment, normalizePath, parseCookie, processAbTestRequest, readCookieFromDocument, selectVariant, serializeCookie, setAssignment, } from './middleware';
|
|
12
12
|
// Re-export webhook utilities
|
|
13
13
|
export { createWebhookHandler, processAbTestWebhook, transformPageTest, } from './webhook';
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,kBAAkB;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,kBAAkB;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAQ/C,iCAAiC;AACjC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,4BAA4B,EAC5B,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,aAAa,GACd,MAAM,cAAc,CAAC;AAetB,8BAA8B;AAC9B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,WAAW,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { AbTest, IBlobStore } from '../types';
|
|
2
2
|
import type { CachedAbTest, TestsCache } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Pre-compute weights and lookups for a test.
|
|
5
|
+
*/
|
|
6
|
+
export declare function computeCachedTest(test: AbTest): CachedAbTest;
|
|
3
7
|
/**
|
|
4
8
|
* Normalize a URL path for consistent matching.
|
|
5
9
|
* - Removes trailing slashes (except for root)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/middleware/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/middleware/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKxD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAyC5D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAelD;AAsBD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,EACzB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAgCtC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,GAAG,IAAI,CAErD"}
|
package/dist/middleware/cache.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/middleware/cache.ts"],"names":[],"mappings":"AAGA,4BAA4B;AAC5B,IAAI,gBAAgB,GAAsB,IAAI,CAAC;AAE/C;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/middleware/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { NextRequest } from 'next/server';
|
|
2
2
|
import { NextResponse } from 'next/server';
|
|
3
|
-
import type {
|
|
3
|
+
import type { AbTestAssignment } from '../types';
|
|
4
|
+
import type { AbTestMiddlewareConfig, AbTestResult, CachedAbTest } from './types';
|
|
4
5
|
/**
|
|
5
6
|
* Create an A/B test middleware handler.
|
|
6
7
|
*
|
|
@@ -42,4 +43,51 @@ export declare function createAbTestMiddleware(config: AbTestMiddlewareConfig):
|
|
|
42
43
|
* @returns Result object with test matching info and new cookie value
|
|
43
44
|
*/
|
|
44
45
|
export declare function processAbTestRequest(pathname: string, searchParams: URLSearchParams, cookieValue: string | undefined, store: ReturnType<AbTestMiddlewareConfig['getStore']>, cacheTtlMs: number, devTestData?: AbTestMiddlewareConfig['devTestData']): Promise<AbTestResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Options for the static A/B test middleware.
|
|
48
|
+
*/
|
|
49
|
+
export interface StaticAbTestMiddlewareOptions {
|
|
50
|
+
/** Name of the cookie used to store A/B test assignments. @default "ab-test-info" */
|
|
51
|
+
cookieName?: string;
|
|
52
|
+
/** Cookie max age in seconds. @default 2592000 (30 days) */
|
|
53
|
+
cookieMaxAge?: number;
|
|
54
|
+
/**
|
|
55
|
+
* Path prefix to prepend when rewriting to a variant.
|
|
56
|
+
* e.g. "/page-test" → rewrites to "/page-test/slug" instead of "/slug".
|
|
57
|
+
* @default "" (no prefix)
|
|
58
|
+
*/
|
|
59
|
+
variantPathPrefix?: string;
|
|
60
|
+
/** Optional function to skip processing for certain pathnames. */
|
|
61
|
+
shouldProcess?: (pathname: string) => boolean;
|
|
62
|
+
/** Optional callback when a cookie assignment fails validation. */
|
|
63
|
+
onValidationFailure?: (testId: string, assignment: AbTestAssignment) => void;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create a synchronous A/B test middleware from a pre-generated static testsByPath map.
|
|
67
|
+
*
|
|
68
|
+
* Use this when you generate `testsByPath` at build time (e.g. via `generateAbTestsFileContent`)
|
|
69
|
+
* and import the result directly — no blob store or cache TTL needed.
|
|
70
|
+
*
|
|
71
|
+
* @param staticTestsByPath - Pre-generated map from `buildStaticTestsByPath`
|
|
72
|
+
* @param options - Cookie, prefix, and filter options
|
|
73
|
+
* @returns Sync middleware function (returns NextResponse | null)
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* // middleware.ts
|
|
78
|
+
* import { createStaticAbTestMiddleware } from '@se-studio/ab-testing/middleware';
|
|
79
|
+
* import { testsByPath } from '@/lib/__generated/abTests';
|
|
80
|
+
*
|
|
81
|
+
* const abTestHandler = createStaticAbTestMiddleware(testsByPath, {
|
|
82
|
+
* variantPathPrefix: '/page-test',
|
|
83
|
+
* });
|
|
84
|
+
*
|
|
85
|
+
* export function middleware(request: NextRequest) {
|
|
86
|
+
* const abResponse = abTestHandler(request);
|
|
87
|
+
* if (abResponse) return abResponse;
|
|
88
|
+
* return NextResponse.next();
|
|
89
|
+
* }
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export declare function createStaticAbTestMiddleware(staticTestsByPath: Record<string, CachedAbTest[]>, options?: StaticAbTestMiddlewareOptions): (request: NextRequest) => NextResponse | null;
|
|
45
93
|
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/middleware/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/middleware/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,UAAU,CAAC;AAW/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAElF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,IAmE5B,SAAS,WAAW,KAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA0D3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,eAAe,EAC7B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,KAAK,EAAE,UAAU,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,EACrD,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,sBAAsB,CAAC,aAAa,CAAC,GAClD,OAAO,CAAC,YAAY,CAAC,CAwDvB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC9E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,4BAA4B,CAC1C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EACjD,OAAO,GAAE,6BAAkC,IAaJ,SAAS,WAAW,KAAG,YAAY,GAAG,IAAI,CAyElF"}
|
|
@@ -30,7 +30,7 @@ import { DEFAULT_COOKIE_MAX_AGE, DEFAULT_COOKIE_NAME, getAssignment, parseCookie
|
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
32
|
export function createAbTestMiddleware(config) {
|
|
33
|
-
const { getStore, cacheTtlMs = 60000, cookieName = DEFAULT_COOKIE_NAME, cookieMaxAge = DEFAULT_COOKIE_MAX_AGE, shouldProcess, devTestData, onValidationFailure, } = config;
|
|
33
|
+
const { getStore, cacheTtlMs = 60000, cookieName = DEFAULT_COOKIE_NAME, cookieMaxAge = DEFAULT_COOKIE_MAX_AGE, shouldProcess, devTestData, onValidationFailure, variantPathPrefix = '', } = config;
|
|
34
34
|
/**
|
|
35
35
|
* Process a single test against the request.
|
|
36
36
|
*/
|
|
@@ -59,11 +59,11 @@ export function createAbTestMiddleware(config) {
|
|
|
59
59
|
}
|
|
60
60
|
// Determine if we need to rewrite
|
|
61
61
|
const variantSlug = assignmentData.test_path;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
let rewriteUrl;
|
|
63
|
+
if (variantSlug && variantSlug !== 'control') {
|
|
64
|
+
const cleanSlug = variantSlug.startsWith('/') ? variantSlug.slice(1) : variantSlug;
|
|
65
|
+
rewriteUrl = `${variantPathPrefix}/${cleanSlug}`;
|
|
66
|
+
}
|
|
67
67
|
return {
|
|
68
68
|
matched: true,
|
|
69
69
|
test,
|
|
@@ -186,4 +186,98 @@ export async function processAbTestRequest(pathname, searchParams, cookieValue,
|
|
|
186
186
|
}
|
|
187
187
|
return { matched: false };
|
|
188
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Create a synchronous A/B test middleware from a pre-generated static testsByPath map.
|
|
191
|
+
*
|
|
192
|
+
* Use this when you generate `testsByPath` at build time (e.g. via `generateAbTestsFileContent`)
|
|
193
|
+
* and import the result directly — no blob store or cache TTL needed.
|
|
194
|
+
*
|
|
195
|
+
* @param staticTestsByPath - Pre-generated map from `buildStaticTestsByPath`
|
|
196
|
+
* @param options - Cookie, prefix, and filter options
|
|
197
|
+
* @returns Sync middleware function (returns NextResponse | null)
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* ```typescript
|
|
201
|
+
* // middleware.ts
|
|
202
|
+
* import { createStaticAbTestMiddleware } from '@se-studio/ab-testing/middleware';
|
|
203
|
+
* import { testsByPath } from '@/lib/__generated/abTests';
|
|
204
|
+
*
|
|
205
|
+
* const abTestHandler = createStaticAbTestMiddleware(testsByPath, {
|
|
206
|
+
* variantPathPrefix: '/page-test',
|
|
207
|
+
* });
|
|
208
|
+
*
|
|
209
|
+
* export function middleware(request: NextRequest) {
|
|
210
|
+
* const abResponse = abTestHandler(request);
|
|
211
|
+
* if (abResponse) return abResponse;
|
|
212
|
+
* return NextResponse.next();
|
|
213
|
+
* }
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
export function createStaticAbTestMiddleware(staticTestsByPath, options = {}) {
|
|
217
|
+
const { cookieName = DEFAULT_COOKIE_NAME, cookieMaxAge = DEFAULT_COOKIE_MAX_AGE, variantPathPrefix = '', shouldProcess, onValidationFailure, } = options;
|
|
218
|
+
// Convert Record to Map once at factory time for O(1) lookups per request
|
|
219
|
+
const testsByPathMap = new Map(Object.entries(staticTestsByPath));
|
|
220
|
+
return function staticAbTestMiddleware(request) {
|
|
221
|
+
const pathname = request.nextUrl.pathname;
|
|
222
|
+
if (shouldProcess && !shouldProcess(pathname)) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
const normalizedPathname = normalizePath(pathname);
|
|
226
|
+
const tests = testsByPathMap.get(normalizedPathname);
|
|
227
|
+
if (!tests || tests.length === 0) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
const cookieValue = request.cookies.get(cookieName)?.value;
|
|
231
|
+
const cookie = parseCookie(cookieValue);
|
|
232
|
+
for (const test of tests) {
|
|
233
|
+
if (test.searchParameters) {
|
|
234
|
+
const testSearchParams = new URLSearchParams(test.searchParameters);
|
|
235
|
+
let paramsMatch = true;
|
|
236
|
+
for (const [key, value] of testSearchParams.entries()) {
|
|
237
|
+
if (request.nextUrl.searchParams.get(key) !== value) {
|
|
238
|
+
paramsMatch = false;
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (!paramsMatch)
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
let assignmentData = getAssignment(cookie, test.id);
|
|
246
|
+
if (assignmentData && !isValidAssignment(test, assignmentData)) {
|
|
247
|
+
onValidationFailure?.(test.id, assignmentData);
|
|
248
|
+
assignmentData = undefined;
|
|
249
|
+
}
|
|
250
|
+
if (!assignmentData) {
|
|
251
|
+
const { selectedKey, variantSlug } = selectVariant(test);
|
|
252
|
+
assignmentData = createAssignment(test, selectedKey, variantSlug, normalizedPathname);
|
|
253
|
+
setAssignment(cookie, test.id, assignmentData);
|
|
254
|
+
}
|
|
255
|
+
const variantSlug = assignmentData.test_path;
|
|
256
|
+
let rewriteUrl;
|
|
257
|
+
if (variantSlug && variantSlug !== 'control') {
|
|
258
|
+
const cleanSlug = variantSlug.startsWith('/') ? variantSlug.slice(1) : variantSlug;
|
|
259
|
+
rewriteUrl = `${variantPathPrefix}/${cleanSlug}`;
|
|
260
|
+
}
|
|
261
|
+
let response;
|
|
262
|
+
if (rewriteUrl) {
|
|
263
|
+
const url = request.nextUrl.clone();
|
|
264
|
+
url.pathname = rewriteUrl;
|
|
265
|
+
response = NextResponse.rewrite(url);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
response = NextResponse.next();
|
|
269
|
+
}
|
|
270
|
+
const newCookieValue = serializeCookie(cookie);
|
|
271
|
+
if (newCookieValue) {
|
|
272
|
+
response.cookies.set(cookieName, newCookieValue, {
|
|
273
|
+
path: '/',
|
|
274
|
+
maxAge: cookieMaxAge,
|
|
275
|
+
sameSite: 'lax',
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
return response;
|
|
279
|
+
}
|
|
280
|
+
return null;
|
|
281
|
+
};
|
|
282
|
+
}
|
|
189
283
|
//# sourceMappingURL=handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/middleware/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,eAAe,EACf,aAAa,GACd,MAAM,WAAW,CAAC;AAGnB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA8B;IACnE,MAAM,EACJ,QAAQ,EACR,UAAU,GAAG,KAAK,EAClB,UAAU,GAAG,mBAAmB,EAChC,YAAY,GAAG,sBAAsB,EACrC,aAAa,EACb,WAAW,EACX,mBAAmB,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/middleware/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,eAAe,EACf,aAAa,GACd,MAAM,WAAW,CAAC;AAGnB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA8B;IACnE,MAAM,EACJ,QAAQ,EACR,UAAU,GAAG,KAAK,EAClB,UAAU,GAAG,mBAAmB,EAChC,YAAY,GAAG,sBAAsB,EACrC,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAAG,EAAE,GACvB,GAAG,MAAM,CAAC;IAEX;;OAEG;IACH,SAAS,WAAW,CAClB,IAAkB,EAClB,kBAA0B,EAC1B,YAA6B,EAC7B,MAAoB;QAEpB,mCAAmC;QACnC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,gBAAgB,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;gBACtD,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;oBACpC,OAAO,IAAI,CAAC,CAAC,qBAAqB;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,cAAc,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAEpD,0DAA0D;QAC1D,IAAI,cAAc,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;YAC/D,mBAAmB,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YAC/C,cAAc,GAAG,SAAS,CAAC,CAAC,sBAAsB;QACpD,CAAC;QAED,kCAAkC;QAClC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACzD,cAAc,GAAG,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;YACtF,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QACjD,CAAC;QAED,kCAAkC;QAClC,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;QAC7C,IAAI,UAA8B,CAAC;QACnC,IAAI,WAAW,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YACnF,UAAU,GAAG,GAAG,iBAAiB,IAAI,SAAS,EAAE,CAAC;QACnD,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI;YACJ,UAAU,EAAE,cAAc;YAC1B,UAAU;YACV,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC;SACrC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,OAAO,KAAK,UAAU,gBAAgB,CAAC,OAAoB;QACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QAE1C,0CAA0C;QAC1C,IAAI,aAAa,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YACzE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAElD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,wBAAwB;YACxB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;YAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;YAExC,kCAAkC;YAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;gBAE3F,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBACpB,kBAAkB;oBAClB,IAAI,QAAsB,CAAC;oBAE3B,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;wBACtB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBACpC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;wBACjC,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACvC,CAAC;yBAAM,CAAC;wBACN,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;oBACjC,CAAC;oBAED,6BAA6B;oBAC7B,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;wBACvB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE;4BACnD,IAAI,EAAE,GAAG;4BACT,MAAM,EAAE,YAAY;4BACpB,QAAQ,EAAE,KAAK;yBAChB,CAAC,CAAC;oBACL,CAAC;oBAED,OAAO,QAAQ,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sEAAsE;YACtE,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAgB,EAChB,YAA6B,EAC7B,WAA+B,EAC/B,KAAqD,EACrD,UAAkB,EAClB,WAAmD;IAEnD,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAElD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,0BAA0B;QAC1B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,gBAAgB,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpE,IAAI,WAAW,GAAG,IAAI,CAAC;YACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;gBACtD,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;oBACpC,WAAW,GAAG,KAAK,CAAC;oBACpB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,CAAC,WAAW;gBAAE,SAAS;QAC7B,CAAC;QAED,IAAI,cAAc,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAEpD,IAAI,cAAc,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;YAC/D,cAAc,GAAG,SAAS,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACzD,cAAc,GAAG,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;YACtF,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;QAC7C,MAAM,UAAU,GACd,WAAW,KAAK,SAAS,IAAI,WAAW;YACtC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC;gBAC3B,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,IAAI,WAAW,EAAE;YACrB,CAAC,CAAC,SAAS,CAAC;QAEhB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI;YACJ,UAAU,EAAE,cAAc;YAC1B,UAAU;YACV,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC;SACrC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAsBD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,4BAA4B,CAC1C,iBAAiD,EACjD,UAAyC,EAAE;IAE3C,MAAM,EACJ,UAAU,GAAG,mBAAmB,EAChC,YAAY,GAAG,sBAAsB,EACrC,iBAAiB,GAAG,EAAE,EACtB,aAAa,EACb,mBAAmB,GACpB,GAAG,OAAO,CAAC;IAEZ,0EAA0E;IAC1E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAyB,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAE1F,OAAO,SAAS,sBAAsB,CAAC,OAAoB;QACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QAE1C,IAAI,aAAa,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAErD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;QAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,MAAM,gBAAgB,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACpE,IAAI,WAAW,GAAG,IAAI,CAAC;gBACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;oBACtD,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;wBACpD,WAAW,GAAG,KAAK,CAAC;wBACpB,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,WAAW;oBAAE,SAAS;YAC7B,CAAC;YAED,IAAI,cAAc,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YAEpD,IAAI,cAAc,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;gBAC/D,mBAAmB,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;gBAC/C,cAAc,GAAG,SAAS,CAAC;YAC7B,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;gBACzD,cAAc,GAAG,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;gBACtF,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;YAC7C,IAAI,UAA8B,CAAC;YACnC,IAAI,WAAW,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;gBACnF,UAAU,GAAG,GAAG,iBAAiB,IAAI,SAAS,EAAE,CAAC;YACnD,CAAC;YAED,IAAI,QAAsB,CAAC;YAC3B,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACpC,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC;gBAC1B,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;YACjC,CAAC;YAED,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,cAAc,EAAE,CAAC;gBACnB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE;oBAC/C,IAAI,EAAE,GAAG;oBACT,MAAM,EAAE,YAAY;oBACpB,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* Helpers for implementing server-side A/B testing in Next.js middleware.
|
|
5
5
|
*/
|
|
6
6
|
export { createAssignment, isValidAssignment, selectVariant } from './assignment';
|
|
7
|
-
export { clearTestCache, getCachedTests, getTestCacheState, normalizePath } from './cache';
|
|
7
|
+
export { clearTestCache, computeCachedTest, getCachedTests, getTestCacheState, normalizePath, } from './cache';
|
|
8
8
|
export { DEFAULT_COOKIE_MAX_AGE, DEFAULT_COOKIE_NAME, getAssignment, parseCookie, readCookieFromDocument, serializeCookie, setAssignment, } from './cookies';
|
|
9
|
-
export {
|
|
9
|
+
export type { StaticAbTestMiddlewareOptions } from './handler';
|
|
10
|
+
export { createAbTestMiddleware, createStaticAbTestMiddleware, processAbTestRequest, } from './handler';
|
|
10
11
|
export type { AbTestMiddlewareConfig, AbTestResult, CachedAbTest, TestsCache, } from './types';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAC"}
|
package/dist/middleware/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Helpers for implementing server-side A/B testing in Next.js middleware.
|
|
5
5
|
*/
|
|
6
6
|
export { createAssignment, isValidAssignment, selectVariant } from './assignment';
|
|
7
|
-
export { clearTestCache, getCachedTests, getTestCacheState, normalizePath } from './cache';
|
|
7
|
+
export { clearTestCache, computeCachedTest, getCachedTests, getTestCacheState, normalizePath, } from './cache';
|
|
8
8
|
export { DEFAULT_COOKIE_MAX_AGE, DEFAULT_COOKIE_NAME, getAssignment, parseCookie, readCookieFromDocument, serializeCookie, setAssignment, } from './cookies';
|
|
9
|
-
export { createAbTestMiddleware, processAbTestRequest } from './handler';
|
|
9
|
+
export { createAbTestMiddleware, createStaticAbTestMiddleware, processAbTestRequest, } from './handler';
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,aAAa,GACd,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,WAAW,CAAC"}
|
|
@@ -59,6 +59,13 @@ export interface AbTestMiddlewareConfig {
|
|
|
59
59
|
* Called when a cookie assignment fails validation against current config.
|
|
60
60
|
*/
|
|
61
61
|
onValidationFailure?: (testId: string, assignment: AbTestAssignment) => void;
|
|
62
|
+
/**
|
|
63
|
+
* Path prefix to prepend when rewriting to a variant.
|
|
64
|
+
* e.g. "/page-test" → rewrites to "/page-test/slug" instead of "/slug".
|
|
65
|
+
* Useful to keep variant URLs on an internal route excluded from robots.txt.
|
|
66
|
+
* @default "" (no prefix — rewrite directly to slug)
|
|
67
|
+
*/
|
|
68
|
+
variantPathPrefix?: string;
|
|
62
69
|
}
|
|
63
70
|
/**
|
|
64
71
|
* Result of processing an A/B test request.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,mEAAmE;IACnE,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,QAAQ,EAAE,MAAM,UAAU,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjE;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAE9C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,mEAAmE;IACnE,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,QAAQ,EAAE,MAAM,UAAU,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjE;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAE9C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAE7E;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/ab-testing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.46",
|
|
4
4
|
"description": "Server-side A/B testing framework for Next.js applications with Contentful CMS",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -27,6 +27,14 @@
|
|
|
27
27
|
"./hooks": {
|
|
28
28
|
"types": "./dist/hooks/index.d.ts",
|
|
29
29
|
"import": "./dist/hooks/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./codegen": {
|
|
32
|
+
"types": "./dist/codegen/index.d.ts",
|
|
33
|
+
"import": "./dist/codegen/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./components": {
|
|
36
|
+
"types": "./dist/components/index.d.ts",
|
|
37
|
+
"import": "./dist/components/index.js"
|
|
30
38
|
}
|
|
31
39
|
},
|
|
32
40
|
"files": [
|
|
@@ -51,7 +59,7 @@
|
|
|
51
59
|
"url": "https://github.com/Something-Else-Studio/se-core-product/issues"
|
|
52
60
|
},
|
|
53
61
|
"peerDependencies": {
|
|
54
|
-
"next": "
|
|
62
|
+
"next": ">=15.5.0",
|
|
55
63
|
"react": "^19.0.0"
|
|
56
64
|
},
|
|
57
65
|
"devDependencies": {
|
|
@@ -59,7 +67,7 @@
|
|
|
59
67
|
"@types/node": "^22.19.15",
|
|
60
68
|
"@types/react": "^19.2.14",
|
|
61
69
|
"next": "^15.5.14",
|
|
62
|
-
"typescript": "^
|
|
70
|
+
"typescript": "^6.0.2"
|
|
63
71
|
},
|
|
64
72
|
"scripts": {
|
|
65
73
|
"build": "tsc --project tsconfig.build.json",
|