@mostajs/ticketing 2.0.1 → 3.0.0

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 (73) hide show
  1. package/dist/api/detect.route.d.ts +19 -0
  2. package/dist/api/detect.route.d.ts.map +1 -0
  3. package/dist/api/detect.route.js +31 -0
  4. package/dist/api/detect.route.js.map +1 -0
  5. package/dist/api/recognize.route.d.ts +32 -0
  6. package/dist/api/recognize.route.d.ts.map +1 -0
  7. package/dist/api/recognize.route.js +86 -0
  8. package/dist/api/recognize.route.js.map +1 -0
  9. package/dist/components/FaceDetector.d.ts +28 -0
  10. package/dist/components/FaceDetector.d.ts.map +1 -0
  11. package/dist/components/FaceDetector.js +184 -0
  12. package/dist/components/FaceDetector.js.map +1 -0
  13. package/dist/components/ScanResultCard.d.ts +10 -0
  14. package/dist/components/ScanResultCard.d.ts.map +1 -0
  15. package/dist/components/ScanResultCard.js +63 -0
  16. package/dist/components/ScanResultCard.js.map +1 -0
  17. package/dist/components/ScannerView.d.ts +9 -0
  18. package/dist/components/ScannerView.d.ts.map +1 -0
  19. package/dist/components/ScannerView.js +62 -0
  20. package/dist/components/ScannerView.js.map +1 -0
  21. package/dist/hooks/useCamera.d.ts +18 -0
  22. package/dist/hooks/useCamera.d.ts.map +1 -0
  23. package/dist/hooks/useCamera.js +74 -0
  24. package/dist/hooks/useCamera.js.map +1 -0
  25. package/dist/hooks/useFaceDetection.d.ts +22 -0
  26. package/dist/hooks/useFaceDetection.d.ts.map +1 -0
  27. package/dist/hooks/useFaceDetection.js +62 -0
  28. package/dist/hooks/useFaceDetection.js.map +1 -0
  29. package/dist/hooks/useScan.d.ts +9 -0
  30. package/dist/hooks/useScan.d.ts.map +1 -0
  31. package/dist/hooks/useScan.js +101 -0
  32. package/dist/hooks/useScan.js.map +1 -0
  33. package/dist/index.d.ts +13 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +14 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/lib/audio.d.ts +10 -0
  38. package/dist/lib/audio.d.ts.map +1 -0
  39. package/dist/lib/audio.js +29 -0
  40. package/dist/lib/audio.js.map +1 -0
  41. package/dist/lib/face-api.d.ts +24 -0
  42. package/dist/lib/face-api.d.ts.map +1 -0
  43. package/dist/lib/face-api.js +66 -0
  44. package/dist/lib/face-api.js.map +1 -0
  45. package/dist/lib/face-matcher.d.ts +19 -0
  46. package/dist/lib/face-matcher.d.ts.map +1 -0
  47. package/dist/lib/face-matcher.js +53 -0
  48. package/dist/lib/face-matcher.js.map +1 -0
  49. package/dist/lib/face-utils.d.ts +21 -0
  50. package/dist/lib/face-utils.d.ts.map +1 -0
  51. package/dist/lib/face-utils.js +40 -0
  52. package/dist/lib/face-utils.js.map +1 -0
  53. package/dist/pages/ScanPage.d.ts +2 -0
  54. package/dist/pages/ScanPage.d.ts.map +1 -0
  55. package/dist/pages/ScanPage.js +32 -0
  56. package/dist/pages/ScanPage.js.map +1 -0
  57. package/dist/pages/TicketsPage.d.ts +2 -0
  58. package/dist/pages/TicketsPage.d.ts.map +1 -0
  59. package/dist/pages/TicketsPage.js +16 -0
  60. package/dist/pages/TicketsPage.js.map +1 -0
  61. package/dist/register.d.ts.map +1 -1
  62. package/dist/register.js +13 -3
  63. package/dist/register.js.map +1 -1
  64. package/dist/server.d.ts +4 -0
  65. package/dist/server.d.ts.map +1 -1
  66. package/dist/server.js +5 -2
  67. package/dist/server.js.map +1 -1
  68. package/dist/types/index.d.ts +115 -0
  69. package/dist/types/index.d.ts.map +1 -1
  70. package/dist/types/index.js +7 -2
  71. package/dist/types/index.js.map +1 -1
  72. package/i18n/fr/scan.json +25 -0
  73. package/package.json +90 -4
