@altura_ma/onemcp 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.
Files changed (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +176 -0
  3. package/dist/cache/index.d.ts +12 -0
  4. package/dist/cache/index.d.ts.map +1 -0
  5. package/dist/cache/index.js +44 -0
  6. package/dist/cache/index.js.map +1 -0
  7. package/dist/connectors/ban.d.ts +15 -0
  8. package/dist/connectors/ban.d.ts.map +1 -0
  9. package/dist/connectors/ban.js +46 -0
  10. package/dist/connectors/ban.js.map +1 -0
  11. package/dist/connectors/base.d.ts +18 -0
  12. package/dist/connectors/base.d.ts.map +1 -0
  13. package/dist/connectors/base.js +10 -0
  14. package/dist/connectors/base.js.map +1 -0
  15. package/dist/connectors/bodacc.d.ts +11 -0
  16. package/dist/connectors/bodacc.d.ts.map +1 -0
  17. package/dist/connectors/bodacc.js +47 -0
  18. package/dist/connectors/bodacc.js.map +1 -0
  19. package/dist/connectors/companies-house.d.ts +13 -0
  20. package/dist/connectors/companies-house.d.ts.map +1 -0
  21. package/dist/connectors/companies-house.js +104 -0
  22. package/dist/connectors/companies-house.js.map +1 -0
  23. package/dist/connectors/dvf.d.ts +13 -0
  24. package/dist/connectors/dvf.d.ts.map +1 -0
  25. package/dist/connectors/dvf.js +51 -0
  26. package/dist/connectors/dvf.js.map +1 -0
  27. package/dist/connectors/epo-ops.d.ts +37 -0
  28. package/dist/connectors/epo-ops.d.ts.map +1 -0
  29. package/dist/connectors/epo-ops.js +100 -0
  30. package/dist/connectors/epo-ops.js.map +1 -0
  31. package/dist/connectors/france-travail.d.ts +47 -0
  32. package/dist/connectors/france-travail.d.ts.map +1 -0
  33. package/dist/connectors/france-travail.js +89 -0
  34. package/dist/connectors/france-travail.js.map +1 -0
  35. package/dist/connectors/georisques.d.ts +7 -0
  36. package/dist/connectors/georisques.d.ts.map +1 -0
  37. package/dist/connectors/georisques.js +68 -0
  38. package/dist/connectors/georisques.js.map +1 -0
  39. package/dist/connectors/gleif.d.ts +9 -0
  40. package/dist/connectors/gleif.d.ts.map +1 -0
  41. package/dist/connectors/gleif.js +63 -0
  42. package/dist/connectors/gleif.js.map +1 -0
  43. package/dist/connectors/index.d.ts +29 -0
  44. package/dist/connectors/index.d.ts.map +1 -0
  45. package/dist/connectors/index.js +28 -0
  46. package/dist/connectors/index.js.map +1 -0
  47. package/dist/connectors/inpi-rne.d.ts +19 -0
  48. package/dist/connectors/inpi-rne.d.ts.map +1 -0
  49. package/dist/connectors/inpi-rne.js +107 -0
  50. package/dist/connectors/inpi-rne.js.map +1 -0
  51. package/dist/connectors/insee-sirene.d.ts +12 -0
  52. package/dist/connectors/insee-sirene.d.ts.map +1 -0
  53. package/dist/connectors/insee-sirene.js +104 -0
  54. package/dist/connectors/insee-sirene.js.map +1 -0
  55. package/dist/connectors/recherche-entreprises.d.ts +20 -0
  56. package/dist/connectors/recherche-entreprises.d.ts.map +1 -0
  57. package/dist/connectors/recherche-entreprises.js +135 -0
  58. package/dist/connectors/recherche-entreprises.js.map +1 -0
  59. package/dist/connectors/vies.d.ts +10 -0
  60. package/dist/connectors/vies.d.ts.map +1 -0
  61. package/dist/connectors/vies.js +39 -0
  62. package/dist/connectors/vies.js.map +1 -0
  63. package/dist/http.d.ts +3 -0
  64. package/dist/http.d.ts.map +1 -0
  65. package/dist/http.js +74 -0
  66. package/dist/http.js.map +1 -0
  67. package/dist/index.d.ts +3 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +16 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/schemas/canonical.d.ts +1545 -0
  72. package/dist/schemas/canonical.d.ts.map +1 -0
  73. package/dist/schemas/canonical.js +120 -0
  74. package/dist/schemas/canonical.js.map +1 -0
  75. package/dist/server.d.ts +6 -0
  76. package/dist/server.d.ts.map +1 -0
  77. package/dist/server.js +126 -0
  78. package/dist/server.js.map +1 -0
  79. package/dist/tools/company-layer2.d.ts +3 -0
  80. package/dist/tools/company-layer2.d.ts.map +1 -0
  81. package/dist/tools/company-layer2.js +84 -0
  82. package/dist/tools/company-layer2.js.map +1 -0
  83. package/dist/tools/company.d.ts +3 -0
  84. package/dist/tools/company.d.ts.map +1 -0
  85. package/dist/tools/company.js +119 -0
  86. package/dist/tools/company.js.map +1 -0
  87. package/dist/tools/geo.d.ts +3 -0
  88. package/dist/tools/geo.d.ts.map +1 -0
  89. package/dist/tools/geo.js +59 -0
  90. package/dist/tools/geo.js.map +1 -0
  91. package/dist/tools/identity.d.ts +3 -0
  92. package/dist/tools/identity.d.ts.map +1 -0
  93. package/dist/tools/identity.js +60 -0
  94. package/dist/tools/identity.js.map +1 -0
  95. package/dist/tools/index.d.ts +14 -0
  96. package/dist/tools/index.d.ts.map +1 -0
  97. package/dist/tools/index.js +22 -0
  98. package/dist/tools/index.js.map +1 -0
  99. package/dist/tools/jobs.d.ts +3 -0
  100. package/dist/tools/jobs.d.ts.map +1 -0
  101. package/dist/tools/jobs.js +63 -0
  102. package/dist/tools/jobs.js.map +1 -0
  103. package/dist/tools/legal.d.ts +3 -0
  104. package/dist/tools/legal.d.ts.map +1 -0
  105. package/dist/tools/legal.js +48 -0
  106. package/dist/tools/legal.js.map +1 -0
  107. package/dist/tools/patents.d.ts +3 -0
  108. package/dist/tools/patents.d.ts.map +1 -0
  109. package/dist/tools/patents.js +51 -0
  110. package/dist/tools/patents.js.map +1 -0
  111. package/dist/tools/realestate.d.ts +3 -0
  112. package/dist/tools/realestate.d.ts.map +1 -0
  113. package/dist/tools/realestate.js +30 -0
  114. package/dist/tools/realestate.js.map +1 -0
  115. package/dist/tools/sources.d.ts +3 -0
  116. package/dist/tools/sources.d.ts.map +1 -0
  117. package/dist/tools/sources.js +17 -0
  118. package/dist/tools/sources.js.map +1 -0
  119. package/dist/tools/types.d.ts +10 -0
  120. package/dist/tools/types.d.ts.map +1 -0
  121. package/dist/tools/types.js +4 -0
  122. package/dist/tools/types.js.map +1 -0
  123. package/dist/utils/env.d.ts +3 -0
  124. package/dist/utils/env.d.ts.map +1 -0
  125. package/dist/utils/env.js +14 -0
  126. package/dist/utils/env.js.map +1 -0
  127. package/dist/utils/http.d.ts +17 -0
  128. package/dist/utils/http.d.ts.map +1 -0
  129. package/dist/utils/http.js +62 -0
  130. package/dist/utils/http.js.map +1 -0
  131. package/dist/utils/oauth.d.ts +11 -0
  132. package/dist/utils/oauth.d.ts.map +1 -0
  133. package/dist/utils/oauth.js +31 -0
  134. package/dist/utils/oauth.js.map +1 -0
  135. package/dist/worker.d.ts +16 -0
  136. package/dist/worker.d.ts.map +1 -0
  137. package/dist/worker.js +185 -0
  138. package/dist/worker.js.map +1 -0
  139. package/package.json +60 -0
@@ -0,0 +1,107 @@
1
+ import { fetchJson } from "../utils/http.js";
2
+ import { requireEnv } from "../utils/oauth.js";
3
+ import { Connector } from "./base.js";
4
+ const BASE_URL = "https://registre-national-entreprises.inpi.fr/api";
5
+ let jwtToken = null;
6
+ async function getInpiToken() {
7
+ if (jwtToken && jwtToken.expires_at > Date.now() + 60_000) {
8
+ return jwtToken.value;
9
+ }
10
+ const username = requireEnv("INPI_USERNAME");
11
+ const password = requireEnv("INPI_PASSWORD");
12
+ const res = await fetchJson(`${BASE_URL}/sso/login`, {
13
+ method: "POST",
14
+ headers: { "Content-Type": "application/json" },
15
+ body: JSON.stringify({ username, password }),
16
+ retries: 1,
17
+ });
18
+ jwtToken = {
19
+ value: res.token,
20
+ expires_at: Date.now() + 23 * 60 * 60 * 1000,
21
+ };
22
+ return res.token;
23
+ }
24
+ export class InpiRneConnector extends Connector {
25
+ metadata = {
26
+ id: "inpi-rne",
27
+ name: "INPI Registre National des Entreprises",
28
+ description: "Registre National des Entreprises INPI : statuts, actes, comptes annuels, bénéficiaires effectifs. Source officielle pour due diligence et KYC.",
29
+ source: "https://registre-national-entreprises.inpi.fr",
30
+ license: "Licence Ouverte 2.0 (Etalab)",
31
+ authRequired: true,
32
+ defaultTtlSeconds: 86400,
33
+ };
34
+ async getBySiren(siren) {
35
+ if (!/^\d{9}$/.test(siren))
36
+ throw new Error("SIREN invalide (9 chiffres requis)");
37
+ const token = await getInpiToken();
38
+ const url = `${BASE_URL}/companies/${siren}`;
39
+ const data = await this.getJson(url, {
40
+ headers: { Authorization: `Bearer ${token}` },
41
+ });
42
+ return this.normalize(siren, data);
43
+ }
44
+ normalize(siren, data) {
45
+ const pm = data.formality?.content?.personneMorale;
46
+ const entreprise = pm?.identite?.entreprise;
47
+ const pouvoirs = pm?.composition?.pouvoirs ?? [];
48
+ const officers = pouvoirs.map((p) => {
49
+ const dp = p.individu?.descriptionPersonne;
50
+ return {
51
+ name: dp ? [dp.prenoms?.[0], dp.nom].filter(Boolean).join(" ") || "Inconnu" : "Inconnu",
52
+ role: p.type,
53
+ type: "person",
54
+ birth_date_partial: dp?.dateDeNaissance?.slice(0, 7),
55
+ nationality: dp?.nationalite,
56
+ };
57
+ });
58
+ const financials = (data.comptes ?? []).map((c) => ({
59
+ filed_at: c.dateDepot,
60
+ }));
61
+ const url = `${BASE_URL}/companies/${siren}`;
62
+ return {
63
+ siren,
64
+ legal_name: entreprise?.denomination,
65
+ trade_name: entreprise?.sigle,
66
+ legal_form: entreprise?.formeJuridique?.libelle,
67
+ legal_form_code: entreprise?.formeJuridique?.code,
68
+ created_at: entreprise?.dateImmat,
69
+ officers,
70
+ financials,
71
+ provenance: [this.makeProvenance(url)],
72
+ _raw: data,
73
+ };
74
+ }
75
+ async getBeneficiairesEffectifs(siren) {
76
+ if (!/^\d{9}$/.test(siren))
77
+ throw new Error("SIREN invalide");
78
+ const token = await getInpiToken();
79
+ const url = `${BASE_URL}/companies/${siren}`;
80
+ const data = await this.getJson(url, {
81
+ headers: { Authorization: `Bearer ${token}` },
82
+ });
83
+ const beneficiaires = (data.beneficiairesEffectifs ?? []).map((b) => {
84
+ const dp = b.beneficiaire?.descriptionPersonne;
85
+ return {
86
+ name: dp ? [dp.prenoms?.[0], dp.nom].filter(Boolean).join(" ") || "Inconnu" : "Inconnu",
87
+ birth_date_partial: dp?.dateDeNaissance?.slice(0, 7),
88
+ nationality: dp?.nationalite,
89
+ ownership_pct: b.beneficiaire?.details?.pourcentageDetentionDirecteIndirecte,
90
+ };
91
+ });
92
+ return {
93
+ siren,
94
+ beneficiaires,
95
+ provenance: [this.makeProvenance(url)],
96
+ };
97
+ }
98
+ makeProvenance(url) {
99
+ return {
100
+ source: this.metadata.id,
101
+ source_url: url,
102
+ fetched_at: new Date().toISOString(),
103
+ license: this.metadata.license,
104
+ };
105
+ }
106
+ }
107
+ //# sourceMappingURL=inpi-rne.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inpi-rne.js","sourceRoot":"","sources":["../../src/connectors/inpi-rne.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAA0B,MAAM,WAAW,CAAC;AAE9D,MAAM,QAAQ,GAAG,mDAAmD,CAAC;AAgFrE,IAAI,QAAQ,GAAiD,IAAI,CAAC;AAElE,KAAK,UAAU,YAAY;IACzB,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;QAC1D,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAE7C,MAAM,GAAG,GAAG,MAAM,SAAS,CAAoB,GAAG,QAAQ,YAAY,EAAE;QACtE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC5C,OAAO,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,QAAQ,GAAG;QACT,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;KAC7C,CAAC;IAEF,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IACpC,QAAQ,GAAsB;QACrC,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,wCAAwC;QAC9C,WAAW,EACT,iJAAiJ;QACnJ,MAAM,EAAE,+CAA+C;QACvD,OAAO,EAAE,8BAA8B;QACvC,YAAY,EAAE,IAAI;QAClB,iBAAiB,EAAE,KAAK;KACzB,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAClF,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,GAAG,QAAQ,cAAc,KAAK,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAc,GAAG,EAAE;YAChD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAEO,SAAS,CAAC,KAAa,EAAE,IAAiB;QAChD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC;QACnD,MAAM,UAAU,GAAG,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC5C,MAAM,QAAQ,GAAG,EAAE,EAAE,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC;QAEjD,MAAM,QAAQ,GAAc,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7C,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,mBAAmB,CAAC;YAC3C,OAAO;gBACL,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS;gBACvF,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,QAAQ;gBACd,kBAAkB,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpD,WAAW,EAAE,EAAE,EAAE,WAAW;aAC7B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAiB,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChE,QAAQ,EAAE,CAAC,CAAC,SAAS;SACtB,CAAC,CAAC,CAAC;QAEJ,MAAM,GAAG,GAAG,GAAG,QAAQ,cAAc,KAAK,EAAE,CAAC;QAC7C,OAAO;YACL,KAAK;YACL,UAAU,EAAE,UAAU,EAAE,YAAY;YACpC,UAAU,EAAE,UAAU,EAAE,KAAK;YAC7B,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO;YAC/C,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI;YACjD,UAAU,EAAE,UAAU,EAAE,SAAS;YACjC,QAAQ;YACR,UAAU;YACV,UAAU,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,EAAE,IAAI;SACX,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,KAAa;QAU3C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,GAAG,QAAQ,cAAc,KAAK,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAc,GAAG,EAAE;YAChD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAClE,MAAM,EAAE,GAAG,CAAC,CAAC,YAAY,EAAE,mBAAmB,CAAC;YAC/C,OAAO;gBACL,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS;gBACvF,kBAAkB,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpD,WAAW,EAAE,EAAE,EAAE,WAAW;gBAC5B,aAAa,EAAE,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,oCAAoC;aAC7E,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,KAAK;YACL,aAAa;YACb,UAAU,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;SACvC,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,GAAW;QAChC,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE;YACxB,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;SAC/B,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { Company } from "../schemas/canonical.js";
2
+ import { Connector, type ConnectorMetadata } from "./base.js";
3
+ export declare class InseeSireneConnector extends Connector {
4
+ readonly metadata: ConnectorMetadata;
5
+ private getToken;
6
+ getBySiren(siren: string): Promise<Company | null>;
7
+ getBySiret(siret: string): Promise<Company | null>;
8
+ private normalize;
9
+ private normalizeEtablissement;
10
+ private makeProvenance;
11
+ }
12
+ //# sourceMappingURL=insee-sirene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insee-sirene.d.ts","sourceRoot":"","sources":["../../src/connectors/insee-sirene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,OAAO,EAAkD,MAAM,yBAAyB,CAAC;AAEhH,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AA8D9D,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CASlC;YAEY,QAAQ;IAShB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAUlD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAoBxD,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,sBAAsB;IAyB9B,OAAO,CAAC,cAAc;CAQvB"}
@@ -0,0 +1,104 @@
1
+ import { getOAuth2Token, requireEnv } from "../utils/oauth.js";
2
+ import { Connector } from "./base.js";
3
+ const BASE_URL = "https://api.insee.fr/entreprises/sirene/V3.11";
4
+ const TOKEN_URL = "https://api.insee.fr/token";
5
+ export class InseeSireneConnector extends Connector {
6
+ metadata = {
7
+ id: "insee-sirene",
8
+ name: "INSEE Sirene",
9
+ description: "Référentiel officiel INSEE des entreprises et établissements français. Mise à jour quotidienne. Accès complet SIREN/SIRET avec historique des changements.",
10
+ source: "https://api.insee.fr/entreprises/sirene/V3.11",
11
+ license: "Licence Ouverte 2.0 (Etalab)",
12
+ authRequired: true,
13
+ defaultTtlSeconds: 86400,
14
+ };
15
+ async getToken() {
16
+ return getOAuth2Token({
17
+ key: "insee-sirene",
18
+ tokenUrl: TOKEN_URL,
19
+ clientId: requireEnv("INSEE_CLIENT_ID"),
20
+ clientSecret: requireEnv("INSEE_CLIENT_SECRET"),
21
+ });
22
+ }
23
+ async getBySiren(siren) {
24
+ if (!/^\d{9}$/.test(siren))
25
+ throw new Error("SIREN invalide (9 chiffres requis)");
26
+ const token = await this.getToken();
27
+ const url = `${BASE_URL}/siren/${siren}`;
28
+ const data = await this.getJson(url, {
29
+ headers: { Authorization: `Bearer ${token}` },
30
+ });
31
+ return this.normalize(data.uniteLegale);
32
+ }
33
+ async getBySiret(siret) {
34
+ if (!/^\d{14}$/.test(siret))
35
+ throw new Error("SIRET invalide (14 chiffres requis)");
36
+ const token = await this.getToken();
37
+ const url = `${BASE_URL}/siret/${siret}`;
38
+ const data = await this.getJson(url, {
39
+ headers: { Authorization: `Bearer ${token}` },
40
+ });
41
+ const etab = data.etablissement;
42
+ const ul = etab.uniteLegale;
43
+ const company = ul ? this.normalize({ ...ul, siren: etab.siren }) : {
44
+ siren: etab.siren,
45
+ active: etab.etatAdministratifEtablissement === "A",
46
+ provenance: [this.makeProvenance(url)],
47
+ };
48
+ company.headquarter = this.normalizeEtablissement(etab);
49
+ return company;
50
+ }
51
+ normalize(ul) {
52
+ const currentPeriod = ul.periodesUniteLegale?.[0];
53
+ const url = `${BASE_URL}/siren/${ul.siren}`;
54
+ const establishment = undefined;
55
+ const officers = [];
56
+ const financials = [];
57
+ return {
58
+ siren: ul.siren,
59
+ legal_name: ul.denominationUniteLegale ?? currentPeriod?.denominationUniteLegale,
60
+ trade_name: ul.denominationUsuelle1UniteLegale,
61
+ legal_form_code: ul.categorieJuridiqueUniteLegale ?? currentPeriod?.categorieJuridiqueUniteLegale,
62
+ active: (ul.etatAdministratifUniteLegale ?? currentPeriod?.etatAdministratifUniteLegale) === "A",
63
+ created_at: ul.dateCreationUniteLegale,
64
+ closed_at: ul.dateFin,
65
+ naf_code: ul.activitePrincipaleUniteLegale ?? currentPeriod?.activitePrincipaleUniteLegale,
66
+ officers,
67
+ financials,
68
+ provenance: [this.makeProvenance(url)],
69
+ _raw: ul,
70
+ };
71
+ }
72
+ normalizeEtablissement(etab) {
73
+ const addr = etab.adresseEtablissement;
74
+ const address = addr
75
+ ? {
76
+ street: [addr.numeroVoieEtablissement, addr.typeVoieEtablissement, addr.libelleVoieEtablissement]
77
+ .filter(Boolean)
78
+ .join(" ") || undefined,
79
+ postal_code: addr.codePostalEtablissement,
80
+ city: addr.libelleCommuneEtablissement,
81
+ insee_code: addr.codeCommuneEtablissement,
82
+ country: addr.codePaysEtrangerEtablissement ?? "FR",
83
+ }
84
+ : undefined;
85
+ return {
86
+ siret: etab.siret,
87
+ is_headquarters: etab.etablissementSiege,
88
+ active: etab.etatAdministratifEtablissement === "A",
89
+ naf_code: etab.activitePrincipaleEtablissement,
90
+ employee_range: etab.trancheEffectifsEtablissement,
91
+ created_at: etab.dateCreationEtablissement,
92
+ address,
93
+ };
94
+ }
95
+ makeProvenance(url) {
96
+ return {
97
+ source: this.metadata.id,
98
+ source_url: url,
99
+ fetched_at: new Date().toISOString(),
100
+ license: this.metadata.license,
101
+ };
102
+ }
103
+ }
104
+ //# sourceMappingURL=insee-sirene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insee-sirene.js","sourceRoot":"","sources":["../../src/connectors/insee-sirene.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Company, SearchResult } from "../schemas/canonical.js";
2
+ import { Connector, type ConnectorMetadata } from "./base.js";
3
+ export declare class RechercheEntreprisesConnector extends Connector {
4
+ readonly metadata: ConnectorMetadata;
5
+ search(params: {
6
+ query: string;
7
+ page?: number;
8
+ perPage?: number;
9
+ departement?: string;
10
+ naf?: string;
11
+ activeOnly?: boolean;
12
+ }): Promise<SearchResult>;
13
+ getBySiren(siren: string): Promise<Company | null>;
14
+ getBySiret(siret: string): Promise<Company | null>;
15
+ private normalize;
16
+ private normalizeEstablishment;
17
+ private normalizeOfficer;
18
+ private makeProvenance;
19
+ }
20
+ //# sourceMappingURL=recherche-entreprises.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recherche-entreprises.d.ts","sourceRoot":"","sources":["../../src/connectors/recherche-entreprises.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,OAAO,EAKP,YAAY,EACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAsE9D,qBAAa,6BAA8B,SAAQ,SAAS;IAC1D,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CASlC;IAEI,MAAM,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBnB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAWlD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAWxD,OAAO,CAAC,SAAS;IAkCjB,OAAO,CAAC,sBAAsB;IAyB9B,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,cAAc;CAQvB"}
@@ -0,0 +1,135 @@
1
+ import { Connector } from "./base.js";
2
+ const BASE_URL = "https://recherche-entreprises.api.gouv.fr";
3
+ export class RechercheEntreprisesConnector extends Connector {
4
+ metadata = {
5
+ id: "recherche-entreprises",
6
+ name: "Recherche d'entreprises (DINUM)",
7
+ description: "API officielle de recherche d'entreprises française agrégeant INSEE, INPI, RNE, BODACC.",
8
+ source: "https://recherche-entreprises.api.gouv.fr",
9
+ license: "Licence Ouverte 2.0 (Etalab)",
10
+ authRequired: false,
11
+ defaultTtlSeconds: 86400,
12
+ };
13
+ async search(params) {
14
+ const search = new URLSearchParams({
15
+ q: params.query,
16
+ page: String(params.page ?? 1),
17
+ per_page: String(params.perPage ?? 10),
18
+ });
19
+ if (params.departement)
20
+ search.set("departement", params.departement);
21
+ if (params.naf)
22
+ search.set("activite_principale", params.naf);
23
+ if (params.activeOnly)
24
+ search.set("etat_administratif", "A");
25
+ const url = `${BASE_URL}/search?${search.toString()}`;
26
+ const data = await this.getJson(url);
27
+ return {
28
+ query: params.query,
29
+ total: data.total_results,
30
+ page: data.page,
31
+ per_page: data.per_page,
32
+ results: data.results.map((c) => this.normalize(c)),
33
+ provenance: [this.makeProvenance(url)],
34
+ };
35
+ }
36
+ async getBySiren(siren) {
37
+ if (!/^\d{9}$/.test(siren)) {
38
+ throw new Error("SIREN invalide (9 chiffres requis)");
39
+ }
40
+ const url = `${BASE_URL}/search?q=${siren}&per_page=1`;
41
+ const data = await this.getJson(url);
42
+ const first = data.results[0];
43
+ if (!first || first.siren !== siren)
44
+ return null;
45
+ return this.normalize(first);
46
+ }
47
+ async getBySiret(siret) {
48
+ if (!/^\d{14}$/.test(siret)) {
49
+ throw new Error("SIRET invalide (14 chiffres requis)");
50
+ }
51
+ const url = `${BASE_URL}/search?q=${siret}&per_page=1`;
52
+ const data = await this.getJson(url);
53
+ const first = data.results[0];
54
+ if (!first)
55
+ return null;
56
+ return this.normalize(first);
57
+ }
58
+ normalize(raw) {
59
+ const headquarter = raw.siege ? this.normalizeEstablishment(raw.siege) : undefined;
60
+ const establishments = (raw.matching_etablissements ?? []).map((e) => this.normalizeEstablishment(e));
61
+ const officers = (raw.dirigeants ?? []).map((d) => this.normalizeOfficer(d));
62
+ const financials = raw.finances
63
+ ? Object.entries(raw.finances).map(([year, f]) => ({
64
+ fiscal_year: Number(year),
65
+ revenue_eur: f.ca,
66
+ net_income_eur: f.resultat_net,
67
+ }))
68
+ : [];
69
+ return {
70
+ siren: raw.siren,
71
+ legal_name: raw.nom_raison_sociale ?? raw.nom_complet,
72
+ trade_name: raw.sigle,
73
+ legal_form_code: raw.nature_juridique,
74
+ active: raw.etat_administratif === "A",
75
+ created_at: raw.date_creation,
76
+ closed_at: raw.date_fermeture,
77
+ naf_code: raw.activite_principale,
78
+ naf_label: raw.section_activite_principale,
79
+ registered_address: headquarter?.address,
80
+ headquarter,
81
+ establishments,
82
+ officers,
83
+ financials,
84
+ provenance: [this.makeProvenance(`${BASE_URL}/search?q=${raw.siren}`)],
85
+ _raw: raw,
86
+ };
87
+ }
88
+ normalizeEstablishment(raw) {
89
+ const address = {
90
+ full: raw.adresse,
91
+ street: [raw.numero_voie, raw.type_voie, raw.libelle_voie]
92
+ .filter(Boolean)
93
+ .join(" ") || undefined,
94
+ postal_code: raw.code_postal,
95
+ city: raw.libelle_commune,
96
+ insee_code: raw.commune,
97
+ country: "FR",
98
+ latitude: raw.latitude !== undefined ? Number(raw.latitude) : undefined,
99
+ longitude: raw.longitude !== undefined ? Number(raw.longitude) : undefined,
100
+ };
101
+ return {
102
+ siret: raw.siret,
103
+ is_headquarters: raw.est_siege,
104
+ active: raw.etat_administratif === "A",
105
+ naf_code: raw.activite_principale,
106
+ naf_label: raw.libelle_activite_principale,
107
+ address,
108
+ employee_range: raw.tranche_effectif_salarie,
109
+ created_at: raw.date_creation,
110
+ };
111
+ }
112
+ normalizeOfficer(raw) {
113
+ const isCompany = raw.type_dirigeant === "personne morale" || !!raw.denomination;
114
+ const name = isCompany
115
+ ? raw.denomination ?? "Personne morale"
116
+ : [raw.prenoms, raw.nom].filter(Boolean).join(" ") || "Inconnu";
117
+ const birth = raw.date_de_naissance?.slice(0, 7);
118
+ return {
119
+ name,
120
+ role: raw.qualite,
121
+ type: isCompany ? "company" : "person",
122
+ birth_date_partial: birth,
123
+ nationality: raw.nationalite,
124
+ };
125
+ }
126
+ makeProvenance(url) {
127
+ return {
128
+ source: this.metadata.id,
129
+ source_url: url,
130
+ fetched_at: new Date().toISOString(),
131
+ license: this.metadata.license,
132
+ };
133
+ }
134
+ }
135
+ //# sourceMappingURL=recherche-entreprises.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recherche-entreprises.js","sourceRoot":"","sources":["../../src/connectors/recherche-entreprises.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { VatValidation } from "../schemas/canonical.js";
2
+ import { Connector, type ConnectorMetadata } from "./base.js";
3
+ export declare class ViesConnector extends Connector {
4
+ readonly metadata: ConnectorMetadata;
5
+ validate(params: {
6
+ countryCode: string;
7
+ vatNumber: string;
8
+ }): Promise<VatValidation>;
9
+ }
10
+ //# sourceMappingURL=vies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vies.d.ts","sourceRoot":"","sources":["../../src/connectors/vies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAc9D,qBAAa,aAAc,SAAQ,SAAS;IAC1C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAQlC;IAEI,QAAQ,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,aAAa,CAAC;CA2B3B"}
@@ -0,0 +1,39 @@
1
+ import { Connector } from "./base.js";
2
+ const BASE_URL = "https://ec.europa.eu/taxation_customs/vies/rest-api";
3
+ export class ViesConnector extends Connector {
4
+ metadata = {
5
+ id: "vies",
6
+ name: "VIES (Commission européenne)",
7
+ description: "Validation des numéros de TVA intracommunautaire (27 États membres UE).",
8
+ source: "https://ec.europa.eu/taxation_customs/vies/",
9
+ license: "Données publiques - usage validation",
10
+ authRequired: false,
11
+ defaultTtlSeconds: 3600,
12
+ };
13
+ async validate(params) {
14
+ const cc = params.countryCode.toUpperCase();
15
+ const vat = params.vatNumber.replace(/^[A-Z]{2}/i, "").replace(/\s/g, "");
16
+ const url = `${BASE_URL}/check-vat-number`;
17
+ const provenance = {
18
+ source: this.metadata.id,
19
+ source_url: url,
20
+ fetched_at: new Date().toISOString(),
21
+ license: this.metadata.license,
22
+ };
23
+ const cacheKey = `vies:${cc}:${vat}`;
24
+ const data = await this.getJson(url, {
25
+ cacheKey,
26
+ headers: { "Content-Type": "application/json" },
27
+ });
28
+ return {
29
+ vat_number: `${cc}${vat}`,
30
+ country_code: cc,
31
+ valid: !!data.isValid,
32
+ legal_name: data.name?.trim() || undefined,
33
+ address: data.address?.trim() || undefined,
34
+ checked_at: data.requestDate ?? new Date().toISOString(),
35
+ provenance: [provenance],
36
+ };
37
+ }
38
+ }
39
+ //# sourceMappingURL=vies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vies.js","sourceRoot":"","sources":["../../src/connectors/vies.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAA0B,MAAM,WAAW,CAAC;AAE9D,MAAM,QAAQ,GAAG,qDAAqD,CAAC;AAYvE,MAAM,OAAO,aAAc,SAAQ,SAAS;IACjC,QAAQ,GAAsB;QACrC,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,yEAAyE;QACtF,MAAM,EAAE,6CAA6C;QACrD,OAAO,EAAE,sCAAsC;QAC/C,YAAY,EAAE,KAAK;QACnB,iBAAiB,EAAE,IAAI;KACxB,CAAC;IAEF,KAAK,CAAC,QAAQ,CAAC,MAGd;QACC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,GAAG,QAAQ,mBAAmB,CAAC;QAC3C,MAAM,UAAU,GAAe;YAC7B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE;YACxB,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;SAC/B,CAAC;QAEF,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAU,GAAG,EAAE;YAC5C,QAAQ;YACR,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;YACzB,YAAY,EAAE,EAAE;YAChB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,SAAS;YAC1C,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,SAAS;YAC1C,UAAU,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACxD,UAAU,EAAE,CAAC,UAAU,CAAC;SACzB,CAAC;IACJ,CAAC;CACF"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":""}
package/dist/http.js ADDED
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Streamable HTTP transport entrypoint (multi-tenant hosted mode).
4
+ *
5
+ * Le transport SSE a été déprécié dans la révision MCP 2025-03-26 en faveur
6
+ * de Streamable HTTP : un seul endpoint /mcp qui gère POST (requêtes JSON-RPC)
7
+ * et GET (upgrade SSE pour les notifications serveur → client).
8
+ *
9
+ * Cette implémentation utilise le serveur HTTP natif de Node pour rester
10
+ * sans dépendance lourde. Pour la prod (Cloudflare Workers), voir docs/architecture.md.
11
+ */
12
+ import { createServer as createHttpServer } from "node:http";
13
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
14
+ import { createServer } from "./server.js";
15
+ const PORT = Number.parseInt(process.env.PORT ?? "3000", 10);
16
+ const ENDPOINT = "/mcp";
17
+ async function main() {
18
+ const mcpServer = createServer();
19
+ const transport = new StreamableHTTPServerTransport({
20
+ sessionIdGenerator: () => crypto.randomUUID(),
21
+ });
22
+ await mcpServer.connect(transport);
23
+ const httpServer = createHttpServer(async (req, res) => {
24
+ if (!req.url?.startsWith(ENDPOINT)) {
25
+ res.statusCode = 404;
26
+ res.end("Not Found");
27
+ return;
28
+ }
29
+ // CORS pour usage navigateur / inspector
30
+ res.setHeader("Access-Control-Allow-Origin", "*");
31
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
32
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Mcp-Session-Id");
33
+ res.setHeader("Access-Control-Expose-Headers", "Mcp-Session-Id");
34
+ if (req.method === "OPTIONS") {
35
+ res.statusCode = 204;
36
+ res.end();
37
+ return;
38
+ }
39
+ try {
40
+ let body;
41
+ if (req.method === "POST") {
42
+ const chunks = [];
43
+ for await (const chunk of req)
44
+ chunks.push(chunk);
45
+ const raw = Buffer.concat(chunks).toString("utf8");
46
+ body = raw ? JSON.parse(raw) : undefined;
47
+ }
48
+ await transport.handleRequest(req, res, body);
49
+ }
50
+ catch (err) {
51
+ // eslint-disable-next-line no-console
52
+ console.error("[mcp-business-fr] request error:", err);
53
+ if (!res.headersSent) {
54
+ res.statusCode = 500;
55
+ res.setHeader("Content-Type", "application/json");
56
+ res.end(JSON.stringify({
57
+ jsonrpc: "2.0",
58
+ error: { code: -32603, message: "Internal error" },
59
+ id: null,
60
+ }));
61
+ }
62
+ }
63
+ });
64
+ httpServer.listen(PORT, () => {
65
+ // eslint-disable-next-line no-console
66
+ console.error(`[mcp-business-fr] Streamable HTTP listening on http://localhost:${PORT}${ENDPOINT}`);
67
+ });
68
+ }
69
+ main().catch((err) => {
70
+ // eslint-disable-next-line no-console
71
+ console.error("[mcp-business-fr] fatal:", err);
72
+ process.exit(1);
73
+ });
74
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createServer } from "./server.js";
4
+ async function main() {
5
+ const server = createServer();
6
+ const transport = new StdioServerTransport();
7
+ await server.connect(transport);
8
+ // eslint-disable-next-line no-console
9
+ console.error("[mcp-business-fr] connected via stdio");
10
+ }
11
+ main().catch((err) => {
12
+ // eslint-disable-next-line no-console
13
+ console.error("[mcp-business-fr] fatal:", err);
14
+ process.exit(1);
15
+ });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;AACzD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}