@kiryl.pekarski/payload-plugin-ab 1.0.0 → 1.0.2

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.
@@ -1,4 +1,4 @@
1
- import { S as StorageAdapter } from '../../config-CRUREAW_.js';
1
+ import { S as StorageAdapter } from '../../config-CvEujvxX.js';
2
2
  import 'payload';
3
3
 
4
4
  interface PayloadGlobalAdapterConfig {
@@ -1,4 +1,4 @@
1
- import { S as StorageAdapter } from '../../config-CRUREAW_.js';
1
+ import { S as StorageAdapter } from '../../config-CvEujvxX.js';
2
2
  import 'payload';
3
3
 
4
4
  interface VercelEdgeAdapterConfig {
@@ -14,13 +14,13 @@ interface CollectionABConfig<TVariantData extends object = object> {
14
14
  variantCollectionSlug: string;
15
15
  generatePath: (args: {
16
16
  doc: Record<string, unknown>;
17
- locale: string;
17
+ locale: string | undefined;
18
18
  }) => string | null;
19
19
  /** Generate the data stored per variant in the manifest. */
20
20
  generateVariantData: (args: {
21
21
  doc: Record<string, unknown>;
22
22
  variantDoc: Record<string, unknown>;
23
- locale: string;
23
+ locale: string | undefined;
24
24
  }) => TVariantData;
25
25
  }
26
26
  interface AbTestingPluginConfig<TVariantData extends object = object> {
package/dist/index.d.ts CHANGED
@@ -1,8 +1,6 @@
1
1
  import { Plugin } from 'payload';
2
- import { A as AbTestingPluginConfig } from './config-CRUREAW_.js';
3
- export { C as CollectionABConfig, S as StorageAdapter } from './config-CRUREAW_.js';
4
- export { payloadGlobalAdapter } from './adapters/payloadGlobal/index.js';
5
- export { vercelEdgeAdapter } from './adapters/vercelEdge/index.js';
2
+ import { A as AbTestingPluginConfig } from './config-CvEujvxX.js';
3
+ export { C as CollectionABConfig, S as StorageAdapter } from './config-CvEujvxX.js';
6
4
 
7
5
  declare const abTestingPlugin: <TVariantData extends object>(pluginConfig: AbTestingPluginConfig<TVariantData>) => Plugin;
8
6
 
package/dist/index.js CHANGED
@@ -22,9 +22,11 @@ function resolveId(value) {
22
22
 
23
23
  // src/utils/getLocales.ts
24
24
  function getLocales(payload) {
25
- const localization = payload.config.localization;
26
- const locales = localization ? localization.locales ?? [] : [];
27
- return locales.map((l) => typeof l === "string" ? l : l.code ?? String(l));
25
+ const { localization } = payload.config;
26
+ if (!localization) return [void 0];
27
+ const { locales } = localization;
28
+ if (!locales?.length) return [void 0];
29
+ return locales.map((l) => typeof l === "string" ? l : l.code);
28
30
  }
29
31
 
30
32
  // src/hooks/buildAfterChangeHook.ts
@@ -184,151 +186,7 @@ var abTestingPlugin = (pluginConfig) => (incomingConfig) => {
184
186
  globals: [...incomingConfig.globals ?? [], ...extraGlobals]
185
187
  };
186
188
  };
187
-
188
- // src/adapters/payloadGlobal/api/fetchManifest.ts
189
- async function fetchManifest(serverURL, apiRoute, slug, path) {
190
- try {
191
- const res = await fetch(`${serverURL}${apiRoute}/globals/${slug}`, {
192
- cache: "no-store"
193
- });
194
- if (!res.ok) return null;
195
- const data = await res.json();
196
- return data?.manifest?.[path] ?? null;
197
- } catch {
198
- return null;
199
- }
200
- }
201
-
202
- // src/adapters/payloadGlobal/api/readManifest.ts
203
- async function readManifest(payload, slug) {
204
- try {
205
- const doc = await payload.findGlobal({ slug, overrideAccess: true });
206
- return doc?.manifest ?? {};
207
- } catch {
208
- return {};
209
- }
210
- }
211
-
212
- // src/adapters/payloadGlobal/utils/createGlobal.ts
213
- function createGlobal(slug, debug) {
214
- return {
215
- slug,
216
- access: {
217
- read: () => true
218
- },
219
- admin: {
220
- hidden: !debug,
221
- group: "System"
222
- },
223
- fields: [
224
- {
225
- name: "manifest",
226
- type: "json",
227
- admin: {
228
- description: "A/B testing manifest. Managed automatically \u2014 do not edit manually."
229
- }
230
- }
231
- ]
232
- };
233
- }
234
-
235
- // src/adapters/payloadGlobal/index.ts
236
- function payloadGlobalAdapter(config) {
237
- const slug = config?.globalSlug ?? "_abManifest";
238
- return {
239
- async write(path, variants, payload) {
240
- const currentManifest = await readManifest(payload, slug);
241
- await payload.updateGlobal({
242
- slug,
243
- data: { manifest: { ...currentManifest, [path]: variants } },
244
- overrideAccess: true
245
- });
246
- },
247
- async read(path) {
248
- const serverURL = config?.serverURL ?? "";
249
- const apiRoute = config?.apiRoute ?? "/api";
250
- return fetchManifest(serverURL, apiRoute, slug, path);
251
- },
252
- async clear(path, payload) {
253
- const currentManifest = await readManifest(payload, slug);
254
- delete currentManifest[path];
255
- await payload.updateGlobal({
256
- slug,
257
- data: { manifest: currentManifest },
258
- overrideAccess: true
259
- });
260
- },
261
- createGlobal(debug = false) {
262
- return createGlobal(slug, debug);
263
- }
264
- };
265
- }
266
-
267
- // src/adapters/vercelEdge/api/readManifest.ts
268
- async function readManifest2(manifestKey) {
269
- try {
270
- const { get } = await import("@vercel/edge-config");
271
- const manifest = await get(manifestKey);
272
- return manifest ?? {};
273
- } catch {
274
- return {};
275
- }
276
- }
277
-
278
- // src/adapters/vercelEdge/utils/buildHeaders.ts
279
- function buildHeaders(config) {
280
- return {
281
- "Content-Type": "application/json",
282
- Authorization: `Bearer ${config.vercelRestAPIAccessToken}`
283
- };
284
- }
285
-
286
- // src/adapters/vercelEdge/api/updateEdgeConfig.ts
287
- async function updateEdgeConfig(config, manifestKey, value) {
288
- const teamQuery = config.teamID ? `?teamId=${config.teamID}` : "";
289
- await fetch(`https://api.vercel.com/v1/edge-config/${config.configID}/items${teamQuery}`, {
290
- method: "PATCH",
291
- headers: buildHeaders(config),
292
- body: JSON.stringify({ items: [{ operation: "upsert", key: manifestKey, value }] })
293
- });
294
- }
295
-
296
- // src/adapters/vercelEdge/index.ts
297
- function vercelEdgeAdapter(config) {
298
- const manifestKey = config.manifestKey ?? "ab-testing";
299
- let localCache = null;
300
- async function getManifest() {
301
- if (localCache === null) {
302
- localCache = await readManifest2(manifestKey);
303
- }
304
- return localCache;
305
- }
306
- return {
307
- async write(path, variants) {
308
- const currentManifest = await getManifest();
309
- localCache = { ...currentManifest, [path]: variants };
310
- await updateEdgeConfig(config, manifestKey, localCache);
311
- },
312
- async read(path) {
313
- try {
314
- const manifest = await readManifest2(manifestKey);
315
- return manifest?.[path] ?? null;
316
- } catch {
317
- return null;
318
- }
319
- },
320
- async clear(path) {
321
- const currentManifest = await getManifest();
322
- const updated = { ...currentManifest };
323
- delete updated[path];
324
- localCache = updated;
325
- await updateEdgeConfig(config, manifestKey, localCache);
326
- }
327
- };
328
- }
329
189
  export {
330
- abTestingPlugin,
331
- payloadGlobalAdapter,
332
- vercelEdgeAdapter
190
+ abTestingPlugin
333
191
  };
334
192
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/buildVariantToParentCollectionSlugsMap.ts","../src/utils/resolveId.ts","../src/utils/getLocales.ts","../src/hooks/buildAfterChangeHook.ts","../src/hooks/buildAfterDeleteHook.ts","../src/utils/addHooksToVariantCollections.ts","../src/plugin.ts","../src/adapters/payloadGlobal/api/fetchManifest.ts","../src/adapters/payloadGlobal/api/readManifest.ts","../src/adapters/payloadGlobal/utils/createGlobal.ts","../src/adapters/payloadGlobal/index.ts","../src/adapters/vercelEdge/api/readManifest.ts","../src/adapters/vercelEdge/utils/buildHeaders.ts","../src/adapters/vercelEdge/api/updateEdgeConfig.ts","../src/adapters/vercelEdge/index.ts"],"sourcesContent":["import type { CollectionABConfig } from \"../types/config\";\n\nexport function buildVariantToParentCollectionSlugsMap<TVariantData extends object>(\n collections: Record<string, CollectionABConfig<TVariantData>>,\n) {\n const variantToParent = new Map<string, string>();\n\n for (const [parentSlug, abConfig] of Object.entries(collections)) {\n if (abConfig) variantToParent.set(abConfig.variantCollectionSlug, parentSlug);\n }\n\n return variantToParent;\n}\n","interface BaseDocument {\n id: number | string;\n}\n\nconst isValueIsBaseDocument = (value: object): value is BaseDocument => {\n return \"id\" in value;\n};\n\nexport function resolveId(value: unknown) {\n if (!value) return null;\n\n if (typeof value === \"number\" || typeof value === \"string\") return value;\n\n if (typeof value === \"object\" && isValueIsBaseDocument(value)) {\n return value.id;\n }\n\n return null;\n}\n","import type { Payload } from \"payload\";\n\nexport function getLocales(payload: Payload): string[] {\n const localization = payload.config.localization;\n\n const locales = localization ? (localization.locales ?? []) : [];\n\n return locales.map((l) => (typeof l === \"string\" ? l : (l.code ?? String(l))));\n}\n","import type { CollectionAfterChangeHook, CollectionSlug, TypedLocale } from \"payload\";\nimport type { AbTestingPluginConfig, CollectionABConfig } from \"../types/config\";\nimport { resolveId } from \"../utils/resolveId\";\nimport { getLocales } from \"../utils/getLocales\";\n\nexport function buildAfterChangeHook<TVariantData extends object>(\n parentCollectionSlug: string,\n abConfig: CollectionABConfig<TVariantData>,\n pluginConfig: AbTestingPluginConfig<TVariantData>,\n): CollectionAfterChangeHook {\n return async ({ doc, req, previousDoc }) => {\n const { payload } = req;\n if (!payload) return;\n\n const pageId = resolveId(doc.page);\n if (!pageId) return;\n\n const locales = getLocales(payload);\n\n const previousPageId = previousDoc ? resolveId(previousDoc.page) : null;\n if (previousPageId && previousPageId !== pageId) {\n for (const locale of locales) {\n const oldPageDoc = await payload.findByID({\n collection: parentCollectionSlug as CollectionSlug,\n id: previousPageId,\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n req,\n });\n if (!oldPageDoc) continue;\n\n const oldManifestKey = abConfig.generatePath({ doc: oldPageDoc, locale });\n if (!oldManifestKey) continue;\n\n const remainingOldVariants = await payload.find({\n collection: abConfig.variantCollectionSlug as CollectionSlug,\n where: {\n and: [{ page: { equals: previousPageId } }, { id: { not_equals: doc.id } }],\n },\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n limit: 100,\n req,\n });\n\n if (remainingOldVariants.docs.length === 0) {\n await pluginConfig.storage.clear(oldManifestKey, payload);\n } else {\n const oldVariantData = remainingOldVariants.docs.map((variantDoc) =>\n abConfig.generateVariantData({ doc: oldPageDoc, variantDoc, locale }),\n );\n await pluginConfig.storage.write(oldManifestKey, oldVariantData, payload);\n }\n }\n }\n\n for (const locale of locales) {\n const pageDoc = await payload.findByID({\n collection: parentCollectionSlug as CollectionSlug,\n id: pageId,\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n req,\n });\n if (!pageDoc) continue;\n\n const manifestKey = abConfig.generatePath({ doc: pageDoc, locale });\n if (!manifestKey) continue;\n\n const allVariants = await payload.find({\n collection: abConfig.variantCollectionSlug as CollectionSlug,\n where: { page: { equals: pageId } },\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n limit: 100,\n req,\n });\n\n const variantData = allVariants.docs.map((variantDoc) =>\n abConfig.generateVariantData({ doc: pageDoc, variantDoc, locale }),\n );\n\n await pluginConfig.storage.write(manifestKey, variantData, payload);\n }\n };\n}\n","import type { CollectionAfterDeleteHook, CollectionSlug, TypedLocale } from \"payload\";\nimport type { AbTestingPluginConfig, CollectionABConfig } from \"../types/config\";\nimport { resolveId } from \"../utils/resolveId\";\nimport { getLocales } from \"../utils/getLocales\";\n\nexport function buildAfterDeleteHook<TVariantData extends object>(\n parentCollectionSlug: string,\n abConfig: CollectionABConfig<TVariantData>,\n pluginConfig: AbTestingPluginConfig<TVariantData>,\n): CollectionAfterDeleteHook {\n return async ({ doc, req, id }) => {\n const { payload } = req;\n if (!payload) return;\n\n const pageId = resolveId(doc.page);\n if (!pageId) return;\n\n const locales = getLocales(payload);\n\n for (const locale of locales) {\n const pageDoc = await payload.findByID({\n collection: parentCollectionSlug as CollectionSlug,\n id: pageId,\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n req,\n });\n if (!pageDoc) continue;\n\n const manifestKey = abConfig.generatePath({ doc: pageDoc, locale });\n if (!manifestKey) continue;\n\n const remainingVariants = await payload.find({\n collection: abConfig.variantCollectionSlug as CollectionSlug,\n where: {\n and: [{ page: { equals: pageId } }, { id: { not_equals: id } }],\n },\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n limit: 100,\n req,\n });\n\n if (remainingVariants.docs.length === 0) {\n await pluginConfig.storage.clear(manifestKey, payload);\n } else {\n const variantData = remainingVariants.docs.map((variantDoc) =>\n abConfig.generateVariantData({ doc: pageDoc, variantDoc, locale }),\n );\n\n await pluginConfig.storage.write(manifestKey, variantData, payload);\n }\n }\n };\n}\n","import type { CollectionConfig, Config } from \"payload\";\nimport type { AbTestingPluginConfig } from \"../types/config\";\nimport { buildAfterChangeHook } from \"../hooks/buildAfterChangeHook\";\nimport { buildAfterDeleteHook } from \"../hooks/buildAfterDeleteHook\";\n\nexport function addHooksToVariantCollections<TVariantData extends object>(\n config: Config,\n pluginConfig: AbTestingPluginConfig<TVariantData>,\n variantToParent: Map<string, string>,\n) {\n const patchedCollections = (config.collections ?? []).map((collection) => {\n const parentSlug = variantToParent.get(collection.slug);\n if (!parentSlug) return collection;\n\n const abConfig = pluginConfig.collections[parentSlug];\n if (!abConfig) return collection;\n\n return {\n ...collection,\n hooks: {\n ...collection.hooks,\n afterChange: [\n ...(collection.hooks?.afterChange ?? []),\n buildAfterChangeHook(parentSlug, abConfig, pluginConfig),\n ],\n afterDelete: [\n ...(collection.hooks?.afterDelete ?? []),\n buildAfterDeleteHook(parentSlug, abConfig, pluginConfig),\n ],\n },\n } as CollectionConfig;\n });\n\n return patchedCollections;\n}\n","import type { Config, Plugin } from \"payload\";\nimport type { AbTestingPluginConfig } from \"./types/config\";\nimport { buildVariantToParentCollectionSlugsMap } from \"./utils/buildVariantToParentCollectionSlugsMap\";\nimport { addHooksToVariantCollections } from \"./utils/addHooksToVariantCollections\";\n\nexport const abTestingPlugin =\n <TVariantData extends object>(pluginConfig: AbTestingPluginConfig<TVariantData>): Plugin =>\n (incomingConfig: Config): Config => {\n const { enabled = true, debug = false, collections, storage } = pluginConfig;\n\n if (!enabled) return incomingConfig;\n\n const extraGlobals = storage.createGlobal ? [storage.createGlobal(debug)] : [];\n\n const variantToParent = buildVariantToParentCollectionSlugsMap<TVariantData>(collections);\n\n const patchedCollections = addHooksToVariantCollections<TVariantData>(\n incomingConfig,\n pluginConfig,\n variantToParent,\n );\n\n return {\n ...incomingConfig,\n collections: patchedCollections,\n globals: [...(incomingConfig.globals ?? []), ...extraGlobals],\n };\n };\n","export async function fetchManifest<TVariantData extends object>(\n serverURL: string,\n apiRoute: string,\n slug: string,\n path: string,\n): Promise<TVariantData[] | null> {\n try {\n const res = await fetch(`${serverURL}${apiRoute}/globals/${slug}`, {\n cache: \"no-store\",\n });\n\n if (!res.ok) return null;\n\n const data = await res.json();\n\n return (data?.manifest?.[path] as TVariantData[]) ?? null;\n } catch {\n return null;\n }\n}\n","import type { GlobalSlug, Payload } from \"payload\";\nimport type { Manifest } from \"../../../types/manifest\";\n\nexport async function readManifest(payload: Payload, slug: string): Promise<Manifest> {\n try {\n const doc = await payload.findGlobal({ slug: slug as GlobalSlug, overrideAccess: true });\n\n return (doc?.manifest as Manifest) ?? {};\n } catch {\n return {};\n }\n}\n","import type { GlobalConfig } from \"payload\";\n\nexport function createGlobal(slug: string, debug: boolean): GlobalConfig {\n return {\n slug,\n access: {\n read: () => true,\n },\n admin: {\n hidden: !debug,\n group: \"System\",\n },\n fields: [\n {\n name: \"manifest\",\n type: \"json\",\n admin: {\n description: \"A/B testing manifest. Managed automatically — do not edit manually.\",\n },\n },\n ],\n };\n}\n","import type { GlobalSlug } from \"payload\";\nimport type { StorageAdapter } from \"../../types/config\";\nimport type { PayloadGlobalAdapterConfig } from \"./config\";\nimport { fetchManifest } from \"./api/fetchManifest\";\nimport { readManifest } from \"./api/readManifest\";\nimport { createGlobal } from \"./utils/createGlobal\";\n\nexport function payloadGlobalAdapter<TVariantData extends object>(\n config?: PayloadGlobalAdapterConfig,\n): StorageAdapter<TVariantData> {\n const slug = config?.globalSlug ?? \"_abManifest\";\n\n return {\n async write(path, variants, payload) {\n const currentManifest = await readManifest(payload, slug);\n\n await payload.updateGlobal({\n slug: slug as GlobalSlug,\n data: { manifest: { ...currentManifest, [path]: variants } },\n overrideAccess: true,\n });\n },\n\n async read(path) {\n const serverURL = config?.serverURL ?? \"\";\n const apiRoute = config?.apiRoute ?? \"/api\";\n\n return fetchManifest<TVariantData>(serverURL, apiRoute, slug, path);\n },\n\n async clear(path, payload) {\n const currentManifest = await readManifest(payload, slug);\n\n delete currentManifest[path];\n\n await payload.updateGlobal({\n slug: slug as GlobalSlug,\n data: { manifest: currentManifest },\n overrideAccess: true,\n });\n },\n\n createGlobal(debug = false) {\n return createGlobal(slug, debug);\n },\n };\n}\n","import type { Manifest } from \"../../../types/manifest\";\n\nexport async function readManifest<TVariantData extends object = object>(\n manifestKey: string,\n): Promise<Manifest<TVariantData>> {\n try {\n const { get } = await import(\"@vercel/edge-config\");\n\n const manifest = await get<Manifest<TVariantData>>(manifestKey);\n\n return manifest ?? {};\n } catch {\n return {};\n }\n}\n","import type { VercelEdgeAdapterConfig } from \"../config\";\n\nexport function buildHeaders(config: VercelEdgeAdapterConfig): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.vercelRestAPIAccessToken}`,\n };\n}\n","import type { VercelEdgeAdapterConfig } from \"../config\";\nimport { buildHeaders } from \"../utils/buildHeaders\";\n\nexport async function updateEdgeConfig(config: VercelEdgeAdapterConfig, manifestKey: string, value: unknown) {\n const teamQuery = config.teamID ? `?teamId=${config.teamID}` : \"\";\n\n await fetch(`https://api.vercel.com/v1/edge-config/${config.configID}/items${teamQuery}`, {\n method: \"PATCH\",\n headers: buildHeaders(config),\n body: JSON.stringify({ items: [{ operation: \"upsert\", key: manifestKey, value }] }),\n });\n}\n","import type { StorageAdapter } from \"../../types/config\";\nimport type { Manifest } from \"../../types/manifest\";\nimport { readManifest } from \"./api/readManifest\";\nimport { updateEdgeConfig } from \"./api/updateEdgeConfig\";\nimport type { VercelEdgeAdapterConfig } from \"./config\";\n\n/**\n * Vercel Edge Config adapter.\n * Requires \"pnpm add \\@vercel/edge-config\" and the following env vars:\n * EDGE_CONFIG, EDGE_CONFIG_ID, VERCEL_REST_API_ACCESS_TOKEN\n */\nexport function vercelEdgeAdapter<TVariantData extends object>(\n config: VercelEdgeAdapterConfig,\n): StorageAdapter<TVariantData> {\n const manifestKey = config.manifestKey ?? \"ab-testing\";\n let localCache: Manifest<TVariantData> | null = null;\n\n async function getManifest() {\n if (localCache === null) {\n localCache = await readManifest<TVariantData>(manifestKey);\n }\n\n return localCache;\n }\n\n return {\n async write(path, variants) {\n const currentManifest = await getManifest();\n\n localCache = { ...currentManifest, [path]: variants };\n\n await updateEdgeConfig(config, manifestKey, localCache);\n },\n\n async read(path) {\n try {\n const manifest = await readManifest<TVariantData>(manifestKey);\n\n return manifest?.[path] ?? null;\n } catch {\n return null;\n }\n },\n\n async clear(path) {\n const currentManifest = await getManifest();\n const updated = { ...currentManifest };\n\n delete updated[path];\n\n localCache = updated;\n\n await updateEdgeConfig(config, manifestKey, localCache);\n },\n };\n}\n"],"mappings":"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","names":["readManifest","readManifest"]}
1
+ {"version":3,"sources":["../src/utils/buildVariantToParentCollectionSlugsMap.ts","../src/utils/resolveId.ts","../src/utils/getLocales.ts","../src/hooks/buildAfterChangeHook.ts","../src/hooks/buildAfterDeleteHook.ts","../src/utils/addHooksToVariantCollections.ts","../src/plugin.ts"],"sourcesContent":["import type { CollectionABConfig } from \"../types/config\";\n\nexport function buildVariantToParentCollectionSlugsMap<TVariantData extends object>(\n collections: Record<string, CollectionABConfig<TVariantData>>,\n) {\n const variantToParent = new Map<string, string>();\n\n for (const [parentSlug, abConfig] of Object.entries(collections)) {\n if (abConfig) variantToParent.set(abConfig.variantCollectionSlug, parentSlug);\n }\n\n return variantToParent;\n}\n","interface BaseDocument {\n id: number | string;\n}\n\nconst isValueIsBaseDocument = (value: object): value is BaseDocument => {\n return \"id\" in value;\n};\n\nexport function resolveId(value: unknown) {\n if (!value) return null;\n\n if (typeof value === \"number\" || typeof value === \"string\") return value;\n\n if (typeof value === \"object\" && isValueIsBaseDocument(value)) {\n return value.id;\n }\n\n return null;\n}\n","import type { Payload } from \"payload\";\n\nexport function getLocales(payload: Payload): (string | undefined)[] {\n const { localization } = payload.config;\n\n if (!localization) return [undefined];\n\n const { locales } = localization;\n\n if (!locales?.length) return [undefined];\n \n return locales.map((l) => (typeof l === \"string\" ? l : l.code));\n}\n","import type { CollectionAfterChangeHook, CollectionSlug, TypedLocale } from \"payload\";\nimport type { AbTestingPluginConfig, CollectionABConfig } from \"../types/config\";\nimport { resolveId } from \"../utils/resolveId\";\nimport { getLocales } from \"../utils/getLocales\";\n\nexport function buildAfterChangeHook<TVariantData extends object>(\n parentCollectionSlug: string,\n abConfig: CollectionABConfig<TVariantData>,\n pluginConfig: AbTestingPluginConfig<TVariantData>,\n): CollectionAfterChangeHook {\n return async ({ doc, req, previousDoc }) => {\n const { payload } = req;\n if (!payload) return;\n\n const pageId = resolveId(doc.page);\n if (!pageId) return;\n\n const locales = getLocales(payload);\n\n const previousPageId = previousDoc ? resolveId(previousDoc.page) : null;\n if (previousPageId && previousPageId !== pageId) {\n for (const locale of locales) {\n const oldPageDoc = await payload.findByID({\n collection: parentCollectionSlug as CollectionSlug,\n id: previousPageId,\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n req,\n });\n if (!oldPageDoc) continue;\n\n const oldManifestKey = abConfig.generatePath({ doc: oldPageDoc, locale });\n if (!oldManifestKey) continue;\n\n const remainingOldVariants = await payload.find({\n collection: abConfig.variantCollectionSlug as CollectionSlug,\n where: {\n and: [{ page: { equals: previousPageId } }, { id: { not_equals: doc.id } }],\n },\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n limit: 100,\n req,\n });\n\n if (remainingOldVariants.docs.length === 0) {\n await pluginConfig.storage.clear(oldManifestKey, payload);\n } else {\n const oldVariantData = remainingOldVariants.docs.map((variantDoc) =>\n abConfig.generateVariantData({ doc: oldPageDoc, variantDoc, locale }),\n );\n await pluginConfig.storage.write(oldManifestKey, oldVariantData, payload);\n }\n }\n }\n\n for (const locale of locales) {\n const pageDoc = await payload.findByID({\n collection: parentCollectionSlug as CollectionSlug,\n id: pageId,\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n req,\n });\n if (!pageDoc) continue;\n\n const manifestKey = abConfig.generatePath({ doc: pageDoc, locale });\n if (!manifestKey) continue;\n\n const allVariants = await payload.find({\n collection: abConfig.variantCollectionSlug as CollectionSlug,\n where: { page: { equals: pageId } },\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n limit: 100,\n req,\n });\n\n const variantData = allVariants.docs.map((variantDoc) =>\n abConfig.generateVariantData({ doc: pageDoc, variantDoc, locale }),\n );\n\n await pluginConfig.storage.write(manifestKey, variantData, payload);\n }\n };\n}\n","import type { CollectionAfterDeleteHook, CollectionSlug, TypedLocale } from \"payload\";\nimport type { AbTestingPluginConfig, CollectionABConfig } from \"../types/config\";\nimport { resolveId } from \"../utils/resolveId\";\nimport { getLocales } from \"../utils/getLocales\";\n\nexport function buildAfterDeleteHook<TVariantData extends object>(\n parentCollectionSlug: string,\n abConfig: CollectionABConfig<TVariantData>,\n pluginConfig: AbTestingPluginConfig<TVariantData>,\n): CollectionAfterDeleteHook {\n return async ({ doc, req, id }) => {\n const { payload } = req;\n if (!payload) return;\n\n const pageId = resolveId(doc.page);\n if (!pageId) return;\n\n const locales = getLocales(payload);\n\n for (const locale of locales) {\n const pageDoc = await payload.findByID({\n collection: parentCollectionSlug as CollectionSlug,\n id: pageId,\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n req,\n });\n if (!pageDoc) continue;\n\n const manifestKey = abConfig.generatePath({ doc: pageDoc, locale });\n if (!manifestKey) continue;\n\n const remainingVariants = await payload.find({\n collection: abConfig.variantCollectionSlug as CollectionSlug,\n where: {\n and: [{ page: { equals: pageId } }, { id: { not_equals: id } }],\n },\n depth: 2,\n locale: locale as TypedLocale,\n overrideAccess: true,\n limit: 100,\n req,\n });\n\n if (remainingVariants.docs.length === 0) {\n await pluginConfig.storage.clear(manifestKey, payload);\n } else {\n const variantData = remainingVariants.docs.map((variantDoc) =>\n abConfig.generateVariantData({ doc: pageDoc, variantDoc, locale }),\n );\n\n await pluginConfig.storage.write(manifestKey, variantData, payload);\n }\n }\n };\n}\n","import type { CollectionConfig, Config } from \"payload\";\r\nimport type { AbTestingPluginConfig } from \"../types/config\";\r\nimport { buildAfterChangeHook } from \"../hooks/buildAfterChangeHook\";\r\nimport { buildAfterDeleteHook } from \"../hooks/buildAfterDeleteHook\";\r\n\r\nexport function addHooksToVariantCollections<TVariantData extends object>(\r\n config: Config,\r\n pluginConfig: AbTestingPluginConfig<TVariantData>,\r\n variantToParent: Map<string, string>,\r\n) {\r\n const patchedCollections = (config.collections ?? []).map((collection) => {\r\n const parentSlug = variantToParent.get(collection.slug);\r\n if (!parentSlug) return collection;\r\n\r\n const abConfig = pluginConfig.collections[parentSlug];\r\n if (!abConfig) return collection;\r\n\r\n return {\r\n ...collection,\r\n hooks: {\r\n ...collection.hooks,\r\n afterChange: [\r\n ...(collection.hooks?.afterChange ?? []),\r\n buildAfterChangeHook(parentSlug, abConfig, pluginConfig),\r\n ],\r\n afterDelete: [\r\n ...(collection.hooks?.afterDelete ?? []),\r\n buildAfterDeleteHook(parentSlug, abConfig, pluginConfig),\r\n ],\r\n },\r\n } as CollectionConfig;\r\n });\r\n\r\n return patchedCollections;\r\n}\r\n","import type { Config, Plugin } from \"payload\";\r\nimport type { AbTestingPluginConfig } from \"./types/config\";\r\nimport { buildVariantToParentCollectionSlugsMap } from \"./utils/buildVariantToParentCollectionSlugsMap\";\r\nimport { addHooksToVariantCollections } from \"./utils/addHooksToVariantCollections\";\r\n\r\nexport const abTestingPlugin =\r\n <TVariantData extends object>(pluginConfig: AbTestingPluginConfig<TVariantData>): Plugin =>\r\n (incomingConfig: Config): Config => {\r\n const { enabled = true, debug = false, collections, storage } = pluginConfig;\r\n\r\n if (!enabled) return incomingConfig;\r\n\r\n const extraGlobals = storage.createGlobal ? [storage.createGlobal(debug)] : [];\r\n\r\n const variantToParent = buildVariantToParentCollectionSlugsMap<TVariantData>(collections);\r\n\r\n const patchedCollections = addHooksToVariantCollections<TVariantData>(\r\n incomingConfig,\r\n pluginConfig,\r\n variantToParent,\r\n );\r\n\r\n return {\r\n ...incomingConfig,\r\n collections: patchedCollections,\r\n globals: [...(incomingConfig.globals ?? []), ...extraGlobals],\r\n };\r\n };\r\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,67 +1,79 @@
1
- {
2
- "name": "@kiryl.pekarski/payload-plugin-ab",
3
- "version": "1.0.0",
4
- "description": "A/B testing plugin for Payload CMS",
5
- "keywords": [
6
- "payload-cms",
7
- "payload-plugin",
8
- "ab-testing",
9
- "split-testing",
10
- "a-b-testing",
11
- "page-variants",
12
- "next.js",
13
- "vercel-edge",
14
- "edge-config",
15
- "middleware",
16
- "typescript",
17
- "cms",
18
- "conversion-optimization"
19
- ],
20
- "license": "MIT",
21
- "repository": {
22
- "type": "git",
23
- "url": "https://github.com/focusreactive/payload-plugin-ab"
24
- },
25
- "author": "Kiryl Pekarski <kiryl.pekarski@fr.team>",
26
- "type": "module",
27
- "main": "./dist/index.js",
28
- "types": "./dist/index.d.ts",
29
- "files": ["dist"],
30
- "exports": {
31
- ".": {
32
- "import": "./dist/index.js",
33
- "types": "./dist/index.d.ts"
34
- },
35
- "./adapters/payload-global": {
36
- "import": "./dist/adapters/payloadGlobal/index.js",
37
- "types": "./dist/adapters/payloadGlobal/index.d.ts"
38
- },
39
- "./adapters/vercel-edge": {
40
- "import": "./dist/adapters/vercelEdge/index.js",
41
- "types": "./dist/adapters/vercelEdge/index.d.ts"
42
- }
43
- },
44
- "scripts": {
45
- "build": "tsup",
46
- "lint": "eslint src/",
47
- "lint:fix": "eslint src/ --fix",
48
- "format": "prettier --write src/",
49
- "format:check": "prettier --check src/"
50
- },
51
- "peerDependencies": {
52
- "payload": "^3.0.0"
53
- },
54
- "optionalDependencies": {
55
- "@vercel/edge-config": "^1.0.0"
56
- },
57
- "devDependencies": {
58
- "@types/node": "^20.0.0",
59
- "eslint": "^9.0.0",
60
- "eslint-config-prettier": "^9.0.0",
61
- "payload": "^3.73.0",
62
- "prettier": "^3.0.0",
63
- "tsup": "^8.0.0",
64
- "typescript": "^5.0.0",
65
- "typescript-eslint": "^8.0.0"
66
- }
67
- }
1
+ {
2
+ "name": "@kiryl.pekarski/payload-plugin-ab",
3
+ "version": "1.0.2",
4
+ "description": "A/B testing plugin for Payload CMS",
5
+ "keywords": [
6
+ "payload-cms",
7
+ "payload-plugin",
8
+ "ab-testing",
9
+ "split-testing",
10
+ "a-b-testing",
11
+ "page-variants",
12
+ "next.js",
13
+ "vercel-edge",
14
+ "edge-config",
15
+ "middleware",
16
+ "typescript",
17
+ "cms",
18
+ "conversion-optimization"
19
+ ],
20
+ "license": "MIT",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/focusreactive/payload-plugin-ab"
24
+ },
25
+ "author": "Kiryl Pekarski <kiryl.pekarski@fr.team>",
26
+ "type": "module",
27
+ "main": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "files": [
30
+ "dist"
31
+ ],
32
+ "typesVersions": {
33
+ "*": {
34
+ "adapters/payload-global": [
35
+ "./dist/adapters/payloadGlobal/index.d.ts"
36
+ ],
37
+ "adapters/vercel-edge": [
38
+ "./dist/adapters/vercelEdge/index.d.ts"
39
+ ]
40
+ }
41
+ },
42
+ "exports": {
43
+ ".": {
44
+ "import": "./dist/index.js",
45
+ "types": "./dist/index.d.ts"
46
+ },
47
+ "./adapters/payload-global": {
48
+ "import": "./dist/adapters/payloadGlobal/index.js",
49
+ "types": "./dist/adapters/payloadGlobal/index.d.ts"
50
+ },
51
+ "./adapters/vercel-edge": {
52
+ "import": "./dist/adapters/vercelEdge/index.js",
53
+ "types": "./dist/adapters/vercelEdge/index.d.ts"
54
+ }
55
+ },
56
+ "scripts": {
57
+ "build": "tsup",
58
+ "lint": "eslint src/",
59
+ "lint:fix": "eslint src/ --fix",
60
+ "format": "prettier --write src/",
61
+ "format:check": "prettier --check src/"
62
+ },
63
+ "peerDependencies": {
64
+ "payload": "^3.0.0"
65
+ },
66
+ "optionalDependencies": {
67
+ "@vercel/edge-config": "^1.0.0"
68
+ },
69
+ "devDependencies": {
70
+ "@types/node": "^20.0.0",
71
+ "eslint": "^9.0.0",
72
+ "eslint-config-prettier": "^9.0.0",
73
+ "payload": "^3.73.0",
74
+ "prettier": "^3.0.0",
75
+ "tsup": "^8.0.0",
76
+ "typescript": "^5.0.0",
77
+ "typescript-eslint": "^8.0.0"
78
+ }
79
+ }