@exxili/capacitor-nfc 0.0.11 → 0.0.12

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.
@@ -4,17 +4,49 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var core = require('@capacitor/core');
6
6
 
7
+ var _a, _b;
7
8
  const NFCPlug = core.registerPlugin('NFC', {
8
- web: () => Promise.resolve().then(function () { return web; }).then(m => new m.NFCWeb()),
9
+ web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.NFCWeb()),
9
10
  });
10
11
  const NFC = {
11
12
  isSupported: NFCPlug.isSupported.bind(NFCPlug),
12
13
  startScan: NFCPlug.startScan.bind(NFCPlug),
14
+ cancelScan: (_b = (_a = NFCPlug.cancelScan) === null || _a === void 0 ? void 0 : _a.bind(NFCPlug)) !== null && _b !== void 0 ? _b : (async () => {
15
+ /* Android no-op */
16
+ }),
13
17
  cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),
14
- onRead: (func) => NFC.wrapperListeners.push(func),
15
- onWrite: (func) => NFCPlug.addListener(`nfcWriteSuccess`, func),
18
+ onRead: (func) => {
19
+ NFC.wrapperListeners.push(func);
20
+ // Return unsubscribe function
21
+ return () => {
22
+ NFC.wrapperListeners = NFC.wrapperListeners.filter((l) => l !== func);
23
+ };
24
+ },
25
+ onWrite: (func) => {
26
+ let handle;
27
+ NFCPlug.addListener(`nfcWriteSuccess`, func).then((h) => (handle = h));
28
+ return () => {
29
+ var _a;
30
+ try {
31
+ (_a = handle === null || handle === void 0 ? void 0 : handle.remove) === null || _a === void 0 ? void 0 : _a.call(handle);
32
+ }
33
+ catch (_b) {
34
+ /* empty */
35
+ }
36
+ };
37
+ },
16
38
  onError: (errorFn) => {
17
- NFCPlug.addListener(`nfcError`, errorFn);
39
+ let handle;
40
+ NFCPlug.addListener(`nfcError`, errorFn).then((h) => (handle = h));
41
+ return () => {
42
+ var _a;
43
+ try {
44
+ (_a = handle === null || handle === void 0 ? void 0 : handle.remove) === null || _a === void 0 ? void 0 : _a.call(handle);
45
+ }
46
+ catch (_b) {
47
+ /* empty */
48
+ }
49
+ };
18
50
  },