@@ -0,0 +1,21 @@
1
+ /** Convert Float32Array descriptor to number[] for JSON/DB storage */
2
+ export declare function descriptorToArray(descriptor: Float32Array): number[];
3
+ /** Convert number[] back to Float32Array for comparison */
4
+ export declare function arrayToDescriptor(arr: number[]): Float32Array;
5
+ /** Validate that a descriptor is valid (128 elements) */
6
+ export declare function isValidDescriptor(data: unknown): boolean;
7
+ /**
8
+ * Draw a detection bounding box + score on a canvas overlay.
9
+ */
10
+ export declare function drawDetection(canvas: HTMLCanvasElement, detection: {
11
+ detection: {
12
+ score: number;
13
+ box: {
14
+ x: number;
15
+ y: number;
16
+ width: number;
17
+ height: number;
18
+ };
19
+ };
20
+ } | null, videoWidth: number, videoHeight: number): void;
21
+ //# sourceMappingURL=face-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"face-utils.d.ts","sourceRoot":"","sources":["../../lib/face-utils.ts"],"names":[],"mappings":"AAGA,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,YAAY,GAAG,MAAM,EAAE,CAEpE;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,CAE7D;AAED,yDAAyD;AACzD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAIxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE;IAAE,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,EAChH,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,IAAI,CAmBN"}
@@ -0,0 +1,40 @@
1
+ // @mostajs/ticketing — Face utility functions (from @mostajs/face)
2
+ // Author: Dr Hamid MADANI drmdh@msn.com
3
+ /** Convert Float32Array descriptor to number[] for JSON/DB storage */
4
+ export function descriptorToArray(descriptor) {
5
+ return Array.from(descriptor);
6
+ }
7
+ /** Convert number[] back to Float32Array for comparison */
8
+ export function arrayToDescriptor(arr) {
9
+ return new Float32Array(arr);
10
+ }
11
+ /** Validate that a descriptor is valid (128 elements) */
12
+ export function isValidDescriptor(data) {
13
+ if (data instanceof Float32Array)
14
+ return data.length === 128;
15
+ if (Array.isArray(data))
16
+ return data.length === 128 && data.every((v) => typeof v === 'number');
17
+ return false;
18
+ }
19
+ /**
20
+ * Draw a detection bounding box + score on a canvas overlay.
21
+ */
22
+ export function drawDetection(canvas, detection, videoWidth, videoHeight) {
23
+ const ctx = canvas.getContext('2d');
24
+ if (!ctx)
25
+ return;
26
+ canvas.width = videoWidth;
27
+ canvas.height = videoHeight;
28
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
29
+ if (!detection)
30
+ return;
31
+ const box = detection.detection.box;
32
+ ctx.strokeStyle = '#22c55e';
33
+ ctx.lineWidth = 3;
34
+ ctx.strokeRect(box.x, box.y, box.width, box.height);
35
+ const score = Math.round(detection.detection.score * 100);
36
+ ctx.fillStyle = '#22c55e';
37
+ ctx.font = 'bold 14px sans-serif';
38
+ ctx.fillText(`Visage ${score}%`, box.x, box.y - 6);
39
+ }
40
+ //# sourceMappingURL=face-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"face-utils.js","sourceRoot":"","sources":["../../lib/face-utils.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,wCAAwC;AAExC,sEAAsE;AACtE,MAAM,UAAU,iBAAiB,CAAC,UAAwB;IACxD,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;AAC/B,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,GAAa;IAC7C,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,IAAI,IAAI,YAAY,YAAY;QAAE,OAAO,IAAI,CAAC,MAAM,KAAK,GAAG,CAAA;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAA;IAC/F,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAyB,EACzB,SAAgH,EAChH,UAAkB,EAClB,WAAmB;IAEnB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,CAAC,GAAG;QAAE,OAAM;IAEhB,MAAM,CAAC,KAAK,GAAG,UAAU,CAAA;IACzB,MAAM,CAAC,MAAM,GAAG,WAAW,CAAA;IAC3B,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAEhD,IAAI,CAAC,SAAS;QAAE,OAAM;IAEtB,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAA;IACnC,GAAG,CAAC,WAAW,GAAG,SAAS,CAAA;IAC3B,GAAG,CAAC,SAAS,GAAG,CAAC,CAAA;IACjB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAEnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,GAAG,GAAG,CAAC,CAAA;IACzD,GAAG,CAAC,SAAS,GAAG,SAAS,CAAA;IACzB,GAAG,CAAC,IAAI,GAAG,sBAAsB,CAAA;IACjC,GAAG,CAAC,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AACpD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export default function ScanPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ScanPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanPage.d.ts","sourceRoot":"","sources":["../../pages/ScanPage.tsx"],"names":[],"mappings":"AAKA,MAAM,CAAC,OAAO,UAAU,QAAQ,4CA0C/B"}
@@ -0,0 +1,32 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ // @mostajs/ticketing — ScanPage (from @mostajs/scan)
4
+ // Author: Dr Hamid MADANI drmdh@msn.com
5
+ import { useState } from 'react';
6
+ export default function ScanPage() {
7
+ const [qrCode, setQrCode] = useState('');
8
+ const [result, setResult] = useState(null);
9
+ const [loading, setLoading] = useState(false);
10
+ async function handleScan() {
11
+ if (!qrCode.trim())
12
+ return;
13
+ setLoading(true);
14
+ setResult(null);
15
+ try {
16
+ const res = await fetch('/api/scan', {
17
+ method: 'POST',
18
+ headers: { 'Content-Type': 'application/json' },
19
+ body: JSON.stringify({ qrCode }),
20
+ });
21
+ setResult(await res.json());
22
+ }
23
+ catch {
24
+ setResult({ error: 'Erreur reseau' });
25
+ }
26
+ finally {
27
+ setLoading(false);
28
+ }
29
+ }
30
+ return (_jsxs("div", { className: "p-6 space-y-4", children: [_jsx("h1", { className: "text-2xl font-bold", children: "Scanner" }), _jsxs("div", { className: "flex gap-2", children: [_jsx("input", { type: "text", value: qrCode, onChange: (e) => setQrCode(e.target.value), onKeyDown: (e) => e.key === 'Enter' && handleScan(), placeholder: "Code QR du ticket...", className: "flex-1 px-3 py-2 border rounded-md" }), _jsx("button", { onClick: handleScan, disabled: loading || !qrCode.trim(), className: "px-4 py-2 bg-sky-600 text-white rounded-md disabled:opacity-50", children: loading ? 'Scan...' : 'Valider' })] }), result && (_jsx("pre", { className: "p-4 bg-gray-50 rounded-lg text-sm overflow-auto", children: JSON.stringify(result, null, 2) }))] }));
31
+ }
32
+ //# sourceMappingURL=ScanPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanPage.js","sourceRoot":"","sources":["../../pages/ScanPage.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AACZ,qDAAqD;AACrD,wCAAwC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,MAAM,CAAC,OAAO,UAAU,QAAQ;IAC9B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACxC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAM,IAAI,CAAC,CAAA;IAC/C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE7C,KAAK,UAAU,UAAU;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAM;QAC1B,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,SAAS,CAAC,IAAI,CAAC,CAAA;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE;gBACnC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;aACjC,CAAC,CAAA;YACF,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAA;QACvC,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,aAC5B,aAAI,SAAS,EAAC,oBAAoB,wBAAa,EAC/C,eAAK,SAAS,EAAC,YAAY,aACzB,gBAAO,IAAI,EAAC,MAAM,EAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1E,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,UAAU,EAAE,EACnD,WAAW,EAAC,sBAAsB,EAAC,SAAS,EAAC,oCAAoC,GAAG,EACtF,iBAAQ,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAC9D,SAAS,EAAC,gEAAgE,YACzE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GACzB,IACL,EACL,MAAM,IAAI,CACT,cAAK,SAAS,EAAC,iDAAiD,YAC7D,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAC5B,CACP,IACG,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export default function TicketsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=TicketsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketsPage.d.ts","sourceRoot":"","sources":["../../pages/TicketsPage.tsx"],"names":[],"mappings":"AAKA,MAAM,CAAC,OAAO,UAAU,WAAW,4CAsBlC"}
@@ -0,0 +1,16 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ // @mostajs/ticketing — TicketsPage
4
+ // Author: Dr Hamid MADANI drmdh@msn.com
5
+ import { useEffect, useState } from 'react';
6
+ export default function TicketsPage() {
7
+ const [tickets, setTickets] = useState([]);
8
+ const [loading, setLoading] = useState(true);
9
+ useEffect(() => {
10
+ fetch('/api/tickets').then(r => r.json()).then(d => { setTickets(d.data || []); setLoading(false); });
11
+ }, []);
12
+ if (loading)
13
+ return _jsx("div", { className: "p-6", children: "Chargement..." });
14
+ return (_jsxs("div", { className: "p-6 space-y-4", children: [_jsx("h1", { className: "text-2xl font-bold", children: "Tickets" }), _jsx("div", { className: "grid gap-2", children: tickets.map((t) => (_jsxs("div", { className: `p-3 border rounded ${t.status === 'active' ? 'bg-green-50' : 'bg-gray-50'}`, children: ["#", t.ticketNumber, " \u2014 ", t.clientName, " \u2014 ", t.activityName, " \u2014 ", t.status] }, t.id))) })] }));
15
+ }
16
+ //# sourceMappingURL=TicketsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketsPage.js","sourceRoot":"","sources":["../../pages/TicketsPage.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AACZ,mCAAmC;AACnC,wCAAwC;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3C,MAAM,CAAC,OAAO,UAAU,WAAW;IACjC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAQ,EAAE,CAAC,CAAA;IACjD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;IACtG,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,IAAI,OAAO;QAAE,OAAO,cAAK,SAAS,EAAC,KAAK,8BAAoB,CAAA;IAE5D,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,aAC5B,aAAI,SAAS,EAAC,oBAAoB,wBAAa,EAC/C,cAAK,SAAS,EAAC,YAAY,YACxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CACvB,eAAgB,SAAS,EAAE,sBAAsB,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,EAAE,kBACnG,CAAC,CAAC,YAAY,cAAK,CAAC,CAAC,UAAU,cAAK,CAAC,CAAC,YAAY,cAAK,CAAC,CAAC,MAAM,KADzD,CAAC,CAAC,EAAE,CAER,CACP,CAAC,GACE,IACF,CACP,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../register.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AASxD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE;IAAE,QAAQ,CAAC,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAkClF"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../register.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAWxD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE;IAAE,QAAQ,CAAC,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CA4ClF"}
package/dist/register.js CHANGED
@@ -1,4 +1,4 @@
1
- // @mostajs/ticketing — Runtime module registration
1
+ // @mostajs/ticketing — Runtime module registration (merged: ticketing + scan + face)
2
2
  // Author: Dr Hamid MADANI drmdh@msn.com
