{"_id":"@amalaika/form-sdk-package","_rev":"5-f97b79a9d5b81b0b799a42bacef909e9","name":"@amalaika/form-sdk-package","dist-tags":{"latest":"1.2.1"},"versions":{"1.0.0":{"name":"@amalaika/form-sdk-package","version":"1.0.0","keywords":["event","form","sdk","registration","ticketing"],"author":{"name":"amalaika"},"license":"MIT","_id":"@amalaika/form-sdk-package@1.0.0","maintainers":[{"name":"aimemalaika","email":"malaikaime@gmail.com"}],"dist":{"shasum":"fb40f7dad25ce7d7a6802686187170ce9963b598","tarball":"https://registry.npmjs.org/@amalaika/form-sdk-package/-/form-sdk-package-1.0.0.tgz","fileCount":75,"integrity":"sha512-A/+shVF74vpCX64tlf5Fv4LTWXTOaeZwg4Lthxeba6Rc7Mr9TqLcU/wMmyHdyW0y2YftzCiCSLhdAQqYe7MTfg==","signatures":[{"sig":"MEUCIA6OPHwI2SwnpykYu0nPEP7Xjeldqazudkvhc5GpiI1fAiEAtUiQBPl29G2ZexlBBmbqVFMZFz1F1Ofv85H2UtzLO6I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186078},"main":"./dist/cjs/index.js","type":"module","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"gitHead":"aefab8c9d459e89446d923dca500dd170b43dc54","scripts":{"lint":"eslint src/","test":"jest","build":"npm run build:esm && npm run build:cjs","test:cov":"jest --coverage","build:cjs":"tsc -p tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json","build:esm":"tsc -p tsconfig.json","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"aimemalaika","email":"malaikaime@gmail.com"},"_npmVersion":"11.6.0","description":"Framework-agnostic SDK for event form integration — fetch forms, handle visibility, upload files, and submit.","directories":{},"_nodeVersion":"24.9.0","dependencies":{"rxjs":"^7.8.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","eslint":"^10.0.0","ts-jest":"^29.4.6","@eslint/js":"^10.0.1","typescript":"^5.0.0","@types/jest":"^30.0.0","typescript-eslint":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/form-sdk-package_1.0.0_1771359614907_0.6028564614925869","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@amalaika/form-sdk-package","version":"1.0.1","keywords":["event","form","sdk","registration","ticketing"],"author":{"name":"amalaika"},"license":"MIT","_id":"@amalaika/form-sdk-package@1.0.1","maintainers":[{"name":"aimemalaika","email":"malaikaime@gmail.com"}],"dist":{"shasum":"f7d19770b0831ee98fd4ea3b82feb153a723fd97","tarball":"https://registry.npmjs.org/@amalaika/form-sdk-package/-/form-sdk-package-1.0.1.tgz","fileCount":43,"integrity":"sha512-Xt/0TkdkYOxx4EiB+/ALrI6hPdgCFDPcxq9gLkej4XN1i1dKX6xunxC5jR2ujNHE4DHwIydch8I0iIUKtmD2qg==","signatures":[{"sig":"MEYCIQCYNugvVbiuYzbCh9Wm8HdKVJQEuErFSuZ66yD7sYDoAgIhAJo9XAXZ6z7PIsd0pclT8QrbJJ8wZSATuYqrK/EscIY7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119375},"main":"./dist/cjs/index.js","type":"module","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"gitHead":"bb788051030b9260e4334e4992a5619c652225b0","scripts":{"lint":"eslint src/","test":"jest","build":"npm run build:esm && npm run build:cjs","test:cov":"jest --coverage","build:cjs":"tsc -p tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json","build:esm":"tsc -p tsconfig.json","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"aimemalaika","email":"malaikaime@gmail.com"},"_npmVersion":"11.6.0","description":"Framework-agnostic SDK for event form integration — fetch forms, handle visibility, upload files, and submit.","directories":{},"_nodeVersion":"24.9.0","dependencies":{"rxjs":"^7.8.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","eslint":"^10.0.0","ts-jest":"^29.4.6","@eslint/js":"^10.0.1","typescript":"^5.0.0","@types/jest":"^30.0.0","typescript-eslint":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/form-sdk-package_1.0.1_1771567911804_0.9787920133807051","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@amalaika/form-sdk-package","version":"1.1.0","keywords":["event","form","sdk","registration","ticketing"],"author":{"name":"amalaika"},"license":"MIT","_id":"@amalaika/form-sdk-package@1.1.0","maintainers":[{"name":"aimemalaika","email":"malaikaime@gmail.com"}],"dist":{"shasum":"d3fd2c403a9dac4f4ed9b4544f02050cbe012a1f","tarball":"https://registry.npmjs.org/@amalaika/form-sdk-package/-/form-sdk-package-1.1.0.tgz","fileCount":89,"integrity":"sha512-EhvlQ4RC9V/y30/9o1d/S+pfuAutHeXLmmH9uB8kHdOP7w+mkrcXY5eOiSwGngz9EIOpKR1qgvD1nGvMf3lD9g==","signatures":[{"sig":"MEYCIQDLDVQg+C+lMVZ9Gl88yd/bPCzu+/8lbjVg2AkqxyGvyQIhAI01qyOmmzlaLUi4fh21ivXb652Xu2pD9OAH2AdpjnZN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":182624},"main":"./dist/cjs/index.js","type":"module","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"gitHead":"3e22ac53399638b1db8926857f7394b40b34248e","scripts":{"lint":"eslint src/","test":"jest","build":"npm run build:esm && npm run build:cjs","test:cov":"jest --coverage","build:cjs":"tsc -p tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json","build:esm":"tsc -p tsconfig.json","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"aimemalaika","email":"malaikaime@gmail.com"},"_npmVersion":"11.6.0","description":"Framework-agnostic SDK for event form integration — fetch forms, handle visibility, upload files, and submit.","directories":{},"_nodeVersion":"24.9.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","eslint":"^10.0.0","ts-jest":"^29.4.6","@eslint/js":"^10.0.1","typescript":"^5.0.0","@types/jest":"^30.0.0","typescript-eslint":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/form-sdk-package_1.1.0_1773386396438_0.1664045624789401","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@amalaika/form-sdk-package","version":"1.2.0","keywords":["event","form","sdk","registration","ticketing"],"author":{"name":"amalaika"},"license":"MIT","_id":"@amalaika/form-sdk-package@1.2.0","maintainers":[{"name":"aimemalaika","email":"malaikaime@gmail.com"}],"dist":{"shasum":"b6e32c507512b2e2ef7569594d20525415dcd91a","tarball":"https://registry.npmjs.org/@amalaika/form-sdk-package/-/form-sdk-package-1.2.0.tgz","fileCount":89,"integrity":"sha512-dOXeY7wDlZT4grbVdHK+NRPmx6hQW2JPlKTmZWg2FFNwxpiwfXpMkvW8T8bSJQuZTI9Qm4e8QK8KCam0Qkl4rw==","signatures":[{"sig":"MEUCIAuLHi2hk6GLIDLqTBTwfa7X8ilYrh5dQh7MwEn+Wh3HAiEAnbdJMGWd3fGZsgOU19kdG4u99bZufHeWNDslhSOVbN0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188020},"main":"./dist/cjs/index.js","type":"module","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"gitHead":"6f9f271d2c3eea419be283b53eeeb0b3711d4220","scripts":{"lint":"eslint src/","test":"jest","build":"npm run build:esm && npm run build:cjs","test:cov":"jest --coverage","build:cjs":"tsc -p tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json","build:esm":"tsc -p tsconfig.json","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"aimemalaika","email":"malaikaime@gmail.com"},"_npmVersion":"11.6.0","description":"Framework-agnostic SDK for event form integration — fetch forms, handle visibility, upload files, and submit.","directories":{},"_nodeVersion":"24.9.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","eslint":"^10.0.0","ts-jest":"^29.4.6","@eslint/js":"^10.0.1","typescript":"^5.0.0","@types/jest":"^30.0.0","typescript-eslint":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/form-sdk-package_1.2.0_1774108077331_0.26760042115958127","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@amalaika/form-sdk-package","version":"1.2.1","description":"Framework-agnostic SDK for event form integration — fetch forms, handle visibility, upload files, and submit.","type":"module","main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/esm/index.d.ts","exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}}},"scripts":{"build:esm":"tsc -p tsconfig.json","build:cjs":"tsc -p tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json","build":"npm run build:esm && npm run build:cjs","test":"jest","test:cov":"jest --coverage","lint":"eslint src/","prepublishOnly":"npm run lint && npm run test && npm run build"},"keywords":["event","form","sdk","registration","ticketing"],"author":{"name":"amalaika"},"license":"MIT","devDependencies":{"@eslint/js":"^10.0.1","@types/jest":"^30.0.0","eslint":"^10.0.0","jest":"^30.2.0","ts-jest":"^29.4.6","typescript":"^5.0.0","typescript-eslint":"^8.56.0"},"dependencies":{},"_id":"@amalaika/form-sdk-package@1.2.1","gitHead":"303afb274449e4d5621f19a0fbe7d84a4825de81","_nodeVersion":"24.9.0","_npmVersion":"11.6.0","dist":{"integrity":"sha512-Do/6dR0s8ffS4oW0ps5YV698ZV/KqUxzobPSQmwnDrkIvf3ero2677h7ure7TKLY9Aeuf0ii+eHLSzuWnaX4OA==","shasum":"9fd8262f0e2dc96479e0294c6f44ec8ef82f7d9d","tarball":"https://registry.npmjs.org/@amalaika/form-sdk-package/-/form-sdk-package-1.2.1.tgz","fileCount":89,"unpackedSize":188126,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDdbNp4Wzidw+L3sVYtN2y52vxeO65gl+6jadktBHXgWQIhAMCVuYlkQN4ANjeZvy7Y+u62doFwZXQOcP7WVR6neojT"}]},"_npmUser":{"name":"aimemalaika","email":"malaikaime@gmail.com"},"directories":{},"maintainers":[{"name":"aimemalaika","email":"malaikaime@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/form-sdk-package_1.2.1_1774110040845_0.820611001543738"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-17T20:20:14.852Z","modified":"2026-03-21T16:20:41.498Z","1.0.0":"2026-02-17T20:20:15.053Z","1.0.1":"2026-02-20T06:11:51.951Z","1.1.0":"2026-03-13T07:19:56.583Z","1.2.0":"2026-03-21T15:47:57.499Z","1.2.1":"2026-03-21T16:20:41.055Z"},"author":{"name":"amalaika"},"license":"MIT","keywords":["event","form","sdk","registration","ticketing"],"description":"Framework-agnostic SDK for event form integration — fetch forms, handle visibility, upload files, and submit.","maintainers":[{"name":"aimemalaika","email":"malaikaime@gmail.com"}],"readme":"# @amalaika/form-sdk-package\n\nFramework-agnostic SDK for event form integration — fetch forms, handle visibility, upload files, submit, and process payments.\n\n**Zero runtime dependencies.** Works with any JavaScript framework or vanilla JS.\n\n## Installation\n\n```bash\nnpm install @amalaika/form-sdk-package\n```\n\n## Quick Start\n\n```ts\nimport { EventFormClient, FormStateManager, validateForm, getAllFields } from \"@amalaika/form-sdk-package\";\n\n// 1. Create a client\nconst client = new EventFormClient({\n  apiKey: \"Am_550e8400-...\",\n  resourceType: \"ticketing\",\n});\n\n// 2. Fetch tickets and forms\nconst tickets = await client.fetchTickets();\nconst form = await client.fetchForm(tickets[0].id);\n\n// 3. Manage form state\nconst fields = getAllFields(form.schema);\nconst state = new FormStateManager(fields);\nstate.setValue(\"email\", \"user@example.com\");\n\n// 4. Validate and submit\nconst errors = validateForm(fields, state.getValues());\nconst allValid = Object.values(errors).every((r) => r.valid);\n\nif (allValid) {\n  const { submission, integrations } = await client.submitForm(form, state.getSubmissionData(), {\n    resourceId: tickets[0].id,\n    attendanceType: \"IN_PERSON\",\n  });\n}\n```\n\n## Configuration\n\n```ts\nconst client = new EventFormClient({\n  // Required\n  apiKey: \"Am_550e8400-...\",\n  resourceType: \"ticketing\", // \"ticketing\" | \"accommodation\" | \"exhibition\"\n\n  // Optional\n  apiBaseUrl: \"https://api.example.com\",   // defaults to production\n  locale: \"en\",                             // default locale for requests\n  origin: \"https://myapp.com\",             // Origin header\n  timeout: 30000,                           // request timeout (ms)\n  noCache: false,                           // send Cache-Control: no-cache\n  mastercardCheckoutUrl: \"https://...\",     // checkout script URL override\n  merchantName: \"My Event\",                // shown in payment UI\n\n  // Retry failed requests\n  retry: { maxRetries: 3, delay: 1000 },\n\n  // Cache GET responses\n  cache: { enabled: true, ttl: 60000 },\n\n  // Custom error messages\n  errorMessages: {\n    fetchTickets: \"Could not load tickets\",\n    submitForm: \"Submission failed\",\n  },\n\n  // Interceptors\n  interceptors: {\n    request: (config) => { /* modify request */ return config; },\n    response: (data) => { /* transform response */ return data; },\n    error: (err) => { /* handle error */ return err; },\n  },\n});\n```\n\n## Client Methods\n\n### Tickets\n\n```ts\n// Fetch all tickets (with optional locale/name filter)\nconst tickets = await client.fetchTickets({ locale: \"fr\", name: \"VIP\" });\n\n// Fetch a single ticket by ID\nconst ticket = await client.fetchTicketById(42);\n\n// Fetch a public ticket (no auth required)\nconst publicTicket = await client.fetchPublicTicket(42, \"en\");\n```\n\n### Languages & Forms\n\n```ts\n// Fetch available languages\nconst languages = await client.fetchLanguages(); // [\"en\", \"fr\", \"rw\"]\n\n// Fetch form schema for a ticket\nconst form = await client.fetchForm(ticketId, \"en\");\n```\n\n### File Uploads\n\n```ts\n// Two-step upload: authorize, then upload\nconst token = await client.authorizeUpload(formId, fieldId, file);\nconst fileUrl = await client.uploadFile(formId, token, file);\n```\n\n### Form Submission\n\n```ts\nconst { submission, integrations } = await client.submitForm(\n  form,\n  formValues,\n  {\n    resourceId: ticketId,\n    attendanceType: \"IN_PERSON\", // \"VIRTUAL\" | \"IN_PERSON\" | \"HYBRID\"\n    containerId: \"#payment-container\", // CSS selector for payment UI\n  },\n);\n\n// submission: SubmissionResponse with id, formId, payment info, etc.\n// integrations: IntegrationResult[] from any payment handlers\n```\n\n### Locale & Cache\n\n```ts\nclient.setLocale(\"fr\");\nclient.getLocale(); // \"fr\"\nclient.clearCache();\n```\n\n### Payment\n\n```ts\n// Preload the Mastercard checkout script before it's needed\nawait client.preloadCheckoutScript();\n```\n\n## FormStateManager\n\nManages form field values, dirty/touched tracking, visibility, and change subscriptions.\n\n```ts\nimport { FormStateManager, getAllFields } from \"@amalaika/form-sdk-package\";\n\nconst fields = getAllFields(form.schema);\nconst state = new FormStateManager(fields);\n\n// Get/set values\nstate.setValue(\"name\", \"Alice\");\nstate.getValue(\"name\"); // \"Alice\"\nstate.setValues({ name: \"Alice\", email: \"alice@example.com\" });\nstate.getValues(); // { name: \"Alice\", email: \"alice@example.com\" }\n\n// Track user interaction\nstate.touchField(\"email\");\nstate.isTouched(\"email\"); // true\nstate.isDirty();          // true\nstate.getDirtyFields();   // Set([\"name\", \"email\"])\n\n// Visibility-aware submission data (excludes hidden fields)\nconst data = state.getSubmissionData();\n\n// Get visible field IDs based on conditional logic\nconst visible = state.getVisibleFieldIds();\n\n// Resolve active payment integrations\nconst integrations = state.getActiveIntegrations();\n\n// Subscribe to changes\nconst unsubscribe = state.onChange(({ fieldId, value, values }) => {\n  console.log(`${fieldId} changed to`, value);\n});\n\n// Reset to initial state\nstate.reset();\n```\n\n## Validation\n\n```ts\nimport { validateField, validateForm, getAllFields } from \"@amalaika/form-sdk-package\";\n\n// Validate a single field\nconst result = validateField(field, value);\n// { valid: true } or { valid: false, error: \"This field is required\" }\n\n// Validate all visible fields at once\nconst results = validateForm(fields, values);\n// { fieldId: { valid: boolean, error?: string }, ... }\n```\n\nSupports: `required`, `minLength`, `maxLength`, `min`, `max`, `pattern`, `accept` (file types), `maxSize` (file size).\n\n## Utility Functions\n\n```ts\nimport {\n  getAllFields,\n  isFieldVisible,\n  getVisibleFieldIds,\n  hasIntegration,\n  getIntegrationMethod,\n  resolveIntegrations,\n} from \"@amalaika/form-sdk-package\";\n\n// Flatten fields from schema (handles flat and step-based layouts)\nconst fields = getAllFields(form.schema);\n\n// Conditional visibility\nconst visible = isFieldVisible(field, formValues, allFields);\nconst visibleIds = getVisibleFieldIds(fields, formValues);\n\n// Payment integrations\nconst hasPay = hasIntegration(field);\nconst method = getIntegrationMethod(field, \"CARD\"); // \"mastercard_payment_gateway\"\nconst active = resolveIntegrations(fields, formValues);\n```\n\n## Mastercard Payment Integration\n\nThe SDK handles Mastercard Hosted Checkout via an embedded page flow:\n\n1. Submit the form — the API returns a `payment` object with `session_id` and `order_id`\n2. The SDK loads the Mastercard checkout script and renders the embedded payment UI in a container element\n3. On successful payment, the SDK confirms the payment with the backend\n4. The result is returned as part of the `integrations` array\n\n```ts\n// Provide a container element for the payment UI\nconst { submission, integrations } = await client.submitForm(form, values, {\n  resourceId: ticketId,\n  attendanceType: \"IN_PERSON\",\n  containerId: \"#payment-container\", // must exist in the DOM\n});\n\n// Check payment result\nfor (const result of integrations) {\n  if (result.success) {\n    // Payment completed\n  } else {\n    // result.error contains the error message\n    // result.data may contain additional details\n  }\n}\n```\n\n## TypeScript\n\nAll types are exported:\n\n```ts\nimport type {\n  EventFormConfig,\n  FormData,\n  FormSchema,\n  FieldDefinition,\n  FieldOption,\n  StepDefinition,\n  Ticket,\n  TicketTranslation,\n  ValidationResult,\n  SubmissionResponse,\n  PaymentInfo,\n  IntegrationResult,\n  ResolvedIntegration,\n  ApiResponse,\n  ErrorMessages,\n} from \"@amalaika/form-sdk-package\";\n```\n\n## i18n\n\nThe SDK supports `en`, `fr`, and `rw` locales for error messages. Pass a locale to the client constructor or to individual methods:\n\n```ts\nconst client = new EventFormClient({ apiKey: \"...\", resourceType: \"ticketing\", locale: \"fr\" });\n// or per-request:\nconst tickets = await client.fetchTickets({ locale: \"rw\" });\n```\n\n## Build\n\nThe package ships ESM and CJS builds with TypeScript declarations:\n\n```bash\nnpm run build      # Build both ESM and CJS\nnpm test           # Run tests (212 tests, 100% coverage)\n```\n\n## License\n\nISC\n","readmeFilename":"README.md"}