19
51
  removeAllListeners: (eventName) => {
20
52
  NFC.wrapperListeners = [];
@@ -23,63 +55,194 @@ const NFC = {
23
55
  wrapperListeners: [],
24
56
  async writeNDEF(options) {
25
57
  var _a;
58
+ // Helper encoders for well-known record types (only applied to string payloads)
59
+ const buildTextPayload = (text, lang = 'en') => {
60
+ const langBytes = Array.from(new TextEncoder().encode(lang));
61
+ const textBytes = Array.from(new TextEncoder().encode(text));
62
+ const status = langBytes.length & 0x3f; // UTF-8 encoding, language length (<= 63)
63
+ return [status, ...langBytes, ...textBytes];
64
+ };
65
+ const buildUriPayload = (uri, prefixCode = 0x00) => {
66
+ const uriBytes = Array.from(new TextEncoder().encode(uri));
67
+ return [prefixCode, ...uriBytes];
68
+ };
69
+ const recordsArray = (_a = options === null || options === void 0 ? void 0 : options.records) !== null && _a !== void 0 ? _a : [];
70
+ if (recordsArray.length === 0)
71
+ throw new Error('At least one NDEF record is required');
26
72
  const ndefMessage = {
27
- records: (_a = options === null || options === void 0 ? void 0 : options.records.map((record) => {
28
- const payload = typeof record.payload === 'string'
29
- ? Array.from(new TextEncoder().encode(record.payload))
30
- : Array.isArray(record.payload)
31
- ? record.payload
32
- : record.payload instanceof Uint8Array
33
- ? Array.from(record.payload)
34
- : null;
73
+ records: recordsArray.map((record) => {
74
+ let payload = null;
75
+ if (typeof record.payload === 'string') {
76
+ // Apply spec-compliant formatting only for Well Known Text (T) & URI (U) types.
77
+ if (record.type === 'T') {
78
+ payload = buildTextPayload(record.payload);
79
+ }
80
+ else if (record.type === 'U') {
81
+ payload = buildUriPayload(record.payload);
82
+ }
83
+ else {
84
+ // Generic string: raw UTF-8 bytes (no extra framing)
85
+ payload = Array.from(new TextEncoder().encode(record.payload));
86
+ }
87
+ }
88
+ else if (Array.isArray(record.payload)) {
89
+ // Assume already raw bytes; do NOT modify
90
+ payload = record.payload;
91
+ }
92
+ else if (record.payload instanceof Uint8Array) {
93
+ payload = Array.from(record.payload);
94
+ }
35
95
  if (!payload)
36
- throw 'Unsupported payload type';
37
- return {
38
- type: record.type,
39
- payload,
40
- };
41
- })) !== null && _a !== void 0 ? _a : [],
96
+ throw new Error('Unsupported payload type');
97
+ return { type: record.type, payload };
98
+ }),
42
99
  };
43
100
  await NFCPlug.writeNDEF(ndefMessage);
44
101
  },
45
102
  };
46
- const decodeBase64 = (base64Payload) => {
47
- return atob(base64Payload)
48
- .split('')
49
- .map((char) => char.charCodeAt(0));
103
+ // Decode a base64 string into a Uint8Array (browser-safe). Existing code used atob already.
104
+ const decodeBase64ToBytes = (base64Payload) => {
105
+ const bin = atob(base64Payload);
106
+ const out = new Uint8Array(bin.length);
107
+ for (let i = 0; i < bin.length; i++)
108
+ out[i] = bin.charCodeAt(i);
109
+ return out;
110
+ };
111
+ // Parse NFC Forum "Text" (Well Known 'T') records according to spec.
112
+ const decodeTextRecord = (bytes) => {
113
+ if (bytes.length === 0)
114
+ return '';
115
+ const status = bytes[0];
116
+ const isUTF16 = (status & 0x80) !== 0; // Bit 7 indicates encoding
117
+ const langLength = status & 0x3f; // Bits 0-5 language code length
118
+ if (1 + langLength > bytes.length)
119
+ return ''; // Corrupt
120
+ const textBytes = bytes.slice(1 + langLength);
121
+ try {
122
+ const decoder = new TextDecoder(isUTF16 ? 'utf-16' : 'utf-8');
123
+ return decoder.decode(textBytes);
124
+ }
125
+ catch (_a) {
126
+ // Fallback: naive ASCII
127
+ return Array.from(textBytes)
128
+ .map((b) => String.fromCharCode(b))
129
+ .join('');
130
+ }
131
+ };
132
+ // Basic URI prefix table for Well Known 'U' records (optional convenience)
133
+ const URI_PREFIX = [
134
+ '',
135
+ 'http://www.',
136
+ 'https://www.',
137
+ 'http://',
138
+ 'https://',
139
+ 'tel:',
140
+ 'mailto:',
141
+ 'ftp://anonymous:anonymous@',
142
+ 'ftp://ftp.',
143
+ 'ftps://',
144
+ 'sftp://',
145
+ 'smb://',
146
+ 'nfs://',
147
+ 'ftp://',
148
+ 'dav://',
149
+ 'news:',
150
+ 'telnet://',
151
+ 'imap:',
152
+ 'rtsp://',
153
+ 'urn:',
154
+ 'pop:',
155
+ 'sip:',
156
+ 'sips:',
157
+ 'tftp:',
158
+ 'btspp://',
159
+ 'btl2cap://',
160
+ 'btgoep://',
161
+ 'tcpobex://',
162
+ 'irdaobex://',
163
+ 'file://',
164
+ 'urn:epc:id:',
165
+ 'urn:epc:tag:',
166
+ 'urn:epc:pat:',
167
+ 'urn:epc:raw:',
168
+ 'urn:epc:',
169
+ 'urn:nfc:',
170
+ ];
171
+ const decodeUriRecord = (bytes) => {
172
+ if (bytes.length === 0)
173
+ return '';
174
+ const prefixIndex = bytes[0];
175
+ const prefix = URI_PREFIX[prefixIndex] || '';
176
+ const remainder = bytes.slice(1);
177
+ try {
178
+ return prefix + new TextDecoder('utf-8').decode(remainder);
179
+ }
180
+ catch (_a) {
181
+ return (prefix +
182
+ Array.from(remainder)
183
+ .map((b) => String.fromCharCode(b))
184
+ .join(''));
185
+ }
186
+ };
187
+ const toStringPayload = (recordType, bytes) => {
188
+ // Well Known Text
189
+ if (recordType === 'T')
190
+ return decodeTextRecord(bytes);
191
+ // Well Known URI
192
+ if (recordType === 'U')
193
+ return decodeUriRecord(bytes);
194
+ // Default: attempt UTF-8 decode
195
+ try {
196
+ return new TextDecoder('utf-8').decode(bytes);
197
+ }
198
+ catch (_a) {
199
+ return Array.from(bytes)
200
+ .map((c) => String.fromCharCode(c))
201
+ .join('');
202
+ }
50
203
  };
51
204
  const mapPayloadTo = (type, data) => {
52
205
  return {
53
- messages: data.messages.map(message => ({
54
- records: message.records.map(record => ({
55
- type: record.type,
56
- payload: type === "b64"
57
- ? record.payload
58
- : type === "string"
59
- ? decodeBase64(record.payload)
60
- : type === "uint8Array"
61
- ? new Uint8Array(decodeBase64(record.payload))
62
- : type === "numberArray"
63
- ? Array.from(decodeBase64(record.payload))
64
- : record.payload
65
- }))
66
- }))
206
+ messages: data.messages.map((message) => ({
207
+ records: message.records.map((record) => {
208
+ const bytes = decodeBase64ToBytes(record.payload);
209
+ let payload;
210
+ switch (type) {
211
+ case 'b64':
212
+ payload = record.payload; // original base64 string
213
+ break;
214
+ case 'uint8Array':
215
+ payload = bytes;
216
+ break;
217
+ case 'numberArray':
218
+ payload = Array.from(bytes);
219
+ break;
220
+ case 'string':
221
+ payload = toStringPayload(record.type, bytes);
222
+ break;
223
+ default:
224
+ payload = record.payload;
225
+ }
226
+ return { type: record.type, payload };
227
+ }),
228
+ })),
229
+ tagInfo: data.tagInfo, // Include tag information
67
230
  };
68
231
  };
69
- NFCPlug.addListener(`nfcTag`, data => {
232
+ NFCPlug.addListener(`nfcTag`, (data) => {
70
233
  const wrappedData = {
71
234
  base64() {
72
- return mapPayloadTo("b64", data);
235
+ return mapPayloadTo('b64', data);
73
236
  },
74
237
  string() {
75
- return mapPayloadTo("string", data);
238
+ return mapPayloadTo('string', data);
76
239
  },
77
240
  uint8Array() {
78
- return mapPayloadTo("uint8Array", data);
241
+ return mapPayloadTo('uint8Array', data);
79
242
  },
80
243
  numberArray() {
81
- return mapPayloadTo("numberArray", data);
82
- }
244
+ return mapPayloadTo('numberArray', data);
245
+ },
83
246
  };
84
247
  for (const listener of NFC.wrapperListeners) {
85
248
  listener(wrappedData);
@@ -87,32 +250,20 @@ NFCPlug.addListener(`nfcTag`, data => {
87
250
  });
88
251
 
89
252
  class NFCWeb extends core.WebPlugin {
90
- constructor() {
91
- super(...arguments);
92
- this.wrapperListeners = [];
93
- }
94
- isSupported() {
95
- return Promise.resolve({ supported: false });
96
- }
97
- startScan() {
98
- return Promise.reject(new Error('NFC is not supported on web'));
99
- }
100
- cancelWriteAndroid() {
101
- return Promise.reject(new Error('NFC is not supported on web'));
253
+ async isSupported() {
254
+ return { supported: false };
102
255
  }
103
- writeNDEF() {
104
- return Promise.reject(new Error('NFC is not supported on web'));
256
+ async startScan() {
257
+ throw new Error('NFC is not supported on web');
105
258
  }
106
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
107
- onRead(_func) {
108
- return Promise.reject(new Error('NFC is not supported on web'));
259
+ async cancelScan() {
260
+ throw new Error('NFC is not supported on web');
109
261
  }
110
- onWrite() {
111
- return Promise.reject(new Error('NFC is not supported on web'));
262
+ async cancelWriteAndroid() {
263
+ throw new Error('NFC is not supported on web');
112
264
  }
113
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
114
- onError(_errorFn) {
115
- return Promise.reject(new Error('NFC is not supported on web'));
265
+ async writeNDEF() {
266
+ throw new Error('NFC is not supported on web');
116
267
  }
117
268
  }
118
269
 
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst NFCPlug = registerPlugin('NFC', {\n web: () => import('./web').then(m => new m.NFCWeb()),\n});\nexport * from './definitions';\nexport const NFC = {\n isSupported: NFCPlug.isSupported.bind(NFCPlug),\n startScan: NFCPlug.startScan.bind(NFCPlug),\n cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),\n onRead: (func) => NFC.wrapperListeners.push(func),\n onWrite: (func) => NFCPlug.addListener(`nfcWriteSuccess`, func),\n onError: (errorFn) => {\n NFCPlug.addListener(`nfcError`, errorFn);\n },\n removeAllListeners: (eventName) => {\n NFC.wrapperListeners = [];\n return NFCPlug.removeAllListeners(eventName);\n },\n wrapperListeners: [],\n async writeNDEF(options) {\n var _a;\n const ndefMessage = {\n records: (_a = options === null || options === void 0 ? void 0 : options.records.map((record) => {\n const payload = typeof record.payload === 'string'\n ? Array.from(new TextEncoder().encode(record.payload))\n : Array.isArray(record.payload)\n ? record.payload\n : record.payload instanceof Uint8Array\n ? Array.from(record.payload)\n : null;\n if (!payload)\n throw 'Unsupported payload type';\n return {\n type: record.type,\n payload,\n };\n })) !== null && _a !== void 0 ? _a : [],\n };\n await NFCPlug.writeNDEF(ndefMessage);\n },\n};\nconst decodeBase64 = (base64Payload) => {\n return atob(base64Payload)\n .split('')\n .map((char) => char.charCodeAt(0));\n};\nconst mapPayloadTo = (type, data) => {\n return {\n messages: data.messages.map(message => ({\n records: message.records.map(record => ({\n type: record.type,\n payload: type === \"b64\"\n ? record.payload\n : type === \"string\"\n ? decodeBase64(record.payload)\n : type === \"uint8Array\"\n ? new Uint8Array(decodeBase64(record.payload))\n : type === \"numberArray\"\n ? Array.from(decodeBase64(record.payload))\n : record.payload\n }))\n }))\n };\n};\nNFCPlug.addListener(`nfcTag`, data => {\n const wrappedData = {\n base64() {\n return mapPayloadTo(\"b64\", data);\n },\n string() {\n return mapPayloadTo(\"string\", data);\n },\n uint8Array() {\n return mapPayloadTo(\"uint8Array\", data);\n },\n numberArray() {\n return mapPayloadTo(\"numberArray\", data);\n }\n };\n for (const listener of NFC.wrapperListeners) {\n listener(wrappedData);\n }\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class NFCWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.wrapperListeners = [];\n }\n isSupported() {\n return Promise.resolve({ supported: false });\n }\n startScan() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n cancelWriteAndroid() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n writeNDEF() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onRead(_func) {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n onWrite() {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onError(_errorFn) {\n return Promise.reject(new Error('NFC is not supported on web'));\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["var _a, _b;\nimport { registerPlugin } from '@capacitor/core';\nconst NFCPlug = registerPlugin('NFC', {\n web: () => import('./web').then((m) => new m.NFCWeb()),\n});\nexport * from './definitions';\nexport const NFC = {\n isSupported: NFCPlug.isSupported.bind(NFCPlug),\n startScan: NFCPlug.startScan.bind(NFCPlug),\n cancelScan: (_b = (_a = NFCPlug.cancelScan) === null || _a === void 0 ? void 0 : _a.bind(NFCPlug)) !== null && _b !== void 0 ? _b : (async () => {\n /* Android no-op */\n }),\n cancelWriteAndroid: NFCPlug.cancelWriteAndroid.bind(NFCPlug),\n onRead: (func) => {\n NFC.wrapperListeners.push(func);\n // Return unsubscribe function\n return () => {\n NFC.wrapperListeners = NFC.wrapperListeners.filter((l) => l !== func);\n };\n },\n onWrite: (func) => {\n let handle;\n NFCPlug.addListener(`nfcWriteSuccess`, func).then((h) => (handle = h));\n return () => {\n var _a;\n try {\n (_a = handle === null || handle === void 0 ? void 0 : handle.remove) === null || _a === void 0 ? void 0 : _a.call(handle);\n }\n catch (_b) {\n /* empty */\n }\n };\n },\n onError: (errorFn) => {\n let handle;\n NFCPlug.addListener(`nfcError`, errorFn).then((h) => (handle = h));\n return () => {\n var _a;\n try {\n (_a = handle === null || handle === void 0 ? void 0 : handle.remove) === null || _a === void 0 ? void 0 : _a.call(handle);\n }\n catch (_b) {\n /* empty */\n }\n };\n },\n removeAllListeners: (eventName) => {\n NFC.wrapperListeners = [];\n return NFCPlug.removeAllListeners(eventName);\n },\n wrapperListeners: [],\n async writeNDEF(options) {\n var _a;\n // Helper encoders for well-known record types (only applied to string payloads)\n const buildTextPayload = (text, lang = 'en') => {\n const langBytes = Array.from(new TextEncoder().encode(lang));\n const textBytes = Array.from(new TextEncoder().encode(text));\n const status = langBytes.length & 0x3f; // UTF-8 encoding, language length (<= 63)\n return [status, ...langBytes, ...textBytes];\n };\n const buildUriPayload = (uri, prefixCode = 0x00) => {\n const uriBytes = Array.from(new TextEncoder().encode(uri));\n return [prefixCode, ...uriBytes];\n };\n const recordsArray = (_a = options === null || options === void 0 ? void 0 : options.records) !== null && _a !== void 0 ? _a : [];\n if (recordsArray.length === 0)\n throw new Error('At least one NDEF record is required');\n const ndefMessage = {\n records: recordsArray.map((record) => {\n let payload = null;\n if (typeof record.payload === 'string') {\n // Apply spec-compliant formatting only for Well Known Text (T) & URI (U) types.\n if (record.type === 'T') {\n payload = buildTextPayload(record.payload);\n }\n else if (record.type === 'U') {\n payload = buildUriPayload(record.payload);\n }\n else {\n // Generic string: raw UTF-8 bytes (no extra framing)\n payload = Array.from(new TextEncoder().encode(record.payload));\n }\n }\n else if (Array.isArray(record.payload)) {\n // Assume already raw bytes; do NOT modify\n payload = record.payload;\n }\n else if (record.payload instanceof Uint8Array) {\n payload = Array.from(record.payload);\n }\n if (!payload)\n throw new Error('Unsupported payload type');\n return { type: record.type, payload };\n }),\n };\n await NFCPlug.writeNDEF(ndefMessage);\n },\n};\n// Decode a base64 string into a Uint8Array (browser-safe). Existing code used atob already.\nconst decodeBase64ToBytes = (base64Payload) => {\n const bin = atob(base64Payload);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++)\n out[i] = bin.charCodeAt(i);\n return out;\n};\n// Parse NFC Forum \"Text\" (Well Known 'T') records according to spec.\nconst decodeTextRecord = (bytes) => {\n if (bytes.length === 0)\n return '';\n const status = bytes[0];\n const isUTF16 = (status & 0x80) !== 0; // Bit 7 indicates encoding\n const langLength = status & 0x3f; // Bits 0-5 language code length\n if (1 + langLength > bytes.length)\n return ''; // Corrupt\n const textBytes = bytes.slice(1 + langLength);\n try {\n const decoder = new TextDecoder(isUTF16 ? 'utf-16' : 'utf-8');\n return decoder.decode(textBytes);\n }\n catch (_a) {\n // Fallback: naive ASCII\n return Array.from(textBytes)\n .map((b) => String.fromCharCode(b))\n .join('');\n }\n};\n// Basic URI prefix table for Well Known 'U' records (optional convenience)\nconst URI_PREFIX = [\n '',\n 'http://www.',\n 'https://www.',\n 'http://',\n 'https://',\n 'tel:',\n 'mailto:',\n 'ftp://anonymous:anonymous@',\n 'ftp://ftp.',\n 'ftps://',\n 'sftp://',\n 'smb://',\n 'nfs://',\n 'ftp://',\n 'dav://',\n 'news:',\n 'telnet://',\n 'imap:',\n 'rtsp://',\n 'urn:',\n 'pop:',\n 'sip:',\n 'sips:',\n 'tftp:',\n 'btspp://',\n 'btl2cap://',\n 'btgoep://',\n 'tcpobex://',\n 'irdaobex://',\n 'file://',\n 'urn:epc:id:',\n 'urn:epc:tag:',\n 'urn:epc:pat:',\n 'urn:epc:raw:',\n 'urn:epc:',\n 'urn:nfc:',\n];\nconst decodeUriRecord = (bytes) => {\n if (bytes.length === 0)\n return '';\n const prefixIndex = bytes[0];\n const prefix = URI_PREFIX[prefixIndex] || '';\n const remainder = bytes.slice(1);\n try {\n return prefix + new TextDecoder('utf-8').decode(remainder);\n }\n catch (_a) {\n return (prefix +\n Array.from(remainder)\n .map((b) => String.fromCharCode(b))\n .join(''));\n }\n};\nconst toStringPayload = (recordType, bytes) => {\n // Well Known Text\n if (recordType === 'T')\n return decodeTextRecord(bytes);\n // Well Known URI\n if (recordType === 'U')\n return decodeUriRecord(bytes);\n // Default: attempt UTF-8 decode\n try {\n return new TextDecoder('utf-8').decode(bytes);\n }\n catch (_a) {\n return Array.from(bytes)\n .map((c) => String.fromCharCode(c))\n .join('');\n }\n};\nconst mapPayloadTo = (type, data) => {\n return {\n messages: data.messages.map((message) => ({\n records: message.records.map((record) => {\n const bytes = decodeBase64ToBytes(record.payload);\n let payload;\n switch (type) {\n case 'b64':\n payload = record.payload; // original base64 string\n break;\n case 'uint8Array':\n payload = bytes;\n break;\n case 'numberArray':\n payload = Array.from(bytes);\n break;\n case 'string':\n payload = toStringPayload(record.type, bytes);\n break;\n default:\n payload = record.payload;\n }\n return { type: record.type, payload };\n }),\n })),\n tagInfo: data.tagInfo, // Include tag information\n };\n};\nNFCPlug.addListener(`nfcTag`, (data) => {\n const wrappedData = {\n base64() {\n return mapPayloadTo('b64', data);\n },\n string() {\n return mapPayloadTo('string', data);\n },\n uint8Array() {\n return mapPayloadTo('uint8Array', data);\n },\n numberArray() {\n return mapPayloadTo('numberArray', data);\n },\n };\n for (const listener of NFC.wrapperListeners) {\n listener(wrappedData);\n }\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class NFCWeb extends WebPlugin {\n async isSupported() {\n return { supported: false };\n }\n async startScan() {\n throw new Error('NFC is not supported on web');\n }\n async cancelScan() {\n throw new Error('NFC is not supported on web');\n }\n async cancelWriteAndroid() {\n throw new Error('NFC is not supported on web');\n }\n async writeNDEF() {\n throw new Error('NFC is not supported on web');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}