3
3
  import { TicketSchema } from './schemas/ticket.schema';
4
4
  import { ScanLogSchema } from './schemas/scan-log.schema';
@@ -7,17 +7,19 @@ import { TicketRepository } from './repositories/ticket.repository';
7
7
  import { ScanLogRepository } from './repositories/scan-log.repository';
8
8
  import { ticketingMenuContribution } from './lib/menu';
9
9
  import { TICKETING_PERMISSIONS, TICKETING_PERMISSION_DEFINITIONS, TICKETING_CATEGORY_DEFINITIONS } from './lib/permissions';
10
+ import TicketsPage from './pages/TicketsPage';
11
+ import ScanPage from './pages/ScanPage';
10
12
  export function register(registry) {
11
13
  registry.register({
12
14
  manifest: {
13
15
  name: 'ticketing',
14
16
  package: '@mostajs/ticketing',
15
- version: '2.0.0',
17
+ version: '3.0.0',
16
18
  type: 'business',
17
19
  priority: 95,
18
20
  dependencies: ['auth', 'subscriptions'],
19
21
  displayName: 'Billetterie',
20
- description: 'Tickets, scan, validation — billetterie pure',
22
+ description: 'Tickets, scan, face recognition, validation — billetterie complete',
21
23
  icon: 'Ticket',
22
24
  register: './dist/register.js',
23
25
  },
@@ -35,7 +37,15 @@ export function register(registry) {
35
37
  definitions: TICKETING_PERMISSION_DEFINITIONS,
36
38
  categories: TICKETING_CATEGORY_DEFINITIONS,
37
39
  },
40
+ pages: [
41
+ { path: 'tickets', component: TicketsPage, permission: 'ticket:view' },
42
+ { path: 'scan', component: ScanPage, permission: 'scan:validate' },
43
+ ],
38
44
  menu: ticketingMenuContribution,
45
+ i18n: [
46
+ { namespace: 'tickets', source: 'node_modules/@mostajs/ticketing/i18n/fr/tickets.json' },
47
+ { namespace: 'scan', source: 'node_modules/@mostajs/ticketing/i18n/fr/scan.json' },
48
+ ],
39
49
  });
40
50
  }
