@aws-blocks/core 0.1.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 (394) hide show
  1. package/LICENSE +174 -0
  2. package/dist/api.d.ts +147 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +10 -0
  5. package/dist/api.test.d.ts +2 -0
  6. package/dist/api.test.d.ts.map +1 -0
  7. package/dist/api.test.js +19 -0
  8. package/dist/bb-utils.d.ts +11 -0
  9. package/dist/bb-utils.d.ts.map +1 -0
  10. package/dist/bb-utils.js +12 -0
  11. package/dist/builtin-routes.d.ts +6 -0
  12. package/dist/builtin-routes.d.ts.map +1 -0
  13. package/dist/builtin-routes.js +57 -0
  14. package/dist/cdk/__fixtures__/factory-backend.d.ts +3 -0
  15. package/dist/cdk/__fixtures__/factory-backend.d.ts.map +1 -0
  16. package/dist/cdk/__fixtures__/factory-backend.js +6 -0
  17. package/dist/cdk/__fixtures__/fullid-construct-backend.d.ts +2 -0
  18. package/dist/cdk/__fixtures__/fullid-construct-backend.d.ts.map +1 -0
  19. package/dist/cdk/__fixtures__/fullid-construct-backend.js +37 -0
  20. package/dist/cdk/__fixtures__/handler.d.ts +5 -0
  21. package/dist/cdk/__fixtures__/handler.d.ts.map +1 -0
  22. package/dist/cdk/__fixtures__/handler.js +3 -0
  23. package/dist/cdk/__fixtures__/side-effect-backend.d.ts +2 -0
  24. package/dist/cdk/__fixtures__/side-effect-backend.d.ts.map +1 -0
  25. package/dist/cdk/__fixtures__/side-effect-backend.js +5 -0
  26. package/dist/cdk/blocks-backend.d.ts +68 -0
  27. package/dist/cdk/blocks-backend.d.ts.map +1 -0
  28. package/dist/cdk/blocks-backend.js +214 -0
  29. package/dist/cdk/blocks-backend.test.d.ts +2 -0
  30. package/dist/cdk/blocks-backend.test.d.ts.map +1 -0
  31. package/dist/cdk/blocks-backend.test.js +151 -0
  32. package/dist/cdk/blocks-stack.test.d.ts +2 -0
  33. package/dist/cdk/blocks-stack.test.d.ts.map +1 -0
  34. package/dist/cdk/blocks-stack.test.js +78 -0
  35. package/dist/cdk/config-registry.d.ts +26 -0
  36. package/dist/cdk/config-registry.d.ts.map +1 -0
  37. package/dist/cdk/config-registry.js +80 -0
  38. package/dist/cdk/index.d.ts +35 -0
  39. package/dist/cdk/index.d.ts.map +1 -0
  40. package/dist/cdk/index.js +90 -0
  41. package/dist/cdk/mixins.d.ts +28 -0
  42. package/dist/cdk/mixins.d.ts.map +1 -0
  43. package/dist/cdk/mixins.js +37 -0
  44. package/dist/cdk/mixins.test.d.ts +2 -0
  45. package/dist/cdk/mixins.test.d.ts.map +1 -0
  46. package/dist/cdk/mixins.test.js +108 -0
  47. package/dist/cdk/node-version.d.ts +14 -0
  48. package/dist/cdk/node-version.d.ts.map +1 -0
  49. package/dist/cdk/node-version.js +15 -0
  50. package/dist/cdk/stack-metadata.d.ts +12 -0
  51. package/dist/cdk/stack-metadata.d.ts.map +1 -0
  52. package/dist/cdk/stack-metadata.js +22 -0
  53. package/dist/cdk/stack-metadata.test.d.ts +2 -0
  54. package/dist/cdk/stack-metadata.test.d.ts.map +1 -0
  55. package/dist/cdk/stack-metadata.test.js +56 -0
  56. package/dist/cdk/synth-guard.d.ts +14 -0
  57. package/dist/cdk/synth-guard.d.ts.map +1 -0
  58. package/dist/cdk/synth-guard.js +20 -0
  59. package/dist/cdk/synth-guard.test.d.ts +2 -0
  60. package/dist/cdk/synth-guard.test.d.ts.map +1 -0
  61. package/dist/cdk/synth-guard.test.js +15 -0
  62. package/dist/client/index.d.ts +97 -0
  63. package/dist/client/index.d.ts.map +1 -0
  64. package/dist/client/index.js +238 -0
  65. package/dist/client/index.test.d.ts +2 -0
  66. package/dist/client/index.test.d.ts.map +1 -0
  67. package/dist/client/index.test.js +113 -0
  68. package/dist/common/config.d.ts +45 -0
  69. package/dist/common/config.d.ts.map +1 -0
  70. package/dist/common/config.js +154 -0
  71. package/dist/common/config.test.d.ts +2 -0
  72. package/dist/common/config.test.d.ts.map +1 -0
  73. package/dist/common/config.test.js +173 -0
  74. package/dist/common/constants.d.ts +11 -0
  75. package/dist/common/constants.d.ts.map +1 -0
  76. package/dist/common/constants.js +12 -0
  77. package/dist/common/crypto.d.ts +6 -0
  78. package/dist/common/crypto.d.ts.map +1 -0
  79. package/dist/common/crypto.js +14 -0
  80. package/dist/common/index.d.ts +220 -0
  81. package/dist/common/index.d.ts.map +1 -0
  82. package/dist/common/index.js +180 -0
  83. package/dist/common/index.test.d.ts +2 -0
  84. package/dist/common/index.test.d.ts.map +1 -0
  85. package/dist/common/index.test.js +195 -0
  86. package/dist/common/mock-data.d.ts +40 -0
  87. package/dist/common/mock-data.d.ts.map +1 -0
  88. package/dist/common/mock-data.js +39 -0
  89. package/dist/common/official-bb-names.generated.d.ts +7 -0
  90. package/dist/common/official-bb-names.generated.d.ts.map +1 -0
  91. package/dist/common/official-bb-names.generated.js +28 -0
  92. package/dist/common/sdk-registry.d.ts +136 -0
  93. package/dist/common/sdk-registry.d.ts.map +1 -0
  94. package/dist/common/sdk-registry.js +125 -0
  95. package/dist/constants.d.ts +27 -0
  96. package/dist/constants.d.ts.map +1 -0
  97. package/dist/constants.js +28 -0
  98. package/dist/cors.d.ts +39 -0
  99. package/dist/cors.d.ts.map +1 -0
  100. package/dist/cors.js +85 -0
  101. package/dist/cors.test.d.ts +2 -0
  102. package/dist/cors.test.d.ts.map +1 -0
  103. package/dist/cors.test.js +241 -0
  104. package/dist/db-naming.d.ts +21 -0
  105. package/dist/db-naming.d.ts.map +1 -0
  106. package/dist/db-naming.js +38 -0
  107. package/dist/db-naming.test.d.ts +2 -0
  108. package/dist/db-naming.test.d.ts.map +1 -0
  109. package/dist/db-naming.test.js +29 -0
  110. package/dist/errors.d.ts +67 -0
  111. package/dist/errors.d.ts.map +1 -0
  112. package/dist/errors.js +69 -0
  113. package/dist/hosting.d.ts +258 -0
  114. package/dist/hosting.d.ts.map +1 -0
  115. package/dist/hosting.js +340 -0
  116. package/dist/hosting.test.d.ts +2 -0
  117. package/dist/hosting.test.d.ts.map +1 -0
  118. package/dist/hosting.test.js +1077 -0
  119. package/dist/index.cdk.d.ts +13 -0
  120. package/dist/index.cdk.d.ts.map +1 -0
  121. package/dist/index.cdk.js +13 -0
  122. package/dist/index.d.ts +9 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +10 -0
  125. package/dist/lambda-handler.d.ts +131 -0
  126. package/dist/lambda-handler.d.ts.map +1 -0
  127. package/dist/lambda-handler.js +610 -0
  128. package/dist/lambda-handler.test.d.ts +2 -0
  129. package/dist/lambda-handler.test.d.ts.map +1 -0
  130. package/dist/lambda-handler.test.js +835 -0
  131. package/dist/pipeline/index.d.ts +4 -0
  132. package/dist/pipeline/index.d.ts.map +1 -0
  133. package/dist/pipeline/index.js +3 -0
  134. package/dist/pipeline/pipeline-construct.d.ts +130 -0
  135. package/dist/pipeline/pipeline-construct.d.ts.map +1 -0
  136. package/dist/pipeline/pipeline-construct.js +484 -0
  137. package/dist/pipeline/pipeline.test.d.ts +2 -0
  138. package/dist/pipeline/pipeline.test.d.ts.map +1 -0
  139. package/dist/pipeline/pipeline.test.js +1231 -0
  140. package/dist/pipeline/types.d.ts +351 -0
  141. package/dist/pipeline/types.d.ts.map +1 -0
  142. package/dist/pipeline/types.js +3 -0
  143. package/dist/raw-route.cdk.d.ts +47 -0
  144. package/dist/raw-route.cdk.d.ts.map +1 -0
  145. package/dist/raw-route.cdk.js +51 -0
  146. package/dist/raw-route.d.ts +119 -0
  147. package/dist/raw-route.d.ts.map +1 -0
  148. package/dist/raw-route.js +239 -0
  149. package/dist/raw-route.mock.d.ts +47 -0
  150. package/dist/raw-route.mock.d.ts.map +1 -0
  151. package/dist/raw-route.mock.js +51 -0
  152. package/dist/raw-route.test.d.ts +2 -0
  153. package/dist/raw-route.test.d.ts.map +1 -0
  154. package/dist/raw-route.test.js +597 -0
  155. package/dist/redact.d.ts +51 -0
  156. package/dist/redact.d.ts.map +1 -0
  157. package/dist/redact.js +134 -0
  158. package/dist/redact.test.d.ts +2 -0
  159. package/dist/redact.test.d.ts.map +1 -0
  160. package/dist/redact.test.js +199 -0
  161. package/dist/rpc.d.ts +54 -0
  162. package/dist/rpc.d.ts.map +1 -0
  163. package/dist/rpc.js +127 -0
  164. package/dist/rpc.test.d.ts +2 -0
  165. package/dist/rpc.test.d.ts.map +1 -0
  166. package/dist/rpc.test.js +60 -0
  167. package/dist/scripts/cdk-telemetry-env.d.ts +13 -0
  168. package/dist/scripts/cdk-telemetry-env.d.ts.map +1 -0
  169. package/dist/scripts/cdk-telemetry-env.js +21 -0
  170. package/dist/scripts/cdk-telemetry-env.test.d.ts +2 -0
  171. package/dist/scripts/cdk-telemetry-env.test.d.ts.map +1 -0
  172. package/dist/scripts/cdk-telemetry-env.test.js +56 -0
  173. package/dist/scripts/cleanup.d.ts +3 -0
  174. package/dist/scripts/cleanup.d.ts.map +1 -0
  175. package/dist/scripts/cleanup.js +35 -0
  176. package/dist/scripts/console.d.ts +6 -0
  177. package/dist/scripts/console.d.ts.map +1 -0
  178. package/dist/scripts/console.js +25 -0
  179. package/dist/scripts/deploy.d.ts +6 -0
  180. package/dist/scripts/deploy.d.ts.map +1 -0
  181. package/dist/scripts/deploy.js +82 -0
  182. package/dist/scripts/destroy.d.ts +6 -0
  183. package/dist/scripts/destroy.d.ts.map +1 -0
  184. package/dist/scripts/destroy.js +30 -0
  185. package/dist/scripts/dev-server-cors.test.d.ts +2 -0
  186. package/dist/scripts/dev-server-cors.test.d.ts.map +1 -0
  187. package/dist/scripts/dev-server-cors.test.js +23 -0
  188. package/dist/scripts/dev-server-telemetry.test.d.ts +2 -0
  189. package/dist/scripts/dev-server-telemetry.test.d.ts.map +1 -0
  190. package/dist/scripts/dev-server-telemetry.test.js +113 -0
  191. package/dist/scripts/dev-server.d.ts +21 -0
  192. package/dist/scripts/dev-server.d.ts.map +1 -0
  193. package/dist/scripts/dev-server.js +456 -0
  194. package/dist/scripts/ensure-secrets.d.ts +31 -0
  195. package/dist/scripts/ensure-secrets.d.ts.map +1 -0
  196. package/dist/scripts/ensure-secrets.js +100 -0
  197. package/dist/scripts/ensure-secrets.test.d.ts +2 -0
  198. package/dist/scripts/ensure-secrets.test.d.ts.map +1 -0
  199. package/dist/scripts/ensure-secrets.test.js +44 -0
  200. package/dist/scripts/external-migrations-step.d.ts +62 -0
  201. package/dist/scripts/external-migrations-step.d.ts.map +1 -0
  202. package/dist/scripts/external-migrations-step.js +243 -0
  203. package/dist/scripts/external-migrations-step.test.d.ts +2 -0
  204. package/dist/scripts/external-migrations-step.test.d.ts.map +1 -0
  205. package/dist/scripts/external-migrations-step.test.js +47 -0
  206. package/dist/scripts/extract-ts-types.d.ts +65 -0
  207. package/dist/scripts/extract-ts-types.d.ts.map +1 -0
  208. package/dist/scripts/extract-ts-types.js +664 -0
  209. package/dist/scripts/extract-ts-types.test.d.ts +2 -0
  210. package/dist/scripts/extract-ts-types.test.d.ts.map +1 -0
  211. package/dist/scripts/extract-ts-types.test.js +497 -0
  212. package/dist/scripts/generate-client-worker.d.ts +2 -0
  213. package/dist/scripts/generate-client-worker.d.ts.map +1 -0
  214. package/dist/scripts/generate-client-worker.js +13 -0
  215. package/dist/scripts/generate-client.d.ts +14 -0
  216. package/dist/scripts/generate-client.d.ts.map +1 -0
  217. package/dist/scripts/generate-client.js +73 -0
  218. package/dist/scripts/generate-client.test.d.ts +2 -0
  219. package/dist/scripts/generate-client.test.d.ts.map +1 -0
  220. package/dist/scripts/generate-client.test.js +48 -0
  221. package/dist/scripts/generate-spec-cli.d.ts +3 -0
  222. package/dist/scripts/generate-spec-cli.d.ts.map +1 -0
  223. package/dist/scripts/generate-spec-cli.js +77 -0
  224. package/dist/scripts/generate-spec-cli.test.d.ts +14 -0
  225. package/dist/scripts/generate-spec-cli.test.d.ts.map +1 -0
  226. package/dist/scripts/generate-spec-cli.test.js +90 -0
  227. package/dist/scripts/generate-spec.d.ts +61 -0
  228. package/dist/scripts/generate-spec.d.ts.map +1 -0
  229. package/dist/scripts/generate-spec.js +746 -0
  230. package/dist/scripts/generate-spec.test.d.ts +12 -0
  231. package/dist/scripts/generate-spec.test.d.ts.map +1 -0
  232. package/dist/scripts/generate-spec.test.js +88 -0
  233. package/dist/scripts/index.d.ts +12 -0
  234. package/dist/scripts/index.d.ts.map +1 -0
  235. package/dist/scripts/index.js +13 -0
  236. package/dist/scripts/sandbox.d.ts +11 -0
  237. package/dist/scripts/sandbox.d.ts.map +1 -0
  238. package/dist/scripts/sandbox.js +200 -0
  239. package/dist/scripts/telemetry-cli.d.ts +3 -0
  240. package/dist/scripts/telemetry-cli.d.ts.map +1 -0
  241. package/dist/scripts/telemetry-cli.js +8 -0
  242. package/dist/scripts/telemetry.d.ts +17 -0
  243. package/dist/scripts/telemetry.d.ts.map +1 -0
  244. package/dist/scripts/telemetry.js +150 -0
  245. package/dist/scripts/telemetry.test.d.ts +2 -0
  246. package/dist/scripts/telemetry.test.d.ts.map +1 -0
  247. package/dist/scripts/telemetry.test.js +203 -0
  248. package/dist/scripts/validate-spec.d.ts +22 -0
  249. package/dist/scripts/validate-spec.d.ts.map +1 -0
  250. package/dist/scripts/validate-spec.js +159 -0
  251. package/dist/server/index.d.ts +3 -0
  252. package/dist/server/index.d.ts.map +1 -0
  253. package/dist/server/index.js +3 -0
  254. package/dist/server/withAuth.d.ts +142 -0
  255. package/dist/server/withAuth.d.ts.map +1 -0
  256. package/dist/server/withAuth.js +261 -0
  257. package/dist/server/withAuth.test.d.ts +2 -0
  258. package/dist/server/withAuth.test.d.ts.map +1 -0
  259. package/dist/server/withAuth.test.js +278 -0
  260. package/dist/telemetry/client.d.ts +59 -0
  261. package/dist/telemetry/client.d.ts.map +1 -0
  262. package/dist/telemetry/client.js +215 -0
  263. package/dist/telemetry/config-writer.d.ts +16 -0
  264. package/dist/telemetry/config-writer.d.ts.map +1 -0
  265. package/dist/telemetry/config-writer.js +36 -0
  266. package/dist/telemetry/consent-commands.test.d.ts +2 -0
  267. package/dist/telemetry/consent-commands.test.d.ts.map +1 -0
  268. package/dist/telemetry/consent-commands.test.js +161 -0
  269. package/dist/telemetry/consent.d.ts +60 -0
  270. package/dist/telemetry/consent.d.ts.map +1 -0
  271. package/dist/telemetry/consent.js +122 -0
  272. package/dist/telemetry/environment.d.ts +33 -0
  273. package/dist/telemetry/environment.d.ts.map +1 -0
  274. package/dist/telemetry/environment.js +87 -0
  275. package/dist/telemetry/identifiers.d.ts +20 -0
  276. package/dist/telemetry/identifiers.d.ts.map +1 -0
  277. package/dist/telemetry/identifiers.js +86 -0
  278. package/dist/telemetry/index.d.ts +6 -0
  279. package/dist/telemetry/index.d.ts.map +1 -0
  280. package/dist/telemetry/index.js +4 -0
  281. package/dist/telemetry/telemetry.test.d.ts +2 -0
  282. package/dist/telemetry/telemetry.test.d.ts.map +1 -0
  283. package/dist/telemetry/telemetry.test.js +1131 -0
  284. package/dist/telemetry/trackCommand.d.ts +32 -0
  285. package/dist/telemetry/trackCommand.d.ts.map +1 -0
  286. package/dist/telemetry/trackCommand.js +102 -0
  287. package/dist/telemetry/types.d.ts +92 -0
  288. package/dist/telemetry/types.d.ts.map +1 -0
  289. package/dist/telemetry/types.js +1 -0
  290. package/dist/types.d.ts +24 -0
  291. package/dist/types.d.ts.map +1 -0
  292. package/dist/types.js +3 -0
  293. package/dist/version.d.ts +2 -0
  294. package/dist/version.d.ts.map +1 -0
  295. package/dist/version.js +2 -0
  296. package/package.json +83 -0
  297. package/src/api.test.ts +25 -0
  298. package/src/api.ts +163 -0
  299. package/src/bb-utils.ts +13 -0
  300. package/src/builtin-routes.ts +62 -0
  301. package/src/cdk/__fixtures__/factory-backend.ts +8 -0
  302. package/src/cdk/__fixtures__/fullid-construct-backend.ts +42 -0
  303. package/src/cdk/__fixtures__/handler.ts +4 -0
  304. package/src/cdk/__fixtures__/side-effect-backend.ts +7 -0
  305. package/src/cdk/blocks-backend.test.ts +207 -0
  306. package/src/cdk/blocks-backend.ts +249 -0
  307. package/src/cdk/blocks-stack.test.ts +106 -0
  308. package/src/cdk/config-registry.ts +106 -0
  309. package/src/cdk/index.ts +115 -0
  310. package/src/cdk/mixins.test.ts +129 -0
  311. package/src/cdk/mixins.ts +41 -0
  312. package/src/cdk/node-version.ts +17 -0
  313. package/src/cdk/stack-metadata.test.ts +71 -0
  314. package/src/cdk/stack-metadata.ts +29 -0
  315. package/src/cdk/synth-guard.test.ts +21 -0
  316. package/src/cdk/synth-guard.ts +23 -0
  317. package/src/client/index.test.ts +118 -0
  318. package/src/client/index.ts +320 -0
  319. package/src/common/config.test.ts +236 -0
  320. package/src/common/config.ts +169 -0
  321. package/src/common/constants.ts +15 -0
  322. package/src/common/crypto.ts +15 -0
  323. package/src/common/index.test.ts +242 -0
  324. package/src/common/index.ts +335 -0
  325. package/src/common/mock-data.ts +52 -0
  326. package/src/common/official-bb-names.generated.ts +29 -0
  327. package/src/common/sdk-registry.ts +150 -0
  328. package/src/constants.ts +31 -0
  329. package/src/cors.test.ts +279 -0
  330. package/src/cors.ts +91 -0
  331. package/src/db-naming.test.ts +48 -0
  332. package/src/db-naming.ts +41 -0
  333. package/src/errors.ts +72 -0
  334. package/src/hosting.test.ts +1431 -0
  335. package/src/hosting.ts +626 -0
  336. package/src/index.cdk.ts +45 -0
  337. package/src/index.ts +22 -0
  338. package/src/lambda-handler.test.ts +1005 -0
  339. package/src/lambda-handler.ts +706 -0
  340. package/src/pipeline/index.ts +12 -0
  341. package/src/pipeline/pipeline-construct.ts +662 -0
  342. package/src/pipeline/pipeline.test.ts +1565 -0
  343. package/src/pipeline/types.ts +384 -0
  344. package/src/raw-route.cdk.ts +56 -0
  345. package/src/raw-route.mock.ts +56 -0
  346. package/src/raw-route.test.ts +819 -0
  347. package/src/raw-route.ts +316 -0
  348. package/src/redact.test.ts +222 -0
  349. package/src/redact.ts +143 -0
  350. package/src/rpc.test.ts +73 -0
  351. package/src/rpc.ts +174 -0
  352. package/src/scripts/cdk-telemetry-env.test.ts +75 -0
  353. package/src/scripts/cdk-telemetry-env.ts +23 -0
  354. package/src/scripts/cleanup.ts +39 -0
  355. package/src/scripts/console.ts +34 -0
  356. package/src/scripts/deploy.ts +106 -0
  357. package/src/scripts/destroy.ts +42 -0
  358. package/src/scripts/dev-server-cors.test.ts +28 -0
  359. package/src/scripts/dev-server-telemetry.test.ts +127 -0
  360. package/src/scripts/dev-server.ts +515 -0
  361. package/src/scripts/ensure-secrets.test.ts +50 -0
  362. package/src/scripts/ensure-secrets.ts +113 -0
  363. package/src/scripts/external-migrations-step.test.ts +64 -0
  364. package/src/scripts/external-migrations-step.ts +269 -0
  365. package/src/scripts/extract-ts-types.test.ts +516 -0
  366. package/src/scripts/extract-ts-types.ts +773 -0
  367. package/src/scripts/generate-client-worker.ts +15 -0
  368. package/src/scripts/generate-client.test.ts +69 -0
  369. package/src/scripts/generate-client.ts +86 -0
  370. package/src/scripts/generate-spec-cli.test.ts +106 -0
  371. package/src/scripts/generate-spec-cli.ts +92 -0
  372. package/src/scripts/generate-spec.test.ts +99 -0
  373. package/src/scripts/generate-spec.ts +833 -0
  374. package/src/scripts/index.ts +21 -0
  375. package/src/scripts/sandbox.ts +230 -0
  376. package/src/scripts/telemetry-cli.ts +10 -0
  377. package/src/scripts/telemetry.test.ts +239 -0
  378. package/src/scripts/telemetry.ts +173 -0
  379. package/src/scripts/validate-spec.ts +199 -0
  380. package/src/server/index.ts +5 -0
  381. package/src/server/withAuth.test.ts +348 -0
  382. package/src/server/withAuth.ts +323 -0
  383. package/src/telemetry/client.ts +226 -0
  384. package/src/telemetry/config-writer.ts +52 -0
  385. package/src/telemetry/consent-commands.test.ts +196 -0
  386. package/src/telemetry/consent.ts +154 -0
  387. package/src/telemetry/environment.ts +100 -0
  388. package/src/telemetry/identifiers.ts +94 -0
  389. package/src/telemetry/index.ts +11 -0
  390. package/src/telemetry/telemetry.test.ts +1343 -0
  391. package/src/telemetry/trackCommand.ts +110 -0
  392. package/src/telemetry/types.ts +92 -0
  393. package/src/types.ts +33 -0
  394. package/src/version.ts +2 -0
