@innovateium/payload-dpo 0.0.1-beta

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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/dist/collections/DpoTransactions.d.ts +3 -0
  4. package/dist/collections/DpoTransactions.js +121 -0
  5. package/dist/collections/DpoTransactions.js.map +1 -0
  6. package/dist/collections/index.d.ts +3 -0
  7. package/dist/collections/index.js +9 -0
  8. package/dist/collections/index.js.map +1 -0
  9. package/dist/endpoints/index.d.ts +3 -0
  10. package/dist/endpoints/index.js +12 -0
  11. package/dist/endpoints/index.js.map +1 -0
  12. package/dist/endpoints/initiate.d.ts +3 -0
  13. package/dist/endpoints/initiate.js +131 -0
  14. package/dist/endpoints/initiate.js.map +1 -0
  15. package/dist/endpoints/notify.d.ts +3 -0
  16. package/dist/endpoints/notify.js +63 -0
  17. package/dist/endpoints/notify.js.map +1 -0
  18. package/dist/endpoints/return.d.ts +3 -0
  19. package/dist/endpoints/return.js +59 -0
  20. package/dist/endpoints/return.js.map +1 -0
  21. package/dist/endpoints/status.d.ts +3 -0
  22. package/dist/endpoints/status.js +74 -0
  23. package/dist/endpoints/status.js.map +1 -0
  24. package/dist/exports/client.d.ts +1 -0
  25. package/dist/exports/client.js +3 -0
  26. package/dist/exports/client.js.map +1 -0
  27. package/dist/exports/rsc.d.ts +1 -0
  28. package/dist/exports/rsc.js +3 -0
  29. package/dist/exports/rsc.js.map +1 -0
  30. package/dist/hooks/afterPayment.d.ts +3 -0
  31. package/dist/hooks/afterPayment.js +18 -0
  32. package/dist/hooks/afterPayment.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.js +26 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/lib/checksum.d.ts +1 -0
  37. package/dist/lib/checksum.js +8 -0
  38. package/dist/lib/checksum.js.map +1 -0
  39. package/dist/lib/constants.d.ts +21 -0
  40. package/dist/lib/constants.js +89 -0
  41. package/dist/lib/constants.js.map +1 -0
  42. package/dist/lib/paygate.d.ts +3 -0
  43. package/dist/lib/paygate.js +43 -0
  44. package/dist/lib/paygate.js.map +1 -0
  45. package/dist/types.d.ts +26 -0
  46. package/dist/types.js +3 -0
  47. package/dist/types.js.map +1 -0
  48. package/package.json +138 -0