41
51
  //# sourceMappingURL=register.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../register.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,wCAAwC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,gCAAgC,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAA;AAE3H,MAAM,UAAU,QAAQ,CAAC,QAAmD;IAC1E,QAAQ,CAAC,QAAQ,CAAC;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,oBAAoB;YAC7B,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;YACvC,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,8CAA8C;YAC3D,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,oBAAoB;SAC/B;QAED,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE;YACxC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE;YAC1C,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE;SAC3C;QAED,YAAY,EAAE;YACZ,UAAU,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,OAAgB,CAAC;YACxE,WAAW,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,OAAgB,CAAC;SAC3E;QAED,WAAW,EAAE;YACX,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE,gCAAgC;YAC7C,UAAU,EAAE,8BAA8B;SAC3C;QAED,IAAI,EAAE,yBAAyB;KAChC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../register.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,wCAAwC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,gCAAgC,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAA;AAC3H,OAAO,WAAW,MAAM,qBAAqB,CAAA;AAC7C,OAAO,QAAQ,MAAM,kBAAkB,CAAA;AAEvC,MAAM,UAAU,QAAQ,CAAC,QAAmD;IAC1E,QAAQ,CAAC,QAAQ,CAAC;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,oBAAoB;YAC7B,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;YACvC,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,oEAAoE;YACjF,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,oBAAoB;SAC/B;QAED,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE;YACxC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE;YAC1C,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE;SAC3C;QAED,YAAY,EAAE;YACZ,UAAU,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,OAAgB,CAAC;YACxE,WAAW,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,OAAgB,CAAC;SAC3E;QAED,WAAW,EAAE;YACX,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE,gCAAgC;YAC7C,UAAU,EAAE,8BAA8B;SAC3C;QAED,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE;YACtE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE;SACnE;QAED,IAAI,EAAE,yBAAyB;QAE/B,IAAI,EAAE;YACJ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,sDAAsD,EAAE;YACxF,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,mDAAmD,EAAE;SACnF;KACF,CAAC,CAAA;AACJ,CAAC"}
