@mostajs/qrpanel 0.1.0 → 0.2.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.
- package/dist/server.d.ts +38 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +27 -0
- package/dist/server.js.map +1 -1
- package/package.json +3 -2
package/dist/server.d.ts
CHANGED
|
@@ -24,4 +24,42 @@ export declare function generateQrSvg(text: string, opts?: QrOptions): Promise<s
|
|
|
24
24
|
/** Génère un Data URL `data:image/png;base64,...` — pratique pour
|
|
25
25
|
* embarquer directement dans une balise `<img src>` sans endpoint dédié. */
|
|
26
26
|
export declare function generateQrDataUrl(text: string, opts?: QrOptions): Promise<string>;
|
|
27
|
+
export interface BuildInviteUrlsOptions {
|
|
28
|
+
/** Base absolue (https://app.example.com), sans slash final. */
|
|
29
|
+
baseUrl: string;
|
|
30
|
+
/** Path public direct (ex: '/projet-x'). Sera concaténé à baseUrl. */
|
|
31
|
+
directPath: string;
|
|
32
|
+
/** Secret HMAC pour signer le token invite. */
|
|
33
|
+
inviteSecret: string | Buffer;
|
|
34
|
+
/** Identifiant opaque encodé dans le token (resource id). */
|
|
35
|
+
inviteId: string;
|
|
36
|
+
/** TTL en ms (default 60 jours). */
|
|
37
|
+
ttlMs?: number;
|
|
38
|
+
/** Path du callback invite (default '/invite'). Le token est appended : `${baseUrl}${invitePath}/${token}`. */
|
|
39
|
+
invitePath?: string;
|
|
40
|
+
/** Meta libre encodée dans le token. */
|
|
41
|
+
inviteMeta?: Record<string, string | number | boolean>;
|
|
42
|
+
}
|
|
43
|
+
export interface InviteUrls {
|
|
44
|
+
/** URL absolue mode "direct" (auth standard derrière). */
|
|
45
|
+
directUrl: string;
|
|
46
|
+
/** URL absolue mode "invite" (token HMAC signé). */
|
|
47
|
+
inviteUrl: string;
|
|
48
|
+
/** Le token signé seul (pour storage si besoin). */
|
|
49
|
+
inviteToken: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Helper combiné — signe un invite-token et construit la paire d'URLs
|
|
53
|
+
* (direct + invite) prête à passer à `<QrPanel>` côté client.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* const { directUrl, inviteUrl } = buildInviteUrls({
|
|
57
|
+
* baseUrl: 'https://app.example.com',
|
|
58
|
+
* directPath: `/${project.slug}`,
|
|
59
|
+
* inviteSecret: process.env.INVITE_SECRET!,
|
|
60
|
+
* inviteId: project.id,
|
|
61
|
+
* inviteMeta: { kind: 'cohort-invite' },
|
|
62
|
+
* })
|
|
63
|
+
*/
|
|
64
|
+
export declare function buildInviteUrls(opts: BuildInviteUrlsOptions): InviteUrls;
|
|
27
65
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,SAAS;IACxB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IAC5C,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAUjF;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAWjF;AAED;6EAC6E;AAC7E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAUrF;AAID,MAAM,WAAW,sBAAsB;IACrC,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAA;IAClB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAA;IAChB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+GAA+G;IAC/G,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;CACvD;AAED,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,UAAU,CAUxE"}
|
package/dist/server.js
CHANGED
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Wrap minimaliste de la lib `qrcode` (npm). Cross-OS natif (Linux,
|
|
5
5
|
// macOS, Windows) — pas de chromium/puppeteer requis.
|
|
6
|
+
// + helpers haut-niveau combinant invite-token (@mostajs/auth) pour
|
|
7
|
+
// builder la paire (directUrl, inviteUrl) en une ligne.
|
|
6
8
|
import QRCode from 'qrcode';
|
|
9
|
+
import { signInviteToken } from '@mostajs/auth/lib/invite-token';
|
|
7
10
|
/** Génère un PNG (Buffer) d'un QR code encodant `text`. */
|
|
8
11
|
export function generateQrPng(text, opts = {}) {
|
|
9
12
|
return QRCode.toBuffer(text, {
|
|
@@ -42,4 +45,28 @@ export function generateQrDataUrl(text, opts = {}) {
|
|
|
42
45
|
},
|
|
43
46
|
});
|
|
44
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Helper combiné — signe un invite-token et construit la paire d'URLs
|
|
50
|
+
* (direct + invite) prête à passer à `<QrPanel>` côté client.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* const { directUrl, inviteUrl } = buildInviteUrls({
|
|
54
|
+
* baseUrl: 'https://app.example.com',
|
|
55
|
+
* directPath: `/${project.slug}`,
|
|
56
|
+
* inviteSecret: process.env.INVITE_SECRET!,
|
|
57
|
+
* inviteId: project.id,
|
|
58
|
+
* inviteMeta: { kind: 'cohort-invite' },
|
|
59
|
+
* })
|
|
60
|
+
*/
|
|
61
|
+
export function buildInviteUrls(opts) {
|
|
62
|
+
const base = String(opts.baseUrl).replace(/\/+$/, '');
|
|
63
|
+
const direct = opts.directPath.startsWith('/') ? opts.directPath : '/' + opts.directPath;
|
|
64
|
+
const invitePath = (opts.invitePath ?? '/invite').replace(/\/+$/, '');
|
|
65
|
+
const inviteToken = signInviteToken(opts.inviteSecret, opts.inviteId, opts.ttlMs, opts.inviteMeta);
|
|
66
|
+
return {
|
|
67
|
+
directUrl: base + direct,
|
|
68
|
+
inviteUrl: `${base}${invitePath}/${inviteToken}`,
|
|
69
|
+
inviteToken,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
45
72
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,0CAA0C;AAC1C,EAAE;AACF,oEAAoE;AACpE,sDAAsD;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,0CAA0C;AAC1C,EAAE;AACF,oEAAoE;AACpE,sDAAsD;AACtD,oEAAoE;AACpE,wDAAwD;AAExD,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAsBhE,2DAA2D;AAC3D,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAkB,EAAE;IAC9D,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC3B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG;QACxB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC;QACxB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,IAAI,GAAG;QACtD,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS;YACjC,KAAK,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;SACpC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAkB,EAAE;IAC9D,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC3B,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG;QACxB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC;QACxB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,IAAI,GAAG;QACtD,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS;YACjC,KAAK,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;SACpC;KACF,CAAC,CAAA;AACJ,CAAC;AAED;6EAC6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAkB,EAAE;IAClE,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG;QACxB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC;QACxB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,IAAI,GAAG;QACtD,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS;YACjC,KAAK,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;SACpC;KACF,CAAC,CAAA;AACJ,CAAC;AA8BD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,IAA4B;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAA;IACxF,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACrE,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IAClG,OAAO;QACL,SAAS,EAAE,IAAI,GAAG,MAAM;QACxB,SAAS,EAAE,GAAG,IAAI,GAAG,UAAU,IAAI,WAAW,EAAE;QAChD,WAAW;KACZ,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mostajs/qrpanel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "QR code panel — server-side PNG generator (qrcode npm, cross-OS, no chromium) + React client component <QrPanel> with copy/share/mailto.",
|
|
5
5
|
"author": "Dr Hamid MADANI <drmdh@msn.com>",
|
|
6
6
|
"license": "AGPL-3.0-or-later",
|
|
@@ -42,7 +42,8 @@
|
|
|
42
42
|
"prepublishOnly": "npm run build"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"qrcode": "^1.5.4"
|
|
45
|
+
"qrcode": "^1.5.4",
|
|
46
|
+
"@mostajs/auth": "^3.2.0"
|
|
46
47
|
},
|
|
47
48
|
"peerDependencies": {
|
|
48
49
|
"react": ">=18 <20"
|