@getopenpay/openpay-js-react 0.0.1 → 0.0.2-beta.1

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 (56) hide show
  1. package/dist/index.d.ts +184 -15
  2. package/dist/index.js +870 -786
  3. package/package.json +13 -3
  4. package/.env.development +0 -1
  5. package/.env.production +0 -1
  6. package/.env.staging +0 -1
  7. package/.eslintrc.cjs +0 -18
  8. package/.github/workflows/alpha-release.yml +0 -39
  9. package/.github/workflows/release.yml +0 -30
  10. package/Makefile +0 -37
  11. package/example/.eslintrc.json +0 -3
  12. package/example/Makefile +0 -10
  13. package/example/README.md +0 -36
  14. package/example/next.config.mjs +0 -4
  15. package/example/package-lock.json +0 -5283
  16. package/example/package.json +0 -27
  17. package/example/postcss.config.mjs +0 -8
  18. package/example/public/next.svg +0 -1
  19. package/example/public/vercel.svg +0 -1
  20. package/example/src/app/elements/_components/FormWrapper.tsx +0 -18
  21. package/example/src/app/elements/_components/InputField.tsx +0 -11
  22. package/example/src/app/elements/card/page.tsx +0 -54
  23. package/example/src/app/elements/card-cvc/page.tsx +0 -29
  24. package/example/src/app/elements/card-expiry/page.tsx +0 -29
  25. package/example/src/app/elements/card-number/page.tsx +0 -29
  26. package/example/src/app/favicon.ico +0 -0
  27. package/example/src/app/globals.css +0 -14
  28. package/example/src/app/layout.tsx +0 -22
  29. package/example/src/app/page.tsx +0 -119
  30. package/example/tailwind.config.ts +0 -11
  31. package/example/tsconfig.json +0 -26
  32. package/lib/components/_common/frame.tsx +0 -73
  33. package/lib/components/card-cvc.tsx +0 -11
  34. package/lib/components/card-expiry.tsx +0 -11
  35. package/lib/components/card-number.tsx +0 -11
  36. package/lib/components/card.tsx +0 -11
  37. package/lib/components/form.tsx +0 -100
  38. package/lib/hooks/context.ts +0 -17
  39. package/lib/hooks/use-openpay-elements.ts +0 -12
  40. package/lib/index.ts +0 -16
  41. package/lib/utils/constants.ts +0 -1
  42. package/lib/utils/element.ts +0 -5
  43. package/lib/utils/event.ts +0 -66
  44. package/lib/utils/style.ts +0 -17
  45. package/lib/vite-env.d.ts +0 -1
  46. package/ngrok.example.yml +0 -6
  47. package/playwright.config.ts +0 -37
  48. package/tests/card-cvc.test.ts +0 -68
  49. package/tests/card-element.test.ts +0 -113
  50. package/tests/card-expiry.test.ts +0 -61
  51. package/tests/card-number.test.ts +0 -61
  52. package/tests/constants.ts +0 -97
  53. package/tsconfig.build.json +0 -28
  54. package/tsconfig.json +0 -11
  55. package/tsconfig.node.json +0 -13
  56. package/vite.config.ts +0 -36