package/dist/server.d.ts CHANGED
@@ -2,4 +2,8 @@ export { TicketRepository, ScanLogRepository } from './repositories/index';
2
2
  export type { TicketDTO, ScanLogDTO } from './repositories/index';
3
3
  export { createScanHandler } from './api/scan.route';
4
4
  export { createTicketsHandler } from './api/tickets.route';
5
+ export { createDetectHandler } from './api/detect.route';
6
+ export type { DetectHandlerConfig } from './api/detect.route';
7
+ export { createRecognizeHandler } from './api/recognize.route';
8
+ export type { FaceCandidate, RecognizeHandlerConfig } from './api/recognize.route';
5
9
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC1E,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC1E,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAG1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA"}
package/dist/server.js CHANGED
@@ -1,7 +1,10 @@
1
- // @mostajs/ticketing/server — Server-side exports (ORM-dependent)
1
+ // @mostajs/ticketing/server — Server-side exports (merged: ticketing + face)
2
2
  // Author: Dr Hamid MADANI drmdh@msn.com
3
3
  export { TicketRepository, ScanLogRepository } from './repositories/index';
4
- // API route factories
4
+ // API route factories — ticketing
5
5
  export { createScanHandler } from './api/scan.route';
6
6
  export { createTicketsHandler } from './api/tickets.route';
7
+ // API route factories — face
8
+ export { createDetectHandler } from './api/detect.route';
9
+ export { createRecognizeHandler } from './api/recognize.route';
7
10
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,wCAAwC;AAExC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAG1E,sBAAsB;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wCAAwC;AAExC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAG1E,kCAAkC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,6BAA6B;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAExD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -96,4 +96,119 @@ export interface TicketsHandlerConfig {
96
96
  }) => Promise<void>;