@@ -0,0 +1,59 @@
1
+ import { DEFAULT_ROUTES } from '../lib/constants.js';
2
+ export const createReturnEndpoint = (pluginOptions)=>{
3
+ const returnPath = pluginOptions.routes?.return ?? DEFAULT_ROUTES.return;
4
+ return [
5
+ {
6
+ handler: (req)=>{
7
+ const url = new URL(req.url || '', 'http://localhost');
8
+ const payRequestId = url.searchParams.get('PAY_REQUEST_ID') || url.searchParams.get('payRequestId') || '';
9
+ const baseUrl = pluginOptions.baseUrl || process.env.BASE_URL || req.payload?.config?.serverURL || '';
10
+ if (!payRequestId) {
11
+ return new Response('Missing PAY_REQUEST_ID', {
12
+ status: 400
13
+ });
14
+ }
15
+ return new Response(null, {
16
+ headers: {
17
+ Location: `${baseUrl}/payment-result?PAY_REQUEST_ID=${payRequestId}`
18
+ },
19
+ status: 302
20
+ });
21
+ },
22
+ method: 'get',
23
+ path: returnPath
24
+ },
25
+ {
26
+ handler: async (req)=>{
27
+ let payRequestId = '';
28
+ try {
29
+ const text = await req.text?.() ?? '';
30
+ for (const pair of text.split('&')){
31
+ const [key, value] = pair.split('=').map(decodeURIComponent);
32
+ if (key === 'PAY_REQUEST_ID') {
33
+ payRequestId = value;
34
+ }
35
+ }
36
+ } catch {
37
+ // ignore
38
+ }
39
+ payRequestId = payRequestId || new URL(req.url || '', 'http://localhost').searchParams.get('PAY_REQUEST_ID') || '';
40
+ const baseUrl = pluginOptions.baseUrl || process.env.BASE_URL || req.payload?.config?.serverURL || '';
41
+ if (!payRequestId) {
42
+ return new Response('Missing PAY_REQUEST_ID', {
43
+ status: 400
44
+ });
45
+ }
46
+ return new Response(null, {
47
+ headers: {
48
+ Location: `${baseUrl}/payment-result?PAY_REQUEST_ID=${payRequestId}`
49
+ },
50
+ status: 302
51
+ });
52
+ },
53
+ method: 'post',
54
+ path: returnPath
55
+ }
56
+ ];
57
+ };
58
+
59
+ //# sourceMappingURL=return.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoints/return.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport type { DpoPluginConfig } from '../types.js'\n\nimport { DEFAULT_ROUTES } from '../lib/constants.js'\n\nexport const createReturnEndpoint = (pluginOptions: DpoPluginConfig): Endpoint[] => {\n const returnPath = pluginOptions.routes?.return ?? DEFAULT_ROUTES.return\n\n return [\n {\n handler: (req: PayloadRequest) => {\n const url = new URL(req.url || '', 'http://localhost')\n const payRequestId =\n url.searchParams.get('PAY_REQUEST_ID') || url.searchParams.get('payRequestId') || ''\n const baseUrl =\n pluginOptions.baseUrl || process.env.BASE_URL || req.payload?.config?.serverURL || ''\n\n if (!payRequestId) {\n return new Response('Missing PAY_REQUEST_ID', { status: 400 })\n }\n\n return new Response(null, {\n headers: { Location: `${baseUrl}/payment-result?PAY_REQUEST_ID=${payRequestId}` },\n status: 302,\n })\n },\n method: 'get' as const,\n path: returnPath,\n },\n {\n handler: async (req: PayloadRequest) => {\n let payRequestId = ''\n try {\n const text = (await req.text?.()) ?? ''\n for (const pair of text.split('&')) {\n const [key, value] = pair.split('=').map(decodeURIComponent)\n if (key === 'PAY_REQUEST_ID') {\n payRequestId = value\n }\n }\n } catch {\n // ignore\n }\n\n payRequestId =\n payRequestId ||\n new URL(req.url || '', 'http://localhost').searchParams.get('PAY_REQUEST_ID') ||\n ''\n\n const baseUrl =\n pluginOptions.baseUrl || process.env.BASE_URL || req.payload?.config?.serverURL || ''\n\n if (!payRequestId) {\n return new Response('Missing PAY_REQUEST_ID', { status: 400 })\n }\n\n return new Response(null, {\n headers: { Location: `${baseUrl}/payment-result?PAY_REQUEST_ID=${payRequestId}` },\n status: 302,\n })\n },\n method: 'post' as const,\n path: returnPath,\n },\n ]\n}\n"],"names":["DEFAULT_ROUTES","createReturnEndpoint","pluginOptions","returnPath","routes","return","handler","req","url","URL","payRequestId","searchParams","get","baseUrl","process","env","BASE_URL","payload","config","serverURL","Response","status","headers","Location","method","path","text","pair","split","key","value","map","decodeURIComponent"],"mappings":"AAIA,SAASA,cAAc,QAAQ,sBAAqB;AAEpD,OAAO,MAAMC,uBAAuB,CAACC;IACnC,MAAMC,aAAaD,cAAcE,MAAM,EAAEC,UAAUL,eAAeK,MAAM;IAExE,OAAO;QACL;YACEC,SAAS,CAACC;gBACR,MAAMC,MAAM,IAAIC,IAAIF,IAAIC,GAAG,IAAI,IAAI;gBACnC,MAAME,eACJF,IAAIG,YAAY,CAACC,GAAG,CAAC,qBAAqBJ,IAAIG,YAAY,CAACC,GAAG,CAAC,mBAAmB;gBACpF,MAAMC,UACJX,cAAcW,OAAO,IAAIC,QAAQC,GAAG,CAACC,QAAQ,IAAIT,IAAIU,OAAO,EAAEC,QAAQC,aAAa;gBAErF,IAAI,CAACT,cAAc;oBACjB,OAAO,IAAIU,SAAS,0BAA0B;wBAAEC,QAAQ;oBAAI;gBAC9D;gBAEA,OAAO,IAAID,SAAS,MAAM;oBACxBE,SAAS;wBAAEC,UAAU,GAAGV,QAAQ,+BAA+B,EAAEH,cAAc;oBAAC;oBAChFW,QAAQ;gBACV;YACF;YACAG,QAAQ;YACRC,MAAMtB;QACR;QACA;YACEG,SAAS,OAAOC;gBACd,IAAIG,eAAe;gBACnB,IAAI;oBACF,MAAMgB,OAAO,AAAC,MAAMnB,IAAImB,IAAI,QAAS;oBACrC,KAAK,MAAMC,QAAQD,KAAKE,KAAK,CAAC,KAAM;wBAClC,MAAM,CAACC,KAAKC,MAAM,GAAGH,KAAKC,KAAK,CAAC,KAAKG,GAAG,CAACC;wBACzC,IAAIH,QAAQ,kBAAkB;4BAC5BnB,eAAeoB;wBACjB;oBACF;gBACF,EAAE,OAAM;gBACN,SAAS;gBACX;gBAEApB,eACEA,gBACA,IAAID,IAAIF,IAAIC,GAAG,IAAI,IAAI,oBAAoBG,YAAY,CAACC,GAAG,CAAC,qBAC5D;gBAEF,MAAMC,UACJX,cAAcW,OAAO,IAAIC,QAAQC,GAAG,CAACC,QAAQ,IAAIT,IAAIU,OAAO,EAAEC,QAAQC,aAAa;gBAErF,IAAI,CAACT,cAAc;oBACjB,OAAO,IAAIU,SAAS,0BAA0B;wBAAEC,QAAQ;oBAAI;gBAC9D;gBAEA,OAAO,IAAID,SAAS,MAAM;oBACxBE,SAAS;wBAAEC,UAAU,GAAGV,QAAQ,+BAA+B,EAAEH,cAAc;oBAAC;oBAChFW,QAAQ;gBACV;YACF;YACAG,QAAQ;YACRC,MAAMtB;QACR;KACD;AACH,EAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Endpoint } from 'payload';
2
+ import type { DpoPluginConfig } from '../types.js';
3
+ export declare const createStatusEndpoint: (pluginOptions: DpoPluginConfig) => Endpoint;
@@ -0,0 +1,74 @@
1
+ import { generateSignature } from '../lib/checksum.js';
2
+ import { DEFAULT_PAYGATE_URL, DEFAULT_ROUTES, STATUS_MAP } from '../lib/constants.js';
3
+ import { queryTransaction } from '../lib/paygate.js';
4
+ export const createStatusEndpoint = (pluginOptions)=>{
5
+ const statusPath = pluginOptions.routes?.status ?? DEFAULT_ROUTES.status;
6
+ const collectionSlug = pluginOptions.transactionCollectionSlug ?? 'dpo-transactions';
7
+ return {
8
+ handler: async (req)=>{
9
+ try {
10
+ const url = new URL(req.url || '', 'http://localhost');
11
+ const id = url.searchParams.get('id');
12
+ if (!id) {
13
+ return Response.json({
14
+ error: 'Missing PAY_REQUEST_ID',
15
+ success: false
16
+ }, {
17
+ status: 400
18
+ });
19
+ }
20
+ const paygateId = pluginOptions.paygateId || process.env.PAYGATE_ID || '';
21
+ const paygateKey = pluginOptions.paygateKey || process.env.PAYGATE_KEY || '';
22
+ const paygateUrl = pluginOptions.paygateUrl || process.env.PAYGATE_URL || DEFAULT_PAYGATE_URL;
23
+ let reference = '';
24
+ if (req.payload) {
25
+ const existing = await req.payload.find({
26
+ collection: collectionSlug,
27
+ limit: 1,
28
+ where: {
29
+ payRequestId: {
30
+ equals: id
31
+ }
32
+ }
33
+ });
34
+ if (existing.docs.length > 0) {
35
+ reference = existing.docs[0].reference;
36
+ }
37
+ }
38
+ const queryData = {
39
+ PAY_REQUEST_ID: id,
40
+ PAYGATE_ID: paygateId,
41
+ REFERENCE: reference
42
+ };
43
+ const checksum = generateSignature(queryData, paygateKey);
44
+ queryData.CHECKSUM = checksum;
45
+ const queryResult = await queryTransaction(paygateUrl, queryData);
46
+ const transactionStatus = queryResult.TRANSACTION_STATUS || '0';
47
+ const statusLabel = STATUS_MAP[transactionStatus] || 'Unknown';
48
+ const isSuccessful = transactionStatus === '1';
49
+ return Response.json({
50
+ isSuccessful,
51
+ payRequestId: queryResult.PAY_REQUEST_ID,
52
+ raw: queryResult,
53
+ reference: queryResult.REFERENCE,
54
+ statusMessage: statusLabel,
55
+ success: true,
56
+ transactionStatus
57
+ });
58
+ } catch (error) {
59
+ const message = error instanceof Error ? error.message : 'Unknown error';
60
+ return Response.json({
61
+ error: 'Status check failed',
62
+ message,
63
+ success: false
64
+ }, {
65
+ status: 500
66
+ });
67
+ }
68
+ },
69
+ method: 'get',
70
+ path: statusPath
71
+ };
72
+ };
73
+
74
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoints/status.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport type { DpoPluginConfig } from '../types.js'\n\nimport { generateSignature } from '../lib/checksum.js'\nimport { DEFAULT_PAYGATE_URL, DEFAULT_ROUTES, STATUS_MAP } from '../lib/constants.js'\nimport { queryTransaction } from '../lib/paygate.js'\n\nexport const createStatusEndpoint = (pluginOptions: DpoPluginConfig): Endpoint => {\n const statusPath = pluginOptions.routes?.status ?? DEFAULT_ROUTES.status\n const collectionSlug = pluginOptions.transactionCollectionSlug ?? 'dpo-transactions'\n\n return {\n handler: async (req: PayloadRequest) => {\n try {\n const url = new URL(req.url || '', 'http://localhost')\n const id = url.searchParams.get('id')\n\n if (!id) {\n return Response.json({ error: 'Missing PAY_REQUEST_ID', success: false }, { status: 400 })\n }\n\n const paygateId = pluginOptions.paygateId || process.env.PAYGATE_ID || ''\n const paygateKey = pluginOptions.paygateKey || process.env.PAYGATE_KEY || ''\n const paygateUrl =\n pluginOptions.paygateUrl || process.env.PAYGATE_URL || DEFAULT_PAYGATE_URL\n\n let reference = ''\n\n if (req.payload) {\n const existing = await req.payload.find({\n collection: collectionSlug,\n limit: 1,\n where: { payRequestId: { equals: id } },\n })\n\n if (existing.docs.length > 0) {\n reference = existing.docs[0].reference as string\n }\n }\n\n const queryData: Record<string, string> = {\n PAY_REQUEST_ID: id,\n PAYGATE_ID: paygateId,\n REFERENCE: reference,\n }\n\n const checksum = generateSignature(queryData, paygateKey)\n queryData.CHECKSUM = checksum\n\n const queryResult = await queryTransaction(paygateUrl, queryData)\n\n const transactionStatus = queryResult.TRANSACTION_STATUS || '0'\n const statusLabel = STATUS_MAP[transactionStatus] || 'Unknown'\n const isSuccessful = transactionStatus === '1'\n\n return Response.json({\n isSuccessful,\n payRequestId: queryResult.PAY_REQUEST_ID,\n raw: queryResult,\n reference: queryResult.REFERENCE,\n statusMessage: statusLabel,\n success: true,\n transactionStatus,\n })\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n return Response.json(\n {\n error: 'Status check failed',\n message,\n success: false,\n },\n { status: 500 },\n )\n }\n },\n method: 'get',\n path: statusPath,\n }\n}\n"],"names":["generateSignature","DEFAULT_PAYGATE_URL","DEFAULT_ROUTES","STATUS_MAP","queryTransaction","createStatusEndpoint","pluginOptions","statusPath","routes","status","collectionSlug","transactionCollectionSlug","handler","req","url","URL","id","searchParams","get","Response","json","error","success","paygateId","process","env","PAYGATE_ID","paygateKey","PAYGATE_KEY","paygateUrl","PAYGATE_URL","reference","payload","existing","find","collection","limit","where","payRequestId","equals","docs","length","queryData","PAY_REQUEST_ID","REFERENCE","checksum","CHECKSUM","queryResult","transactionStatus","TRANSACTION_STATUS","statusLabel","isSuccessful","raw","statusMessage","message","Error","method","path"],"mappings":"AAIA,SAASA,iBAAiB,QAAQ,qBAAoB;AACtD,SAASC,mBAAmB,EAAEC,cAAc,EAAEC,UAAU,QAAQ,sBAAqB;AACrF,SAASC,gBAAgB,QAAQ,oBAAmB;AAEpD,OAAO,MAAMC,uBAAuB,CAACC;IACnC,MAAMC,aAAaD,cAAcE,MAAM,EAAEC,UAAUP,eAAeO,MAAM;IACxE,MAAMC,iBAAiBJ,cAAcK,yBAAyB,IAAI;IAElE,OAAO;QACLC,SAAS,OAAOC;YACd,IAAI;gBACF,MAAMC,MAAM,IAAIC,IAAIF,IAAIC,GAAG,IAAI,IAAI;gBACnC,MAAME,KAAKF,IAAIG,YAAY,CAACC,GAAG,CAAC;gBAEhC,IAAI,CAACF,IAAI;oBACP,OAAOG,SAASC,IAAI,CAAC;wBAAEC,OAAO;wBAA0BC,SAAS;oBAAM,GAAG;wBAAEb,QAAQ;oBAAI;gBAC1F;gBAEA,MAAMc,YAAYjB,cAAciB,SAAS,IAAIC,QAAQC,GAAG,CAACC,UAAU,IAAI;gBACvE,MAAMC,aAAarB,cAAcqB,UAAU,IAAIH,QAAQC,GAAG,CAACG,WAAW,IAAI;gBAC1E,MAAMC,aACJvB,cAAcuB,UAAU,IAAIL,QAAQC,GAAG,CAACK,WAAW,IAAI7B;gBAEzD,IAAI8B,YAAY;gBAEhB,IAAIlB,IAAImB,OAAO,EAAE;oBACf,MAAMC,WAAW,MAAMpB,IAAImB,OAAO,CAACE,IAAI,CAAC;wBACtCC,YAAYzB;wBACZ0B,OAAO;wBACPC,OAAO;4BAAEC,cAAc;gCAAEC,QAAQvB;4BAAG;wBAAE;oBACxC;oBAEA,IAAIiB,SAASO,IAAI,CAACC,MAAM,GAAG,GAAG;wBAC5BV,YAAYE,SAASO,IAAI,CAAC,EAAE,CAACT,SAAS;oBACxC;gBACF;gBAEA,MAAMW,YAAoC;oBACxCC,gBAAgB3B;oBAChBU,YAAYH;oBACZqB,WAAWb;gBACb;gBAEA,MAAMc,WAAW7C,kBAAkB0C,WAAWf;gBAC9Ce,UAAUI,QAAQ,GAAGD;gBAErB,MAAME,cAAc,MAAM3C,iBAAiByB,YAAYa;gBAEvD,MAAMM,oBAAoBD,YAAYE,kBAAkB,IAAI;gBAC5D,MAAMC,cAAc/C,UAAU,CAAC6C,kBAAkB,IAAI;gBACrD,MAAMG,eAAeH,sBAAsB;gBAE3C,OAAO7B,SAASC,IAAI,CAAC;oBACnB+B;oBACAb,cAAcS,YAAYJ,cAAc;oBACxCS,KAAKL;oBACLhB,WAAWgB,YAAYH,SAAS;oBAChCS,eAAeH;oBACf5B,SAAS;oBACT0B;gBACF;YACF,EAAE,OAAO3B,OAAgB;gBACvB,MAAMiC,UAAUjC,iBAAiBkC,QAAQlC,MAAMiC,OAAO,GAAG;gBACzD,OAAOnC,SAASC,IAAI,CAClB;oBACEC,OAAO;oBACPiC;oBACAhC,SAAS;gBACX,GACA;oBAAEb,QAAQ;gBAAI;YAElB;QACF;QACA+C,QAAQ;QACRC,MAAMlD;IACR;AACF,EAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export {}\n"],"names":[],"mappings":"AAAA,WAAS"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=rsc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/rsc.ts"],"sourcesContent":["export {}\n"],"names":[],"mappings":"AAAA,WAAS"}
@@ -0,0 +1,3 @@
1
+ import type { CollectionAfterChangeHook } from 'payload';
2
+ import type { DpoPluginConfig } from '../types.js';
3
+ export declare const afterPaymentHook: (pluginOptions: DpoPluginConfig) => CollectionAfterChangeHook;
@@ -0,0 +1,18 @@
1
+ export const afterPaymentHook = (pluginOptions)=>{
2
+ return async (args)=>{
3
+ const { doc, operation, previousDoc } = args;
4
+ if (operation !== 'update') {
5
+ return;
6
+ }
7
+ const wasApproved = previousDoc.transactionStatus !== '1' && doc.transactionStatus === '1';
8
+ if (!wasApproved || !pluginOptions.onSuccess) {
9
+ return;
10
+ }
11
+ await pluginOptions.onSuccess({
12
+ payload: args.req.payload,
13
+ transaction: doc
14
+ });
15
+ };
16
+ };
17
+
18
+ //# sourceMappingURL=afterPayment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/afterPayment.ts"],"sourcesContent":["import type { CollectionAfterChangeHook } from 'payload'\n\nimport type { DpoPluginConfig } from '../types.js'\n\nexport const afterPaymentHook = (pluginOptions: DpoPluginConfig): CollectionAfterChangeHook => {\n return async (args) => {\n const { doc, operation, previousDoc } = args\n\n if (operation !== 'update') {\n return\n }\n\n const wasApproved = previousDoc.transactionStatus !== '1' && doc.transactionStatus === '1'\n\n if (!wasApproved || !pluginOptions.onSuccess) {\n return\n }\n\n await pluginOptions.onSuccess({\n payload: args.req.payload,\n transaction: doc,\n })\n }\n}\n"],"names":["afterPaymentHook","pluginOptions","args","doc","operation","previousDoc","wasApproved","transactionStatus","onSuccess","payload","req","transaction"],"mappings":"AAIA,OAAO,MAAMA,mBAAmB,CAACC;IAC/B,OAAO,OAAOC;QACZ,MAAM,EAAEC,GAAG,EAAEC,SAAS,EAAEC,WAAW,EAAE,GAAGH;QAExC,IAAIE,cAAc,UAAU;YAC1B;QACF;QAEA,MAAME,cAAcD,YAAYE,iBAAiB,KAAK,OAAOJ,IAAII,iBAAiB,KAAK;QAEvF,IAAI,CAACD,eAAe,CAACL,cAAcO,SAAS,EAAE;YAC5C;QACF;QAEA,MAAMP,cAAcO,SAAS,CAAC;YAC5BC,SAASP,KAAKQ,GAAG,CAACD,OAAO;YACzBE,aAAaR;QACf;IACF;AACF,EAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Config } from 'payload';
2
+ import type { DpoPluginConfig } from './types.js';
3
+ export declare const dpoPlugin: (pluginOptions: DpoPluginConfig) => (config: Config) => Config;
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ import { getCollections } from './collections/index.js';
2
+ import { getEndpoints } from './endpoints/index.js';
3
+ export const dpoPlugin = (pluginOptions)=>(config)=>{
4
+ const enabledCollections = getCollections(pluginOptions);
5
+ const enabledEndpoints = getEndpoints(pluginOptions);
6
+ config.collections = [
7
+ ...config.collections || [],
8
+ ...enabledCollections
9
+ ];
10
+ if (pluginOptions.disabled) {
11
+ return config;
12
+ }
13
+ config.endpoints = [
14
+ ...config.endpoints || [],
15
+ ...enabledEndpoints
16
+ ];
17
+ const incomingOnInit = config.onInit;
18
+ config.onInit = async (payload)=>{
19
+ if (incomingOnInit) {
20
+ await incomingOnInit(payload);
21
+ }
22
+ };
23
+ return config;
24
+ };
25
+
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport type { DpoPluginConfig } from './types.js'\n\nimport { getCollections } from './collections/index.js'\nimport { getEndpoints } from './endpoints/index.js'\n\nexport const dpoPlugin =\n (pluginOptions: DpoPluginConfig) =>\n (config: Config): Config => {\n const enabledCollections = getCollections(pluginOptions)\n const enabledEndpoints = getEndpoints(pluginOptions)\n\n config.collections = [...(config.collections || []), ...enabledCollections]\n\n if (pluginOptions.disabled) {\n return config\n }\n\n config.endpoints = [...(config.endpoints || []), ...enabledEndpoints]\n\n const incomingOnInit = config.onInit\n\n config.onInit = async (payload) => {\n if (incomingOnInit) {\n await incomingOnInit(payload)\n }\n }\n\n return config\n }\n"],"names":["getCollections","getEndpoints","dpoPlugin","pluginOptions","config","enabledCollections","enabledEndpoints","collections","disabled","endpoints","incomingOnInit","onInit","payload"],"mappings":"AAIA,SAASA,cAAc,QAAQ,yBAAwB;AACvD,SAASC,YAAY,QAAQ,uBAAsB;AAEnD,OAAO,MAAMC,YACX,CAACC,gBACD,CAACC;QACC,MAAMC,qBAAqBL,eAAeG;QAC1C,MAAMG,mBAAmBL,aAAaE;QAEtCC,OAAOG,WAAW,GAAG;eAAKH,OAAOG,WAAW,IAAI,EAAE;eAAMF;SAAmB;QAE3E,IAAIF,cAAcK,QAAQ,EAAE;YAC1B,OAAOJ;QACT;QAEAA,OAAOK,SAAS,GAAG;eAAKL,OAAOK,SAAS,IAAI,EAAE;eAAMH;SAAiB;QAErE,MAAMI,iBAAiBN,OAAOO,MAAM;QAEpCP,OAAOO,MAAM,GAAG,OAAOC;YACrB,IAAIF,gBAAgB;gBAClB,MAAMA,eAAeE;YACvB;QACF;QAEA,OAAOR;IACT,EAAC"}
@@ -0,0 +1 @@
1
+ export declare function generateSignature(params: Record<string, string | undefined>, paygateKey: string): string;
@@ -0,0 +1,8 @@
1
+ import crypto from 'crypto';
2
+ import { SIGNATURE_FIELDS } from './constants.js';
3
+ export function generateSignature(params, paygateKey) {
4
+ const hashString = SIGNATURE_FIELDS.map((field)=>String(params[field] || '')).join('') + paygateKey;
5
+ return crypto.createHash('md5').update(hashString).digest('hex').toLowerCase();
6
+ }
7
+
8
+ //# sourceMappingURL=checksum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/checksum.ts"],"sourcesContent":["import crypto from 'crypto'\n\nimport { SIGNATURE_FIELDS } from './constants.js'\n\nexport function generateSignature(\n params: Record<string, string | undefined>,\n paygateKey: string,\n): string {\n const hashString =\n SIGNATURE_FIELDS.map((field) => String(params[field] || '')).join('') + paygateKey\n\n return crypto.createHash('md5').update(hashString).digest('hex').toLowerCase()\n}\n"],"names":["crypto","SIGNATURE_FIELDS","generateSignature","params","paygateKey","hashString","map","field","String","join","createHash","update","digest","toLowerCase"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAE3B,SAASC,gBAAgB,QAAQ,iBAAgB;AAEjD,OAAO,SAASC,kBACdC,MAA0C,EAC1CC,UAAkB;IAElB,MAAMC,aACJJ,iBAAiBK,GAAG,CAAC,CAACC,QAAUC,OAAOL,MAAM,CAACI,MAAM,IAAI,KAAKE,IAAI,CAAC,MAAML;IAE1E,OAAOJ,OAAOU,UAAU,CAAC,OAAOC,MAAM,CAACN,YAAYO,MAAM,CAAC,OAAOC,WAAW;AAC9E"}
@@ -0,0 +1,21 @@
1
+ export declare const DEFAULT_PAYGATE_URL = "https://secure.paygate.co.za";
2
+ export declare const DEFAULT_ROUTES: {
3
+ readonly initiate: "/dpo/initiate";
4
+ readonly notify: "/dpo/notify";
5
+ readonly return: "/dpo/return";
6
+ readonly status: "/dpo/status";
7
+ };
8
+ export declare const SIGNATURE_FIELDS: readonly ["PAYGATE_ID", "PAY_REQUEST_ID", "REFERENCE", "AMOUNT", "CURRENCY", "RETURN_URL", "TRANSACTION_DATE", "LOCALE", "COUNTRY", "EMAIL", "NOTIFY_URL"];
9
+ export declare const STATUS_MAP: Record<string, string>;
10
+ export declare const TRANSACTION_STATUS_OPTIONS: {
11
+ label: string;
12
+ value: string;
13
+ }[];
14
+ export declare const CURRENCY_LOCALE_MAP: Record<string, {
15
+ country: string;
16
+ locale: string;
17
+ }>;
18
+ export declare const CURRENCY_OPTIONS: {
19
+ label: string;
20
+ value: string;
21
+ }[];
@@ -0,0 +1,89 @@
1
+ export const DEFAULT_PAYGATE_URL = 'https://secure.paygate.co.za';
2
+ export const DEFAULT_ROUTES = {
3
+ initiate: '/dpo/initiate',
4
+ notify: '/dpo/notify',
5
+ return: '/dpo/return',
6
+ status: '/dpo/status'
7
+ };
8
+ export const SIGNATURE_FIELDS = [
9
+ 'PAYGATE_ID',
10
+ 'PAY_REQUEST_ID',
11
+ 'REFERENCE',
12
+ 'AMOUNT',
13
+ 'CURRENCY',
14
+ 'RETURN_URL',
15
+ 'TRANSACTION_DATE',
16
+ 'LOCALE',
17
+ 'COUNTRY',
18
+ 'EMAIL',
19
+ 'NOTIFY_URL'
20
+ ];
21
+ export const STATUS_MAP = {
22
+ '0': 'Not Done',
23
+ '1': 'Approved',
24
+ '2': 'Declined',
25
+ '3': 'Cancelled',
26
+ '4': 'User Cancelled',
27
+ '5': 'Received by PayGate',
28
+ '7': 'Settlement Voided'
29
+ };
30
+ export const TRANSACTION_STATUS_OPTIONS = [
31
+ {
32
+ label: 'Not Done',
33
+ value: '0'
34
+ },
35
+ {
36
+ label: 'Approved',
37
+ value: '1'
38
+ },
39
+ {
40
+ label: 'Declined',
41
+ value: '2'
42
+ },
43
+ {
44
+ label: 'Cancelled',
45
+ value: '3'
46
+ },
47
+ {
48
+ label: 'User Cancelled',
49
+ value: '4'
50
+ },
51
+ {
52
+ label: 'Received by PayGate',
53
+ value: '5'
54
+ },
55
+ {
56
+ label: 'Settlement Voided',
57
+ value: '7'
58
+ }
59
+ ];
60
+ export const CURRENCY_LOCALE_MAP = {
61
+ ZAR: {
62
+ country: 'ZAF',
63
+ locale: 'en-za'
64
+ },
65
+ BWP: {
66
+ country: 'BWA',
67
+ locale: 'en-bw'
68
+ },
69
+ USD: {
70
+ country: 'USA',
71
+ locale: 'en-us'
72
+ }
73
+ };
74
+ export const CURRENCY_OPTIONS = [
75
+ {
76
+ label: 'ZAR',
77
+ value: 'ZAR'
78
+ },
79
+ {
80
+ label: 'BWP',
81
+ value: 'BWP'
82
+ },
83
+ {
84
+ label: 'USD',
85
+ value: 'USD'
86
+ }
87
+ ];
88
+
89
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/constants.ts"],"sourcesContent":["export const DEFAULT_PAYGATE_URL = 'https://secure.paygate.co.za'\n\nexport const DEFAULT_ROUTES = {\n initiate: '/dpo/initiate',\n notify: '/dpo/notify',\n return: '/dpo/return',\n status: '/dpo/status',\n} as const\n\nexport const SIGNATURE_FIELDS = [\n 'PAYGATE_ID',\n 'PAY_REQUEST_ID',\n 'REFERENCE',\n 'AMOUNT',\n 'CURRENCY',\n 'RETURN_URL',\n 'TRANSACTION_DATE',\n 'LOCALE',\n 'COUNTRY',\n 'EMAIL',\n 'NOTIFY_URL',\n] as const\n\nexport const STATUS_MAP: Record<string, string> = {\n '0': 'Not Done',\n '1': 'Approved',\n '2': 'Declined',\n '3': 'Cancelled',\n '4': 'User Cancelled',\n '5': 'Received by PayGate',\n '7': 'Settlement Voided',\n}\n\nexport const TRANSACTION_STATUS_OPTIONS = [\n { label: 'Not Done', value: '0' },\n { label: 'Approved', value: '1' },\n { label: 'Declined', value: '2' },\n { label: 'Cancelled', value: '3' },\n { label: 'User Cancelled', value: '4' },\n { label: 'Received by PayGate', value: '5' },\n { label: 'Settlement Voided', value: '7' },\n]\n\nexport const CURRENCY_LOCALE_MAP: Record<string, { country: string; locale: string }> = {\n ZAR: { country: 'ZAF', locale: 'en-za' },\n BWP: { country: 'BWA', locale: 'en-bw' },\n USD: { country: 'USA', locale: 'en-us' },\n}\n\nexport const CURRENCY_OPTIONS = [\n { label: 'ZAR', value: 'ZAR' },\n { label: 'BWP', value: 'BWP' },\n { label: 'USD', value: 'USD' },\n]\n"],"names":["DEFAULT_PAYGATE_URL","DEFAULT_ROUTES","initiate","notify","return","status","SIGNATURE_FIELDS","STATUS_MAP","TRANSACTION_STATUS_OPTIONS","label","value","CURRENCY_LOCALE_MAP","ZAR","country","locale","BWP","USD","CURRENCY_OPTIONS"],"mappings":"AAAA,OAAO,MAAMA,sBAAsB,+BAA8B;AAEjE,OAAO,MAAMC,iBAAiB;IAC5BC,UAAU;IACVC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;AACV,EAAU;AAEV,OAAO,MAAMC,mBAAmB;IAC9B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAS;AAEV,OAAO,MAAMC,aAAqC;IAChD,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACP,EAAC;AAED,OAAO,MAAMC,6BAA6B;IACxC;QAAEC,OAAO;QAAYC,OAAO;IAAI;IAChC;QAAED,OAAO;QAAYC,OAAO;IAAI;IAChC;QAAED,OAAO;QAAYC,OAAO;IAAI;IAChC;QAAED,OAAO;QAAaC,OAAO;IAAI;IACjC;QAAED,OAAO;QAAkBC,OAAO;IAAI;IACtC;QAAED,OAAO;QAAuBC,OAAO;IAAI;IAC3C;QAAED,OAAO;QAAqBC,OAAO;IAAI;CAC1C,CAAA;AAED,OAAO,MAAMC,sBAA2E;IACtFC,KAAK;QAAEC,SAAS;QAAOC,QAAQ;IAAQ;IACvCC,KAAK;QAAEF,SAAS;QAAOC,QAAQ;IAAQ;IACvCE,KAAK;QAAEH,SAAS;QAAOC,QAAQ;IAAQ;AACzC,EAAC;AAED,OAAO,MAAMG,mBAAmB;IAC9B;QAAER,OAAO;QAAOC,OAAO;IAAM;IAC7B;QAAED,OAAO;QAAOC,OAAO;IAAM;IAC7B;QAAED,OAAO;QAAOC,OAAO;IAAM;CAC9B,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare function parseResponse(responseData: string): Record<string, string>;
2
+ export declare function initiateTransaction(paygateUrl: string, data: Record<string, string>): Promise<Record<string, string>>;
3
+ export declare function queryTransaction(paygateUrl: string, data: Record<string, string>): Promise<Record<string, string>>;
@@ -0,0 +1,43 @@
1
+ export function parseResponse(responseData) {
2
+ if (!responseData || typeof responseData !== 'string') {
3
+ throw new Error('Invalid response data from PayGate');
4
+ }
5
+ const result = {};
6
+ for (const pair of responseData.split('&')){
7
+ const eqIdx = pair.indexOf('=');
8
+ if (eqIdx === -1) {
9
+ result[pair] = '';
10
+ } else {
11
+ const key = decodeURIComponent(pair.slice(0, eqIdx));
12
+ const value = decodeURIComponent(pair.slice(eqIdx + 1));
13
+ if (key) {
14
+ result[key] = value;
15
+ }
16
+ }
17
+ }
18
+ return result;
19
+ }
20
+ async function postForm(url, data) {
21
+ const response = await fetch(url, {
22
+ body: new URLSearchParams(data).toString(),
23
+ headers: {
24
+ 'Content-Type': 'application/x-www-form-urlencoded'
25
+ },
26
+ method: 'POST'
27
+ });
28
+ const text = await response.text();
29
+ if (!response.ok) {
30
+ return {
31
+ ERROR: `HTTP ${response.status}: ${text.slice(0, 500)}`
32
+ };
33
+ }
34
+ return parseResponse(text);
35
+ }
36
+ export async function initiateTransaction(paygateUrl, data) {
37
+ return postForm(`${paygateUrl}/payweb3/initiate.trans`, data);
38
+ }
39
+ export async function queryTransaction(paygateUrl, data) {
40
+ return postForm(`${paygateUrl}/payweb3/query.trans`, data);
41
+ }
42
+
43
+ //# sourceMappingURL=paygate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/paygate.ts"],"sourcesContent":["export function parseResponse(responseData: string): Record<string, string> {\n if (!responseData || typeof responseData !== 'string') {\n throw new Error('Invalid response data from PayGate')\n }\n\n const result: Record<string, string> = {}\n for (const pair of responseData.split('&')) {\n const eqIdx = pair.indexOf('=')\n if (eqIdx === -1) {\n result[pair] = ''\n } else {\n const key = decodeURIComponent(pair.slice(0, eqIdx))\n const value = decodeURIComponent(pair.slice(eqIdx + 1))\n if (key) {\n result[key] = value\n }\n }\n }\n return result\n}\n\nasync function postForm(\n url: string,\n data: Record<string, string>,\n): Promise<Record<string, string>> {\n const response = await fetch(url, {\n body: new URLSearchParams(data).toString(),\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n method: 'POST',\n })\n\n const text = await response.text()\n\n if (!response.ok) {\n return { ERROR: `HTTP ${response.status}: ${text.slice(0, 500)}` }\n }\n\n return parseResponse(text)\n}\n\nexport async function initiateTransaction(\n paygateUrl: string,\n data: Record<string, string>,\n): Promise<Record<string, string>> {\n return postForm(`${paygateUrl}/payweb3/initiate.trans`, data)\n}\n\nexport async function queryTransaction(\n paygateUrl: string,\n data: Record<string, string>,\n): Promise<Record<string, string>> {\n return postForm(`${paygateUrl}/payweb3/query.trans`, data)\n}\n"],"names":["parseResponse","responseData","Error","result","pair","split","eqIdx","indexOf","key","decodeURIComponent","slice","value","postForm","url","data","response","fetch","body","URLSearchParams","toString","headers","method","text","ok","ERROR","status","initiateTransaction","paygateUrl","queryTransaction"],"mappings":"AAAA,OAAO,SAASA,cAAcC,YAAoB;IAChD,IAAI,CAACA,gBAAgB,OAAOA,iBAAiB,UAAU;QACrD,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAMC,SAAiC,CAAC;IACxC,KAAK,MAAMC,QAAQH,aAAaI,KAAK,CAAC,KAAM;QAC1C,MAAMC,QAAQF,KAAKG,OAAO,CAAC;QAC3B,IAAID,UAAU,CAAC,GAAG;YAChBH,MAAM,CAACC,KAAK,GAAG;QACjB,OAAO;YACL,MAAMI,MAAMC,mBAAmBL,KAAKM,KAAK,CAAC,GAAGJ;YAC7C,MAAMK,QAAQF,mBAAmBL,KAAKM,KAAK,CAACJ,QAAQ;YACpD,IAAIE,KAAK;gBACPL,MAAM,CAACK,IAAI,GAAGG;YAChB;QACF;IACF;IACA,OAAOR;AACT;AAEA,eAAeS,SACbC,GAAW,EACXC,IAA4B;IAE5B,MAAMC,WAAW,MAAMC,MAAMH,KAAK;QAChCI,MAAM,IAAIC,gBAAgBJ,MAAMK,QAAQ;QACxCC,SAAS;YAAE,gBAAgB;QAAoC;QAC/DC,QAAQ;IACV;IAEA,MAAMC,OAAO,MAAMP,SAASO,IAAI;IAEhC,IAAI,CAACP,SAASQ,EAAE,EAAE;QAChB,OAAO;YAAEC,OAAO,CAAC,KAAK,EAAET,SAASU,MAAM,CAAC,EAAE,EAAEH,KAAKZ,KAAK,CAAC,GAAG,MAAM;QAAC;IACnE;IAEA,OAAOV,cAAcsB;AACvB;AAEA,OAAO,eAAeI,oBACpBC,UAAkB,EAClBb,IAA4B;IAE5B,OAAOF,SAAS,GAAGe,WAAW,uBAAuB,CAAC,EAAEb;AAC1D;AAEA,OAAO,eAAec,iBACpBD,UAAkB,EAClBb,IAA4B;IAE5B,OAAOF,SAAS,GAAGe,WAAW,oBAAoB,CAAC,EAAEb;AACvD"}
@@ -0,0 +1,26 @@
1
+ import type { CollectionSlug, Payload } from 'payload';
2
+ export type DpoRoutes = {
3
+ initiate?: string;
4
+ notify?: string;
5
+ return?: string;
6
+ status?: string;
7
+ };
8
+ export type DpoPluginConfig = {
9
+ baseUrl?: string;
10
+ collections?: Partial<Record<CollectionSlug, true>>;
11
+ defaultCountry?: string;
12
+ defaultCurrency?: 'BWP' | 'USD' | 'ZAR';
13
+ defaultLocale?: string;
14
+ disabled?: boolean;
15
+ onSuccess?: (args: {
16
+ payload: Payload;
17
+ transaction: Record<string, unknown>;
18
+ }) => Promise<void>;
19
+ paygateId?: string;
20
+ paygateKey?: string;
21
+ paygateUrl?: string;
22
+ routes?: DpoRoutes;
23
+ transactionCollectionSlug?: string;
24
+ };
25
+ export type PayGateStatus = '0' | '1' | '2' | '3' | '4' | '5' | '7';
26
+ export type PayGateStatusLabel = 'Approved' | 'Cancelled' | 'Declined' | 'Not Done' | 'Received by PayGate' | 'Settlement Voided' | 'User Cancelled';
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { CollectionSlug, Payload } from 'payload'\n\nexport type DpoRoutes = {\n initiate?: string\n notify?: string\n return?: string\n status?: string\n}\n\nexport type DpoPluginConfig = {\n baseUrl?: string\n collections?: Partial<Record<CollectionSlug, true>>\n defaultCountry?: string\n defaultCurrency?: 'BWP' | 'USD' | 'ZAR'\n defaultLocale?: string\n disabled?: boolean\n onSuccess?: (args: { payload: Payload; transaction: Record<string, unknown> }) => Promise<void>\n paygateId?: string\n paygateKey?: string\n paygateUrl?: string\n routes?: DpoRoutes\n transactionCollectionSlug?: string\n}\n\nexport type PayGateStatus = '0' | '1' | '2' | '3' | '4' | '5' | '7'\n\nexport type PayGateStatusLabel =\n | 'Approved'\n | 'Cancelled'\n | 'Declined'\n | 'Not Done'\n | 'Received by PayGate'\n | 'Settlement Voided'\n | 'User Cancelled'\n"],"names":[],"mappings":"AA0BA,WAOoB"}
package/package.json ADDED
@@ -0,0 +1,138 @@
1
+ {
2
+ "name": "@innovateium/payload-dpo",
3
+ "version": "0.0.1-beta",
4
+ "description": "PayGate PayWeb3 payment gateway plugin for Payload CMS v3",
5
+ "license": "MIT",
6
+ "author": "Innovateium <info@innovateium.co.bw> (https://innovateium.co.bw)",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/innovateium/payload-dpo.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/innovateium/payload-dpo/issues"
13
+ },
14
+ "homepage": "https://github.com/innovateium/payload-dpo",
15
+ "keywords": [
16
+ "payload",
17
+ "payload-cms",
18
+ "payload-plugin",
19
+ "paygate",
20
+ "payweb3",
21
+ "payment-gateway",
22
+ "dpo",
23
+ "botswana"
24
+ ],
25
+ "type": "module",
26
+ "exports": {
27
+ ".": {
28
+ "import": "./src/index.ts",
29
+ "types": "./src/index.ts",
30
+ "default": "./src/index.ts"
31
+ },
32
+ "./client": {
33
+ "import": "./src/exports/client.ts",
34
+ "types": "./src/exports/client.ts",
35
+ "default": "./src/exports/client.ts"
36
+ },
37
+ "./rsc": {
38
+ "import": "./src/exports/rsc.ts",
39
+ "types": "./src/exports/rsc.ts",
40
+ "default": "./src/exports/rsc.ts"
41
+ }
42
+ },
43
+ "main": "./src/index.ts",
44
+ "types": "./src/index.ts",
45
+ "files": [
46
+ "dist"
47
+ ],
48
+ "scripts": {
49
+ "build": "pnpm copyfiles && pnpm build:types && pnpm build:swc",
50
+ "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
51
+ "build:types": "tsc --outDir dist --rootDir ./src",
52
+ "clean": "rimraf {dist,*.tsbuildinfo}",
53
+ "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/",
54
+ "dev": "next dev dev --turbo",
55
+ "dev:generate-importmap": "pnpm dev:payload generate:importmap",
56
+ "dev:generate-types": "pnpm dev:payload generate:types",
57
+ "dev:payload": "cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload",
58
+ "generate:importmap": "pnpm dev:generate-importmap",
59
+ "generate:types": "pnpm dev:generate-types",
60
+ "lint": "eslint",
61
+ "lint:fix": "eslint ./src --fix",
62
+ "test": "pnpm test:int && pnpm test:e2e",
63
+ "test:e2e": "playwright test",
64
+ "test:int": "vitest"
65
+ },
66
+ "devDependencies": {
67
+ "@eslint/eslintrc": "^3.2.0",
68
+ "@payloadcms/db-mongodb": "3.84.1",
69
+ "@payloadcms/db-postgres": "3.84.1",
70
+ "@payloadcms/db-sqlite": "3.84.1",
71
+ "@payloadcms/eslint-config": "3.28.0",
72
+ "@payloadcms/next": "3.84.1",
73
+ "@payloadcms/richtext-lexical": "3.84.1",
74
+ "@payloadcms/ui": "3.84.1",
75
+ "@playwright/test": "1.58.2",
76
+ "@swc-node/register": "1.10.9",
77
+ "@swc/cli": "0.6.0",
78
+ "@types/node": "22.19.9",
79
+ "@types/react": "19.2.14",
80
+ "@types/react-dom": "19.2.3",
81
+ "copyfiles": "2.4.1",
82
+ "cross-env": "^7.0.3",
83
+ "eslint": "^9.23.0",
84
+ "eslint-config-next": "16.2.6",
85
+ "graphql": "^16.8.1",
86
+ "mongodb-memory-server": "10.1.4",
87
+ "next": "16.2.6",
88
+ "open": "^10.1.0",
89
+ "payload": "3.84.1",
90
+ "prettier": "^3.4.2",
91
+ "qs-esm": "8.0.1",
92
+ "react": "19.2.6",
93
+ "react-dom": "19.2.6",
94
+ "rimraf": "3.0.2",
95
+ "sharp": "0.34.2",
96
+ "sort-package-json": "^2.10.0",
97
+ "typescript": "5.7.3",
98
+ "vite-tsconfig-paths": "6.0.5",
99
+ "vitest": "4.0.18"
100
+ },
101
+ "peerDependencies": {
102
+ "payload": "^3.84.1"
103
+ },
104
+ "engines": {
105
+ "node": "^18.20.2 || >=20.9.0",
106
+ "pnpm": "^9 || ^10"
107
+ },
108
+ "publishConfig": {
109
+ "exports": {
110
+ ".": {
111
+ "import": "./dist/index.js",
112
+ "types": "./dist/index.d.ts",
113
+ "default": "./dist/index.js"
114
+ },
115
+ "./client": {
116
+ "import": "./dist/exports/client.js",
117
+ "types": "./dist/exports/client.d.ts",
118
+ "default": "./dist/exports/client.js"
119
+ },
120
+ "./rsc": {
121
+ "import": "./dist/exports/rsc.js",
122
+ "types": "./dist/exports/rsc.d.ts",
123
+ "default": "./dist/exports/rsc.js"
124
+ }
125
+ },
126
+ "main": "./dist/index.js",
127
+ "types": "./dist/index.d.ts"
128
+ },
129
+ "pnpm": {
130
+ "onlyBuiltDependencies": [
131
+ "sharp",
132
+ "esbuild",
133
+ "unrs-resolver"
134
+ ]
135
+ },
136
+ "registry": "https://registry.npmjs.org/",
137
+ "dependencies": {}
138
+ }