@intlayer/engine 9.5.10 → 9.5.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/dist/assets/installSkills/skills/bundle-optimization.md +123 -0
  2. package/dist/assets/installSkills/skills/compat.md +0 -4
  3. package/dist/assets/installSkills/skills/content.md +8 -2
  4. package/dist/assets/installSkills/skills/next-js.md +2 -2
  5. package/dist/assets/installSkills/skills/usage.md +1 -1
  6. package/dist/cjs/build.cjs +5 -0
  7. package/dist/cjs/cli.cjs +1 -0
  8. package/dist/cjs/docReview/alignBlocks.cjs +53 -36
  9. package/dist/cjs/docReview/alignBlocks.cjs.map +1 -1
  10. package/dist/cjs/docReview/rebuildDocument.cjs +3 -1
  11. package/dist/cjs/docReview/rebuildDocument.cjs.map +1 -1
  12. package/dist/cjs/docReview/segmentDocument.cjs +8 -5
  13. package/dist/cjs/docReview/segmentDocument.cjs.map +1 -1
  14. package/dist/cjs/init/frameworkSetup/nextAppRouter/transforms.cjs +4 -1
  15. package/dist/cjs/init/frameworkSetup/nextAppRouter/transforms.cjs.map +1 -1
  16. package/dist/cjs/init/index.cjs +2 -12
  17. package/dist/cjs/init/index.cjs.map +1 -1
  18. package/dist/cjs/init/utils/backendPackages.cjs +15 -0
  19. package/dist/cjs/init/utils/backendPackages.cjs.map +1 -0
  20. package/dist/cjs/init/utils/index.cjs +2 -3
  21. package/dist/cjs/installMCP/installMCP.cjs +1 -1
  22. package/dist/cjs/installMCP/installMCP.cjs.map +1 -1
  23. package/dist/cjs/installSkills/index.cjs +2 -0
  24. package/dist/cjs/installSkills/index.cjs.map +1 -1
  25. package/dist/cjs/loadDictionaries/loadDictionaries.cjs +9 -8
  26. package/dist/cjs/loadDictionaries/loadDictionaries.cjs.map +1 -1
  27. package/dist/cjs/loadDictionaries/loadLocalDictionaries.cjs +3 -1
  28. package/dist/cjs/loadDictionaries/loadLocalDictionaries.cjs.map +1 -1
  29. package/dist/cjs/loadDictionaries/loadRemoteDictionaries.cjs +4 -6
  30. package/dist/cjs/loadDictionaries/loadRemoteDictionaries.cjs.map +1 -1
  31. package/dist/cjs/loadDictionaries/log.cjs +1 -1
  32. package/dist/cjs/loadDictionaries/log.cjs.map +1 -1
  33. package/dist/cjs/loadDictionaries/logTypeScriptErrors.cjs +19 -12
  34. package/dist/cjs/loadDictionaries/logTypeScriptErrors.cjs.map +1 -1
  35. package/dist/cjs/loadDictionaries/remoteDictionaryClient.cjs +18 -0
  36. package/dist/cjs/loadDictionaries/remoteDictionaryClient.cjs.map +1 -0
  37. package/dist/cjs/prepareIntlayerServer.cjs +132 -0
  38. package/dist/cjs/prepareIntlayerServer.cjs.map +1 -0
  39. package/dist/cjs/scan/analyzeBundleContent.cjs +26 -12
  40. package/dist/cjs/scan/analyzeBundleContent.cjs.map +1 -1
  41. package/dist/cjs/scan/calculateScore.cjs +4 -1
  42. package/dist/cjs/scan/calculateScore.cjs.map +1 -1
  43. package/dist/cjs/scan/checks.cjs +394 -221
  44. package/dist/cjs/scan/checks.cjs.map +1 -1
  45. package/dist/cjs/scan/detection/checkDetails.cjs +56 -0
  46. package/dist/cjs/scan/detection/checkDetails.cjs.map +1 -0
  47. package/dist/cjs/scan/detection/classifyInternalLinks.cjs +47 -0
  48. package/dist/cjs/scan/detection/classifyInternalLinks.cjs.map +1 -0
  49. package/dist/cjs/scan/detection/detectRoutingStrategy.cjs +143 -0
  50. package/dist/cjs/scan/detection/detectRoutingStrategy.cjs.map +1 -0
  51. package/dist/cjs/scan/detection/detectTechnologies.cjs +89 -0
  52. package/dist/cjs/scan/detection/detectTechnologies.cjs.map +1 -0
  53. package/dist/cjs/scan/detection/index.cjs +36 -0
  54. package/dist/cjs/scan/detection/localeCode.cjs +118 -0
  55. package/dist/cjs/scan/detection/localeCode.cjs.map +1 -0
  56. package/dist/cjs/scan/detection/localizedPages.cjs +48 -0
  57. package/dist/cjs/scan/detection/localizedPages.cjs.map +1 -0
  58. package/dist/cjs/scan/detection/technologySignatures.cjs +564 -0
  59. package/dist/cjs/scan/detection/technologySignatures.cjs.map +1 -0
  60. package/dist/cjs/scan/detection/url.cjs +53 -0
  61. package/dist/cjs/scan/detection/url.cjs.map +1 -0
  62. package/dist/cjs/scan/fetchText.cjs +56 -0
  63. package/dist/cjs/scan/fetchText.cjs.map +1 -0
  64. package/dist/cjs/scan/index.cjs +59 -3
  65. package/dist/cjs/scan/parseHtml.cjs +55 -10
  66. package/dist/cjs/scan/parseHtml.cjs.map +1 -1
  67. package/dist/cjs/scan/robots.cjs +65 -0
  68. package/dist/cjs/scan/robots.cjs.map +1 -0
  69. package/dist/cjs/scan/runScanChecks.cjs +89 -0
  70. package/dist/cjs/scan/runScanChecks.cjs.map +1 -0
  71. package/dist/cjs/scan/scanWebsite.cjs +58 -52
  72. package/dist/cjs/scan/scanWebsite.cjs.map +1 -1
  73. package/dist/cjs/scan/sitemap.cjs +109 -0
  74. package/dist/cjs/scan/sitemap.cjs.map +1 -0
  75. package/dist/cjs/utils/chunkJSON.cjs +24 -9
  76. package/dist/cjs/utils/chunkJSON.cjs.map +1 -1
  77. package/dist/cjs/utils/getChunk.cjs +2 -2
  78. package/dist/cjs/utils/getChunk.cjs.map +1 -1
  79. package/dist/cjs/utils/getProcessChainCommands.cjs +117 -0
  80. package/dist/cjs/utils/getProcessChainCommands.cjs.map +1 -0
  81. package/dist/cjs/utils/index.cjs +2 -0
  82. package/dist/cjs/utils/runParallel/index.cjs +1 -1
  83. package/dist/cjs/utils/runParallel/index.cjs.map +1 -1
  84. package/dist/cjs/utils/runParallel/pidTree.cjs +23 -11
  85. package/dist/cjs/utils/runParallel/pidTree.cjs.map +1 -1
  86. package/dist/cjs/utils/runParallel/ps.cjs +8 -3
  87. package/dist/cjs/utils/runParallel/ps.cjs.map +1 -1
  88. package/dist/cjs/utils/runParallel/runTask.cjs +2 -1
  89. package/dist/cjs/utils/runParallel/runTask.cjs.map +1 -1
  90. package/dist/cjs/utils/runParallel/wmic.cjs +8 -3
  91. package/dist/cjs/utils/runParallel/wmic.cjs.map +1 -1
  92. package/dist/cjs/utils/startContentWatcher.cjs +99 -0
  93. package/dist/cjs/utils/startContentWatcher.cjs.map +1 -0
  94. package/dist/cjs/watcher.cjs +2 -2
  95. package/dist/cjs/watcher.cjs.map +1 -1
  96. package/dist/cjs/writeContentDeclaration/detectExportedComponentName.cjs +7 -4
  97. package/dist/cjs/writeContentDeclaration/detectExportedComponentName.cjs.map +1 -1
  98. package/dist/cjs/writeContentDeclaration/writeMarkdownFile.cjs +2 -2
  99. package/dist/cjs/writeContentDeclaration/writeMarkdownFile.cjs.map +1 -1
  100. package/dist/cjs/writeJsonIfChanged.cjs.map +1 -1
  101. package/dist/esm/build.mjs +2 -1
  102. package/dist/esm/cli.mjs +2 -2
  103. package/dist/esm/docReview/alignBlocks.mjs +53 -36
  104. package/dist/esm/docReview/alignBlocks.mjs.map +1 -1
  105. package/dist/esm/docReview/rebuildDocument.mjs +3 -1
  106. package/dist/esm/docReview/rebuildDocument.mjs.map +1 -1
  107. package/dist/esm/docReview/segmentDocument.mjs +8 -5
  108. package/dist/esm/docReview/segmentDocument.mjs.map +1 -1
  109. package/dist/esm/init/frameworkSetup/nextAppRouter/transforms.mjs +4 -1
  110. package/dist/esm/init/frameworkSetup/nextAppRouter/transforms.mjs.map +1 -1
  111. package/dist/esm/init/index.mjs +1 -11
  112. package/dist/esm/init/index.mjs.map +1 -1
  113. package/dist/esm/init/utils/backendPackages.mjs +14 -0
  114. package/dist/esm/init/utils/backendPackages.mjs.map +1 -0
  115. package/dist/esm/init/utils/index.mjs +2 -2
  116. package/dist/esm/installMCP/installMCP.mjs +1 -1
  117. package/dist/esm/installMCP/installMCP.mjs.map +1 -1
  118. package/dist/esm/installSkills/index.mjs +2 -0
  119. package/dist/esm/installSkills/index.mjs.map +1 -1
  120. package/dist/esm/loadDictionaries/loadDictionaries.mjs +9 -8
  121. package/dist/esm/loadDictionaries/loadDictionaries.mjs.map +1 -1
  122. package/dist/esm/loadDictionaries/loadLocalDictionaries.mjs +3 -1
  123. package/dist/esm/loadDictionaries/loadLocalDictionaries.mjs.map +1 -1
  124. package/dist/esm/loadDictionaries/loadRemoteDictionaries.mjs +3 -5
  125. package/dist/esm/loadDictionaries/loadRemoteDictionaries.mjs.map +1 -1
  126. package/dist/esm/loadDictionaries/log.mjs +1 -1
  127. package/dist/esm/loadDictionaries/log.mjs.map +1 -1
  128. package/dist/esm/loadDictionaries/logTypeScriptErrors.mjs +19 -12
  129. package/dist/esm/loadDictionaries/logTypeScriptErrors.mjs.map +1 -1
  130. package/dist/esm/loadDictionaries/remoteDictionaryClient.mjs +16 -0
  131. package/dist/esm/loadDictionaries/remoteDictionaryClient.mjs.map +1 -0
  132. package/dist/esm/prepareIntlayerServer.mjs +128 -0
  133. package/dist/esm/prepareIntlayerServer.mjs.map +1 -0
  134. package/dist/esm/scan/analyzeBundleContent.mjs +26 -12
  135. package/dist/esm/scan/analyzeBundleContent.mjs.map +1 -1
  136. package/dist/esm/scan/calculateScore.mjs +4 -1
  137. package/dist/esm/scan/calculateScore.mjs.map +1 -1
  138. package/dist/esm/scan/checks.mjs +387 -220
  139. package/dist/esm/scan/checks.mjs.map +1 -1
  140. package/dist/esm/scan/detection/checkDetails.mjs +54 -0
  141. package/dist/esm/scan/detection/checkDetails.mjs.map +1 -0
  142. package/dist/esm/scan/detection/classifyInternalLinks.mjs +46 -0
  143. package/dist/esm/scan/detection/classifyInternalLinks.mjs.map +1 -0
  144. package/dist/esm/scan/detection/detectRoutingStrategy.mjs +141 -0
  145. package/dist/esm/scan/detection/detectRoutingStrategy.mjs.map +1 -0
  146. package/dist/esm/scan/detection/detectTechnologies.mjs +87 -0
  147. package/dist/esm/scan/detection/detectTechnologies.mjs.map +1 -0
  148. package/dist/esm/scan/detection/index.mjs +10 -0
  149. package/dist/esm/scan/detection/localeCode.mjs +108 -0
  150. package/dist/esm/scan/detection/localeCode.mjs.map +1 -0
  151. package/dist/esm/scan/detection/localizedPages.mjs +46 -0
  152. package/dist/esm/scan/detection/localizedPages.mjs.map +1 -0
  153. package/dist/esm/scan/detection/technologySignatures.mjs +563 -0
  154. package/dist/esm/scan/detection/technologySignatures.mjs.map +1 -0
  155. package/dist/esm/scan/detection/url.mjs +47 -0
  156. package/dist/esm/scan/detection/url.mjs.map +1 -0
  157. package/dist/esm/scan/fetchText.mjs +55 -0
  158. package/dist/esm/scan/fetchText.mjs.map +1 -0
  159. package/dist/esm/scan/index.mjs +15 -3
  160. package/dist/esm/scan/parseHtml.mjs +52 -11
  161. package/dist/esm/scan/parseHtml.mjs.map +1 -1
  162. package/dist/esm/scan/robots.mjs +63 -0
  163. package/dist/esm/scan/robots.mjs.map +1 -0
  164. package/dist/esm/scan/runScanChecks.mjs +88 -0
  165. package/dist/esm/scan/runScanChecks.mjs.map +1 -0
  166. package/dist/esm/scan/scanWebsite.mjs +59 -53
  167. package/dist/esm/scan/scanWebsite.mjs.map +1 -1
  168. package/dist/esm/scan/sitemap.mjs +105 -0
  169. package/dist/esm/scan/sitemap.mjs.map +1 -0
  170. package/dist/esm/utils/chunkJSON.mjs +24 -9
  171. package/dist/esm/utils/chunkJSON.mjs.map +1 -1
  172. package/dist/esm/utils/getChunk.mjs +2 -2
  173. package/dist/esm/utils/getChunk.mjs.map +1 -1
  174. package/dist/esm/utils/getProcessChainCommands.mjs +115 -0
  175. package/dist/esm/utils/getProcessChainCommands.mjs.map +1 -0
  176. package/dist/esm/utils/index.mjs +2 -1
  177. package/dist/esm/utils/runParallel/index.mjs +1 -1
  178. package/dist/esm/utils/runParallel/index.mjs.map +1 -1
  179. package/dist/esm/utils/runParallel/pidTree.mjs +23 -11
  180. package/dist/esm/utils/runParallel/pidTree.mjs.map +1 -1
  181. package/dist/esm/utils/runParallel/ps.mjs +8 -3
  182. package/dist/esm/utils/runParallel/ps.mjs.map +1 -1
  183. package/dist/esm/utils/runParallel/runTask.mjs +2 -1
  184. package/dist/esm/utils/runParallel/runTask.mjs.map +1 -1
  185. package/dist/esm/utils/runParallel/wmic.mjs +8 -3
  186. package/dist/esm/utils/runParallel/wmic.mjs.map +1 -1
  187. package/dist/esm/utils/startContentWatcher.mjs +98 -0
  188. package/dist/esm/utils/startContentWatcher.mjs.map +1 -0
  189. package/dist/esm/watcher.mjs +1 -1
  190. package/dist/esm/watcher.mjs.map +1 -1
  191. package/dist/esm/writeContentDeclaration/detectExportedComponentName.mjs +7 -4
  192. package/dist/esm/writeContentDeclaration/detectExportedComponentName.mjs.map +1 -1
  193. package/dist/esm/writeContentDeclaration/writeMarkdownFile.mjs +2 -2
  194. package/dist/esm/writeContentDeclaration/writeMarkdownFile.mjs.map +1 -1
  195. package/dist/esm/writeJsonIfChanged.mjs +1 -1
  196. package/dist/esm/writeJsonIfChanged.mjs.map +1 -1
  197. package/dist/types/build.d.ts +2 -1
  198. package/dist/types/cli.d.ts +2 -2
  199. package/dist/types/docReview/rebuildDocument.d.ts.map +1 -1
  200. package/dist/types/docReview/segmentDocument.d.ts.map +1 -1
  201. package/dist/types/init/frameworkSetup/nextAppRouter/transforms.d.ts.map +1 -1
  202. package/dist/types/init/index.d.ts +1 -1
  203. package/dist/types/init/index.d.ts.map +1 -1
  204. package/dist/types/init/utils/backendPackages.d.ts +5 -0
  205. package/dist/types/init/utils/backendPackages.d.ts.map +1 -0
  206. package/dist/types/init/utils/index.d.ts +2 -2
  207. package/dist/types/installSkills/index.d.ts +1 -0
  208. package/dist/types/installSkills/index.d.ts.map +1 -1
  209. package/dist/types/loadDictionaries/loadRemoteDictionaries.d.ts.map +1 -1
  210. package/dist/types/loadDictionaries/logTypeScriptErrors.d.ts.map +1 -1
  211. package/dist/types/loadDictionaries/remoteDictionaryClient.d.ts +14 -0
  212. package/dist/types/loadDictionaries/remoteDictionaryClient.d.ts.map +1 -0
  213. package/dist/types/prepareIntlayerServer.d.ts +67 -0
  214. package/dist/types/prepareIntlayerServer.d.ts.map +1 -0
  215. package/dist/types/scan/analyzeBundleContent.d.ts.map +1 -1
  216. package/dist/types/scan/calculateScore.d.ts +4 -1
  217. package/dist/types/scan/calculateScore.d.ts.map +1 -1
  218. package/dist/types/scan/checks.d.ts +114 -21
  219. package/dist/types/scan/checks.d.ts.map +1 -1
  220. package/dist/types/scan/detection/checkDetails.d.ts +29 -0
  221. package/dist/types/scan/detection/checkDetails.d.ts.map +1 -0
  222. package/dist/types/scan/detection/classifyInternalLinks.d.ts +44 -0
  223. package/dist/types/scan/detection/classifyInternalLinks.d.ts.map +1 -0
  224. package/dist/types/scan/detection/detectRoutingStrategy.d.ts +60 -0
  225. package/dist/types/scan/detection/detectRoutingStrategy.d.ts.map +1 -0
  226. package/dist/types/scan/detection/detectTechnologies.d.ts +60 -0
  227. package/dist/types/scan/detection/detectTechnologies.d.ts.map +1 -0
  228. package/dist/types/scan/detection/index.d.ts +9 -0
  229. package/dist/types/scan/detection/localeCode.d.ts +49 -0
  230. package/dist/types/scan/detection/localeCode.d.ts.map +1 -0
  231. package/dist/types/scan/detection/localizedPages.d.ts +40 -0
  232. package/dist/types/scan/detection/localizedPages.d.ts.map +1 -0
  233. package/dist/types/scan/detection/technologySignatures.d.ts +48 -0
  234. package/dist/types/scan/detection/technologySignatures.d.ts.map +1 -0
  235. package/dist/types/scan/detection/url.d.ts +27 -0
  236. package/dist/types/scan/detection/url.d.ts.map +1 -0
  237. package/dist/types/scan/fetchText.d.ts +30 -0
  238. package/dist/types/scan/fetchText.d.ts.map +1 -0
  239. package/dist/types/scan/index.d.ts +16 -4
  240. package/dist/types/scan/parseHtml.d.ts +17 -0
  241. package/dist/types/scan/parseHtml.d.ts.map +1 -1
  242. package/dist/types/scan/robots.d.ts +23 -0
  243. package/dist/types/scan/robots.d.ts.map +1 -0
  244. package/dist/types/scan/runScanChecks.d.ts +43 -0
  245. package/dist/types/scan/runScanChecks.d.ts.map +1 -0
  246. package/dist/types/scan/scanWebsite.d.ts.map +1 -1
  247. package/dist/types/scan/sitemap.d.ts +49 -0
  248. package/dist/types/scan/sitemap.d.ts.map +1 -0
  249. package/dist/types/scan/types.d.ts +15 -0
  250. package/dist/types/scan/types.d.ts.map +1 -1
  251. package/dist/types/utils/chunkJSON.d.ts.map +1 -1
  252. package/dist/types/utils/getProcessChainCommands.d.ts +35 -0
  253. package/dist/types/utils/getProcessChainCommands.d.ts.map +1 -0
  254. package/dist/types/utils/index.d.ts +2 -1
  255. package/dist/types/utils/runParallel/pidTree.d.ts.map +1 -1
  256. package/dist/types/utils/startContentWatcher.d.ts +40 -0
  257. package/dist/types/utils/startContentWatcher.d.ts.map +1 -0
  258. package/dist/types/watcher.d.ts.map +1 -1
  259. package/dist/types/writeContentDeclaration/writeMarkdownFile.d.ts.map +1 -1
  260. package/package.json +15 -7
  261. package/dist/cjs/init/utils/devScript.cjs +0 -57
  262. package/dist/cjs/init/utils/devScript.cjs.map +0 -1
  263. package/dist/esm/init/utils/devScript.mjs +0 -55
  264. package/dist/esm/init/utils/devScript.mjs.map +0 -1
  265. package/dist/types/init/utils/devScript.d.ts +0 -48
  266. package/dist/types/init/utils/devScript.d.ts.map +0 -1