97
97
  defaultCodeFormat?: CodeFormat;
98
98
  }
99
+ export interface ScanTicketInfo {
100
+ ticketNumber: string;
101
+ clientName: string;
102
+ activityName: string;
103
+ ticketType: string;
104
+ validityMode: string;
105
+ status: string;
106
+ }
107
+ export interface ScanClientInfo {
108
+ name: string;
109
+ clientNumber: string;
110
+ photo?: string;
111
+ faceDescriptor?: number[];
112
+ }
113
+ export interface ScanAccessInfo {
114
+ remainingQuota: number | null;
115
+ totalQuota: number | null;
116
+ endDate: string | null;
117
+ status: string;
118
+ }
119
+ export interface ScanResultData {
120
+ result: 'granted' | 'denied';
121
+ reason?: string;
122
+ isReentry?: boolean;
123
+ ticket?: ScanTicketInfo;
124
+ client?: ScanClientInfo;
125
+ access?: ScanAccessInfo;
126
+ }
127
+ export interface ScannerViewProps {
128
+ /** API endpoint for scan validation (default: '/api/scan') */
129
+ apiEndpoint?: string;
130
+ /** Called when a scan result is received */
131
+ onResult?: (data: ScanResultData) => void;
132
+ /** Called on scanner error */
133
+ onError?: (message: string) => void;
134
+ /** Translate function (default: identity) */
135
+ t?: (key: string) => string;
136
+ /** Labels for start/stop buttons */
137
+ startLabel?: string;
138
+ stopLabel?: string;
139
+ /** Sound frequencies: [grantedHz, deniedHz] */
140
+ soundFrequencies?: [number, number];
141
+ }
142
+ export interface ScanResultCardProps {
143
+ /** The scan result data */
144
+ data: ScanResultData;
145
+ /** Translate function (default: identity) */
146
+ t?: (key: string) => string;
147
+ /** Render custom content after client info (e.g., face verification) */
148
+ renderExtra?: (data: ScanResultData) => React.ReactNode;
149
+ }
150
+ export interface UseScanOptions {
151
+ /** API endpoint for scan validation (default: '/api/scan') */
152
+ apiEndpoint?: string;
153
+ /** Play audio feedback on result (default: true) */
154
+ audioFeedback?: boolean;
155
+ /** Sound frequencies: [grantedHz, deniedHz] (default: [800, 300]) */
156
+ soundFrequencies?: [number, number];
157
+ /** Called when a scan result is received */
158
+ onResult?: (data: ScanResultData) => void;
159
+ /** Called on error */
160
+ onError?: (message: string) => void;
161
+ }
162
+ export interface UseScanReturn {
163
+ /** Whether the scanner is actively scanning */
164
+ scanning: boolean;
165
+ /** Whether a scan is being processed */
166
+ processing: boolean;
167
+ /** The latest scan result */
168
+ result: ScanResultData | null;
169
+ /** Start the QR scanner */
170
+ startScanner: () => Promise<void>;
171
+ /** Stop the QR scanner */
172
+ stopScanner: () => void;
173
+ /** Reset the result */
174
+ resetResult: () => void;
175
+ }
176
+ export interface MostaFaceConfig {
177
+ /** Path to face-api.js model files (default: '/models/face-api') */
178
+ modelsPath?: string;
179
+ /** Detection score threshold (default: 0.5) */
180
+ scoreThreshold?: number;
181
+ /** TinyFaceDetector input size (default: 320) */
182
+ inputSize?: number;
183
+ /** Face matching distance threshold (default: 0.6) */
184
+ matchThreshold?: number;
185
+ }
186
+ export interface FaceDetectionResult {
187
+ detection: {
188
+ score: number;
189
+ box: {
190
+ x: number;
191
+ y: number;
192
+ width: number;
193
+ height: number;
194
+ };
195
+ };
196
+ landmarks?: any;
197
+ }
198
+ export interface FaceMatchResult<T> {
199
+ match: T;
200
+ distance: number;
201
+ }
202
+ export type FaceDescriptor = Float32Array | number[];
203
+ export interface FaceSettings {
204
+ /** Enable face detection/recognition (default: true) */
205
+ faceRecognitionEnabled: boolean;
206
+ /** Match distance threshold — lower = stricter (default: 0.6) */
207
+ faceRecognitionThreshold: number;
208
+ /** Require face detected before photo capture (default: true) */
209
+ faceRequireForCapture: boolean;
210
+ /** Auto-verify face after scan (default: false) */
211
+ faceAutoVerify: boolean;
212
+ }
213
+ export declare const DEFAULT_FACE_SETTINGS: FaceSettings;
99
214
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
- // @mostajs/ticketing — Types
1
+ // @mostajs/ticketing — Types (merged: ticketing + scan + face)
2
2
  // Author: Dr Hamid MADANI drmdh@msn.com