@@ -1,12 +0,0 @@
1
- import { useContext } from 'react';
2
- import { ElementsContextValue, ElementsContext } from './context';
3
-
4
- export const useOpenPayElements = (): ElementsContextValue => {
5
- const context = useContext(ElementsContext);
6
- if (!context) {
7
- throw new Error('useOpenPayElements must be used within an OpenPayElementsProvider');
8
- }
9
- return context;
10
- };
11
-
12
- export default useOpenPayElements;
package/lib/index.ts DELETED
@@ -1,16 +0,0 @@
1
- import useOpenPayElements from './hooks/use-openpay-elements';
2
- import ElementsForm from './components/form';
3
- import CardCvcElement from './components/card-cvc';
4
- import CardElement from './components/card';
5
- import CardExpiryElement from './components/card-expiry';
6
- import CardNumberElement from './components/card-number';
7
-
8
-
9
- export {
10
- useOpenPayElements,
11
- ElementsForm,
12
- CardCvcElement,
13
- CardElement,
14
- CardExpiryElement,
15
- CardNumberElement,
16
- };
@@ -1 +0,0 @@
1
- export const FRAME_BASE_URL = import.meta.env.VITE_CDE_BASE_URL ?? 'http://localhost:3030';
@@ -1,5 +0,0 @@
1
- import { type ElementStyle } from './style';
2
-
3
- export type ElementProps = {
4
- styles?: ElementStyle;
5
- }
@@ -1,66 +0,0 @@
1
- import { z } from 'zod';
2
- import { v4 as uuidv4 } from 'uuid';
3
- import { FRAME_BASE_URL } from './constants';
4
-
5
- /**
6
- * Start of common event stuff
7
- * Don't forget to update in app-cde:frontend/utils/elements/event.ts also!
8
- */
9
-
10
- const EVENT_PREFIX = 'op-elements';
11
-
12
- export enum ElementEventType {
13
- LOADED = `${EVENT_PREFIX}-loaded`,
14
- VALIDATION_ERROR = `${EVENT_PREFIX}-validation-error`,
15
- BLUR = `${EVENT_PREFIX}-blur`,
16
- FOCUS = `${EVENT_PREFIX}-focus`,
17
- CHANGE = `${EVENT_PREFIX}-change`,
18
- RESIZE = `${EVENT_PREFIX}-resize`,
19
- }
20
-
21
- export const ElementEventSchema = z.object({
22
- type: z.nativeEnum(ElementEventType),
23
- payload: z.object({}).catchall(z.string()),
24
- nonce: z.string(),
25
- formId: z.string(),
26
- elementId: z.string(),
27
- });
28
- export type ElementEvent = z.infer<typeof ElementEventSchema>;
29
-
30
- export const parseEventPayload = (eventData: object): ElementEvent => {
31
- try {
32
- return ElementEventSchema.parse(eventData);
33
- } catch (error) {
34
- console.error('Error parsing event payload:', eventData, error);
35
- throw error;
36
- }
37
- };
38
-
39
- /**
40
- * End of common event stuff
41
- */
42
-
43
- export const emitEvent = (
44
- frame: HTMLIFrameElement,
45
- formId: string,
46
- elementId: string,
47
- type: ElementEventType,
48
- payload: Record<string, string>
49
- ) => {
50
- const target = frame.contentWindow;
51
- if (!target) {
52
- console.error('[form] Cannot emit event, no contentWindow found:', frame);
53
- return;
54
- }
55
-
56
- const event: ElementEvent = {
57
- type,
58
- formId,
59
- elementId,
60
- payload,
61
- nonce: uuidv4(),
62
- };
63
-
64
- console.log(`[form] Emitting event ${type} from parent form ${formId} to child element ${elementId}:`, event);
65
- target.postMessage(JSON.stringify(event), FRAME_BASE_URL);
66
- };
@@ -1,17 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- const ElementStyleSchema = z.object({
4
- backgroundColor: z.string().optional(),
5
- color: z.string().optional(),
6
- fontFamily: z.string().optional(),
7
- fontSize: z.string().optional(),
8
- fontWeight: z.string().optional(),
9
- margin: z.string().optional(),
10
- padding: z.string().optional(),
11
- });
12
- export type ElementStyle = z.infer<typeof ElementStyleSchema>;
13
-
14
- export const convertStylesToQueryString = (styles: ElementStyle): string => {
15
- const serializedStyles = encodeURIComponent(JSON.stringify(styles));
16
- return `styles=${serializedStyles}`;
17
- };
package/lib/vite-env.d.ts DELETED
@@ -1 +0,0 @@
1
- /// <reference types="vite/client" />
package/ngrok.example.yml DELETED
@@ -1,6 +0,0 @@
1
- version: "2"
2
- authtoken: <YOUR_AUTH_TOKEN>
3
- tunnels:
4
- openpay-client:
5
- addr: 3032
6
- proto: http
@@ -1,37 +0,0 @@
1
- import { defineConfig, devices } from '@playwright/test';
2
-
3
- const BASE_URL = process.env.BASE_URL || 'http://localhost:3032';
4
-
5
- console.log('BASE_URL:', BASE_URL);
6
- /**
7
- * See https://playwright.dev/docs/test-configuration.
8
- */
9
- export default defineConfig({
10
- testDir: './tests',
11
- fullyParallel: true,
12
- forbidOnly: !!process.env.CI,
13
- retries: process.env.CI ? 2 : 0,
14
- workers: process.env.CI ? 1 : 4,
15
- reporter: 'html',
16
- use: {
17
- baseURL: BASE_URL,
18
- extraHTTPHeaders: {
19
- // Skip browser warning of ngrok
20
- 'ngrok-skip-browser-warning': 'true',
21
- },
22
- trace: 'on-first-retry',
23
- headless: !process.env.HEADFULL,
24
- },
25
-
26
- projects: [
27
- {
28
- name: 'chromium',
29
- use: { ...devices['Desktop Chrome'] },
30
- },
31
- ],
32
- webServer: {
33
- command: 'cd example && make dev',
34
- port: 3032,
35
- reuseExistingServer: !process.env.CI,
36
- },
37
- });
@@ -1,68 +0,0 @@
1
- import { test, expect } from '@playwright/test';
2
- import { CARD_CVC_INPUT_SELECTOR, ERROR_MESSAGE_SELECTOR, INVALID_CVC_MESSAGE, invalidCVCNumbers, validCVCNumbers } from './constants';
3
-
4
- const IFRAME_SELECTOR = 'iframe[name=card-cvc-element]';
5
- const INPUT_SELECTOR = CARD_CVC_INPUT_SELECTOR;
6
- const PAGE_PATH = '/elements/card-cvc';
7
-
8
- test.describe('Card CVC element', () => {
9
- test.beforeEach(async ({ page }) => {
10
- await page.goto(PAGE_PATH);
11
- });
12
-
13
- test('should render card cvc element', async ({ page }) => {
14
- const element = page.locator(IFRAME_SELECTOR);
15
- await expect(element).toBeVisible();
16
- });
17
-
18
- test('should be able to focus on card cvc input', async ({ page }) => {
19
- const iframe = page.frameLocator(IFRAME_SELECTOR);
20
- const element = iframe.locator(INPUT_SELECTOR).first();
21
- await element.focus();
22
- await expect(element).toBeFocused();
23
- });
24
-
25
- test('should be able to fill card cvc input', async ({ page }) => {
26
- const iframe = page.frameLocator(IFRAME_SELECTOR);
27
- const element = iframe.locator(INPUT_SELECTOR).first();
28
- await element.fill('123');
29
- await expect(element).toHaveValue('123');
30
- });
31
-
32
- test('should be able to input only valid number', async ({ page }) => {
33
- const iframe = page.frameLocator(IFRAME_SELECTOR);
34
- const clientFrameErrorMessage = page.locator(ERROR_MESSAGE_SELECTOR).first();
35
-
36
- const cardCVC = iframe.locator(INPUT_SELECTOR).first();
37
- await cardCVC.fill('asdf');
38
-
39
- await expect(cardCVC).toHaveAttribute('aria-invalid', 'true');
40
- await expect(clientFrameErrorMessage).toHaveText(INVALID_CVC_MESSAGE);
41
- });
42
-
43
- invalidCVCNumbers.forEach(async (cvc) => {
44
- test(`should raise validation error when card cvc is invalid: [input:${cvc}]`, async ({ page }) => {
45
- const iframe = page.frameLocator(IFRAME_SELECTOR);
46
- const clientFrameErrorMessage = page.locator(ERROR_MESSAGE_SELECTOR).first();
47
-
48
- const element = iframe.locator(INPUT_SELECTOR).first();
49
- await element.fill(cvc);
50
- await expect(element).toHaveAttribute('aria-invalid', 'true');
51
- await expect(clientFrameErrorMessage).toHaveText(INVALID_CVC_MESSAGE);
52
- });
53
- });
54
-
55
- validCVCNumbers.forEach(async (cvc) => {
56
- test(`should not raise validation error when card cvc is valid: [input:${cvc}]`, async ({ page }) => {
57
- const iframe = page.frameLocator(IFRAME_SELECTOR);
58
- const clientFrameErrorMessage = page.locator(ERROR_MESSAGE_SELECTOR).first();
59
-
60
- const element = iframe.locator(INPUT_SELECTOR).first();
61
- await element.fill(cvc);
62
- // CVC should be truncated to max 4 characters
63
- await expect(element).toHaveValue(cvc.replace(/\D/g, '').slice(0, 4));
64
- await expect(element).not.toHaveAttribute('aria-invalid');
65
- await expect(clientFrameErrorMessage).toHaveText('');
66
- });
67
- });
68
- });
@@ -1,113 +0,0 @@
1
- import { test, expect } from '@playwright/test';
2
- import {
3
- CARD_CVC_INPUT_SELECTOR,
4
- CARD_EXPIRY_INPUT_SELECTOR,
5
- CARD_NUMBER_INPUT_SELECTOR,
6
- cardElementTestCases,
7
- ERROR_MESSAGE_SELECTOR,
8
- INVALID_CVC_MESSAGE,
9
- INVALID_EXPIRY_MESSAGE,
10
- INVALID_NUMBER_MESSAGE,
11
- } from './constants';
12
-
13
- const IFRAME_SELECTOR = 'iframe[name=card-element]';
14
- const PAGE_PATH = '/elements/card';
15
-
16
- test.describe('Card element', () => {
17
- test.beforeEach(async ({ page }) => {
18
- await page.goto(PAGE_PATH);
19
- });
20
-
21
- test('should render card element', async ({ page }) => {
22
- const cardElement = page.locator(IFRAME_SELECTOR);
23
- await expect(cardElement).toBeVisible();
24
- });
25
-
26
- test('should contain all card elements', async ({ page }) => {
27
- const iframe = page.frameLocator(IFRAME_SELECTOR);
28
- const cardNumber = iframe.locator(CARD_NUMBER_INPUT_SELECTOR).first();
29
- const cardExpiry = iframe.locator(CARD_EXPIRY_INPUT_SELECTOR).first();
30
- const cardCvc = iframe.locator(CARD_CVC_INPUT_SELECTOR).first();
31
- await expect(cardNumber).toBeVisible();
32
- await expect(cardExpiry).toBeVisible();
33
- await expect(cardCvc).toBeVisible();
34
- });
35
-
36
- test('should be able to focus on all elements', async ({ page }) => {
37
- const iframe = page.frameLocator(IFRAME_SELECTOR);
38
- const cardNumber = iframe.locator(CARD_NUMBER_INPUT_SELECTOR).first();
39
- const cardExpiry = iframe.locator(CARD_EXPIRY_INPUT_SELECTOR).first();
40
- const cardCvc = iframe.locator(CARD_CVC_INPUT_SELECTOR).first();
41
-
42
- await cardNumber.focus();
43
- await expect(cardNumber).toBeFocused();
44
-
45
- await cardExpiry.focus();
46
- await expect(cardExpiry).toBeFocused();
47
-
48
- await cardCvc.focus();
49
- await expect(cardCvc).toBeFocused();
50
- });
51
-
52
- test('should be able to change focus with keyboard tab key', async ({ page }) => {
53
- const iframe = page.frameLocator(IFRAME_SELECTOR);
54
- const cardNumber = iframe.locator(CARD_NUMBER_INPUT_SELECTOR).first();
55
- const cardExpiry = iframe.locator(CARD_EXPIRY_INPUT_SELECTOR).first();
56
- const cardCvc = iframe.locator(CARD_CVC_INPUT_SELECTOR).first();
57
-
58
- await cardNumber.focus();
59
- await expect(cardNumber).toBeFocused();
60
-
61
- await page.keyboard.press('Tab');
62
- await expect(cardExpiry).toBeFocused();
63
-
64
- await page.keyboard.press('Tab');
65
- await expect(cardCvc).toBeFocused();
66
- });
67
-
68
- cardElementTestCases.forEach((testCase, idx) => {
69
- test(`should validate card number, expiry and cvc fields [test-case:${idx + 1}] `, async ({ page }) => {
70
- const iframe = page.frameLocator(IFRAME_SELECTOR);
71
- const clientFrameErrorMessage = page.locator(ERROR_MESSAGE_SELECTOR);
72
-
73
- const cardNumber = iframe.locator(CARD_NUMBER_INPUT_SELECTOR).first();
74
- const cardExpiry = iframe.locator(CARD_EXPIRY_INPUT_SELECTOR).first();
75
- const cardCvc = iframe.locator(CARD_CVC_INPUT_SELECTOR).first();
76
-
77
- await cardNumber.fill(testCase.cardNumber);
78
- await cardExpiry.fill(testCase.cardExpiry);
79
- await cardCvc.fill(testCase.cardCvc);
80
-
81
- if (testCase.expected.cardNumber) {
82
- await expect(cardNumber).not.toHaveAttribute('aria-invalid');
83
- } else {
84
- await expect(cardNumber).toHaveAttribute('aria-invalid', 'true');
85
- }
86
-
87
- if (testCase.expected.cardExpiry) {
88
- await expect(cardExpiry).not.toHaveAttribute('aria-invalid');
89
- } else {
90
- await expect(cardExpiry).toHaveAttribute('aria-invalid', 'true');
91
- }
92
-
93
- if (testCase.expected.cardCvc) {
94
- await expect(cardCvc).not.toHaveAttribute('aria-invalid');
95
- } else {
96
- await expect(cardCvc).toHaveAttribute('aria-invalid', 'true');
97
- }
98
-
99
- if (!testCase.expected.cardCvc) {
100
- await expect(clientFrameErrorMessage).toContainText(INVALID_CVC_MESSAGE);
101
- }
102
- if (!testCase.expected.cardExpiry) {
103
- await expect(clientFrameErrorMessage).toContainText(INVALID_EXPIRY_MESSAGE);
104
- }
105
- if (!testCase.expected.cardNumber) {
106
- await expect(clientFrameErrorMessage).toContainText(INVALID_NUMBER_MESSAGE);
107
- }
108
- if (testCase.expected.cardNumber && testCase.expected.cardExpiry && testCase.expected.cardCvc) {
109
- await expect(clientFrameErrorMessage).toHaveText('');
110
- }
111
- });
112
- });
113
- });
@@ -1,61 +0,0 @@
1
- import { test, expect } from '@playwright/test';
2
- import {
3
- CARD_EXPIRY_INPUT_SELECTOR,
4
- ERROR_MESSAGE_SELECTOR,
5
- INVALID_EXPIRY_MESSAGE,
6
- invalidExpiryDates,
7
- validExpiryDates,
8
- } from './constants';
9
-
10
- const IFRAME_SELECTOR = 'iframe[name=card-expiry-element]';
11
- const INPUT_SELECTOR = CARD_EXPIRY_INPUT_SELECTOR;
12
- const PAGE_PATH = '/elements/card-expiry';
13
-
14
- test.describe('Card expiry element', () => {
15
- test.beforeEach(async ({ page }) => {
16
- await page.goto(PAGE_PATH);
17
- });
18
-
19
- test('should render card expiry element', async ({ page }) => {
20
- const element = page.locator(IFRAME_SELECTOR);
21
- await expect(element).toBeVisible();
22
- });
23
-
24
- test('should be able to focus on card expiry', async ({ page }) => {
25
- const iframe = page.frameLocator(IFRAME_SELECTOR);
26
- const element = iframe.locator(INPUT_SELECTOR).first();
27
- await element.focus();
28
- await expect(element).toBeFocused();
29
- });
30
-
31
- test('should be able to fill card expiry', async ({ page }) => {
32
- const iframe = page.frameLocator(IFRAME_SELECTOR);
33
- const element = iframe.locator(INPUT_SELECTOR).first();
34
- await element.fill('042027');
35
- await expect(element).toHaveValue('04/2027');
36
- });
37
-
38
- invalidExpiryDates.forEach(async (expiryDate) => {
39
- test(`should raise validation error when card expiry is invalid: [input:${expiryDate}]`, async ({ page }) => {
40
- const iframe = page.frameLocator(IFRAME_SELECTOR);
41
- const clientFrameErrorMessage = page.locator(ERROR_MESSAGE_SELECTOR).first();
42
-
43
- const cardExpiry = iframe.locator(INPUT_SELECTOR).first();
44
- await cardExpiry.fill(expiryDate);
45
- await expect(cardExpiry).toHaveAttribute('aria-invalid', 'true');
46
- await expect(clientFrameErrorMessage).toHaveText(INVALID_EXPIRY_MESSAGE);
47
- });
48
- });
49
-
50
- validExpiryDates.forEach(async (expiryDate) => {
51
- test(`should not raise validation error when card expiry is valid: [input:${expiryDate}]`, async ({ page }) => {
52
- const iframe = page.frameLocator(IFRAME_SELECTOR);
53
- const clientFrameErrorMessage = page.locator(ERROR_MESSAGE_SELECTOR).first();
54
-
55
- const cardExpiry = iframe.locator(INPUT_SELECTOR).first();
56
- await cardExpiry.fill(expiryDate);
57
- await expect(cardExpiry).not.toHaveAttribute('aria-invalid');
58
- await expect(clientFrameErrorMessage).toHaveText('');
59
- });
60
- });
61
- });
@@ -1,61 +0,0 @@
1
- import { test, expect } from '@playwright/test';
2
- import {
3
- CARD_NUMBER_INPUT_SELECTOR,
4
- ERROR_MESSAGE_SELECTOR,
5
- INVALID_NUMBER_MESSAGE,
6
- invalidCardNumbers,
7
- validCardNumbers,
8
- } from './constants';
9
-
10
- const IFRAME_SELECTOR = 'iframe[name=card-number-element]';
11
- const INPUT_SELECTOR = CARD_NUMBER_INPUT_SELECTOR;
12
- const PAGE_PATH = '/elements/card-number';
13
-
14
- test.describe('Card number element', () => {
15
- test.beforeEach(async ({ page }) => {
16
- await page.goto(PAGE_PATH);
17
- });
18
-
19
- test('should render card number element', async ({ page }) => {
20
- const element = page.locator(IFRAME_SELECTOR);
21
- await expect(element).toBeVisible();
22
- });
23
-
24
- test('should be able to focus on card number', async ({ page }) => {
25
- const iframe = page.frameLocator(IFRAME_SELECTOR);
26
- const element = iframe.locator(INPUT_SELECTOR).first();
27
- await element.focus();
28
- await expect(element).toBeFocused();
29
- });
30
-
31
- test('should be able to fill card number', async ({ page }) => {
32
- const iframe = page.frameLocator(IFRAME_SELECTOR);
33
- const element = iframe.locator(INPUT_SELECTOR).first();
34
- await element.fill('4242424242424242');
35
- await expect(element).toHaveValue('4242 4242 4242 4242');
36
- });
37
-
38
- invalidCardNumbers.forEach(async (cardNumber) => {
39
- test(`should raise validation error when card expiry is invalid: [input:${cardNumber}]`, async ({ page }) => {
40
- const iframe = page.frameLocator(IFRAME_SELECTOR);
41
- const clientFrameErrorMessage = page.locator(ERROR_MESSAGE_SELECTOR).first();
42
-
43
- const element = iframe.locator(INPUT_SELECTOR).first();
44
- await element.fill(cardNumber);
45
- await expect(element).toHaveAttribute('aria-invalid', 'true');
46
- await expect(clientFrameErrorMessage).toHaveText(INVALID_NUMBER_MESSAGE);
47
- });
48
- });
49
-
50
- validCardNumbers.forEach(async (cardNumber) => {
51
- test(`should not raise validation error when card number is valid: [input:${cardNumber}]`, async ({ page }) => {
52
- const iframe = page.frameLocator(IFRAME_SELECTOR);
53
- const clientFrameErrorMessage = page.locator(ERROR_MESSAGE_SELECTOR).first();
54
-
55
- const element = iframe.locator(INPUT_SELECTOR).first();
56
- await element.fill(cardNumber);
57
- await expect(element).not.toHaveAttribute('aria-invalid');
58
- await expect(clientFrameErrorMessage).toHaveText('');
59
- });
60
- });
61
- });
@@ -1,97 +0,0 @@
1
- export const INVALID_CVC_MESSAGE = 'Invalid CVV/CVC';
2
- export const INVALID_EXPIRY_MESSAGE = 'Invalid card expiry';
3
- export const INVALID_NUMBER_MESSAGE = 'Invalid card number';
4
-
5
- export const ERROR_MESSAGE_SELECTOR = '[data-testid=error-message]';
6
-
7
- export const CARD_NUMBER_INPUT_SELECTOR = 'input[name=cardNumber]';
8
- export const CARD_EXPIRY_INPUT_SELECTOR = 'input[name=cardExpiry]';
9
- export const CARD_CVC_INPUT_SELECTOR = 'input[name=cardCvc]';
10
-
11
- export const cardElementTestCases = [
12
- {
13
- cardNumber: '4242424242424241',
14
- cardExpiry: '12/2020',
15
- cardCvc: '123',
16
- expected: {
17
- cardNumber: false,
18
- cardExpiry: false,
19
- cardCvc: true,
20
- },
21
- },
22
- {
23
- cardNumber: '4242424242424242',
24
- cardExpiry: '12/2021',
25
- cardCvc: '123',
26
- expected: {
27
- cardNumber: true,
28
- cardExpiry: false,
29
- cardCvc: true,
30
- },
31
- },
32
- {
33
- cardNumber: '4242424242424242',
34
- cardExpiry: '12/2022',
35
- cardCvc: '1234',
36
- expected: {
37
- cardNumber: true,
38
- cardExpiry: false,
39
- cardCvc: true,
40
- },
41
- },
42
- {
43
- cardNumber: '5555 5555 5555 6666',
44
- cardExpiry: '12/2022',
45
- cardCvc: '12',
46
- expected: {
47
- cardNumber: false,
48
- cardExpiry: false,
49
- cardCvc: false,
50
- },
51
- },
52
- {
53
- cardNumber: '371449a635398431',
54
- cardExpiry: '12/2022',
55
- cardCvc: '123',
56
- expected: {
57
- cardNumber: false,
58
- cardExpiry: false,
59
- cardCvc: true,
60
- },
61
- },
62
- {
63
- cardNumber: '5523 3657 4787 2301',
64
- cardExpiry: '042027',
65
- cardCvc: '987',
66
- expected: {
67
- cardNumber: true,
68
- cardExpiry: true,
69
- cardCvc: true,
70
- },
71
- },
72
- {
73
- cardNumber: '4587517354648608',
74
- cardExpiry: '09/2026',
75
- cardCvc: '087',
76
- expected: {
77
- cardNumber: true,
78
- cardExpiry: true,
79
- cardCvc: true,
80
- },
81
- },
82
- ];
83
-
84
- export const invalidCardNumbers = ['4242424242424241', '5555 5555 5555 6666', '371449a635398431', '37144-963539-8431'];
85
- export const validCardNumbers = [
86
- '4443 2338 3330 3641',
87
- '4242424242424242',
88
- '5523 3657 4787 2301',
89
- '3671 5815 4264 223xxx',
90
- '4587517354648608',
91
- ];
92
-
93
- export const invalidExpiryDates = ['12/2020', '12/2021', '12/2022', '122023', '13/2025', '12/202', '1220', '12/2', '12/', '12', '1'];
94
- export const validExpiryDates = ['12/2024', '12/2025', '122026', '082027'];
95
-
96
- export const validCVCNumbers = ['123', '1234', '111', '12345', '123456', '123aaa', '1234aaa'];
97
- export const invalidCVCNumbers = ['32ee', 'aaaa', 'e12', '1e1', '1', '12', '24ee4'];
@@ -1,28 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "composite": true,
4
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.build.tsbuildinfo",
5
- "target": "ES2020",
6
- "useDefineForClassFields": true,
7
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
8
- "module": "ESNext",
9
- "skipLibCheck": true,
10
-
11
- /* Bundler mode */
12
- "moduleResolution": "bundler",
13
- "allowImportingTsExtensions": true,
14
- "resolveJsonModule": true,
15
- "isolatedModules": true,
16
- "moduleDetection": "force",
17
- "noEmit": true,
18
- "declaration": true,
19
- "jsx": "react-jsx",
20
-
21
- /* Linting */
22
- "strict": true,
23
- "noUnusedLocals": true,
24
- "noUnusedParameters": true,
25
- "noFallthroughCasesInSwitch": true
26
- },
27
- "include": ["lib"]
28
- }
package/tsconfig.json DELETED
@@ -1,11 +0,0 @@
1
- {
2
- "files": [],
3
- "references": [
4
- {
5
- "path": "./tsconfig.build.json"
6
- },
7
- {
8
- "path": "./tsconfig.node.json"
9
- }
10
- ]
11
- }
@@ -1,13 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "composite": true,
4
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
5
- "skipLibCheck": true,
6
- "module": "ESNext",
7
- "moduleResolution": "bundler",
8
- "allowSyntheticDefaultImports": true,
9
- "strict": true,
10
- "noEmit": true
11
- },
12
- "include": ["vite.config.ts"]
13
- }
package/vite.config.ts DELETED
@@ -1,36 +0,0 @@
1
- import { defineConfig } from 'vite'
2
- import { resolve } from 'path'
3
- import react from '@vitejs/plugin-react'
4
- import dts from 'vite-plugin-dts'
5
-
6
- // https://vitejs.dev/config/
7
- export default defineConfig({
8
- esbuild: {
9
- drop: process.env.NODE_ENV === 'development' ? [] : ['console', 'debugger'],
10
- },
11
- build: {
12
- copyPublicDir: false,
13
- lib: {
14
- entry: resolve(__dirname, 'lib/index.ts'),
15
- formats: ['es'],
16
- },
17
- rollupOptions: {
18
- external: ['react', 'react-dom', 'react/jsx-runtime'],
19
- output: {
20
- globals: {
21
- react: 'React',
22
- 'react-dom': 'ReactDOM',
23
- },
24
- assetFileNames: 'assets/[name][extname]',
25
- entryFileNames: '[name].js',
26
- },
27
- },
28
- },
29
- plugins: [
30
- react(),
31
- dts({
32
- rollupTypes: true,
33
- tsconfigPath: resolve(__dirname, 'tsconfig.build.json'),
34
- }),
35
- ],
36
- });