@@ -0,0 +1,215 @@
1
+ import { request as httpsRequest } from 'node:https';
2
+ import { request as httpRequest } from 'node:http';
3
+ import { existsSync, readFileSync, mkdirSync, openSync, writeSync, closeSync, writeFileSync, constants } from 'node:fs';
4
+ import path from 'node:path';
5
+ import { debuglog } from 'node:util';
6
+ import { CORE_VERSION } from '../version.js';
7
+ import { Scope } from '../common/index.js';
8
+ import { isTelemetryEnabled } from './consent.js';
9
+ import { collectEnvironment } from './environment.js';
10
+ import { getInstallationId, getProjectId, generateEventId } from './identifiers.js';
11
+ // Debug log: writes to stderr via NODE_DEBUG=blocks-telemetry (developer-facing, for troubleshooting)
12
+ const debug = debuglog('blocks-telemetry');
13
+ const DEFAULT_ENDPOINT = 'https://blocks-telemetry.us-east-1.api.aws/metrics';
14
+ const TIMEOUT_MS = 500;
15
+ const TELEMETRY_VERSION = '1.0.0';
16
+ function getEndpoint() {
17
+ return process.env.BLOCKS_TELEMETRY_ENDPOINT || DEFAULT_ENDPOINT;
18
+ }
19
+ /**
20
+ * Parse `--telemetry-file=/path/to/file.json` from process.argv.
21
+ *
22
+ * Supports both `--telemetry-file=path` and `--telemetry-file path` forms.
23
+ *
24
+ * @returns The file path if the flag is present, undefined otherwise.
25
+ *
26
+ * @example
27
+ * // Capture telemetry to file (also sends HTTP when enabled):
28
+ * // npx tsx aws-blocks/scripts/server.ts --telemetry-file=/tmp/events.json
29
+ *
30
+ * // Capture WITHOUT sending (disable HTTP, file still writes):
31
+ * // AWS_BLOCKS_DISABLE_TELEMETRY=1 npx tsx aws-blocks/scripts/server.ts --telemetry-file=/tmp/events.json
32
+ */
33
+ export function getTelemetryFilePath() {
34
+ const arg = process.argv.find(a => a.startsWith('--telemetry-file='));
35
+ if (arg) {
36
+ const p = arg.slice('--telemetry-file='.length);
37
+ return p.trim() === '' ? undefined : p;
38
+ }
39
+ const idx = process.argv.indexOf('--telemetry-file');
40
+ if (idx !== -1 && process.argv[idx + 1] && !process.argv[idx + 1].startsWith('-')) {
41
+ return process.argv[idx + 1];
42
+ }
43
+ return undefined;
44
+ }
45
+ // File sink: writes to --telemetry-file path (user-facing, for debugging/testing)
46
+ function writeToTelemetryFile(event) {
47
+ const filePath = getTelemetryFilePath();
48
+ if (!filePath)
49
+ return; // getTelemetryFilePath already rejects empty/whitespace
50
+ try {
51
+ const dir = path.dirname(filePath);
52
+ if (!existsSync(dir)) {
53
+ mkdirSync(dir, { recursive: true });
54
+ }
55
+ // O_CREAT | O_EXCL: atomic create — fails with EEXIST if file already exists
56
+ const fd = openSync(filePath, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, 0o644);
57
+ const content = JSON.stringify([event], null, 2);
58
+ writeSync(fd, content);
59
+ closeSync(fd);
60
+ }
61
+ catch (err) {
62
+ // EEXIST = file already existed → skip (protects user data)
63
+ // All other errors silently ignored — telemetry must never affect commands
64
+ }
65
+ }
66
+ /**
67
+ * Constructs a telemetry event without sending it.
68
+ * Useful for testing event structure without I/O side effects.
69
+ * @internal
70
+ */
71
+ export function buildEvent(opts) {
72
+ const { blocks, totalCount, customBlocksCount } = Scope.getRegisteredBlocks();
73
+ let templateName = opts.product?.template;
74
+ let templateVersion = opts.product?.templateVersion;
75
+ try {
76
+ const pkgPath = path.resolve(process.cwd(), 'package.json');
77
+ if (existsSync(pkgPath)) {
78
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
79
+ if (pkg.blocksTemplate)
80
+ templateName = templateName || pkg.blocksTemplate;
81
+ if (pkg.blocksTemplateVersion)
82
+ templateVersion = templateVersion || pkg.blocksTemplateVersion;
83
+ }
84
+ }
85
+ catch {
86
+ // template info is best-effort
87
+ }
88
+ const buildingBlocks = blocks;
89
+ return {
90
+ telemetryVersion: TELEMETRY_VERSION,
91
+ identifiers: {
92
+ installationId: getInstallationId(),
93
+ projectId: getProjectId(),
94
+ eventId: generateEventId(),
95
+ timestamp: new Date().toISOString(),
96
+ },
97
+ event: {
98
+ command: opts.command,
99
+ state: opts.state,
100
+ duration: opts.duration,
101
+ ...(opts.error && { error: opts.error }),
102
+ },
103
+ environment: collectEnvironment(),
104
+ product: {
105
+ blocksVersion: CORE_VERSION,
106
+ ...(opts.product?.cdkVersion && { cdkVersion: opts.product.cdkVersion }),
107
+ ...(opts.product?.framework && { framework: opts.product.framework }),
108
+ ...(templateName && {
109
+ template: {
110
+ name: templateName,
111
+ ...(templateVersion && { version: templateVersion }),
112
+ },
113
+ }),
114
+ ...(buildingBlocks.length > 0 && { buildingBlocks }),
115
+ },
116
+ ...(opts.counters || totalCount > 0 || customBlocksCount > 0
117
+ ? {
118
+ counters: {
119
+ blocksCount: opts.counters?.blocksCount ?? totalCount,
120
+ ...(opts.counters?.customBuildingBlocks !== undefined
121
+ ? { customBuildingBlocks: opts.counters.customBuildingBlocks }
122
+ : customBlocksCount > 0 ? { customBuildingBlocks: customBlocksCount } : undefined),
123
+ },
124
+ }
125
+ : undefined),
126
+ };
127
+ }
128
+ /**
129
+ * Build a complete telemetry event and send it to the collection endpoint.
130
+ *
131
+ * This is the single entry point for all telemetry emission. It handles:
132
+ * 1. Early exit — if telemetry is disabled AND no `--telemetry-file` is set,
133
+ * returns immediately with no side effects (no IDs persisted, no notice)
134
+ * 2. Full payload construction (identifiers, environment, product info)
135
+ * 3. File sink — writes to the file specified by `--telemetry-file` (if set),
136
+ * regardless of opt-out status (inspired by CDK CLI's --telemetry-file)
137
+ * 4. Privacy filtering — custom BB names are NEVER sent, only counted
138
+ * 5. HTTP sink — fire-and-forget POST (only when telemetry is enabled)
139
+ *
140
+ * The file sink fires unconditionally when `--telemetry-file` is set.
141
+ * The HTTP sink only fires when telemetry is enabled. Callers never need to
142
+ * import consent, identifier, or environment utilities directly.
143
+ *
144
+ * @param opts - Event metadata (command, state, duration, optional error/product/counters)
145
+ *
146
+ * @example
147
+ * ```ts
148
+ * buildAndSendEvent({
149
+ * command: 'deploy',
150
+ * state: 'SUCCESS',
151
+ * duration: 4500,
152
+ * product: { cdkVersion: '2.150.0' },
153
+ * });
154
+ * ```
155
+ */
156
+ export function buildAndSendEvent(opts) {
157
+ try {
158
+ const filePath = getTelemetryFilePath();
159
+ const enabled = isTelemetryEnabled();
160
+ if (!filePath && !enabled)
161
+ return;
162
+ const event = buildEvent(opts);
163
+ if (filePath)
164
+ writeToTelemetryFile(event);
165
+ if (enabled)
166
+ sendEvent(event);
167
+ }
168
+ catch {
169
+ // Telemetry must never throw or affect the user's command
170
+ }
171
+ }
172
+ /**
173
+ * Send a pre-built telemetry event to the collection endpoint.
174
+ *
175
+ * Fire-and-forget: no retry, 500ms timeout, all errors silently swallowed.
176
+ * Debug output available via `NODE_DEBUG=blocks-telemetry`.
177
+ */
178
+ export function sendEvent(event) {
179
+ try {
180
+ const endpoint = getEndpoint();
181
+ const payload = JSON.stringify(event);
182
+ // E2E test sink: writes to BLOCKS_TELEMETRY_FILE env path (test-facing, for assertions)
183
+ if (process.env.BLOCKS_TELEMETRY_FILE) {
184
+ try {
185
+ writeFileSync(process.env.BLOCKS_TELEMETRY_FILE, payload);
186
+ }
187
+ catch { }
188
+ }
189
+ debug('sending event to %s (%d bytes)', endpoint, Buffer.byteLength(payload));
190
+ const url = new URL(endpoint);
191
+ const isHttps = url.protocol === 'https:';
192
+ const requestFn = isHttps ? httpsRequest : httpRequest;
193
+ const req = requestFn({
194
+ hostname: url.hostname,
195
+ port: url.port || (isHttps ? '443' : '80'),
196
+ path: url.pathname + url.search,
197
+ method: 'POST',
198
+ headers: {
199
+ 'Content-Type': 'application/json',
200
+ 'Content-Length': Buffer.byteLength(payload),
201
+ },
202
+ timeout: TIMEOUT_MS,
203
+ }, (res) => {
204
+ debug('event sent (status=%d)', res.statusCode);
205
+ res.resume();
206
+ });
207
+ req.on('error', (err) => { debug('send failed: %s', err.message); });
208
+ req.on('timeout', () => { debug('send timed out'); req.destroy(); });
209
+ req.write(payload);
210
+ req.end();
211
+ }
212
+ catch {
213
+ // Telemetry must never throw or affect the user's command
214
+ }
215
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Read an existing config file, merge the telemetry.enabled setting, and write it back.
3
+ * Creates the file and parent directories if they don't exist.
4
+ * Preserves all other keys in the config file and in the telemetry object
5
+ * (e.g., projectId).
6
+ *
7
+ * Config format:
8
+ * ```json
9
+ * { "telemetry": { "enabled": true, "projectId": "..." } }
10
+ * ```
11
+ *
12
+ * @param configPath - Absolute path to the config file
13
+ * @param telemetryEnabled - Whether telemetry should be enabled
14
+ */
15
+ export declare function writeConfigTelemetry(configPath: string, telemetryEnabled: boolean): void;
16
+ //# sourceMappingURL=config-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-writer.d.ts","sourceRoot":"","sources":["../../src/telemetry/config-writer.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAoBxF"}
@@ -0,0 +1,36 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
4
+ import { dirname } from 'node:path';
5
+ /**
6
+ * Read an existing config file, merge the telemetry.enabled setting, and write it back.
7
+ * Creates the file and parent directories if they don't exist.
8
+ * Preserves all other keys in the config file and in the telemetry object
9
+ * (e.g., projectId).
10
+ *
11
+ * Config format:
12
+ * ```json
13
+ * { "telemetry": { "enabled": true, "projectId": "..." } }
14
+ * ```
15
+ *
16
+ * @param configPath - Absolute path to the config file
17
+ * @param telemetryEnabled - Whether telemetry should be enabled
18
+ */
19
+ export function writeConfigTelemetry(configPath, telemetryEnabled) {
20
+ let existing = {};
21
+ try {
22
+ const content = readFileSync(configPath, 'utf-8');
23
+ existing = JSON.parse(content);
24
+ }
25
+ catch {
26
+ // File doesn't exist or is invalid — start fresh
27
+ }
28
+ const telemetry = (existing.telemetry && typeof existing.telemetry === 'object')
29
+ ? { ...existing.telemetry }
30
+ : {};
31
+ telemetry.enabled = telemetryEnabled;
32
+ existing.telemetry = telemetry;
33
+ const dir = dirname(configPath);
34
+ mkdirSync(dir, { recursive: true });
35
+ writeFileSync(configPath, JSON.stringify(existing, null, 2) + '\n', 'utf-8');
36
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=consent-commands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent-commands.test.d.ts","sourceRoot":"","sources":["../../src/telemetry/consent-commands.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,161 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { describe, it, beforeEach, afterEach } from 'node:test';
4
+ import assert from 'node:assert';
5
+ import { mkdirSync, writeFileSync, readFileSync, rmSync, existsSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { tmpdir } from 'node:os';
8
+ import { getTelemetryStatus, getGlobalConfigPath, getProjectConfigPath } from './consent.js';
9
+ import { writeConfigTelemetry } from './config-writer.js';
10
+ describe('getTelemetryStatus', () => {
11
+ const originalEnv = { ...process.env };
12
+ const originalCwd = process.cwd();
13
+ afterEach(() => {
14
+ process.env = { ...originalEnv };
15
+ process.chdir(originalCwd);
16
+ });
17
+ function clearCIVars() {
18
+ delete process.env.CI;
19
+ delete process.env.CONTINUOUS_INTEGRATION;
20
+ delete process.env.BUILD_NUMBER;
21
+ delete process.env.CODEBUILD_BUILD_ID;
22
+ delete process.env.GITHUB_ACTIONS;
23
+ delete process.env.GITLAB_CI;
24
+ delete process.env.CIRCLECI;
25
+ delete process.env.JENKINS_URL;
26
+ delete process.env.TF_BUILD;
27
+ delete process.env.BITBUCKET_BUILD_NUMBER;
28
+ delete process.env.BUILDKITE;
29
+ }
30
+ it('returns enabled=true when no config exists and not in CI', () => {
31
+ delete process.env.AWS_BLOCKS_DISABLE_TELEMETRY;
32
+ clearCIVars();
33
+ const tmp = join(tmpdir(), `blocks-status-test-${Date.now()}`);
34
+ mkdirSync(tmp, { recursive: true });
35
+ process.chdir(tmp);
36
+ const status = getTelemetryStatus();
37
+ assert.strictEqual(status.enabled, true);
38
+ rmSync(tmp, { recursive: true, force: true });
39
+ });
40
+ it('returns enabled=false when AWS_BLOCKS_DISABLE_TELEMETRY=1', () => {
41
+ process.env.AWS_BLOCKS_DISABLE_TELEMETRY = '1';
42
+ const tmp = join(tmpdir(), `blocks-status-test-${Date.now()}`);
43
+ mkdirSync(tmp, { recursive: true });
44
+ process.chdir(tmp);
45
+ const status = getTelemetryStatus();
46
+ assert.strictEqual(status.enabled, false);
47
+ assert.strictEqual(status.envVar, '1');
48
+ rmSync(tmp, { recursive: true, force: true });
49
+ });
50
+ it('returns enabled=false when project config disables', () => {
51
+ delete process.env.AWS_BLOCKS_DISABLE_TELEMETRY;
52
+ clearCIVars();
53
+ const tmp = join(tmpdir(), `blocks-status-test-${Date.now()}`);
54
+ mkdirSync(join(tmp, '.blocks'), { recursive: true });
55
+ writeFileSync(join(tmp, '.blocks', 'config.json'), JSON.stringify({ telemetry: { enabled: false } }));
56
+ process.chdir(tmp);
57
+ const status = getTelemetryStatus();
58
+ assert.strictEqual(status.enabled, false);
59
+ assert.strictEqual(status.projectConfig, false);
60
+ rmSync(tmp, { recursive: true, force: true });
61
+ });
62
+ it('any disable wins — global disabled even if project enables', () => {
63
+ delete process.env.AWS_BLOCKS_DISABLE_TELEMETRY;
64
+ clearCIVars();
65
+ const tmp = join(tmpdir(), `blocks-status-test-${Date.now()}`);
66
+ mkdirSync(join(tmp, '.blocks'), { recursive: true });
67
+ writeFileSync(join(tmp, '.blocks', 'config.json'), JSON.stringify({ telemetry: { enabled: true } }));
68
+ process.chdir(tmp);
69
+ // Simulate global config disabling (via projectRoot override for global path won't work here,
70
+ // but we can test that project enabled=true alone is fine)
71
+ const status = getTelemetryStatus();
72
+ assert.strictEqual(status.enabled, true);
73
+ rmSync(tmp, { recursive: true, force: true });
74
+ });
75
+ it('env var disables even when project config enables', () => {
76
+ process.env.AWS_BLOCKS_DISABLE_TELEMETRY = '1';
77
+ const tmp = join(tmpdir(), `blocks-status-test-${Date.now()}`);
78
+ mkdirSync(join(tmp, '.blocks'), { recursive: true });
79
+ writeFileSync(join(tmp, '.blocks', 'config.json'), JSON.stringify({ telemetry: { enabled: true } }));
80
+ process.chdir(tmp);
81
+ const status = getTelemetryStatus();
82
+ assert.strictEqual(status.enabled, false);
83
+ rmSync(tmp, { recursive: true, force: true });
84
+ });
85
+ it('returns enabled=true in CI environment (CI does not suppress telemetry)', () => {
86
+ delete process.env.AWS_BLOCKS_DISABLE_TELEMETRY;
87
+ process.env.CI = 'true';
88
+ const tmp = join(tmpdir(), `blocks-status-test-${Date.now()}`);
89
+ mkdirSync(tmp, { recursive: true });
90
+ process.chdir(tmp);
91
+ const status = getTelemetryStatus();
92
+ assert.strictEqual(status.enabled, true);
93
+ rmSync(tmp, { recursive: true, force: true });
94
+ });
95
+ });
96
+ describe('writeConfigTelemetry', () => {
97
+ let tmpDir;
98
+ beforeEach(() => {
99
+ tmpDir = join(tmpdir(), `blocks-writer-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
100
+ mkdirSync(tmpDir, { recursive: true });
101
+ });
102
+ afterEach(() => {
103
+ rmSync(tmpDir, { recursive: true, force: true });
104
+ });
105
+ it('creates a new config file with telemetry.enabled', () => {
106
+ const configPath = join(tmpDir, '.blocks', 'config.json');
107
+ writeConfigTelemetry(configPath, true);
108
+ assert.ok(existsSync(configPath));
109
+ const content = JSON.parse(readFileSync(configPath, 'utf-8'));
110
+ assert.strictEqual(content.telemetry.enabled, true);
111
+ });
112
+ it('writes telemetry.enabled=false', () => {
113
+ const configPath = join(tmpDir, '.blocks', 'config.json');
114
+ writeConfigTelemetry(configPath, false);
115
+ const content = JSON.parse(readFileSync(configPath, 'utf-8'));
116
+ assert.strictEqual(content.telemetry.enabled, false);
117
+ });
118
+ it('preserves existing keys when writing', () => {
119
+ const configPath = join(tmpDir, 'config.json');
120
+ writeFileSync(configPath, JSON.stringify({ telemetry: { projectId: 'abc-123' }, other: 'data' }, null, 2));
121
+ writeConfigTelemetry(configPath, false);
122
+ const content = JSON.parse(readFileSync(configPath, 'utf-8'));
123
+ assert.strictEqual(content.telemetry.enabled, false);
124
+ assert.strictEqual(content.telemetry.projectId, 'abc-123');
125
+ assert.strictEqual(content.other, 'data');
126
+ });
127
+ it('creates parent directories if they do not exist', () => {
128
+ const configPath = join(tmpDir, 'deep', 'nested', 'config.json');
129
+ writeConfigTelemetry(configPath, true);
130
+ assert.ok(existsSync(configPath));
131
+ const content = JSON.parse(readFileSync(configPath, 'utf-8'));
132
+ assert.strictEqual(content.telemetry.enabled, true);
133
+ });
134
+ it('overwrites telemetry.enabled without affecting other telemetry keys', () => {
135
+ const configPath = join(tmpDir, 'config.json');
136
+ writeFileSync(configPath, JSON.stringify({ telemetry: { enabled: true, projectId: 'xyz' } }));
137
+ writeConfigTelemetry(configPath, false);
138
+ const content = JSON.parse(readFileSync(configPath, 'utf-8'));
139
+ assert.strictEqual(content.telemetry.enabled, false);
140
+ assert.strictEqual(content.telemetry.projectId, 'xyz');
141
+ });
142
+ });
143
+ describe('getProjectConfigPath', () => {
144
+ it('uses cwd by default', () => {
145
+ const result = getProjectConfigPath();
146
+ assert.ok(result.endsWith('.blocks/config.json'));
147
+ assert.ok(result.startsWith(process.cwd()));
148
+ });
149
+ it('accepts a custom project root', () => {
150
+ const custom = '/some/custom/path';
151
+ const result = getProjectConfigPath(custom);
152
+ assert.ok(result.startsWith(custom));
153
+ assert.ok(result.endsWith('.blocks/config.json'));
154
+ });
155
+ });
156
+ describe('getGlobalConfigPath', () => {
157
+ it('uses homedir', () => {
158
+ const result = getGlobalConfigPath();
159
+ assert.ok(result.endsWith('.blocks/config.json'));
160
+ });
161
+ });
@@ -0,0 +1,60 @@
1
+ interface BlocksConfig {
2
+ telemetry?: {
3
+ enabled?: boolean;
4
+ };
5
+ [key: string]: unknown;
6
+ }
7
+ /**
8
+ * Read and parse a Blocks config file, returning null if it doesn't exist or is invalid.
9
+ */
10
+ export declare function readConfigFile(configPath: string): BlocksConfig | null;
11
+ /**
12
+ * Get the path to the global Blocks config file (~/.blocks/config.json).
13
+ */
14
+ export declare function getGlobalConfigPath(): string;
15
+ /**
16
+ * Get the path to the project-level Blocks config file (.blocks/config.json).
17
+ *
18
+ * @param projectRoot - Optional project root directory (defaults to process.cwd())
19
+ */
20
+ export declare function getProjectConfigPath(projectRoot?: string): string;
21
+ /**
22
+ * Result of a detailed telemetry status check.
23
+ */
24
+ export interface TelemetryStatus {
25
+ /** Whether telemetry is currently enabled (final resolved value). */
26
+ enabled: boolean;
27
+ /** Value of AWS_BLOCKS_DISABLE_TELEMETRY env var if set. */
28
+ envVar?: string;
29
+ /** Value from global config if present. */
30
+ globalConfig?: boolean;
31
+ /** Value from project config if present. */
32
+ projectConfig?: boolean;
33
+ }
34
+ /**
35
+ * Get detailed telemetry status showing all mechanism values and the final result.
36
+ *
37
+ * Telemetry is enabled by default. If any mechanism disables it, telemetry is off:
38
+ * - `AWS_BLOCKS_DISABLE_TELEMETRY=1` env var
39
+ * - `.blocks/config.json` → `telemetry.enabled: false` (per-project)
40
+ * - `~/.blocks/config.json` → `telemetry.enabled: false` (global)
41
+ *
42
+ * @param projectRoot - Optional project root directory (defaults to process.cwd())
43
+ */
44
+ export declare function getTelemetryStatus(projectRoot?: string): TelemetryStatus;
45
+ /**
46
+ * Determine whether telemetry collection is enabled.
47
+ *
48
+ * Disable mechanisms (any one disables telemetry):
49
+ * - `AWS_BLOCKS_DISABLE_TELEMETRY=1` env var
50
+ * - `.blocks/config.json` → `telemetry.enabled: false` (per-project)
51
+ * - `~/.blocks/config.json` → `telemetry.enabled: false` (global)
52
+ *
53
+ * Default: enabled (if no disable mechanism is active)
54
+ *
55
+ * Note: CI environments do NOT suppress telemetry. CI detection is used
56
+ * only as metadata in the telemetry payload (environment.ci field).
57
+ */
58
+ export declare function isTelemetryEnabled(): boolean;
59
+ export {};
60
+ //# sourceMappingURL=consent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../src/telemetry/consent.ts"],"names":[],"mappings":"AAMA,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAOtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,CAsCxE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAqC5C"}
@@ -0,0 +1,122 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ const ENV_VAR = 'AWS_BLOCKS_DISABLE_TELEMETRY';
5
+ /**
6
+ * Read and parse a Blocks config file, returning null if it doesn't exist or is invalid.
7
+ */
8
+ export function readConfigFile(configPath) {
9
+ try {
10
+ const content = readFileSync(configPath, 'utf-8');
11
+ return JSON.parse(content);
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ /**
18
+ * Get the path to the global Blocks config file (~/.blocks/config.json).
19
+ */
20
+ export function getGlobalConfigPath() {
21
+ return join(homedir(), '.blocks', 'config.json');
22
+ }
23
+ /**
24
+ * Get the path to the project-level Blocks config file (.blocks/config.json).
25
+ *
26
+ * @param projectRoot - Optional project root directory (defaults to process.cwd())
27
+ */
28
+ export function getProjectConfigPath(projectRoot) {
29
+ return join(projectRoot ?? process.cwd(), '.blocks', 'config.json');
30
+ }
31
+ /**
32
+ * Get detailed telemetry status showing all mechanism values and the final result.
33
+ *
34
+ * Telemetry is enabled by default. If any mechanism disables it, telemetry is off:
35
+ * - `AWS_BLOCKS_DISABLE_TELEMETRY=1` env var
36
+ * - `.blocks/config.json` → `telemetry.enabled: false` (per-project)
37
+ * - `~/.blocks/config.json` → `telemetry.enabled: false` (global)
38
+ *
39
+ * @param projectRoot - Optional project root directory (defaults to process.cwd())
40
+ */
41
+ export function getTelemetryStatus(projectRoot) {
42
+ const envValue = process.env[ENV_VAR];
43
+ const globalConfig = readConfigFile(getGlobalConfigPath());
44
+ const projectConfig = readConfigFile(getProjectConfigPath(projectRoot));
45
+ const globalEnabled = globalConfig?.telemetry?.enabled;
46
+ const projectEnabled = projectConfig?.telemetry?.enabled;
47
+ const status = {
48
+ enabled: true,
49
+ };
50
+ if (envValue !== undefined && envValue !== '') {
51
+ status.envVar = envValue;
52
+ }
53
+ if (typeof globalEnabled === 'boolean') {
54
+ status.globalConfig = globalEnabled;
55
+ }
56
+ if (typeof projectEnabled === 'boolean') {
57
+ status.projectConfig = projectEnabled;
58
+ }
59
+ if (envValue === '1') {
60
+ status.enabled = false;
61
+ return status;
62
+ }
63
+ if (status.projectConfig === false) {
64
+ status.enabled = false;
65
+ return status;
66
+ }
67
+ if (status.globalConfig === false) {
68
+ status.enabled = false;
69
+ return status;
70
+ }
71
+ return status;
72
+ }
73
+ /**
74
+ * Determine whether telemetry collection is enabled.
75
+ *
76
+ * Disable mechanisms (any one disables telemetry):
77
+ * - `AWS_BLOCKS_DISABLE_TELEMETRY=1` env var
78
+ * - `.blocks/config.json` → `telemetry.enabled: false` (per-project)
79
+ * - `~/.blocks/config.json` → `telemetry.enabled: false` (global)
80
+ *
81
+ * Default: enabled (if no disable mechanism is active)
82
+ *
83
+ * Note: CI environments do NOT suppress telemetry. CI detection is used
84
+ * only as metadata in the telemetry payload (environment.ci field).
85
+ */
86
+ export function isTelemetryEnabled() {
87
+ if (process.env[ENV_VAR] === '1') {
88
+ return false;
89
+ }
90
+ // Per-project config
91
+ try {
92
+ const projectConfigPath = join(process.cwd(), '.blocks', 'config.json');
93
+ const content = readFileSync(projectConfigPath, 'utf-8');
94
+ const config = JSON.parse(content);
95
+ if (config.telemetry?.enabled === false) {
96
+ return false;
97
+ }
98
+ if (config.telemetry?.enabled === true) {
99
+ return true;
100
+ }
101
+ }
102
+ catch {
103
+ // No project config or invalid JSON
104
+ }
105
+ // Global config
106
+ try {
107
+ const globalConfigPath = join(homedir(), '.blocks', 'config.json');
108
+ const content = readFileSync(globalConfigPath, 'utf-8');
109
+ const config = JSON.parse(content);
110
+ if (config.telemetry?.enabled === false) {
111
+ return false;
112
+ }
113
+ if (config.telemetry?.enabled === true) {
114
+ return true;
115
+ }
116
+ }
117
+ catch {
118
+ // No global config or invalid JSON
119
+ }
120
+ // Default: enabled
121
+ return true;
122
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Detect the OS platform.
3
+ */
4
+ export declare function detectOS(): 'linux' | 'darwin' | 'win32';
5
+ /**
6
+ * Detect the Node.js version string (without the leading 'v').
7
+ */
8
+ export declare function detectNodeVersion(): string;
9
+ /**
10
+ * Detect whether the current process is running inside a CI/CD environment.
11
+ */
12
+ export declare function isCI(): boolean;
13
+ /**
14
+ * Detect the package manager from npm_config_user_agent.
15
+ * Returns the raw user agent string (e.g., "npm/10.2.0 node/v22.0.0").
16
+ */
17
+ export declare function detectPackageManager(): string | undefined;
18
+ /**
19
+ * Detect if the current execution is driven by an AI agent.
20
+ * Uses the "am-i-vibing" pattern and checks known environment variables.
21
+ */
22
+ export declare function detectAgent(): string | undefined;
23
+ /**
24
+ * Collect all environment information needed for a telemetry event.
25
+ */
26
+ export declare function collectEnvironment(): {
27
+ os: 'linux' | 'darwin' | 'win32';
28
+ nodeVersion: string;
29
+ ci: boolean;
30
+ packageManager?: string;
31
+ agent?: string;
32
+ };
33
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/telemetry/environment.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,GAAG,QAAQ,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,IAAI,IAAI,OAAO,CAc9B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAEzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,CAiBhD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,EAAE,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAwBA"}