3
- export {};
3
+ export const DEFAULT_FACE_SETTINGS = {
4
+ faceRecognitionEnabled: true,
5
+ faceRecognitionThreshold: 0.6,
6
+ faceRequireForCapture: true,
7
+ faceAutoVerify: false,
8
+ };
4
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,wCAAwC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wCAAwC;AAiPxC,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,sBAAsB,EAAE,IAAI;IAC5B,wBAAwB,EAAE,GAAG;IAC7B,qBAAqB,EAAE,IAAI;IAC3B,cAAc,EAAE,KAAK;CACtB,CAAA"}
@@ -0,0 +1,25 @@
1
+ {
2
+ "_author": "Dr Hamid MADANI drmdh@msn.com",
3
+ "title": "Scanner",
4
+ "scan": "Scanner un ticket",
5
+ "history": "Historique des scans",
6
+ "result": {
7
+ "granted": "ACCÈS ACCORDÉ",
8
+ "denied": "ACCÈS REFUSÉ"
9
+ },
10
+ "info": {
11
+ "client": "Client",
12
+ "activity": "Activité",
13
+ "quotaRemaining": "Quota restant",
14
+ "locker": "Casier"
15
+ },
16
+ "denyReasons": {
17
+ "ticket_expired": "Ticket expiré",
18
+ "ticket_already_used": "Ticket déjà utilisé",
19
+ "ticket_cancelled": "Ticket annulé",
20
+ "quota_depleted": "Quota épuisé",
21
+ "access_expired": "Accès expiré",
22
+ "client_suspended": "Client suspendu",
23
+ "invalid_ticket": "Ticket invalide"
24
+ }
25
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mostajs/ticketing",
3
- "version": "2.0.1",
4
- "description": "Ticketing module — ticket lifecycle, scan validation, quota management",
3
+ "version": "3.0.0",
4
+ "description": "Ticketing module — tickets, scan, face recognition, quota management (merged scan+face)",
5
5
  "author": "Dr Hamid MADANI <drmdh@msn.com>",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -28,6 +28,26 @@
28
28
  "import": "./dist/lib/menu.js",
29
29
  "default": "./dist/lib/menu.js"
30
30
  },
