@narcisbodea/smstunnel-sdk 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/angular/index.d.mts +144 -0
- package/dist/angular/index.d.ts +144 -0
- package/dist/angular/index.js +166 -0
- package/dist/angular/index.js.map +1 -0
- package/dist/angular/index.mjs +140 -0
- package/dist/angular/index.mjs.map +1 -0
- package/dist/index.d.mts +33 -1
- package/dist/index.d.ts +33 -1
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41 -0
- package/dist/index.mjs.map +1 -1
- package/dist/node/index.d.mts +228 -0
- package/dist/node/index.d.ts +228 -0
- package/dist/node/index.js +208 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/index.mjs +183 -0
- package/dist/node/index.mjs.map +1 -0
- package/dist/react/index.d.mts +4 -0
- package/dist/react/index.d.ts +4 -0
- package/dist/react/index.js +64 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +64 -1
- package/dist/react/index.mjs.map +1 -1
- package/dist/server/index.d.mts +86 -1
- package/dist/server/index.d.ts +86 -1
- package/dist/server/index.js +88 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +88 -0
- package/dist/server/index.mjs.map +1 -1
- package/dist/vue/index.d.mts +4 -0
- package/dist/vue/index.d.ts +4 -0
- package/dist/vue/index.js +52 -1
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/index.mjs +52 -1
- package/dist/vue/index.mjs.map +1 -1
- package/package.json +19 -4
package/dist/vue/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/vue/SmsTunnelPairing.ts","../../src/vue/useSmsTunnel.ts","../../src/vue/QrCodeCanvas.ts","../../src/shared/labels.ts"],"sourcesContent":["import { defineComponent, ref, watch, h, type PropType } from 'vue';\r\nimport { useSmsTunnel } from './useSmsTunnel';\r\nimport { QrCodeCanvas } from './QrCodeCanvas';\r\nimport { EN_LABELS, type SmsTunnelLabels } from '../shared/labels';\r\n\r\n// Inline styles (same as React version - no CSS dependency)\r\nconst s = {\r\n container: { fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif', fontSize: '14px', color: '#1f2937' },\r\n card: { border: '1px solid #e5e7eb', borderRadius: '12px', padding: '24px', backgroundColor: '#ffffff' },\r\n title: { fontSize: '18px', fontWeight: '600', color: '#111827', marginBottom: '4px' },\r\n subtitle: { fontSize: '13px', color: '#6b7280', marginBottom: '20px' },\r\n section: { border: '1px solid #e5e7eb', borderRadius: '8px', padding: '16px', marginBottom: '16px' },\r\n label: { display: 'block', fontSize: '13px', fontWeight: '500', color: '#374151', marginBottom: '6px' },\r\n inputRow: { display: 'flex', gap: '8px' },\r\n input: { flex: '1', border: '1px solid #d1d5db', borderRadius: '8px', padding: '6px 12px', fontSize: '13px', outline: 'none' },\r\n button: { padding: '6px 16px', borderRadius: '8px', border: 'none', fontSize: '13px', fontWeight: '500', cursor: 'pointer', backgroundColor: '#4f46e5', color: '#ffffff' },\r\n buttonSecondary: { padding: '6px 16px', borderRadius: '8px', border: '1px solid #d1d5db', fontSize: '13px', fontWeight: '500', cursor: 'pointer', backgroundColor: '#ffffff', color: '#374151' },\r\n pairedBanner: { display: 'flex', alignItems: 'center', gap: '12px', border: '1px solid #bbf7d0', backgroundColor: '#f0fdf4', borderRadius: '8px', padding: '16px', marginBottom: '16px' },\r\n pairedIcon: { width: '40px', height: '40px', borderRadius: '50%', backgroundColor: '#dcfce7', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#16a34a', fontSize: '18px', flexShrink: '0' },\r\n unpairedBanner: { display: 'flex', alignItems: 'center', gap: '12px', border: '1px solid #fde68a', backgroundColor: '#fefce8', borderRadius: '8px', padding: '16px', marginBottom: '16px' },\r\n qrContainer: { textAlign: 'center', padding: '16px' } as Record<string, string>,\r\n qrFrame: { display: 'inline-block', border: '2px dashed #a5b4fc', borderRadius: '12px', padding: '16px', backgroundColor: '#ffffff', marginBottom: '12px' },\r\n spinner: { display: 'inline-block', width: '12px', height: '12px', border: '2px solid #d1d5db', borderTopColor: '#4f46e5', borderRadius: '50%', animation: 'smstunnel-spin 0.8s linear infinite', marginRight: '8px', verticalAlign: 'middle' },\r\n error: { color: '#dc2626', fontSize: '13px', marginBottom: '12px' },\r\n success: { color: '#16a34a', fontSize: '12px', marginTop: '8px' },\r\n errorSmall: { color: '#dc2626', fontSize: '12px', marginTop: '8px' },\r\n};\r\n\r\nlet stylesInjected = false;\r\nfunction injectKeyframes() {\r\n if (stylesInjected || typeof document === 'undefined') return;\r\n const style = document.createElement('style');\r\n style.textContent = '@keyframes smstunnel-spin { to { transform: rotate(360deg); } }';\r\n document.head.appendChild(style);\r\n stylesInjected = true;\r\n}\r\n\r\nexport const SmsTunnelPairing = defineComponent({\r\n name: 'SmsTunnelPairing',\r\n props: {\r\n apiBaseUrl: { type: String, required: true },\r\n getAuthHeaders: { type: Function as PropType<() => Record<string, string>>, default: undefined },\r\n labels: { type: Object as PropType<SmsTunnelLabels>, default: () => EN_LABELS },\r\n showTestSms: { type: Boolean, default: true },\r\n showServerUrlInput: { type: Boolean, default: true },\r\n qrSize: { type: Number, default: 220 },\r\n routePrefix: { type: String, default: 'smstunnel' },\r\n },\r\n emits: ['paired', 'unpaired'],\r\n setup(props, { emit }) {\r\n injectKeyframes();\r\n\r\n const tunnel = useSmsTunnel({\r\n apiBaseUrl: props.apiBaseUrl,\r\n getAuthHeaders: props.getAuthHeaders,\r\n routePrefix: props.routePrefix,\r\n });\r\n\r\n const localServerUrl = ref('');\r\n const savingUrl = ref(false);\r\n const testPhone = ref('');\r\n const testMsg = ref('Test SMS');\r\n const testResult = ref<{ success: boolean; error?: string; messageId?: string } | null>(null);\r\n const sendingTest = ref(false);\r\n\r\n watch(tunnel.serverUrl, (val) => {\r\n if (val && !localServerUrl.value) localServerUrl.value = val;\r\n }, { immediate: true });\r\n\r\n watch(tunnel.status, (val, old) => {\r\n if (val === 'paired' && old !== 'paired') {\r\n emit('paired', { deviceName: tunnel.deviceName.value });\r\n }\r\n });\r\n\r\n async function saveUrl() {\r\n if (!localServerUrl.value.trim()) return;\r\n savingUrl.value = true;\r\n await tunnel.updateServerUrl(localServerUrl.value.trim().replace(/\\/$/, ''));\r\n savingUrl.value = false;\r\n }\r\n\r\n async function handleUnpair() {\r\n if (!confirm(props.labels.unpairConfirm)) return;\r\n await tunnel.unpair();\r\n emit('unpaired');\r\n }\r\n\r\n async function handleTestSms() {\r\n if (!testPhone.value.trim()) return;\r\n sendingTest.value = true;\r\n testResult.value = null;\r\n testResult.value = await tunnel.sendTestSms(testPhone.value.trim(), testMsg.value);\r\n sendingTest.value = false;\r\n }\r\n\r\n return () => {\r\n const L = props.labels;\r\n\r\n if (tunnel.status.value === 'loading') {\r\n return h('div', { style: s.container }, [\r\n h('div', { style: s.card }, [\r\n h('div', { style: { textAlign: 'center', padding: '24px' } }, [\r\n h('span', { style: s.spinner }),\r\n ]),\r\n ]),\r\n ]);\r\n }\r\n\r\n const children: any[] = [];\r\n\r\n // Title\r\n children.push(h('div', { style: s.title }, L.title));\r\n children.push(h('div', { style: s.subtitle }, L.description));\r\n\r\n // Server URL\r\n if (props.showServerUrlInput) {\r\n children.push(\r\n h('div', { style: s.section }, [\r\n h('label', { style: s.label }, L.serverUrlLabel),\r\n h('div', { style: s.inputRow }, [\r\n h('input', {\r\n value: localServerUrl.value,\r\n onInput: (e: Event) => { localServerUrl.value = (e.target as HTMLInputElement).value; },\r\n placeholder: L.serverUrlPlaceholder,\r\n style: s.input,\r\n }),\r\n h('button', {\r\n style: { ...s.button, opacity: savingUrl.value || !localServerUrl.value.trim() ? '0.5' : '1' },\r\n onClick: saveUrl,\r\n disabled: savingUrl.value || !localServerUrl.value.trim(),\r\n }, L.saveButton),\r\n ]),\r\n ]),\r\n );\r\n }\r\n\r\n // Error\r\n if (tunnel.error.value) {\r\n children.push(h('div', { style: s.error }, tunnel.error.value));\r\n }\r\n\r\n if (tunnel.status.value === 'paired') {\r\n // Paired banner\r\n children.push(\r\n h('div', { style: s.pairedBanner }, [\r\n h('div', { style: s.pairedIcon }, '\\u2713'),\r\n h('div', { style: { flex: '1' } }, [\r\n h('div', { style: { fontSize: '14px', fontWeight: '600', color: '#166534' } }, L.pairedStatus),\r\n h('div', { style: { fontSize: '12px', color: '#16a34a' } },\r\n `${L.deviceLabel}: ${tunnel.deviceName.value || 'Android Phone'}`),\r\n ]),\r\n h('button', {\r\n onClick: handleUnpair,\r\n style: { padding: '6px', borderRadius: '8px', border: 'none', cursor: 'pointer', backgroundColor: 'transparent', color: '#9ca3af' },\r\n title: L.unpairButton,\r\n }, '\\u2715'),\r\n ]),\r\n );\r\n\r\n // Test SMS\r\n if (props.showTestSms) {\r\n const testChildren: any[] = [\r\n h('div', { style: { fontSize: '13px', fontWeight: '600', color: '#374151', marginBottom: '12px' } }, L.testSmsTitle),\r\n h('div', { style: s.inputRow }, [\r\n h('input', {\r\n value: testPhone.value,\r\n onInput: (e: Event) => { testPhone.value = (e.target as HTMLInputElement).value; },\r\n placeholder: L.testPhonePlaceholder,\r\n style: s.input,\r\n }),\r\n h('input', {\r\n value: testMsg.value,\r\n onInput: (e: Event) => { testMsg.value = (e.target as HTMLInputElement).value; },\r\n placeholder: L.testMessagePlaceholder,\r\n style: s.input,\r\n }),\r\n h('button', {\r\n style: { ...s.button, opacity: sendingTest.value || !testPhone.value.trim() ? '0.5' : '1' },\r\n onClick: handleTestSms,\r\n disabled: sendingTest.value || !testPhone.value.trim(),\r\n }, sendingTest.value ? h('span', { style: s.spinner }) : L.sendTestButton),\r\n ]),\r\n ];\r\n\r\n if (testResult.value) {\r\n testChildren.push(\r\n h('div', { style: testResult.value.success ? s.success : s.errorSmall },\r\n testResult.value.success\r\n ? `${L.smsSentSuccess} (ID: ${testResult.value.messageId})`\r\n : `${L.smsError}: ${testResult.value.error}`),\r\n );\r\n }\r\n\r\n children.push(h('div', { style: s.section }, testChildren));\r\n }\r\n } else {\r\n // Unpaired banner\r\n children.push(\r\n h('div', { style: s.unpairedBanner }, [\r\n h('div', { style: { fontSize: '24px' } }, '\\uD83D\\uDCF1'),\r\n h('div', {}, [\r\n h('div', { style: { fontSize: '14px', fontWeight: '600', color: '#854d0e' } }, L.notPairedStatus),\r\n h('div', { style: { fontSize: '12px', color: '#a16207' } }, L.notPairedDescription),\r\n ]),\r\n ]),\r\n );\r\n\r\n if (!tunnel.showQr.value) {\r\n children.push(\r\n h('button', {\r\n style: { ...s.button, opacity: tunnel.generating.value ? '0.5' : '1' },\r\n onClick: tunnel.generateQr,\r\n disabled: tunnel.generating.value,\r\n }, [\r\n tunnel.generating.value ? h('span', { style: s.spinner }) : null,\r\n L.connectButton,\r\n ]),\r\n );\r\n } else {\r\n children.push(\r\n h('div', { style: s.qrContainer }, [\r\n h('div', { style: { fontSize: '13px', color: '#4b5563', marginBottom: '12px' } }, L.scanQrPrompt),\r\n h('div', { style: s.qrFrame }, [\r\n h(QrCodeCanvas, { value: tunnel.qrData.value, size: props.qrSize }),\r\n ]),\r\n h('div', {\r\n style: { display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', fontSize: '12px', color: '#9ca3af', marginBottom: '12px' },\r\n }, [\r\n h('span', { style: s.spinner }),\r\n L.waitingForPairing,\r\n ]),\r\n h('button', { style: s.buttonSecondary, onClick: tunnel.cancelPairing }, L.cancelButton),\r\n ]),\r\n );\r\n }\r\n }\r\n\r\n return h('div', { style: s.container }, [\r\n h('div', { style: s.card }, children),\r\n ]);\r\n };\r\n },\r\n});\r\n","import { ref, onMounted, onUnmounted, watch } from 'vue';\r\nimport type { SmsTunnelLabels } from '../shared/labels';\r\n\r\nexport interface UseSmsTunnelOptions {\r\n apiBaseUrl: string;\r\n getAuthHeaders?: () => Record<string, string>;\r\n routePrefix?: string;\r\n pollInterval?: number;\r\n}\r\n\r\nexport interface SendSmsResult {\r\n success: boolean;\r\n messageId?: string;\r\n error?: string;\r\n}\r\n\r\nexport function useSmsTunnel(options: UseSmsTunnelOptions) {\r\n const {\r\n apiBaseUrl,\r\n getAuthHeaders,\r\n routePrefix = 'smstunnel',\r\n pollInterval = 3000,\r\n } = options;\r\n\r\n const baseUrl = apiBaseUrl.replace(/\\/$/, '');\r\n\r\n const status = ref<'loading' | 'unpaired' | 'paired'>('loading');\r\n const serverUrl = ref('');\r\n const deviceName = ref('');\r\n const showQr = ref(false);\r\n const qrData = ref('');\r\n const generating = ref(false);\r\n const polling = ref(false);\r\n const error = ref('');\r\n\r\n let pairingToken = '';\r\n let pollTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n function authHeaders(): Record<string, string> {\r\n return getAuthHeaders ? getAuthHeaders() : {};\r\n }\r\n\r\n async function fetchStatus() {\r\n try {\r\n const res = await fetch(`${baseUrl}/${routePrefix}/status`, {\r\n headers: authHeaders(),\r\n });\r\n const data = await res.json();\r\n status.value = data.paired ? 'paired' : 'unpaired';\r\n serverUrl.value = data.serverUrl || '';\r\n deviceName.value = data.deviceName || '';\r\n } catch {\r\n status.value = 'unpaired';\r\n }\r\n }\r\n\r\n function startPolling() {\r\n stopPolling();\r\n pollTimer = setInterval(async () => {\r\n if (!pairingToken) return;\r\n try {\r\n const res = await fetch(\r\n `${baseUrl}/${routePrefix}/pairing-status/${pairingToken}`,\r\n );\r\n const data = await res.json();\r\n if (data.status === 'completed') {\r\n polling.value = false;\r\n showQr.value = false;\r\n stopPolling();\r\n setTimeout(() => fetchStatus(), 2000);\r\n } else if (data.status === 'expired') {\r\n polling.value = false;\r\n showQr.value = false;\r\n error.value = 'QR code expired';\r\n stopPolling();\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n }, pollInterval);\r\n }\r\n\r\n function stopPolling() {\r\n if (pollTimer) {\r\n clearInterval(pollTimer);\r\n pollTimer = null;\r\n }\r\n }\r\n\r\n watch(polling, (val) => {\r\n if (val) startPolling();\r\n else stopPolling();\r\n });\r\n\r\n async function generateQr() {\r\n generating.value = true;\r\n error.value = '';\r\n try {\r\n const res = await fetch(`${baseUrl}/${routePrefix}/create-token`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...authHeaders() },\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n error.value = data.error || 'Failed to create QR code';\r\n generating.value = false;\r\n return;\r\n }\r\n pairingToken = data.token;\r\n qrData.value = data.qrData;\r\n showQr.value = true;\r\n polling.value = true;\r\n } catch (err: any) {\r\n error.value = `Error: ${err.message}`;\r\n } finally {\r\n generating.value = false;\r\n }\r\n }\r\n\r\n function cancelPairing() {\r\n stopPolling();\r\n pairingToken = '';\r\n showQr.value = false;\r\n polling.value = false;\r\n qrData.value = '';\r\n }\r\n\r\n async function unpair() {\r\n try {\r\n await fetch(`${baseUrl}/${routePrefix}/unpair`, {\r\n method: 'POST',\r\n headers: authHeaders(),\r\n });\r\n status.value = 'unpaired';\r\n deviceName.value = '';\r\n } catch (err: any) {\r\n error.value = `Unpair failed: ${err.message}`;\r\n }\r\n }\r\n\r\n async function sendTestSms(to: string, message: string): Promise<SendSmsResult> {\r\n try {\r\n const res = await fetch(`${baseUrl}/${routePrefix}/send`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...authHeaders() },\r\n body: JSON.stringify({ to, message }),\r\n });\r\n return await res.json();\r\n } catch (err: any) {\r\n return { success: false, error: err.message };\r\n }\r\n }\r\n\r\n async function updateServerUrl(url: string) {\r\n try {\r\n await fetch(`${baseUrl}/${routePrefix}/update-config`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...authHeaders() },\r\n body: JSON.stringify({ serverUrl: url }),\r\n });\r\n serverUrl.value = url;\r\n } catch (err: any) {\r\n error.value = `Update failed: ${err.message}`;\r\n }\r\n }\r\n\r\n onMounted(() => fetchStatus());\r\n onUnmounted(() => stopPolling());\r\n\r\n return {\r\n status,\r\n serverUrl,\r\n deviceName,\r\n showQr,\r\n qrData,\r\n generating,\r\n polling,\r\n error,\r\n generateQr,\r\n cancelPairing,\r\n unpair,\r\n sendTestSms,\r\n updateServerUrl,\r\n refetch: fetchStatus,\r\n };\r\n}\r\n","import { defineComponent, ref, onMounted, watch, h } from 'vue';\r\nimport qrcode from 'qrcode-generator';\r\n\r\nexport const QrCodeCanvas = defineComponent({\r\n name: 'QrCodeCanvas',\r\n props: {\r\n value: { type: String, required: true },\r\n size: { type: Number, default: 200 },\r\n },\r\n setup(props) {\r\n const canvasRef = ref<HTMLCanvasElement | null>(null);\r\n\r\n function render() {\r\n if (!canvasRef.value || !props.value) return;\r\n const canvas = canvasRef.value;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n const qr = qrcode(0, 'M');\r\n qr.addData(props.value);\r\n qr.make();\r\n\r\n const moduleCount = qr.getModuleCount();\r\n const cellSize = props.size / moduleCount;\r\n\r\n canvas.width = props.size;\r\n canvas.height = props.size;\r\n ctx.fillStyle = '#ffffff';\r\n ctx.fillRect(0, 0, props.size, props.size);\r\n ctx.fillStyle = '#000000';\r\n\r\n for (let row = 0; row < moduleCount; row++) {\r\n for (let col = 0; col < moduleCount; col++) {\r\n if (qr.isDark(row, col)) {\r\n ctx.fillRect(col * cellSize, row * cellSize, cellSize, cellSize);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onMounted(render);\r\n watch(() => [props.value, props.size], render);\r\n\r\n return () =>\r\n h('canvas', {\r\n ref: canvasRef,\r\n width: props.size,\r\n height: props.size,\r\n });\r\n },\r\n});\r\n","export interface SmsTunnelLabels {\r\n title: string;\r\n description: string;\r\n serverUrlLabel: string;\r\n serverUrlPlaceholder: string;\r\n saveButton: string;\r\n pairedStatus: string;\r\n deviceLabel: string;\r\n unpairButton: string;\r\n unpairConfirm: string;\r\n notPairedStatus: string;\r\n notPairedDescription: string;\r\n connectButton: string;\r\n scanQrPrompt: string;\r\n waitingForPairing: string;\r\n cancelButton: string;\r\n qrExpired: string;\r\n testSmsTitle: string;\r\n testPhonePlaceholder: string;\r\n testMessagePlaceholder: string;\r\n sendTestButton: string;\r\n smsSentSuccess: string;\r\n smsError: string;\r\n}\r\n\r\nexport const EN_LABELS: SmsTunnelLabels = {\r\n title: 'SMS Configuration (SMSTunnel)',\r\n description: 'Connect an Android phone with the SMSTunnel app to send SMS directly from the application.',\r\n serverUrlLabel: 'SMSTunnel Server',\r\n serverUrlPlaceholder: 'https://smstunnel.io',\r\n saveButton: 'Save',\r\n pairedStatus: 'Connected',\r\n deviceLabel: 'Device',\r\n unpairButton: 'Disconnect',\r\n unpairConfirm: 'Are you sure you want to disconnect the SMS device?',\r\n notPairedStatus: 'Not connected',\r\n notPairedDescription: 'Scan the QR code with the SMSTunnel app on your Android phone.',\r\n connectButton: 'Connect phone',\r\n scanQrPrompt: 'Scan this QR code with the SMSTunnel app on your phone:',\r\n waitingForPairing: 'Waiting for connection...',\r\n cancelButton: 'Cancel',\r\n qrExpired: 'QR code has expired. Generate a new one.',\r\n testSmsTitle: 'Send test SMS',\r\n testPhonePlaceholder: 'Phone number (e.g., +1234567890)',\r\n testMessagePlaceholder: 'Message',\r\n sendTestButton: 'Send',\r\n smsSentSuccess: 'SMS sent successfully!',\r\n smsError: 'Error',\r\n};\r\n\r\nexport const RO_LABELS: SmsTunnelLabels = {\r\n title: 'Configurare SMS (SMSTunnel)',\r\n description: 'Conecteaza un telefon Android cu aplicatia SMSTunnel pentru a trimite SMS-uri direct din aplicatie.',\r\n serverUrlLabel: 'Server SMSTunnel',\r\n serverUrlPlaceholder: 'https://smstunnel.io',\r\n saveButton: 'Salveaza',\r\n pairedStatus: 'Conectat',\r\n deviceLabel: 'Dispozitiv',\r\n unpairButton: 'Deconecteaza',\r\n unpairConfirm: 'Sigur doresti sa deconectezi dispozitivul SMS?',\r\n notPairedStatus: 'Neconectat',\r\n notPairedDescription: 'Scaneaza codul QR cu aplicatia SMSTunnel de pe telefonul Android.',\r\n connectButton: 'Conecteaza telefon',\r\n scanQrPrompt: 'Scaneaza acest cod QR cu aplicatia SMSTunnel de pe telefon:',\r\n waitingForPairing: 'Se asteapta conectarea...',\r\n cancelButton: 'Anuleaza',\r\n qrExpired: 'Codul QR a expirat. Genereaza unul nou.',\r\n testSmsTitle: 'Trimite SMS de test',\r\n testPhonePlaceholder: 'Nr. telefon (ex: 0741234567)',\r\n testMessagePlaceholder: 'Mesaj',\r\n sendTestButton: 'Trimite',\r\n smsSentSuccess: 'SMS trimis cu succes!',\r\n smsError: 'Eroare',\r\n};\r\n"],"mappings":"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","names":["defineComponent","ref","watch","h","ref","onMounted","watch","defineComponent","ref","watch","h"]}
|
|
1
|
+
{"version":3,"sources":["../../src/vue/SmsTunnelPairing.ts","../../src/vue/useSmsTunnel.ts","../../src/vue/QrCodeCanvas.ts","../../src/shared/labels.ts"],"sourcesContent":["import { defineComponent, ref, watch, h, type PropType } from 'vue';\r\nimport { useSmsTunnel } from './useSmsTunnel';\r\nimport { QrCodeCanvas } from './QrCodeCanvas';\r\nimport { EN_LABELS, type SmsTunnelLabels } from '../shared/labels';\r\n\r\n// Inline styles (same as React version - no CSS dependency)\r\nconst s = {\r\n container: { fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif', fontSize: '14px', color: '#1f2937' },\r\n card: { border: '1px solid #e5e7eb', borderRadius: '12px', padding: '24px', backgroundColor: '#ffffff' },\r\n title: { fontSize: '18px', fontWeight: '600', color: '#111827', marginBottom: '4px' },\r\n subtitle: { fontSize: '13px', color: '#6b7280', marginBottom: '20px' },\r\n section: { border: '1px solid #e5e7eb', borderRadius: '8px', padding: '16px', marginBottom: '16px' },\r\n label: { display: 'block', fontSize: '13px', fontWeight: '500', color: '#374151', marginBottom: '6px' },\r\n inputRow: { display: 'flex', gap: '8px' },\r\n input: { flex: '1', border: '1px solid #d1d5db', borderRadius: '8px', padding: '6px 12px', fontSize: '13px', outline: 'none' },\r\n button: { padding: '6px 16px', borderRadius: '8px', border: 'none', fontSize: '13px', fontWeight: '500', cursor: 'pointer', backgroundColor: '#4f46e5', color: '#ffffff' },\r\n buttonSecondary: { padding: '6px 16px', borderRadius: '8px', border: '1px solid #d1d5db', fontSize: '13px', fontWeight: '500', cursor: 'pointer', backgroundColor: '#ffffff', color: '#374151' },\r\n pairedBanner: { display: 'flex', alignItems: 'center', gap: '12px', border: '1px solid #bbf7d0', backgroundColor: '#f0fdf4', borderRadius: '8px', padding: '16px', marginBottom: '16px' },\r\n pairedIcon: { width: '40px', height: '40px', borderRadius: '50%', backgroundColor: '#dcfce7', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#16a34a', fontSize: '18px', flexShrink: '0' },\r\n unpairedBanner: { display: 'flex', alignItems: 'center', gap: '12px', border: '1px solid #fde68a', backgroundColor: '#fefce8', borderRadius: '8px', padding: '16px', marginBottom: '16px' },\r\n qrContainer: { textAlign: 'center', padding: '16px' } as Record<string, string>,\r\n qrFrame: { display: 'inline-block', border: '2px dashed #a5b4fc', borderRadius: '12px', padding: '16px', backgroundColor: '#ffffff', marginBottom: '12px' },\r\n spinner: { display: 'inline-block', width: '12px', height: '12px', border: '2px solid #d1d5db', borderTopColor: '#4f46e5', borderRadius: '50%', animation: 'smstunnel-spin 0.8s linear infinite', marginRight: '8px', verticalAlign: 'middle' },\r\n error: { color: '#dc2626', fontSize: '13px', marginBottom: '12px' },\r\n success: { color: '#16a34a', fontSize: '12px', marginTop: '8px' },\r\n errorSmall: { color: '#dc2626', fontSize: '12px', marginTop: '8px' },\r\n};\r\n\r\nlet stylesInjected = false;\r\nfunction injectKeyframes() {\r\n if (stylesInjected || typeof document === 'undefined') return;\r\n const style = document.createElement('style');\r\n style.textContent = '@keyframes smstunnel-spin { to { transform: rotate(360deg); } }';\r\n document.head.appendChild(style);\r\n stylesInjected = true;\r\n}\r\n\r\nexport const SmsTunnelPairing = defineComponent({\r\n name: 'SmsTunnelPairing',\r\n props: {\r\n apiBaseUrl: { type: String, required: true },\r\n getAuthHeaders: { type: Function as PropType<() => Record<string, string>>, default: undefined },\r\n labels: { type: Object as PropType<SmsTunnelLabels>, default: () => EN_LABELS },\r\n showTestSms: { type: Boolean, default: true },\r\n showServerUrlInput: { type: Boolean, default: true },\r\n qrSize: { type: Number, default: 220 },\r\n routePrefix: { type: String, default: 'smstunnel' },\r\n },\r\n emits: ['paired', 'unpaired'],\r\n setup(props, { emit }) {\r\n injectKeyframes();\r\n\r\n const tunnel = useSmsTunnel({\r\n apiBaseUrl: props.apiBaseUrl,\r\n getAuthHeaders: props.getAuthHeaders,\r\n routePrefix: props.routePrefix,\r\n });\r\n\r\n const localServerUrl = ref('');\r\n const savingUrl = ref(false);\r\n const testPhone = ref('');\r\n const testMsg = ref('Test SMS');\r\n const testResult = ref<{ success: boolean; error?: string; messageId?: string } | null>(null);\r\n const sendingTest = ref(false);\r\n\r\n watch(tunnel.serverUrl, (val) => {\r\n if (val && !localServerUrl.value) localServerUrl.value = val;\r\n }, { immediate: true });\r\n\r\n watch(tunnel.status, (val, old) => {\r\n if (val === 'paired' && old !== 'paired') {\r\n emit('paired', { deviceName: tunnel.deviceName.value });\r\n }\r\n });\r\n\r\n async function saveUrl() {\r\n if (!localServerUrl.value.trim()) return;\r\n savingUrl.value = true;\r\n await tunnel.updateServerUrl(localServerUrl.value.trim().replace(/\\/$/, ''));\r\n savingUrl.value = false;\r\n }\r\n\r\n async function handleUnpair() {\r\n if (!confirm(props.labels.unpairConfirm)) return;\r\n await tunnel.unpair();\r\n emit('unpaired');\r\n }\r\n\r\n async function handleTestSms() {\r\n if (!testPhone.value.trim()) return;\r\n sendingTest.value = true;\r\n testResult.value = null;\r\n testResult.value = await tunnel.sendTestSms(testPhone.value.trim(), testMsg.value);\r\n sendingTest.value = false;\r\n }\r\n\r\n return () => {\r\n const L = props.labels;\r\n\r\n if (tunnel.status.value === 'loading') {\r\n return h('div', { style: s.container }, [\r\n h('div', { style: s.card }, [\r\n h('div', { style: { textAlign: 'center', padding: '24px' } }, [\r\n h('span', { style: s.spinner }),\r\n ]),\r\n ]),\r\n ]);\r\n }\r\n\r\n const children: any[] = [];\r\n\r\n // Title\r\n children.push(h('div', { style: s.title }, L.title));\r\n children.push(h('div', { style: s.subtitle }, L.description));\r\n\r\n // Server URL\r\n if (props.showServerUrlInput) {\r\n children.push(\r\n h('div', { style: s.section }, [\r\n h('label', { style: s.label }, L.serverUrlLabel),\r\n h('div', { style: s.inputRow }, [\r\n h('input', {\r\n value: localServerUrl.value,\r\n onInput: (e: Event) => { localServerUrl.value = (e.target as HTMLInputElement).value; },\r\n placeholder: L.serverUrlPlaceholder,\r\n style: s.input,\r\n }),\r\n h('button', {\r\n style: { ...s.button, opacity: savingUrl.value || !localServerUrl.value.trim() ? '0.5' : '1' },\r\n onClick: saveUrl,\r\n disabled: savingUrl.value || !localServerUrl.value.trim(),\r\n }, L.saveButton),\r\n ]),\r\n ]),\r\n );\r\n }\r\n\r\n // Error\r\n if (tunnel.error.value) {\r\n children.push(h('div', { style: s.error }, tunnel.error.value));\r\n }\r\n\r\n if (tunnel.status.value === 'paired') {\r\n // Paired banner\r\n children.push(\r\n h('div', { style: s.pairedBanner }, [\r\n h('div', { style: s.pairedIcon }, '\\u2713'),\r\n h('div', { style: { flex: '1' } }, [\r\n h('div', { style: { fontSize: '14px', fontWeight: '600', color: '#166534' } }, L.pairedStatus),\r\n h('div', { style: { fontSize: '12px', color: '#16a34a' } },\r\n `${L.deviceLabel}: ${tunnel.deviceName.value || 'Android Phone'}`),\r\n ]),\r\n h('button', {\r\n onClick: handleUnpair,\r\n style: { padding: '6px', borderRadius: '8px', border: 'none', cursor: 'pointer', backgroundColor: 'transparent', color: '#9ca3af' },\r\n title: L.unpairButton,\r\n }, '\\u2715'),\r\n ]),\r\n );\r\n\r\n // Test SMS\r\n if (props.showTestSms) {\r\n const testChildren: any[] = [\r\n h('div', { style: { fontSize: '13px', fontWeight: '600', color: '#374151', marginBottom: '12px' } }, L.testSmsTitle),\r\n h('div', { style: s.inputRow }, [\r\n h('input', {\r\n value: testPhone.value,\r\n onInput: (e: Event) => { testPhone.value = (e.target as HTMLInputElement).value; },\r\n placeholder: L.testPhonePlaceholder,\r\n style: s.input,\r\n }),\r\n h('input', {\r\n value: testMsg.value,\r\n onInput: (e: Event) => { testMsg.value = (e.target as HTMLInputElement).value; },\r\n placeholder: L.testMessagePlaceholder,\r\n style: s.input,\r\n }),\r\n h('button', {\r\n style: { ...s.button, opacity: sendingTest.value || !testPhone.value.trim() ? '0.5' : '1' },\r\n onClick: handleTestSms,\r\n disabled: sendingTest.value || !testPhone.value.trim(),\r\n }, sendingTest.value ? h('span', { style: s.spinner }) : L.sendTestButton),\r\n ]),\r\n ];\r\n\r\n if (testResult.value) {\r\n testChildren.push(\r\n h('div', { style: testResult.value.success ? s.success : s.errorSmall },\r\n testResult.value.success\r\n ? `${L.smsSentSuccess} (ID: ${testResult.value.messageId})`\r\n : `${L.smsError}: ${testResult.value.error}`),\r\n );\r\n }\r\n\r\n children.push(h('div', { style: s.section }, testChildren));\r\n }\r\n } else {\r\n // Unpaired banner\r\n children.push(\r\n h('div', { style: s.unpairedBanner }, [\r\n h('div', { style: { fontSize: '24px' } }, '\\uD83D\\uDCF1'),\r\n h('div', {}, [\r\n h('div', { style: { fontSize: '14px', fontWeight: '600', color: '#854d0e' } }, L.notPairedStatus),\r\n h('div', { style: { fontSize: '12px', color: '#a16207' } }, L.notPairedDescription),\r\n ]),\r\n ]),\r\n );\r\n\r\n if (!tunnel.showQr.value) {\r\n children.push(\r\n h('button', {\r\n style: { ...s.button, opacity: tunnel.generating.value ? '0.5' : '1' },\r\n onClick: tunnel.generateQr,\r\n disabled: tunnel.generating.value,\r\n }, [\r\n tunnel.generating.value ? h('span', { style: s.spinner }) : null,\r\n L.connectButton,\r\n ]),\r\n );\r\n } else {\r\n children.push(\r\n h('div', { style: s.qrContainer }, [\r\n h('div', { style: { fontSize: '13px', color: '#4b5563', marginBottom: '12px' } }, L.scanQrPrompt),\r\n h('div', { style: s.qrFrame }, [\r\n h(QrCodeCanvas, { value: tunnel.qrData.value, size: props.qrSize }),\r\n ]),\r\n h('div', {\r\n style: { display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', fontSize: '12px', color: '#9ca3af', marginBottom: '12px' },\r\n }, [\r\n h('span', { style: s.spinner }),\r\n L.waitingForPairing,\r\n ]),\r\n h('button', { style: s.buttonSecondary, onClick: tunnel.cancelPairing }, L.cancelButton),\r\n ]),\r\n );\r\n }\r\n }\r\n\r\n return h('div', { style: s.container }, [\r\n h('div', { style: s.card }, children),\r\n ]);\r\n };\r\n },\r\n});\r\n","import { ref, onMounted, onUnmounted, watch } from 'vue';\r\nimport type { SmsTunnelLabels } from '../shared/labels';\r\n\r\nexport interface UseSmsTunnelOptions {\r\n apiBaseUrl: string;\r\n getAuthHeaders?: () => Record<string, string>;\r\n routePrefix?: string;\r\n pollInterval?: number;\r\n}\r\n\r\nexport interface SendSmsResult {\r\n success: boolean;\r\n messageId?: string;\r\n error?: string;\r\n}\r\n\r\nexport function useSmsTunnel(options: UseSmsTunnelOptions) {\r\n const {\r\n apiBaseUrl,\r\n getAuthHeaders,\r\n routePrefix = 'smstunnel',\r\n pollInterval = 3000,\r\n } = options;\r\n\r\n const baseUrl = apiBaseUrl.replace(/\\/$/, '');\r\n\r\n const status = ref<'loading' | 'unpaired' | 'paired'>('loading');\r\n const serverUrl = ref('');\r\n const deviceName = ref('');\r\n const showQr = ref(false);\r\n const qrData = ref('');\r\n const generating = ref(false);\r\n const polling = ref(false);\r\n const error = ref('');\r\n\r\n let pairingToken = '';\r\n let pollTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n function authHeaders(): Record<string, string> {\r\n return getAuthHeaders ? getAuthHeaders() : {};\r\n }\r\n\r\n async function fetchStatus() {\r\n try {\r\n const res = await fetch(`${baseUrl}/${routePrefix}/status`, {\r\n headers: authHeaders(),\r\n });\r\n const data = await res.json();\r\n status.value = data.paired ? 'paired' : 'unpaired';\r\n serverUrl.value = data.serverUrl || '';\r\n deviceName.value = data.deviceName || '';\r\n } catch {\r\n status.value = 'unpaired';\r\n }\r\n }\r\n\r\n function startPolling() {\r\n stopPolling();\r\n pollTimer = setInterval(async () => {\r\n if (!pairingToken) return;\r\n try {\r\n const res = await fetch(\r\n `${baseUrl}/${routePrefix}/pairing-status/${pairingToken}`,\r\n );\r\n const data = await res.json();\r\n if (data.status === 'completed') {\r\n polling.value = false;\r\n showQr.value = false;\r\n stopPolling();\r\n setTimeout(() => fetchStatus(), 2000);\r\n } else if (data.status === 'expired') {\r\n polling.value = false;\r\n showQr.value = false;\r\n error.value = 'QR code expired';\r\n stopPolling();\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n }, pollInterval);\r\n }\r\n\r\n function stopPolling() {\r\n if (pollTimer) {\r\n clearInterval(pollTimer);\r\n pollTimer = null;\r\n }\r\n }\r\n\r\n watch(polling, (val) => {\r\n if (val) startPolling();\r\n else stopPolling();\r\n });\r\n\r\n async function generateQr() {\r\n generating.value = true;\r\n error.value = '';\r\n try {\r\n const res = await fetch(`${baseUrl}/${routePrefix}/create-token`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...authHeaders() },\r\n });\r\n const data = await res.json();\r\n if (!data.success) {\r\n error.value = data.error || 'Failed to create QR code';\r\n generating.value = false;\r\n return;\r\n }\r\n pairingToken = data.token;\r\n qrData.value = data.qrData;\r\n showQr.value = true;\r\n polling.value = true;\r\n } catch (err: any) {\r\n error.value = `Error: ${err.message}`;\r\n } finally {\r\n generating.value = false;\r\n }\r\n }\r\n\r\n function cancelPairing() {\r\n stopPolling();\r\n pairingToken = '';\r\n showQr.value = false;\r\n polling.value = false;\r\n qrData.value = '';\r\n }\r\n\r\n async function unpair() {\r\n try {\r\n await fetch(`${baseUrl}/${routePrefix}/unpair`, {\r\n method: 'POST',\r\n headers: authHeaders(),\r\n });\r\n status.value = 'unpaired';\r\n deviceName.value = '';\r\n } catch (err: any) {\r\n error.value = `Unpair failed: ${err.message}`;\r\n }\r\n }\r\n\r\n async function sendTestSms(to: string, message: string): Promise<SendSmsResult> {\r\n try {\r\n const res = await fetch(`${baseUrl}/${routePrefix}/send`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...authHeaders() },\r\n body: JSON.stringify({ to, message }),\r\n });\r\n return await res.json();\r\n } catch (err: any) {\r\n return { success: false, error: err.message };\r\n }\r\n }\r\n\r\n async function updateServerUrl(url: string) {\r\n try {\r\n await fetch(`${baseUrl}/${routePrefix}/update-config`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...authHeaders() },\r\n body: JSON.stringify({ serverUrl: url }),\r\n });\r\n serverUrl.value = url;\r\n } catch (err: any) {\r\n error.value = `Update failed: ${err.message}`;\r\n }\r\n }\r\n\r\n // ─── E2E Encryption ────────────────────────────────\r\n\r\n async function getDeviceE2EStatus(deviceId: string) {\r\n try {\r\n const res = await fetch(\r\n `${baseUrl}/${routePrefix}/e2e-status/${deviceId}`,\r\n { headers: authHeaders() },\r\n );\r\n return await res.json();\r\n } catch (err: any) {\r\n return { success: false, error: err.message };\r\n }\r\n }\r\n\r\n async function getDevicePublicKey(deviceId: string) {\r\n try {\r\n const res = await fetch(\r\n `${baseUrl}/${routePrefix}/public-key/${deviceId}`,\r\n { headers: authHeaders() },\r\n );\r\n return await res.json();\r\n } catch (err: any) {\r\n return { success: false, error: err.message };\r\n }\r\n }\r\n\r\n async function verifyDeviceKey(deviceId: string, fingerprint: string) {\r\n try {\r\n const res = await fetch(`${baseUrl}/${routePrefix}/verify-key`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...authHeaders() },\r\n body: JSON.stringify({ deviceId, fingerprint }),\r\n });\r\n return await res.json();\r\n } catch (err: any) {\r\n return { valid: false, needsRePairing: true, error: err.message };\r\n }\r\n }\r\n\r\n async function sendEncryptedSms(encryptedPayload: string, deviceId: string, is2FA: boolean = false) {\r\n try {\r\n const res = await fetch(`${baseUrl}/${routePrefix}/send-encrypted`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...authHeaders() },\r\n body: JSON.stringify({ encryptedPayload, deviceId, is2FA }),\r\n });\r\n return await res.json();\r\n } catch (err: any) {\r\n return { success: false, error: err.message };\r\n }\r\n }\r\n\r\n onMounted(() => fetchStatus());\r\n onUnmounted(() => stopPolling());\r\n\r\n return {\r\n status,\r\n serverUrl,\r\n deviceName,\r\n showQr,\r\n qrData,\r\n generating,\r\n polling,\r\n error,\r\n generateQr,\r\n cancelPairing,\r\n unpair,\r\n sendTestSms,\r\n updateServerUrl,\r\n refetch: fetchStatus,\r\n // E2E\r\n getDeviceE2EStatus,\r\n getDevicePublicKey,\r\n verifyDeviceKey,\r\n sendEncryptedSms,\r\n };\r\n}\r\n","import { defineComponent, ref, onMounted, watch, h } from 'vue';\r\nimport qrcode from 'qrcode-generator';\r\n\r\nexport const QrCodeCanvas = defineComponent({\r\n name: 'QrCodeCanvas',\r\n props: {\r\n value: { type: String, required: true },\r\n size: { type: Number, default: 200 },\r\n },\r\n setup(props) {\r\n const canvasRef = ref<HTMLCanvasElement | null>(null);\r\n\r\n function render() {\r\n if (!canvasRef.value || !props.value) return;\r\n const canvas = canvasRef.value;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n const qr = qrcode(0, 'M');\r\n qr.addData(props.value);\r\n qr.make();\r\n\r\n const moduleCount = qr.getModuleCount();\r\n const cellSize = props.size / moduleCount;\r\n\r\n canvas.width = props.size;\r\n canvas.height = props.size;\r\n ctx.fillStyle = '#ffffff';\r\n ctx.fillRect(0, 0, props.size, props.size);\r\n ctx.fillStyle = '#000000';\r\n\r\n for (let row = 0; row < moduleCount; row++) {\r\n for (let col = 0; col < moduleCount; col++) {\r\n if (qr.isDark(row, col)) {\r\n ctx.fillRect(col * cellSize, row * cellSize, cellSize, cellSize);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onMounted(render);\r\n watch(() => [props.value, props.size], render);\r\n\r\n return () =>\r\n h('canvas', {\r\n ref: canvasRef,\r\n width: props.size,\r\n height: props.size,\r\n });\r\n },\r\n});\r\n","export interface SmsTunnelLabels {\r\n title: string;\r\n description: string;\r\n serverUrlLabel: string;\r\n serverUrlPlaceholder: string;\r\n saveButton: string;\r\n pairedStatus: string;\r\n deviceLabel: string;\r\n unpairButton: string;\r\n unpairConfirm: string;\r\n notPairedStatus: string;\r\n notPairedDescription: string;\r\n connectButton: string;\r\n scanQrPrompt: string;\r\n waitingForPairing: string;\r\n cancelButton: string;\r\n qrExpired: string;\r\n testSmsTitle: string;\r\n testPhonePlaceholder: string;\r\n testMessagePlaceholder: string;\r\n sendTestButton: string;\r\n smsSentSuccess: string;\r\n smsError: string;\r\n}\r\n\r\nexport const EN_LABELS: SmsTunnelLabels = {\r\n title: 'SMS Configuration (SMSTunnel)',\r\n description: 'Connect an Android phone with the SMSTunnel app to send SMS directly from the application.',\r\n serverUrlLabel: 'SMSTunnel Server',\r\n serverUrlPlaceholder: 'https://smstunnel.io',\r\n saveButton: 'Save',\r\n pairedStatus: 'Connected',\r\n deviceLabel: 'Device',\r\n unpairButton: 'Disconnect',\r\n unpairConfirm: 'Are you sure you want to disconnect the SMS device?',\r\n notPairedStatus: 'Not connected',\r\n notPairedDescription: 'Scan the QR code with the SMSTunnel app on your Android phone.',\r\n connectButton: 'Connect phone',\r\n scanQrPrompt: 'Scan this QR code with the SMSTunnel app on your phone:',\r\n waitingForPairing: 'Waiting for connection...',\r\n cancelButton: 'Cancel',\r\n qrExpired: 'QR code has expired. Generate a new one.',\r\n testSmsTitle: 'Send test SMS',\r\n testPhonePlaceholder: 'Phone number (e.g., +1234567890)',\r\n testMessagePlaceholder: 'Message',\r\n sendTestButton: 'Send',\r\n smsSentSuccess: 'SMS sent successfully!',\r\n smsError: 'Error',\r\n};\r\n\r\nexport const RO_LABELS: SmsTunnelLabels = {\r\n title: 'Configurare SMS (SMSTunnel)',\r\n description: 'Conecteaza un telefon Android cu aplicatia SMSTunnel pentru a trimite SMS-uri direct din aplicatie.',\r\n serverUrlLabel: 'Server SMSTunnel',\r\n serverUrlPlaceholder: 'https://smstunnel.io',\r\n saveButton: 'Salveaza',\r\n pairedStatus: 'Conectat',\r\n deviceLabel: 'Dispozitiv',\r\n unpairButton: 'Deconecteaza',\r\n unpairConfirm: 'Sigur doresti sa deconectezi dispozitivul SMS?',\r\n notPairedStatus: 'Neconectat',\r\n notPairedDescription: 'Scaneaza codul QR cu aplicatia SMSTunnel de pe telefonul Android.',\r\n connectButton: 'Conecteaza telefon',\r\n scanQrPrompt: 'Scaneaza acest cod QR cu aplicatia SMSTunnel de pe telefon:',\r\n waitingForPairing: 'Se asteapta conectarea...',\r\n cancelButton: 'Anuleaza',\r\n qrExpired: 'Codul QR a expirat. Genereaza unul nou.',\r\n testSmsTitle: 'Trimite SMS de test',\r\n testPhonePlaceholder: 'Nr. telefon (ex: 0741234567)',\r\n testMessagePlaceholder: 'Mesaj',\r\n sendTestButton: 'Trimite',\r\n smsSentSuccess: 'SMS trimis cu succes!',\r\n smsError: 'Eroare',\r\n};\r\n"],"mappings":"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","names":["defineComponent","ref","watch","h","ref","onMounted","watch","defineComponent","ref","watch","h"]}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@narcisbodea/smstunnel-sdk",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"description": "SMSTunnel SDK - NestJS + React + Vue + framework-agnostic client for SMS pairing",
|
|
3
|
+
"version": "1.1.2",
|
|
4
|
+
"description": "SMSTunnel SDK - Node.js + NestJS + React + Vue + framework-agnostic client for SMS pairing & E2E encryption",
|
|
5
5
|
"author": "NARBOWEB SRL",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "https://github.com/narcisbodea/smstunnel-sdk.git"
|
|
9
|
+
"url": "git+https://github.com/narcisbodea/smstunnel-sdk.git"
|
|
10
10
|
},
|
|
11
11
|
"publishConfig": {
|
|
12
12
|
"access": "public"
|
|
@@ -34,6 +34,16 @@
|
|
|
34
34
|
"types": "./dist/vue/index.d.ts",
|
|
35
35
|
"import": "./dist/vue/index.mjs",
|
|
36
36
|
"require": "./dist/vue/index.js"
|
|
37
|
+
},
|
|
38
|
+
"./node": {
|
|
39
|
+
"types": "./dist/node/index.d.ts",
|
|
40
|
+
"import": "./dist/node/index.mjs",
|
|
41
|
+
"require": "./dist/node/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./angular": {
|
|
44
|
+
"types": "./dist/angular/index.d.ts",
|
|
45
|
+
"import": "./dist/angular/index.mjs",
|
|
46
|
+
"require": "./dist/angular/index.js"
|
|
37
47
|
}
|
|
38
48
|
},
|
|
39
49
|
"files": [
|
|
@@ -51,7 +61,8 @@
|
|
|
51
61
|
"@nestjs/core": ">=10.0.0",
|
|
52
62
|
"react": ">=18.0.0",
|
|
53
63
|
"react-dom": ">=18.0.0",
|
|
54
|
-
"vue": ">=3.3.0"
|
|
64
|
+
"vue": ">=3.3.0",
|
|
65
|
+
"@angular/core": ">=17.0.0"
|
|
55
66
|
},
|
|
56
67
|
"peerDependenciesMeta": {
|
|
57
68
|
"@nestjs/common": {
|
|
@@ -68,6 +79,9 @@
|
|
|
68
79
|
},
|
|
69
80
|
"vue": {
|
|
70
81
|
"optional": true
|
|
82
|
+
},
|
|
83
|
+
"@angular/core": {
|
|
84
|
+
"optional": true
|
|
71
85
|
}
|
|
72
86
|
},
|
|
73
87
|
"devDependencies": {
|
|
@@ -77,6 +91,7 @@
|
|
|
77
91
|
"react": "^18.0.0",
|
|
78
92
|
"tsup": "^8.0.0",
|
|
79
93
|
"typescript": "^5.3.0",
|
|
94
|
+
"@angular/core": "^17.0.0",
|
|
80
95
|
"vue": "^3.5.0"
|
|
81
96
|
}
|
|
82
97
|
}
|