@@ -0,0 +1,564 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ //#region src/scan/detection/technologySignatures.ts
3
+ /**
4
+ * Any string-literal quote. Minifiers such as rolldown / oxc emit template
5
+ * literals (`` `i18next:` ``), so bundle patterns must accept backticks too.
6
+ */
7
+ const QUOTE = `["'\`]`;
8
+ /** Build a bundle pattern where every `<Q>` placeholder stands for {@link QUOTE}. */
9
+ const quoted = (source, flags) => new RegExp(source.replaceAll("<Q>", QUOTE), flags);
10
+ /** Rendering frameworks and site builders. */
11
+ const frameworkSignatures = [
12
+ {
13
+ id: "nextjs",
14
+ name: "Next.js",
15
+ category: "framework",
16
+ html: [/<script[^>]+id=["']__NEXT_DATA__["']/, /self\.__next_f\b/],
17
+ resourceUrls: [/\/_next\/static\//],
18
+ globals: ["__NEXT_DATA__", "__next_f"],
19
+ versionGlobal: "next.version"
20
+ },
21
+ {
22
+ id: "nuxt",
23
+ name: "Nuxt",
24
+ category: "framework",
25
+ html: [/window\.__NUXT__|id=["']__nuxt["']|data-nuxt-/],
26
+ resourceUrls: [/\/_nuxt\//],
27
+ globals: ["__NUXT__", "useNuxtApp"]
28
+ },
29
+ {
30
+ id: "gatsby",
31
+ name: "Gatsby",
32
+ category: "framework",
33
+ html: [/id=["']___gatsby["']/],
34
+ globals: ["___gatsby"]
35
+ },
36
+ {
37
+ id: "remix",
38
+ name: "Remix",
39
+ category: "framework",
40
+ html: [/window\.__remixContext\b/],
41
+ globals: ["__remixContext"]
42
+ },
43
+ {
44
+ id: "react-router",
45
+ name: "React Router",
46
+ category: "framework",
47
+ html: [/window\.__reactRouterContext\b/],
48
+ globals: ["__reactRouterContext"]
49
+ },
50
+ {
51
+ id: "tanstack-start",
52
+ name: "TanStack Start",
53
+ category: "framework",
54
+ html: [/\$_TSR\b|__TSR_ROUTER__/],
55
+ globals: ["$_TSR", "__TSR_ROUTER__"]
56
+ },
57
+ {
58
+ id: "tanstack-router",
59
+ name: "TanStack Router",
60
+ category: "framework",
61
+ bundle: [/tsr-scroll-restoration/],
62
+ hiddenBy: ["tanstack-start"]
63
+ },
64
+ {
65
+ id: "astro",
66
+ name: "Astro",
67
+ category: "framework",
68
+ html: [/<meta[^>]+name=["']generator["'][^>]+content=["']Astro v?([\d.]+)/i, /<astro-(?:island|slot)\b/]
69
+ },
70
+ {
71
+ id: "sveltekit",
72
+ name: "SvelteKit",
73
+ category: "framework",
74
+ html: [/data-sveltekit-|__sveltekit_/],
75
+ resourceUrls: [/\/_app\/immutable\//]
76
+ },
77
+ {
78
+ id: "svelte",
79
+ name: "Svelte",
80
+ category: "framework",
81
+ bundle: [/https:\/\/svelte\.dev\/e\//],
82
+ hiddenBy: ["sveltekit"]
83
+ },
84
+ {
85
+ id: "angular",
86
+ name: "Angular",
87
+ category: "framework",
88
+ html: [/ng-version=["']([\d.]+)/]
89
+ },
90
+ {
91
+ id: "vue",
92
+ name: "Vue.js",
93
+ category: "framework",
94
+ html: [/data-v-app\b/],
95
+ bundle: [/\b__v_isRef\b/],
96
+ globals: ["__VUE__"],
97
+ hiddenBy: ["nuxt"]
98
+ },
99
+ {
100
+ id: "solid",
101
+ name: "SolidJS",
102
+ category: "framework",
103
+ html: [/_\$HY\b/],
104
+ bundle: [/\b_\$HY\.done\b/],
105
+ globals: ["_$HY"]
106
+ },
107
+ {
108
+ id: "qwik",
109
+ name: "Qwik",
110
+ category: "framework",
111
+ html: [/q:container=/]
112
+ },
113
+ {
114
+ id: "react",
115
+ name: "React",
116
+ category: "framework",
117
+ bundle: [quoted(String.raw`Symbol\.for\(<Q>react\.(?:transitional\.element|forward_ref)<Q>\)`)],
118
+ domMarkers: ["react-fiber"],
119
+ hiddenBy: [
120
+ "nextjs",
121
+ "gatsby",
122
+ "remix",
123
+ "react-router",
124
+ "tanstack-start",
125
+ "tanstack-router"
126
+ ]
127
+ },
128
+ {
129
+ id: "wordpress",
130
+ name: "WordPress",
131
+ category: "cms",
132
+ html: [/<meta[^>]+name=["']generator["'][^>]+content=["']WordPress ?([\d.]+)?/i],
133
+ resourceUrls: [/\/wp-(?:content|includes)\//]
134
+ },
135
+ {
136
+ id: "shopify",
137
+ name: "Shopify",
138
+ category: "cms",
139
+ resourceUrls: [/cdn\.shopify\.com\//],
140
+ globals: ["Shopify"]
141
+ },
142
+ {
143
+ id: "webflow",
144
+ name: "Webflow",
145
+ category: "cms",
146
+ html: [/data-wf-page=/]
147
+ },
148
+ {
149
+ id: "wix",
150
+ name: "Wix",
151
+ category: "cms",
152
+ resourceUrls: [/static\.parastorage\.com\/|static\.wixstatic\.com\//]
153
+ }
154
+ ];
155
+ /**
156
+ * Code-level i18n libraries. Bundle patterns target string literals kept by
157
+ * minifiers in production builds (error codes, symbols, cookie names).
158
+ */
159
+ const i18nLibrarySignatures = [
160
+ {
161
+ id: "intlayer",
162
+ name: "Intlayer",
163
+ category: "i18n-library",
164
+ resourceUrls: [/\/intlayer-(?:shared|index|client)-[\w-]+\.m?js/],
165
+ bundle: [/INTLAYER_(?:NODE_TYPE_|EDITOR_ENABLED|ROUTING_)|intlayer-node-plugin|intlayerQualifierTypes/],
166
+ storageKeys: ["INTLAYER_LOCALE"]
167
+ },
168
+ {
169
+ id: "next-intl",
170
+ name: "next-intl",
171
+ category: "i18n-library",
172
+ bundle: [quoted("X-NEXT-INTL-LOCALE|<Q>ENVIRONMENT_FALLBACK<Q>", "i")],
173
+ requires: ["nextjs"]
174
+ },
175
+ {
176
+ id: "use-intl",
177
+ name: "use-intl",
178
+ category: "i18n-library",
179
+ bundle: [quoted("<Q>ENVIRONMENT_FALLBACK<Q>")],
180
+ hiddenBy: ["next-intl"]
181
+ },
182
+ {
183
+ id: "next-i18next",
184
+ name: "next-i18next",
185
+ category: "i18n-library",
186
+ html: [/"_nextI18Next"\s*:/]
187
+ },
188
+ {
189
+ id: "react-i18next",
190
+ name: "react-i18next",
191
+ category: "i18n-library",
192
+ bundle: [/NO_I18NEXT_INSTANCE|USE_T_BEFORE_READY/],
193
+ hiddenBy: ["next-i18next"]
194
+ },
195
+ {
196
+ id: "i18next",
197
+ name: "i18next",
198
+ category: "i18n-library",
199
+ bundle: [quoted("<Q>backendConnector<Q>|<Q>i18next:<Q>")],
200
+ globals: ["i18next"],
201
+ storageKeys: ["i18nextLng", "i18next"],
202
+ versionGlobal: "i18next.version",
203
+ hiddenBy: ["next-i18next", "react-i18next"]
204
+ },
205
+ {
206
+ id: "react-intl",
207
+ name: "react-intl (FormatJS)",
208
+ category: "i18n-library",
209
+ bundle: [quoted(String.raw`\[React Intl\]|<Q>UNSUPPORTED_FORMATTER<Q>`)]
210
+ },
211
+ {
212
+ id: "nuxt-i18n",
213
+ name: "@nuxtjs/i18n",
214
+ category: "i18n-library",
215
+ bundle: [/__NUXT_I18N_|nuxt-i18n-slp/],
216
+ storageKeys: ["i18n_redirected"]
217
+ },
218
+ {
219
+ id: "vue-i18n",
220
+ name: "vue-i18n",
221
+ category: "i18n-library",
222
+ bundle: [/__VUE_I18N_SYMBOL__|intlify-message-/],
223
+ globals: ["__INTLIFY__", "__VUE_I18N__"],
224
+ hiddenBy: ["nuxt-i18n"]
225
+ },
226
+ {
227
+ id: "lingui",
228
+ name: "Lingui",
229
+ category: "i18n-library",
230
+ bundle: [/Lingui: Attempted to call a translation function/]
231
+ },
232
+ {
233
+ id: "svelte-i18n",
234
+ name: "svelte-i18n",
235
+ category: "i18n-library",
236
+ bundle: [/\[svelte-i18n\]/]
237
+ },
238
+ {
239
+ id: "paraglide",
240
+ name: "Paraglide JS",
241
+ category: "i18n-library",
242
+ bundle: [/PARAGLIDE_LOCALE/],
243
+ storageKeys: ["PARAGLIDE_LOCALE"]
244
+ },
245
+ {
246
+ id: "ngx-translate",
247
+ name: "ngx-translate",
248
+ category: "i18n-library",
249
+ bundle: [/ngx-translate\/core: /]
250
+ },
251
+ {
252
+ id: "transloco",
253
+ name: "Transloco",
254
+ category: "i18n-library",
255
+ bundle: [/\bTRANSLOCO_[A-Z_]+/]
256
+ },
257
+ {
258
+ id: "angular-localize",
259
+ name: "Angular @angular/localize",
260
+ category: "i18n-library",
261
+ globals: ["$localize"]
262
+ },
263
+ {
264
+ id: "next-translate",
265
+ name: "next-translate",
266
+ category: "i18n-library",
267
+ html: [/"__namespaces"\s*:/],
268
+ bundle: [/\b__NEXT_TRANSLATE__\b/],
269
+ globals: ["__NEXT_TRANSLATE__"]
270
+ },
271
+ {
272
+ id: "next-international",
273
+ name: "next-international",
274
+ category: "i18n-library",
275
+ bundle: [/\bI18nProviderClient\b/],
276
+ requires: ["nextjs"]
277
+ },
278
+ {
279
+ id: "gt-next",
280
+ name: "gt-next (General Translation)",
281
+ category: "i18n-library",
282
+ bundle: [/\bgt-next\b/],
283
+ requires: ["nextjs"]
284
+ },
285
+ {
286
+ id: "gt-react",
287
+ name: "gt-react (General Translation)",
288
+ category: "i18n-library",
289
+ bundle: [/__generaltranslation|generaltranslation\/react-core|\bgt-react\b/],
290
+ hiddenBy: ["gt-next"]
291
+ },
292
+ {
293
+ id: "lingo-dev",
294
+ name: "Lingo.dev",
295
+ category: "i18n-library",
296
+ bundle: [/__LINGO_DEV_(?:STATE|UPDATE)__|\bLINGO_DEBUG\b/],
297
+ globals: ["__LINGO_DEV_STATE__"]
298
+ },
299
+ {
300
+ id: "wuchale",
301
+ name: "wuchale",
302
+ category: "i18n-library",
303
+ bundle: [/i18n-404:tag/]
304
+ },
305
+ {
306
+ id: "fluent-vue",
307
+ name: "fluent-vue",
308
+ category: "i18n-library",
309
+ bundle: [/\[fluent-vue\]/]
310
+ },
311
+ {
312
+ id: "fluent",
313
+ name: "Fluent (Project Fluent)",
314
+ category: "i18n-library",
315
+ bundle: [quoted("ReferenceError\\(<Q>Unknown term: ")],
316
+ hiddenBy: ["fluent-vue"]
317
+ },
318
+ {
319
+ id: "solid-primitives-i18n",
320
+ name: "@solid-primitives/i18n",
321
+ category: "i18n-library",
322
+ bundle: [quoted(String.raw`RegExp\(<Q>\{\{\\\\s\*\$\{\w+\}\\\\s\*\}\}<Q>`)]
323
+ },
324
+ {
325
+ id: "next-locale",
326
+ name: "Next.js i18n routing",
327
+ category: "i18n-library",
328
+ storageKeys: ["NEXT_LOCALE"],
329
+ requires: ["nextjs"],
330
+ hiddenBy: [
331
+ "intlayer",
332
+ "next-intl",
333
+ "next-i18next",
334
+ "next-translate"
335
+ ]
336
+ },
337
+ {
338
+ id: "polylang",
339
+ name: "Polylang",
340
+ category: "i18n-library",
341
+ html: [/\blang-item-\d+\b/],
342
+ resourceUrls: [/\/wp-content\/plugins\/polylang/],
343
+ storageKeys: ["pll_language"]
344
+ },
345
+ {
346
+ id: "wpml",
347
+ name: "WPML",
348
+ category: "i18n-library",
349
+ html: [/<meta[^>]+name=["']generator["'][^>]+content=["']WPML ver:([\d.]+)/i, /\bwpml-ls(?:-item|-statics|-legacy)?\b/],
350
+ resourceUrls: [/\/wp-content\/plugins\/sitepress-multilingual-cms/],
351
+ storageKeys: ["wp-wpml_current_language", "_icl_current_language"]
352
+ },
353
+ {
354
+ id: "translatepress",
355
+ name: "TranslatePress",
356
+ category: "i18n-library",
357
+ html: [/\btrp-language-switcher\b|\bdata-trp-/],
358
+ resourceUrls: [/\/wp-content\/plugins\/translatepress-multilingual/]
359
+ }
360
+ ];
361
+ /** Translation management systems (in-context editors and OTA delivery). */
362
+ const tmsSignatures = [
363
+ {
364
+ id: "intlayer-cms",
365
+ name: "Intlayer CMS",
366
+ category: "tms",
367
+ resourceUrls: [/\/\/back\.intlayer\.org\//],
368
+ bundle: [quoted(String.raw`back\.intlayer\.org<Q>,\s*<Q>?port<Q>?:\s*[\w.]+,\s*<Q>?enabled<Q>?:\s*(?:!0|true)`)],
369
+ requires: ["intlayer"]
370
+ },
371
+ {
372
+ id: "crowdin",
373
+ name: "Crowdin",
374
+ category: "tms",
375
+ resourceUrls: [/(?:^|\.|\/\/)crowdin\.(?:com|net)\//],
376
+ html: [/\b_jipt\s*(?:=\s*\[|\.push\()/],
377
+ bundle: [/distributions\.crowdin\.net|cdn\.crowdin\.com/],
378
+ globals: ["_jipt"]
379
+ },
380
+ {
381
+ id: "phrase",
382
+ name: "Phrase",
383
+ category: "tms",
384
+ html: [/\bPHRASEAPP_CONFIG\s*=/],
385
+ resourceUrls: [/(?:^|\.|\/\/)(?:phrase|phraseapp)\.com\//],
386
+ bundle: [/ota\.(?:eu|us)\.phrase\.com|PHRASEAPP_CONFIG|phraseapp\.com/],
387
+ globals: ["PHRASEAPP_CONFIG", "phraseApp"]
388
+ },
389
+ {
390
+ id: "lokalise",
391
+ name: "Lokalise",
392
+ category: "tms",
393
+ html: [/\bLOKALISE_CONFIG\s*=/],
394
+ resourceUrls: [/(?:^|\.|\/\/)lokalise\.(?:com|co)\//],
395
+ bundle: [/ota\.lokalise\.com|app\.lokalise\.com|LOKALISE_CONFIG/],
396
+ globals: ["LOKALISE_CONFIG"]
397
+ },
398
+ {
399
+ id: "locize",
400
+ name: "locize",
401
+ category: "tms",
402
+ html: [/\blocizer\.init\(/],
403
+ resourceUrls: [/(?:^|\.|\/\/)locize\.(?:app|io|com)\//],
404
+ bundle: [/api\.(?:lite\.)?locize\.(?:app|io)/]
405
+ },
406
+ {
407
+ id: "transifex",
408
+ name: "Transifex",
409
+ category: "tms",
410
+ html: [/\bliveSettings\s*=\s*\{/],
411
+ resourceUrls: [/(?:^|\.|\/\/)transifex\.(?:com|net)\//],
412
+ bundle: [/cds\.svc\.transifex\.net/],
413
+ globals: ["Transifex", "liveSettings"]
414
+ },
415
+ {
416
+ id: "tolgee",
417
+ name: "Tolgee",
418
+ category: "tms",
419
+ resourceUrls: [/(?:^|\.|\/\/)(?:tolgee\.io|tolg\.ee)\//],
420
+ bundle: [/app\.tolgee\.io|@tolgee\//]
421
+ },
422
+ {
423
+ id: "localazy",
424
+ name: "Localazy",
425
+ category: "tms",
426
+ resourceUrls: [/(?:^|\.|\/\/)localazy\.com\//],
427
+ bundle: [/delivery\.localazy\.com/]
428
+ },
429
+ {
430
+ id: "simplelocalize",
431
+ name: "SimpleLocalize",
432
+ category: "tms",
433
+ resourceUrls: [/(?:^|\.|\/\/)simplelocalize\.io\//],
434
+ bundle: [/cdn\.simplelocalize\.io/]
435
+ },
436
+ {
437
+ id: "localizely",
438
+ name: "Localizely",
439
+ category: "tms",
440
+ resourceUrls: [/(?:^|\.|\/\/)localizely\.com\//],
441
+ bundle: [/api\.localizely\.com/]
442
+ },
443
+ {
444
+ id: "smartling",
445
+ name: "Smartling",
446
+ category: "tms",
447
+ resourceUrls: [/(?:^|\.|\/\/)smartling\.com\//],
448
+ bundle: [/api\.smartling\.com/]
449
+ },
450
+ {
451
+ id: "poeditor",
452
+ name: "POEditor",
453
+ category: "tms",
454
+ resourceUrls: [/(?:^|\.|\/\/)poeditor\.com\//],
455
+ bundle: [/api\.poeditor\.com/]
456
+ },
457
+ {
458
+ id: "weblate",
459
+ name: "Weblate",
460
+ category: "tms",
461
+ resourceUrls: [/hosted\.weblate\.org\//],
462
+ bundle: [/hosted\.weblate\.org/]
463
+ },
464
+ {
465
+ id: "lingohub",
466
+ name: "Lingohub",
467
+ category: "tms",
468
+ resourceUrls: [/(?:^|\.|\/\/)lingohub\.com\//],
469
+ bundle: [/api\.lingohub\.com/]
470
+ },
471
+ {
472
+ id: "loco",
473
+ name: "Loco",
474
+ category: "tms",
475
+ resourceUrls: [/(?:^|\.|\/\/)localise\.biz\//],
476
+ bundle: [/localise\.biz\/api/]
477
+ },
478
+ {
479
+ id: "gridly",
480
+ name: "Gridly",
481
+ category: "tms",
482
+ resourceUrls: [/(?:^|\.|\/\/)gridly\.com\//],
483
+ bundle: [/cdn\.gridly\.com|api\.gridly\.com/]
484
+ }
485
+ ];
486
+ /** Hosted website translation layers (proxy or JS overlay). */
487
+ const translationProxySignatures = [
488
+ {
489
+ id: "weglot",
490
+ name: "Weglot",
491
+ category: "translation-proxy",
492
+ html: [/\bWeglot\.initialize\(|\bdata-wg-notranslate\b/],
493
+ resourceUrls: [/cdn\.weglot\.(?:com|us)\//],
494
+ globals: ["Weglot"]
495
+ },
496
+ {
497
+ id: "localizejs",
498
+ name: "Localize",
499
+ category: "translation-proxy",
500
+ html: [/\bLocalize\.initialize\(/],
501
+ resourceUrls: [/global\.localizecdn\.com\/|cdn\.localizejs\.com\//],
502
+ globals: ["Localize"]
503
+ },
504
+ {
505
+ id: "gtranslate",
506
+ name: "GTranslate",
507
+ category: "translation-proxy",
508
+ html: [/\bgtranslateSettings\s*=|\bgtranslate_wrapper\b/],
509
+ resourceUrls: [/cdn\.gtranslate\.net\//],
510
+ globals: ["gtranslateSettings"]
511
+ },
512
+ {
513
+ id: "google-translate",
514
+ name: "Google Translate widget",
515
+ category: "translation-proxy",
516
+ html: [/\bgoogleTranslateElementInit\b|\bgoogle\.translate\.TranslateElement\(/],
517
+ resourceUrls: [/translate\.google\.com\/translate_a\/element\.js/],
518
+ globals: ["googleTranslateElementInit"]
519
+ },
520
+ {
521
+ id: "conveythis",
522
+ name: "ConveyThis",
523
+ category: "translation-proxy",
524
+ html: [/\bConveyThis_Initializer\.init\(/],
525
+ resourceUrls: [/cdn\.conveythis\.com\//]
526
+ },
527
+ {
528
+ id: "bablic",
529
+ name: "Bablic",
530
+ category: "translation-proxy",
531
+ resourceUrls: [/(?:^|\.|\/\/)bablic\.com\//],
532
+ globals: ["bablic"]
533
+ },
534
+ {
535
+ id: "linguise",
536
+ name: "Linguise",
537
+ category: "translation-proxy",
538
+ html: [/\blinguise_configs\b/],
539
+ resourceUrls: [/(?:^|\.|\/\/)linguise\.com\//]
540
+ },
541
+ {
542
+ id: "onelink",
543
+ name: "OneLink (TransPerfect)",
544
+ category: "translation-proxy",
545
+ resourceUrls: [/(?:^|\.|\/\/)onelink(?:js|-edge)?\.com\//]
546
+ },
547
+ {
548
+ id: "motionpoint",
549
+ name: "MotionPoint",
550
+ category: "translation-proxy",
551
+ resourceUrls: [/(?:^|\.|\/\/)motionpoint\.(?:com|net)\//]
552
+ }
553
+ ];
554
+ /** Every known technology fingerprint, in display order. */
555
+ const technologySignatures = [
556
+ ...frameworkSignatures,
557
+ ...i18nLibrarySignatures,
558
+ ...tmsSignatures,
559
+ ...translationProxySignatures
560
+ ];
561
+
562
+ //#endregion
563
+ exports.technologySignatures = technologySignatures;
564
+ //# sourceMappingURL=technologySignatures.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"technologySignatures.cjs","names":[],"sources":["../../../../src/scan/detection/technologySignatures.ts"],"sourcesContent":["/**\n * Category of a technology detected on a scanned page.\n *\n * - `framework`: rendering framework (Next.js, Nuxt, Angular…)\n * - `i18n-library`: code-level i18n library (Intlayer, i18next, vue-i18n…)\n * - `tms`: translation management system (Crowdin, Phrase, Lokalise…)\n * - `translation-proxy`: hosted website translation layer (Weglot, Localize…)\n * - `cms`: content management system / site builder\n */\nexport type TechnologyCategory =\n | 'framework'\n | 'i18n-library'\n | 'tms'\n | 'translation-proxy'\n | 'cms';\n\n/**\n * Fingerprint of a technology. Every signal is optional; a technology is\n * detected as soon as one of them matches. Regexes with a first capture group\n * provide the detected version.\n */\nexport type TechnologySignature = {\n /** Stable identifier, e.g. `nextjs`, `crowdin`. */\n id: string;\n /** Human-readable name. */\n name: string;\n category: TechnologyCategory;\n /** Matched against script / stylesheet / iframe / request URLs. */\n resourceUrls?: RegExp[];\n /** Matched against the HTML document, inline scripts included. */\n html?: RegExp[];\n /** Matched against the content of same-origin JavaScript chunks. */\n bundle?: RegExp[];\n /** Window globals, only available when inspecting a live page. */\n globals?: string[];\n /** Cookie / localStorage / sessionStorage keys (case-insensitive). */\n storageKeys?: string[];\n /**\n * Markers only a live DOM exposes, reported by the collector (e.g.\n * `react-fiber` for the `__reactFiber$…` keys React sets on elements).\n */\n domMarkers?: string[];\n /** Dotted window path holding the version, e.g. `next.version`. */\n versionGlobal?: string;\n /** Only reported when every one of these ids is detected too. */\n requires?: string[];\n /** Hidden when any of these ids is detected (e.g. Vue under Nuxt). */\n hiddenBy?: string[];\n};\n\n/**\n * Any string-literal quote. Minifiers such as rolldown / oxc emit template\n * literals (`` `i18next:` ``), so bundle patterns must accept backticks too.\n */\nconst QUOTE = `[\"'\\`]`;\n\n/** Build a bundle pattern where every `<Q>` placeholder stands for {@link QUOTE}. */\nconst quoted = (source: string, flags?: string): RegExp =>\n new RegExp(source.replaceAll('<Q>', QUOTE), flags);\n\n/** Rendering frameworks and site builders. */\nconst frameworkSignatures: TechnologySignature[] = [\n {\n id: 'nextjs',\n name: 'Next.js',\n category: 'framework',\n html: [/<script[^>]+id=[\"']__NEXT_DATA__[\"']/, /self\\.__next_f\\b/],\n resourceUrls: [/\\/_next\\/static\\//],\n globals: ['__NEXT_DATA__', '__next_f'],\n versionGlobal: 'next.version',\n },\n {\n id: 'nuxt',\n name: 'Nuxt',\n category: 'framework',\n html: [/window\\.__NUXT__|id=[\"']__nuxt[\"']|data-nuxt-/],\n resourceUrls: [/\\/_nuxt\\//],\n globals: ['__NUXT__', 'useNuxtApp'],\n },\n {\n id: 'gatsby',\n name: 'Gatsby',\n category: 'framework',\n html: [/id=[\"']___gatsby[\"']/],\n globals: ['___gatsby'],\n },\n {\n id: 'remix',\n name: 'Remix',\n category: 'framework',\n html: [/window\\.__remixContext\\b/],\n globals: ['__remixContext'],\n },\n {\n id: 'react-router',\n name: 'React Router',\n category: 'framework',\n html: [/window\\.__reactRouterContext\\b/],\n globals: ['__reactRouterContext'],\n },\n {\n id: 'tanstack-start',\n name: 'TanStack Start',\n category: 'framework',\n html: [/\\$_TSR\\b|__TSR_ROUTER__/],\n globals: ['$_TSR', '__TSR_ROUTER__'],\n },\n {\n id: 'tanstack-router',\n name: 'TanStack Router',\n category: 'framework',\n bundle: [/tsr-scroll-restoration/],\n hiddenBy: ['tanstack-start'],\n },\n {\n id: 'astro',\n name: 'Astro',\n category: 'framework',\n html: [\n /<meta[^>]+name=[\"']generator[\"'][^>]+content=[\"']Astro v?([\\d.]+)/i,\n /<astro-(?:island|slot)\\b/,\n ],\n },\n {\n id: 'sveltekit',\n name: 'SvelteKit',\n category: 'framework',\n html: [/data-sveltekit-|__sveltekit_/],\n resourceUrls: [/\\/_app\\/immutable\\//],\n },\n {\n id: 'svelte',\n name: 'Svelte',\n category: 'framework',\n bundle: [/https:\\/\\/svelte\\.dev\\/e\\//],\n hiddenBy: ['sveltekit'],\n },\n {\n id: 'angular',\n name: 'Angular',\n category: 'framework',\n html: [/ng-version=[\"']([\\d.]+)/],\n },\n {\n id: 'vue',\n name: 'Vue.js',\n category: 'framework',\n html: [/data-v-app\\b/],\n bundle: [/\\b__v_isRef\\b/],\n globals: ['__VUE__'],\n hiddenBy: ['nuxt'],\n },\n {\n id: 'solid',\n name: 'SolidJS',\n category: 'framework',\n html: [/_\\$HY\\b/],\n bundle: [/\\b_\\$HY\\.done\\b/],\n globals: ['_$HY'],\n },\n {\n id: 'qwik',\n name: 'Qwik',\n category: 'framework',\n html: [/q:container=/],\n },\n {\n // `react.element` alone also appears in deepmerge's isReactElement.\n id: 'react',\n name: 'React',\n category: 'framework',\n bundle: [\n quoted(\n String.raw`Symbol\\.for\\(<Q>react\\.(?:transitional\\.element|forward_ref)<Q>\\)`\n ),\n ],\n domMarkers: ['react-fiber'],\n hiddenBy: [\n 'nextjs',\n 'gatsby',\n 'remix',\n 'react-router',\n 'tanstack-start',\n 'tanstack-router',\n ],\n },\n {\n id: 'wordpress',\n name: 'WordPress',\n category: 'cms',\n html: [\n /<meta[^>]+name=[\"']generator[\"'][^>]+content=[\"']WordPress ?([\\d.]+)?/i,\n ],\n resourceUrls: [/\\/wp-(?:content|includes)\\//],\n },\n {\n id: 'shopify',\n name: 'Shopify',\n category: 'cms',\n resourceUrls: [/cdn\\.shopify\\.com\\//],\n globals: ['Shopify'],\n },\n {\n id: 'webflow',\n name: 'Webflow',\n category: 'cms',\n html: [/data-wf-page=/],\n },\n {\n id: 'wix',\n name: 'Wix',\n category: 'cms',\n resourceUrls: [/static\\.parastorage\\.com\\/|static\\.wixstatic\\.com\\//],\n },\n];\n\n/**\n * Code-level i18n libraries. Bundle patterns target string literals kept by\n * minifiers in production builds (error codes, symbols, cookie names).\n */\nconst i18nLibrarySignatures: TechnologySignature[] = [\n {\n id: 'intlayer',\n name: 'Intlayer',\n category: 'i18n-library',\n resourceUrls: [/\\/intlayer-(?:shared|index|client)-[\\w-]+\\.m?js/],\n bundle: [\n /INTLAYER_(?:NODE_TYPE_|EDITOR_ENABLED|ROUTING_)|intlayer-node-plugin|intlayerQualifierTypes/,\n ],\n storageKeys: ['INTLAYER_LOCALE'],\n },\n {\n id: 'next-intl',\n name: 'next-intl',\n category: 'i18n-library',\n bundle: [quoted('X-NEXT-INTL-LOCALE|<Q>ENVIRONMENT_FALLBACK<Q>', 'i')],\n requires: ['nextjs'],\n },\n {\n id: 'use-intl',\n name: 'use-intl',\n category: 'i18n-library',\n bundle: [quoted('<Q>ENVIRONMENT_FALLBACK<Q>')],\n hiddenBy: ['next-intl'],\n },\n {\n id: 'next-i18next',\n name: 'next-i18next',\n category: 'i18n-library',\n html: [/\"_nextI18Next\"\\s*:/],\n },\n {\n id: 'react-i18next',\n name: 'react-i18next',\n category: 'i18n-library',\n bundle: [/NO_I18NEXT_INSTANCE|USE_T_BEFORE_READY/],\n hiddenBy: ['next-i18next'],\n },\n {\n id: 'i18next',\n name: 'i18next',\n category: 'i18n-library',\n bundle: [quoted('<Q>backendConnector<Q>|<Q>i18next:<Q>')],\n globals: ['i18next'],\n storageKeys: ['i18nextLng', 'i18next'],\n versionGlobal: 'i18next.version',\n hiddenBy: ['next-i18next', 'react-i18next'],\n },\n {\n id: 'react-intl',\n name: 'react-intl (FormatJS)',\n category: 'i18n-library',\n bundle: [quoted(String.raw`\\[React Intl\\]|<Q>UNSUPPORTED_FORMATTER<Q>`)],\n },\n {\n id: 'nuxt-i18n',\n name: '@nuxtjs/i18n',\n category: 'i18n-library',\n bundle: [/__NUXT_I18N_|nuxt-i18n-slp/],\n storageKeys: ['i18n_redirected'],\n },\n {\n id: 'vue-i18n',\n name: 'vue-i18n',\n category: 'i18n-library',\n bundle: [/__VUE_I18N_SYMBOL__|intlify-message-/],\n globals: ['__INTLIFY__', '__VUE_I18N__'],\n hiddenBy: ['nuxt-i18n'],\n },\n {\n id: 'lingui',\n name: 'Lingui',\n category: 'i18n-library',\n bundle: [/Lingui: Attempted to call a translation function/],\n },\n {\n id: 'svelte-i18n',\n name: 'svelte-i18n',\n category: 'i18n-library',\n bundle: [/\\[svelte-i18n\\]/],\n },\n {\n id: 'paraglide',\n name: 'Paraglide JS',\n category: 'i18n-library',\n bundle: [/PARAGLIDE_LOCALE/],\n storageKeys: ['PARAGLIDE_LOCALE'],\n },\n {\n id: 'ngx-translate',\n name: 'ngx-translate',\n category: 'i18n-library',\n bundle: [/ngx-translate\\/core: /],\n },\n {\n id: 'transloco',\n name: 'Transloco',\n category: 'i18n-library',\n bundle: [/\\bTRANSLOCO_[A-Z_]+/],\n },\n {\n id: 'angular-localize',\n name: 'Angular @angular/localize',\n category: 'i18n-library',\n globals: ['$localize'],\n },\n {\n id: 'next-translate',\n name: 'next-translate',\n category: 'i18n-library',\n html: [/\"__namespaces\"\\s*:/],\n bundle: [/\\b__NEXT_TRANSLATE__\\b/],\n globals: ['__NEXT_TRANSLATE__'],\n },\n {\n id: 'next-international',\n name: 'next-international',\n category: 'i18n-library',\n bundle: [/\\bI18nProviderClient\\b/],\n requires: ['nextjs'],\n },\n {\n id: 'gt-next',\n name: 'gt-next (General Translation)',\n category: 'i18n-library',\n bundle: [/\\bgt-next\\b/],\n requires: ['nextjs'],\n },\n {\n id: 'gt-react',\n name: 'gt-react (General Translation)',\n category: 'i18n-library',\n bundle: [\n /__generaltranslation|generaltranslation\\/react-core|\\bgt-react\\b/,\n ],\n hiddenBy: ['gt-next'],\n },\n {\n id: 'lingo-dev',\n name: 'Lingo.dev',\n category: 'i18n-library',\n bundle: [/__LINGO_DEV_(?:STATE|UPDATE)__|\\bLINGO_DEBUG\\b/],\n globals: ['__LINGO_DEV_STATE__'],\n },\n {\n id: 'wuchale',\n name: 'wuchale',\n category: 'i18n-library',\n bundle: [/i18n-404:tag/],\n },\n {\n id: 'fluent-vue',\n name: 'fluent-vue',\n category: 'i18n-library',\n bundle: [/\\[fluent-vue\\]/],\n },\n {\n id: 'fluent',\n name: 'Fluent (Project Fluent)',\n category: 'i18n-library',\n bundle: [quoted('ReferenceError\\\\(<Q>Unknown term: ')],\n hiddenBy: ['fluent-vue'],\n },\n {\n id: 'solid-primitives-i18n',\n name: '@solid-primitives/i18n',\n category: 'i18n-library',\n bundle: [quoted(String.raw`RegExp\\(<Q>\\{\\{\\\\\\\\s\\*\\$\\{\\w+\\}\\\\\\\\s\\*\\}\\}<Q>`)],\n },\n {\n id: 'next-locale',\n name: 'Next.js i18n routing',\n category: 'i18n-library',\n storageKeys: ['NEXT_LOCALE'],\n requires: ['nextjs'],\n hiddenBy: ['intlayer', 'next-intl', 'next-i18next', 'next-translate'],\n },\n {\n id: 'polylang',\n name: 'Polylang',\n category: 'i18n-library',\n // Language switcher items: `lang-item lang-item-2 lang-item-fr`.\n html: [/\\blang-item-\\d+\\b/],\n resourceUrls: [/\\/wp-content\\/plugins\\/polylang/],\n storageKeys: ['pll_language'],\n },\n {\n id: 'wpml',\n name: 'WPML',\n category: 'i18n-library',\n html: [\n /<meta[^>]+name=[\"']generator[\"'][^>]+content=[\"']WPML ver:([\\d.]+)/i,\n /\\bwpml-ls(?:-item|-statics|-legacy)?\\b/,\n ],\n resourceUrls: [/\\/wp-content\\/plugins\\/sitepress-multilingual-cms/],\n storageKeys: ['wp-wpml_current_language', '_icl_current_language'],\n },\n {\n id: 'translatepress',\n name: 'TranslatePress',\n category: 'i18n-library',\n html: [/\\btrp-language-switcher\\b|\\bdata-trp-/],\n resourceUrls: [/\\/wp-content\\/plugins\\/translatepress-multilingual/],\n },\n];\n\n/** Translation management systems (in-context editors and OTA delivery). */\nconst tmsSignatures: TechnologySignature[] = [\n {\n id: 'intlayer-cms',\n name: 'Intlayer CMS',\n category: 'tms',\n resourceUrls: [/\\/\\/back\\.intlayer\\.org\\//],\n // The editor config always embeds the backend URL: require it enabled.\n bundle: [\n quoted(\n String.raw`back\\.intlayer\\.org<Q>,\\s*<Q>?port<Q>?:\\s*[\\w.]+,\\s*<Q>?enabled<Q>?:\\s*(?:!0|true)`\n ),\n ],\n requires: ['intlayer'],\n },\n {\n id: 'crowdin',\n name: 'Crowdin',\n category: 'tms',\n resourceUrls: [/(?:^|\\.|\\/\\/)crowdin\\.(?:com|net)\\//],\n // In-context (JIPT) snippet: `var _jipt = []; _jipt.push(['project', …])`.\n html: [/\\b_jipt\\s*(?:=\\s*\\[|\\.push\\()/],\n bundle: [/distributions\\.crowdin\\.net|cdn\\.crowdin\\.com/],\n globals: ['_jipt'],\n },\n {\n id: 'phrase',\n name: 'Phrase',\n category: 'tms',\n html: [/\\bPHRASEAPP_CONFIG\\s*=/],\n resourceUrls: [/(?:^|\\.|\\/\\/)(?:phrase|phraseapp)\\.com\\//],\n bundle: [/ota\\.(?:eu|us)\\.phrase\\.com|PHRASEAPP_CONFIG|phraseapp\\.com/],\n globals: ['PHRASEAPP_CONFIG', 'phraseApp'],\n },\n {\n id: 'lokalise',\n name: 'Lokalise',\n category: 'tms',\n html: [/\\bLOKALISE_CONFIG\\s*=/],\n resourceUrls: [/(?:^|\\.|\\/\\/)lokalise\\.(?:com|co)\\//],\n bundle: [/ota\\.lokalise\\.com|app\\.lokalise\\.com|LOKALISE_CONFIG/],\n globals: ['LOKALISE_CONFIG'],\n },\n {\n id: 'locize',\n name: 'locize',\n category: 'tms',\n html: [/\\blocizer\\.init\\(/],\n resourceUrls: [/(?:^|\\.|\\/\\/)locize\\.(?:app|io|com)\\//],\n bundle: [/api\\.(?:lite\\.)?locize\\.(?:app|io)/],\n },\n {\n id: 'transifex',\n name: 'Transifex',\n category: 'tms',\n // Transifex Live snippet: `window.liveSettings = { api_key: … }`.\n html: [/\\bliveSettings\\s*=\\s*\\{/],\n resourceUrls: [/(?:^|\\.|\\/\\/)transifex\\.(?:com|net)\\//],\n bundle: [/cds\\.svc\\.transifex\\.net/],\n globals: ['Transifex', 'liveSettings'],\n },\n {\n id: 'tolgee',\n name: 'Tolgee',\n category: 'tms',\n resourceUrls: [/(?:^|\\.|\\/\\/)(?:tolgee\\.io|tolg\\.ee)\\//],\n bundle: [/app\\.tolgee\\.io|@tolgee\\//],\n },\n {\n id: 'localazy',\n name: 'Localazy',\n category: 'tms',\n resourceUrls: [/(?:^|\\.|\\/\\/)localazy\\.com\\//],\n bundle: [/delivery\\.localazy\\.com/],\n },\n {\n id: 'simplelocalize',\n name: 'SimpleLocalize',\n category: 'tms',\n resourceUrls: [/(?:^|\\.|\\/\\/)simplelocalize\\.io\\//],\n bundle: [/cdn\\.simplelocalize\\.io/],\n },\n {\n id: 'localizely',\n name: 'Localizely',\n category: 'tms',\n resourceUrls: [/(?:^|\\.|\\/\\/)localizely\\.com\\//],\n bundle: [/api\\.localizely\\.com/],\n },\n {\n id: 'smartling',\n name: 'Smartling',\n category: 'tms',\n resourceUrls: [/(?:^|\\.|\\/\\/)smartling\\.com\\//],\n bundle: [/api\\.smartling\\.com/],\n },\n {\n id: 'poeditor',\n name: 'POEditor',\n category: 'tms',\n resourceUrls: [/(?:^|\\.|\\/\\/)poeditor\\.com\\//],\n bundle: [/api\\.poeditor\\.com/],\n },\n {\n id: 'weblate',\n name: 'Weblate',\n category: 'tms',\n resourceUrls: [/hosted\\.weblate\\.org\\//],\n bundle: [/hosted\\.weblate\\.org/],\n },\n {\n id: 'lingohub',\n name: 'Lingohub',\n category: 'tms',\n resourceUrls: [/(?:^|\\.|\\/\\/)lingohub\\.com\\//],\n bundle: [/api\\.lingohub\\.com/],\n },\n {\n id: 'loco',\n name: 'Loco',\n category: 'tms',\n resourceUrls: [/(?:^|\\.|\\/\\/)localise\\.biz\\//],\n bundle: [/localise\\.biz\\/api/],\n },\n {\n id: 'gridly',\n name: 'Gridly',\n category: 'tms',\n resourceUrls: [/(?:^|\\.|\\/\\/)gridly\\.com\\//],\n bundle: [/cdn\\.gridly\\.com|api\\.gridly\\.com/],\n },\n];\n\n/** Hosted website translation layers (proxy or JS overlay). */\nconst translationProxySignatures: TechnologySignature[] = [\n {\n id: 'weglot',\n name: 'Weglot',\n category: 'translation-proxy',\n html: [/\\bWeglot\\.initialize\\(|\\bdata-wg-notranslate\\b/],\n resourceUrls: [/cdn\\.weglot\\.(?:com|us)\\//],\n globals: ['Weglot'],\n },\n {\n id: 'localizejs',\n name: 'Localize',\n category: 'translation-proxy',\n html: [/\\bLocalize\\.initialize\\(/],\n resourceUrls: [/global\\.localizecdn\\.com\\/|cdn\\.localizejs\\.com\\//],\n globals: ['Localize'],\n },\n {\n id: 'gtranslate',\n name: 'GTranslate',\n category: 'translation-proxy',\n html: [/\\bgtranslateSettings\\s*=|\\bgtranslate_wrapper\\b/],\n resourceUrls: [/cdn\\.gtranslate\\.net\\//],\n globals: ['gtranslateSettings'],\n },\n {\n id: 'google-translate',\n name: 'Google Translate widget',\n category: 'translation-proxy',\n html: [\n /\\bgoogleTranslateElementInit\\b|\\bgoogle\\.translate\\.TranslateElement\\(/,\n ],\n resourceUrls: [/translate\\.google\\.com\\/translate_a\\/element\\.js/],\n globals: ['googleTranslateElementInit'],\n },\n {\n id: 'conveythis',\n name: 'ConveyThis',\n category: 'translation-proxy',\n html: [/\\bConveyThis_Initializer\\.init\\(/],\n resourceUrls: [/cdn\\.conveythis\\.com\\//],\n },\n {\n id: 'bablic',\n name: 'Bablic',\n category: 'translation-proxy',\n resourceUrls: [/(?:^|\\.|\\/\\/)bablic\\.com\\//],\n globals: ['bablic'],\n },\n {\n id: 'linguise',\n name: 'Linguise',\n category: 'translation-proxy',\n html: [/\\blinguise_configs\\b/],\n resourceUrls: [/(?:^|\\.|\\/\\/)linguise\\.com\\//],\n },\n {\n id: 'onelink',\n name: 'OneLink (TransPerfect)',\n category: 'translation-proxy',\n resourceUrls: [/(?:^|\\.|\\/\\/)onelink(?:js|-edge)?\\.com\\//],\n },\n {\n id: 'motionpoint',\n name: 'MotionPoint',\n category: 'translation-proxy',\n resourceUrls: [/(?:^|\\.|\\/\\/)motionpoint\\.(?:com|net)\\//],\n },\n];\n\n/** Every known technology fingerprint, in display order. */\nexport const technologySignatures: readonly TechnologySignature[] = [\n ...frameworkSignatures,\n ...i18nLibrarySignatures,\n ...tmsSignatures,\n ...translationProxySignatures,\n];\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ //#region src/scan/detection/url.ts
3
+ /** URL helpers shared by the scan checks (browser-safe). */
4
+ /** Parse a possibly relative URL, returning `undefined` when it is invalid. */
5
+ const parseUrl = (url, baseUrl) => {
6
+ try {
7
+ return new URL(url, baseUrl);
8
+ } catch {
9
+ return;
10
+ }
11
+ };
12
+ /** Strip a leading `www.` so `www.example.com` and `example.com` compare equal. */
13
+ const normalizeHostname = (hostname) => hostname.toLowerCase().replace(/^www\./, "");
14
+ /**
15
+ * Canonical comparable form of a URL: no hash, no trailing slash (except the
16
+ * root), `www.` stripped. Returns the input unchanged when it cannot be parsed.
17
+ */
18
+ const normalizeUrl = (url, baseUrl) => {
19
+ const parsedUrl = parseUrl(url, baseUrl);
20
+ if (!parsedUrl) return url;
21
+ const pathname = parsedUrl.pathname.length > 1 ? parsedUrl.pathname.replace(/\/+$/, "") : parsedUrl.pathname;
22
+ return `${parsedUrl.protocol}//${normalizeHostname(parsedUrl.host)}${pathname}${parsedUrl.search}`;
23
+ };
24
+ /** First non-empty segment of a URL path (`/fr/about` → `fr`). */
25
+ const getFirstPathSegment = (pathname) => pathname.split("/").find(Boolean);
26
+ /**
27
+ * Whether the URL is fully qualified (`https://host/…`), as hreflang requires.
28
+ * Relative (`/fr`), protocol-relative (`//host/fr`) and non-HTTP URLs are not.
29
+ */
30
+ const isAbsoluteUrl = (url) => /^https?:\/\/[^/\s?#]+/i.test(url.trim());
31
+ /**
32
+ * Approximate registrable domain of a hostname (`gtm.crowdin.com` →
33
+ * `crowdin.com`, `www.airbnb.co.uk` → `airbnb.co.uk`), without a public
34
+ * suffix list: a short second-level label under a country code is treated as
35
+ * part of the suffix.
36
+ */
37
+ const getSiteDomain = (hostname) => {
38
+ const labels = normalizeHostname(hostname).split(".");
39
+ if (labels.length <= 2) return labels.join(".");
40
+ const topLevelLabel = labels[labels.length - 1] ?? "";
41
+ const secondLevelLabel = labels[labels.length - 2] ?? "";
42
+ const isCompoundSuffix = topLevelLabel.length === 2 && secondLevelLabel.length <= 3;
43
+ return labels.slice(isCompoundSuffix ? -3 : -2).join(".");
44
+ };
45
+
46
+ //#endregion
47
+ exports.getFirstPathSegment = getFirstPathSegment;
48
+ exports.getSiteDomain = getSiteDomain;
49
+ exports.isAbsoluteUrl = isAbsoluteUrl;
50
+ exports.normalizeHostname = normalizeHostname;
51
+ exports.normalizeUrl = normalizeUrl;
52
+ exports.parseUrl = parseUrl;
53
+ //# sourceMappingURL=url.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.cjs","names":[],"sources":["../../../../src/scan/detection/url.ts"],"sourcesContent":["/** URL helpers shared by the scan checks (browser-safe). */\n\n/** Parse a possibly relative URL, returning `undefined` when it is invalid. */\nexport const parseUrl = (url: string, baseUrl?: string): URL | undefined => {\n try {\n return new URL(url, baseUrl);\n } catch {\n return undefined;\n }\n};\n\n/** Strip a leading `www.` so `www.example.com` and `example.com` compare equal. */\nexport const normalizeHostname = (hostname: string): string =>\n hostname.toLowerCase().replace(/^www\\./, '');\n\n/**\n * Canonical comparable form of a URL: no hash, no trailing slash (except the\n * root), `www.` stripped. Returns the input unchanged when it cannot be parsed.\n */\nexport const normalizeUrl = (url: string, baseUrl?: string): string => {\n const parsedUrl = parseUrl(url, baseUrl);\n if (!parsedUrl) return url;\n\n const pathname =\n parsedUrl.pathname.length > 1\n ? parsedUrl.pathname.replace(/\\/+$/, '')\n : parsedUrl.pathname;\n\n return `${parsedUrl.protocol}//${normalizeHostname(parsedUrl.host)}${pathname}${parsedUrl.search}`;\n};\n\n/** First non-empty segment of a URL path (`/fr/about` → `fr`). */\nexport const getFirstPathSegment = (pathname: string): string | undefined =>\n pathname.split('/').find(Boolean);\n\n/**\n * Whether the URL is fully qualified (`https://host/…`), as hreflang requires.\n * Relative (`/fr`), protocol-relative (`//host/fr`) and non-HTTP URLs are not.\n */\nexport const isAbsoluteUrl = (url: string): boolean =>\n /^https?:\\/\\/[^/\\s?#]+/i.test(url.trim());\n\n/**\n * Approximate registrable domain of a hostname (`gtm.crowdin.com` →\n * `crowdin.com`, `www.airbnb.co.uk` → `airbnb.co.uk`), without a public\n * suffix list: a short second-level label under a country code is treated as\n * part of the suffix.\n */\nexport const getSiteDomain = (hostname: string): string => {\n const labels = normalizeHostname(hostname).split('.');\n if (labels.length <= 2) return labels.join('.');\n const topLevelLabel = labels[labels.length - 1] ?? '';\n const secondLevelLabel = labels[labels.length - 2] ?? '';\n const isCompoundSuffix =\n topLevelLabel.length === 2 && secondLevelLabel.length <= 3;\n return labels.slice(isCompoundSuffix ? -3 : -2).join('.');\n};\n"],"mappings":";;;;AAGA,MAAa,YAAY,KAAa,YAAsC;CAC1E,IAAI;EACF,OAAO,IAAI,IAAI,KAAK,OAAO;CAC7B,QAAQ;EACN;CACF;AACF;;AAGA,MAAa,qBAAqB,aAChC,SAAS,YAAY,CAAC,CAAC,QAAQ,UAAU,EAAE;;;;;AAM7C,MAAa,gBAAgB,KAAa,YAA6B;CACrE,MAAM,YAAY,SAAS,KAAK,OAAO;CACvC,IAAI,CAAC,WAAW,OAAO;CAEvB,MAAM,WACJ,UAAU,SAAS,SAAS,IACxB,UAAU,SAAS,QAAQ,QAAQ,EAAE,IACrC,UAAU;CAEhB,OAAO,GAAG,UAAU,SAAS,IAAI,kBAAkB,UAAU,IAAI,IAAI,WAAW,UAAU;AAC5F;;AAGA,MAAa,uBAAuB,aAClC,SAAS,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO;;;;;AAMlC,MAAa,iBAAiB,QAC5B,yBAAyB,KAAK,IAAI,KAAK,CAAC;;;;;;;AAQ1C,MAAa,iBAAiB,aAA6B;CACzD,MAAM,SAAS,kBAAkB,QAAQ,CAAC,CAAC,MAAM,GAAG;CACpD,IAAI,OAAO,UAAU,GAAG,OAAO,OAAO,KAAK,GAAG;CAC9C,MAAM,gBAAgB,OAAO,OAAO,SAAS,MAAM;CACnD,MAAM,mBAAmB,OAAO,OAAO,SAAS,MAAM;CACtD,MAAM,mBACJ,cAAc,WAAW,KAAK,iBAAiB,UAAU;CAC3D,OAAO,OAAO,MAAM,mBAAmB,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG;AAC1D"}