31
+ "./lib/audio": {
32
+ "types": "./dist/lib/audio.d.ts",
33
+ "import": "./dist/lib/audio.js",
34
+ "default": "./dist/lib/audio.js"
35
+ },
36
+ "./lib/face-api": {
37
+ "types": "./dist/lib/face-api.d.ts",
38
+ "import": "./dist/lib/face-api.js",
39
+ "default": "./dist/lib/face-api.js"
40
+ },
41
+ "./lib/face-matcher": {
42
+ "types": "./dist/lib/face-matcher.d.ts",
43
+ "import": "./dist/lib/face-matcher.js",
44
+ "default": "./dist/lib/face-matcher.js"
45
+ },
46
+ "./lib/face-utils": {
47
+ "types": "./dist/lib/face-utils.d.ts",
48
+ "import": "./dist/lib/face-utils.js",
49
+ "default": "./dist/lib/face-utils.js"
50
+ },
31
51
  "./types": {
32
52
  "types": "./dist/types/index.d.ts",
33
53
  "import": "./dist/types/index.js",
@@ -37,6 +57,56 @@
37
57
  "types": "./dist/register.d.ts",
38
58
  "import": "./dist/register.js",
39
59
  "default": "./dist/register.js"
60
+ },
61
+ "./pages/TicketsPage": {
62
+ "types": "./dist/pages/TicketsPage.d.ts",
63
+ "import": "./dist/pages/TicketsPage.js",
64
+ "default": "./dist/pages/TicketsPage.js"
65
+ },
66
+ "./pages/ScanPage": {
67
+ "types": "./dist/pages/ScanPage.d.ts",
68
+ "import": "./dist/pages/ScanPage.js",
69
+ "default": "./dist/pages/ScanPage.js"
70
+ },
71
+ "./components/ScannerView": {
72
+ "types": "./dist/components/ScannerView.d.ts",
73
+ "import": "./dist/components/ScannerView.js",
74
+ "default": "./dist/components/ScannerView.js"
75
+ },
76
+ "./components/ScanResultCard": {
77
+ "types": "./dist/components/ScanResultCard.d.ts",
78
+ "import": "./dist/components/ScanResultCard.js",
79
+ "default": "./dist/components/ScanResultCard.js"
80
+ },
81
+ "./components/FaceDetector": {
82
+ "types": "./dist/components/FaceDetector.d.ts",
83
+ "import": "./dist/components/FaceDetector.js",
84
+ "default": "./dist/components/FaceDetector.js"
85
+ },
86
+ "./hooks/useScan": {
87
+ "types": "./dist/hooks/useScan.d.ts",
88
+ "import": "./dist/hooks/useScan.js",
89
+ "default": "./dist/hooks/useScan.js"
90
+ },
91
+ "./hooks/useCamera": {
92
+ "types": "./dist/hooks/useCamera.d.ts",
93
+ "import": "./dist/hooks/useCamera.js",
94
+ "default": "./dist/hooks/useCamera.js"
95
+ },
96
+ "./hooks/useFaceDetection": {
97
+ "types": "./dist/hooks/useFaceDetection.d.ts",
98
+ "import": "./dist/hooks/useFaceDetection.js",
99
+ "default": "./dist/hooks/useFaceDetection.js"
100
+ },
101
+ "./api/detect.route": {
102
+ "types": "./dist/api/detect.route.d.ts",
103
+ "import": "./dist/api/detect.route.js",
104
+ "default": "./dist/api/detect.route.js"
105
+ },
106
+ "./api/recognize.route": {
107
+ "types": "./dist/api/recognize.route.d.ts",
108
+ "import": "./dist/api/recognize.route.js",
109
+ "default": "./dist/api/recognize.route.js"
40
110
  }
41
111
  },
42
112
  "files": [
@@ -51,6 +121,8 @@
51
121
  "ticket",
52
122
  "scan",
53
123
  "qrcode",
124
+ "face-recognition",
125
+ "face-detection",
54
126
  "quota",
55
127
  "nextjs",
56
128
  "mosta"
@@ -68,12 +140,16 @@
68
140
  "prepublishOnly": "npm run build"
69
141
  },
70
142
  "dependencies": {
71
- "@mostajs/orm": "^1.4.12"
143
+ "@mostajs/orm": "^1.4.12",
144
+ "@vladmandic/face-api": "^1.7.0"
72
145
  },
73
146
  "peerDependencies": {
74
147
  "@mostajs/socle": ">=2.0.0",
75
148
  "@mostajs/subscriptions": ">=1.0.0",
76
- "next": ">=14"
149
+ "html5-qrcode": ">=2.3.0",
150
+ "lucide-react": ">=0.400.0",
151
+ "next": ">=14",
152
+ "react": ">=18"
77
153
  },
78
154
  "peerDependenciesMeta": {
79
155
  "next": {
@@ -81,12 +157,22 @@
81
157
  },
82
158
  "@mostajs/subscriptions": {
83
159
  "optional": true
160
+ },
161
+ "html5-qrcode": {
162
+ "optional": true
163
+ },
164
+ "lucide-react": {
165
+ "optional": true
84
166
  }
85
167
  },
86
168
  "devDependencies": {
87
169
  "@mostajs/socle": "^2.0.0",
88
170
  "@types/node": "^25.3.3",
171
+ "@types/react": "^19.0.0",
172
+ "html5-qrcode": "^2.3.8",
173
+ "lucide-react": "^0.575.0",
89
174
  "next": "^16.1.6",
175
+ "react": "^19.0.0",
90
176
  "typescript": "^5.9.3"
91
177
  }
92
178
  }