@selvajs/server 0.2.0-beta.3 → 0.2.0-beta.5

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 (188) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +40 -0
  3. package/dist/compute/client-cache.d.ts +7 -0
  4. package/dist/compute/client-cache.d.ts.map +1 -1
  5. package/dist/compute/client-cache.js +12 -1
  6. package/dist/compute/client-cache.js.map +1 -1
  7. package/dist/compute/index.d.ts +2 -2
  8. package/dist/compute/index.d.ts.map +1 -1
  9. package/dist/compute/index.js +2 -2
  10. package/dist/compute/index.js.map +1 -1
  11. package/dist/compute/limits.d.ts +26 -5
  12. package/dist/compute/limits.d.ts.map +1 -1
  13. package/dist/compute/limits.js +51 -25
  14. package/dist/compute/limits.js.map +1 -1
  15. package/dist/compute/rate-limit.d.ts +40 -0
  16. package/dist/compute/rate-limit.d.ts.map +1 -1
  17. package/dist/compute/rate-limit.js +72 -1
  18. package/dist/compute/rate-limit.js.map +1 -1
  19. package/dist/compute/remote-definition.d.ts +7 -0
  20. package/dist/compute/remote-definition.d.ts.map +1 -1
  21. package/dist/compute/remote-definition.js +3 -1
  22. package/dist/compute/remote-definition.js.map +1 -1
  23. package/dist/compute/safe-url.d.ts +2 -1
  24. package/dist/compute/safe-url.d.ts.map +1 -1
  25. package/dist/compute/safe-url.js +31 -1
  26. package/dist/compute/safe-url.js.map +1 -1
  27. package/dist/compute/solve-cache-key.d.ts +5 -6
  28. package/dist/compute/solve-cache-key.d.ts.map +1 -1
  29. package/dist/compute/solve-cache-key.js +4 -3
  30. package/dist/compute/solve-cache-key.js.map +1 -1
  31. package/dist/compute/solve-cache-single-flight.d.ts +8 -1
  32. package/dist/compute/solve-cache-single-flight.d.ts.map +1 -1
  33. package/dist/compute/solve-cache-single-flight.js +4 -2
  34. package/dist/compute/solve-cache-single-flight.js.map +1 -1
  35. package/dist/compute/solve-pipeline.d.ts +31 -0
  36. package/dist/compute/solve-pipeline.d.ts.map +1 -1
  37. package/dist/compute/solve-pipeline.js +42 -1
  38. package/dist/compute/solve-pipeline.js.map +1 -1
  39. package/dist/definitions/load-for-render.d.ts +10 -1
  40. package/dist/definitions/load-for-render.d.ts.map +1 -1
  41. package/dist/definitions/load-for-render.js +33 -6
  42. package/dist/definitions/load-for-render.js.map +1 -1
  43. package/dist/logging/PinoLogger.d.ts +39 -0
  44. package/dist/logging/PinoLogger.d.ts.map +1 -0
  45. package/dist/logging/PinoLogger.js +189 -0
  46. package/dist/logging/PinoLogger.js.map +1 -0
  47. package/dist/logging/index.d.ts +3 -0
  48. package/dist/logging/index.d.ts.map +1 -0
  49. package/dist/logging/index.js +5 -0
  50. package/dist/logging/index.js.map +1 -0
  51. package/dist/logging/requestId.d.ts +45 -0
  52. package/dist/logging/requestId.d.ts.map +1 -0
  53. package/dist/logging/requestId.js +82 -0
  54. package/dist/logging/requestId.js.map +1 -0
  55. package/dist/providers/create-selva-providers.d.ts +11 -1
  56. package/dist/providers/create-selva-providers.d.ts.map +1 -1
  57. package/dist/providers/create-selva-providers.js +21 -8
  58. package/dist/providers/create-selva-providers.js.map +1 -1
  59. package/package.json +23 -19
  60. package/dist/access/__tests__/project-access-input.test.d.ts +0 -2
  61. package/dist/access/__tests__/project-access-input.test.d.ts.map +0 -1
  62. package/dist/access/__tests__/project-access-input.test.js +0 -146
  63. package/dist/access/__tests__/project-access-input.test.js.map +0 -1
  64. package/dist/compute/__tests__/client-cache.test.d.ts +0 -11
  65. package/dist/compute/__tests__/client-cache.test.d.ts.map +0 -1
  66. package/dist/compute/__tests__/client-cache.test.js +0 -218
  67. package/dist/compute/__tests__/client-cache.test.js.map +0 -1
  68. package/dist/compute/__tests__/definition-byte-cache.test.d.ts +0 -2
  69. package/dist/compute/__tests__/definition-byte-cache.test.d.ts.map +0 -1
  70. package/dist/compute/__tests__/definition-byte-cache.test.js +0 -107
  71. package/dist/compute/__tests__/definition-byte-cache.test.js.map +0 -1
  72. package/dist/compute/__tests__/rate-limit.test.d.ts +0 -2
  73. package/dist/compute/__tests__/rate-limit.test.d.ts.map +0 -1
  74. package/dist/compute/__tests__/rate-limit.test.js +0 -98
  75. package/dist/compute/__tests__/rate-limit.test.js.map +0 -1
  76. package/dist/compute/__tests__/remote-definition.test.d.ts +0 -11
  77. package/dist/compute/__tests__/remote-definition.test.d.ts.map +0 -1
  78. package/dist/compute/__tests__/remote-definition.test.js +0 -114
  79. package/dist/compute/__tests__/remote-definition.test.js.map +0 -1
  80. package/dist/compute/__tests__/safe-url.test.d.ts +0 -2
  81. package/dist/compute/__tests__/safe-url.test.d.ts.map +0 -1
  82. package/dist/compute/__tests__/safe-url.test.js +0 -71
  83. package/dist/compute/__tests__/safe-url.test.js.map +0 -1
  84. package/dist/compute/__tests__/solve-cache.test.d.ts +0 -13
  85. package/dist/compute/__tests__/solve-cache.test.d.ts.map +0 -1
  86. package/dist/compute/__tests__/solve-cache.test.js +0 -234
  87. package/dist/compute/__tests__/solve-cache.test.js.map +0 -1
  88. package/dist/compute/__tests__/solve-pipeline.test.d.ts +0 -11
  89. package/dist/compute/__tests__/solve-pipeline.test.d.ts.map +0 -1
  90. package/dist/compute/__tests__/solve-pipeline.test.js +0 -557
  91. package/dist/compute/__tests__/solve-pipeline.test.js.map +0 -1
  92. package/dist/compute/__tests__/transform-input.test.d.ts +0 -14
  93. package/dist/compute/__tests__/transform-input.test.d.ts.map +0 -1
  94. package/dist/compute/__tests__/transform-input.test.js +0 -120
  95. package/dist/compute/__tests__/transform-input.test.js.map +0 -1
  96. package/dist/definitions/__tests__/definition-service.test.d.ts +0 -14
  97. package/dist/definitions/__tests__/definition-service.test.d.ts.map +0 -1
  98. package/dist/definitions/__tests__/definition-service.test.js +0 -95
  99. package/dist/definitions/__tests__/definition-service.test.js.map +0 -1
  100. package/dist/definitions/__tests__/load-for-render.test.d.ts +0 -8
  101. package/dist/definitions/__tests__/load-for-render.test.d.ts.map +0 -1
  102. package/dist/definitions/__tests__/load-for-render.test.js +0 -196
  103. package/dist/definitions/__tests__/load-for-render.test.js.map +0 -1
  104. package/dist/definitions/__tests__/schema-extraction.test.d.ts +0 -11
  105. package/dist/definitions/__tests__/schema-extraction.test.d.ts.map +0 -1
  106. package/dist/definitions/__tests__/schema-extraction.test.js +0 -115
  107. package/dist/definitions/__tests__/schema-extraction.test.js.map +0 -1
  108. package/dist/http/__tests__/body-size.test.d.ts +0 -2
  109. package/dist/http/__tests__/body-size.test.d.ts.map +0 -1
  110. package/dist/http/__tests__/body-size.test.js +0 -24
  111. package/dist/http/__tests__/body-size.test.js.map +0 -1
  112. package/dist/http/__tests__/route-classifier.test.d.ts +0 -2
  113. package/dist/http/__tests__/route-classifier.test.d.ts.map +0 -1
  114. package/dist/http/__tests__/route-classifier.test.js +0 -54
  115. package/dist/http/__tests__/route-classifier.test.js.map +0 -1
  116. package/dist/http/__tests__/safe-redirect.test.d.ts +0 -2
  117. package/dist/http/__tests__/safe-redirect.test.d.ts.map +0 -1
  118. package/dist/http/__tests__/safe-redirect.test.js +0 -44
  119. package/dist/http/__tests__/safe-redirect.test.js.map +0 -1
  120. package/dist/http/__tests__/security-headers.test.d.ts +0 -2
  121. package/dist/http/__tests__/security-headers.test.d.ts.map +0 -1
  122. package/dist/http/__tests__/security-headers.test.js +0 -24
  123. package/dist/http/__tests__/security-headers.test.js.map +0 -1
  124. package/dist/ops/__tests__/semver.test.d.ts +0 -2
  125. package/dist/ops/__tests__/semver.test.d.ts.map +0 -1
  126. package/dist/ops/__tests__/semver.test.js +0 -38
  127. package/dist/ops/__tests__/semver.test.js.map +0 -1
  128. package/dist/providers/__tests__/create-selva-providers.test.d.ts +0 -7
  129. package/dist/providers/__tests__/create-selva-providers.test.d.ts.map +0 -1
  130. package/dist/providers/__tests__/create-selva-providers.test.js +0 -135
  131. package/dist/providers/__tests__/create-selva-providers.test.js.map +0 -1
  132. package/dist/tokens/__tests__/token-codec.test.d.ts +0 -2
  133. package/dist/tokens/__tests__/token-codec.test.d.ts.map +0 -1
  134. package/dist/tokens/__tests__/token-codec.test.js +0 -50
  135. package/dist/tokens/__tests__/token-codec.test.js.map +0 -1
  136. package/src/access/__tests__/project-access-input.test.ts +0 -175
  137. package/src/access/index.ts +0 -9
  138. package/src/access/project-access-input.ts +0 -145
  139. package/src/compute/__tests__/client-cache.test.ts +0 -244
  140. package/src/compute/__tests__/definition-byte-cache.test.ts +0 -129
  141. package/src/compute/__tests__/rate-limit.test.ts +0 -106
  142. package/src/compute/__tests__/remote-definition.test.ts +0 -140
  143. package/src/compute/__tests__/safe-url.test.ts +0 -72
  144. package/src/compute/__tests__/solve-cache.test.ts +0 -268
  145. package/src/compute/__tests__/solve-pipeline.test.ts +0 -660
  146. package/src/compute/__tests__/transform-input.test.ts +0 -162
  147. package/src/compute/client-cache.ts +0 -321
  148. package/src/compute/definition-byte-cache.ts +0 -168
  149. package/src/compute/index.ts +0 -82
  150. package/src/compute/limits.ts +0 -237
  151. package/src/compute/memory-solve-cache.ts +0 -0
  152. package/src/compute/rate-limit.ts +0 -110
  153. package/src/compute/remote-definition.ts +0 -149
  154. package/src/compute/safe-url.ts +0 -186
  155. package/src/compute/solve-cache-envelope.ts +0 -98
  156. package/src/compute/solve-cache-key.ts +0 -85
  157. package/src/compute/solve-cache-single-flight.ts +0 -59
  158. package/src/compute/solve-pipeline.ts +0 -603
  159. package/src/compute/transform-input.ts +0 -66
  160. package/src/definitions/__tests__/definition-service.test.ts +0 -131
  161. package/src/definitions/__tests__/load-for-render.test.ts +0 -244
  162. package/src/definitions/__tests__/schema-extraction.test.ts +0 -137
  163. package/src/definitions/definition-service.ts +0 -247
  164. package/src/definitions/index.ts +0 -22
  165. package/src/definitions/load-for-render.ts +0 -272
  166. package/src/definitions/schema-extraction.ts +0 -117
  167. package/src/errors/SentryErrorReporter.ts +0 -88
  168. package/src/errors/index.ts +0 -3
  169. package/src/http/__tests__/body-size.test.ts +0 -27
  170. package/src/http/__tests__/route-classifier.test.ts +0 -60
  171. package/src/http/__tests__/safe-redirect.test.ts +0 -47
  172. package/src/http/__tests__/security-headers.test.ts +0 -29
  173. package/src/http/body-size.ts +0 -24
  174. package/src/http/index.ts +0 -10
  175. package/src/http/redirect.ts +0 -16
  176. package/src/http/route-classifier.ts +0 -74
  177. package/src/http/security-headers.ts +0 -42
  178. package/src/index.ts +0 -27
  179. package/src/ops/__tests__/semver.test.ts +0 -42
  180. package/src/ops/index.ts +0 -3
  181. package/src/ops/semver.ts +0 -60
  182. package/src/providers/__tests__/create-selva-providers.test.ts +0 -172
  183. package/src/providers/__tests__/fixtures/override-config.mjs +0 -8
  184. package/src/providers/create-selva-providers.ts +0 -241
  185. package/src/providers/index.ts +0 -12
  186. package/src/tokens/__tests__/token-codec.test.ts +0 -63
  187. package/src/tokens/index.ts +0 -8
  188. package/src/tokens/token-codec.ts +0 -86
@@ -1,6 +1,7 @@
1
1
  import type { GrasshopperClient } from '@selvajs/compute/grasshopper';
2
2
  import { type UISchema } from '@selvajs/schemas';
3
3
  import type { ComputeServerConfig, DefinitionRecord, DefinitionVersion, IDefinitionStore, IProjectStore, IStorageProvider, RequestContext } from '@selvajs/platform';
4
+ import { type ILogger } from '@selvajs/platform';
4
5
  export type DefinitionChannel = 'live' | 'draft';
5
6
  export interface LoadedDefinition {
6
7
  version: DefinitionVersion;
@@ -43,8 +44,16 @@ export interface DefinitionLoaderDeps {
43
44
  * casing/serialization mismatches are visible.
44
45
  */
45
46
  computeDebug?: boolean;
46
- /** Diagnostic sink; defaults to `console.warn`. */
47
+ /**
48
+ * Legacy diagnostic sink, kept for callers that already pass one. When set it
49
+ * receives the rendered strings and `logger` is not used for these warnings.
50
+ */
47
51
  onWarn?: (message: string, detail?: string) => void;
52
+ /**
53
+ * Structured logger for the diagnostics below. Defaults to `NoopLogger`, so a
54
+ * consumer that wires nothing gets silence rather than unsolicited stdout.
55
+ */
56
+ logger?: ILogger;
48
57
  }
49
58
  export type DefinitionLoader = (ctx: RequestContext, record: DefinitionRecord, channel: DefinitionChannel, explicitVersionId?: string | null) => Promise<LoadedDefinition>;
50
59
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"load-for-render.d.ts","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EACX,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,MAAM,mBAAmB,CAAC;AAG3B,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,gBAAgB,EAAE,UAAU,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,QAAQ,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,gBAAgB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvF,qBAAa,mBAAoB,SAAQ,KAAK;aAE5B,IAAI,EAAE,uBAAuB;aAE7B,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,uBAAuB,EAC7C,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKhC;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvC,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,kBAAkB,CAAC,CAAC;IACvE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5C,mFAAmF;IACnF,aAAa,EAAE,CACd,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAClC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,gGAAgG;IAChG,SAAS,EAAE,CACV,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,KAC5B,OAAO,CAAC;QAAE,MAAM,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAC5C,qFAAqF;IACrF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpF;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mDAAmD;IACnD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC9B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,KAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CA0InF"}
1
+ {"version":3,"file":"load-for-render.d.ts","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EACX,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG7D,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,gBAAgB,EAAE,UAAU,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,QAAQ,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,gBAAgB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvF,qBAAa,mBAAoB,SAAQ,KAAK;aAE5B,IAAI,EAAE,uBAAuB;aAE7B,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,uBAAuB,EAC7C,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKhC;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvC,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,kBAAkB,CAAC,CAAC;IACvE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5C,mFAAmF;IACnF,aAAa,EAAE,CACd,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAClC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,gGAAgG;IAChG,SAAS,EAAE,CACV,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,KAC5B,OAAO,CAAC;QAAE,MAAM,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAC5C,qFAAqF;IACrF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpF;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC9B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,KAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CAgKnF"}
@@ -10,6 +10,7 @@
10
10
  // resolution, the warm-client cache, and the schema fetcher — so any app built
11
11
  // on the engine can wire its own composition root.
12
12
  import { UI_SCHEMA_VERSION } from '@selvajs/schemas';
13
+ import { NoopLogger } from '@selvajs/platform';
13
14
  import { fetchSchemaFromCompute } from './schema-extraction.js';
14
15
  export class DefinitionLoadError extends Error {
15
16
  kind;
@@ -32,7 +33,7 @@ export class DefinitionLoadError extends Error {
32
33
  * classified failures so the caller can translate to HTTP status codes.
33
34
  */
34
35
  export function createDefinitionLoader(deps) {
35
- const { storage, definitions, projects, resolveServer, getClient, fetchSchema = fetchSchemaFromCompute, computeDebug = false, onWarn = (message, detail) => (detail ? console.warn(message, detail) : console.warn(message)) } = deps;
36
+ const { storage, definitions, projects, resolveServer, getClient, fetchSchema = fetchSchemaFromCompute, computeDebug = false, onWarn, logger = new NoopLogger() } = deps;
36
37
  return async function loadDefinitionForRender(ctx, record, channel, explicitVersionId) {
37
38
  const versionId = explicitVersionId ?? (channel === 'draft' ? record.draftVersionId : record.liveVersionId);
38
39
  if (!versionId)
@@ -87,8 +88,16 @@ export function createDefinitionLoader(deps) {
87
88
  // plugin behind the app) would just go stale again next render.
88
89
  if (!freshCache && fetchedSchema.schemaVersion === UI_SCHEMA_VERSION) {
89
90
  definitions.setVersionSchema(ctx, version.id, fetchedSchema).catch((err) => {
90
- onWarn(`[loadForRender] schema cache refresh failed for version ${version.id}: ` +
91
- `${err instanceof Error ? err.message : String(err)}`);
91
+ if (onWarn) {
92
+ onWarn(`[loadForRender] schema cache refresh failed for version ${version.id}: ` +
93
+ `${err instanceof Error ? err.message : String(err)}`);
94
+ return;
95
+ }
96
+ logger.warn('Schema cache refresh failed', {
97
+ component: 'loadForRender',
98
+ versionId: version.id,
99
+ err: err instanceof Error ? (err.stack ?? err.message) : String(err)
100
+ });
92
101
  });
93
102
  }
94
103
  if (!definition) {
@@ -105,18 +114,36 @@ export function createDefinitionLoader(deps) {
105
114
  const ioLoadErrors = definition.loadErrors ?? [];
106
115
  const ioLooksBroken = definition.inputs.length === 0 || ioParseErrors.length > 0 || ioLoadErrors.length > 0;
107
116
  if (ioLooksBroken) {
108
- onWarn(`[loadForRender] IO health for '${record.guid}':`, JSON.stringify({
117
+ const health = {
109
118
  inputCount: definition.inputs.length,
110
119
  outputCount: definition.outputs?.length,
111
120
  parseErrors: ioParseErrors,
112
121
  loadErrors: ioLoadErrors,
113
122
  loadWarnings: definition.loadWarnings
114
- }));
123
+ };
124
+ if (onWarn) {
125
+ onWarn(`[loadForRender] IO health for '${record.guid}':`, JSON.stringify(health));
126
+ }
127
+ else {
128
+ logger.warn('Definition IO looks unhealthy', {
129
+ component: 'loadForRender',
130
+ definitionGuid: record.guid,
131
+ ...health
132
+ });
133
+ }
115
134
  if (computeDebug) {
116
135
  const rawIO = await client
117
136
  .getRawIO(definitionSource)
118
137
  .catch((e) => ({ error: String(e) }));
119
- onWarn('[loadForRender] raw /io:', JSON.stringify(rawIO).slice(0, 3000));
138
+ const rendered = JSON.stringify(rawIO).slice(0, 3000);
139
+ if (onWarn)
140
+ onWarn('[loadForRender] raw /io:', rendered);
141
+ else
142
+ logger.debug('Raw /io wire shape', {
143
+ component: 'loadForRender',
144
+ definitionGuid: record.guid,
145
+ rawIO: rendered
146
+ });
120
147
  }
121
148
  }
122
149
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"load-for-render.js","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"load-for-render.js","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { ILogger, LogFields, LogLevel } from '@selvajs/platform';
2
+ /**
3
+ * Minimal `ILogger` over `console.*`, used when pino isn't installed.
4
+ *
5
+ * Renders as `LEVEL message {fields}` — readable in a terminal, greppable, and
6
+ * honest about not being machine-parseable. `child` fields are merged eagerly
7
+ * so correlation still works without pino.
8
+ */
9
+ export declare class ConsoleLogger implements ILogger {
10
+ private readonly bound;
11
+ private readonly minLevel;
12
+ constructor(bound?: LogFields, minLevel?: LogLevel);
13
+ private static readonly ORDER;
14
+ private write;
15
+ debug(message: string, fields?: LogFields): void;
16
+ info(message: string, fields?: LogFields): void;
17
+ warn(message: string, fields?: LogFields): void;
18
+ error(message: string, fields?: LogFields): void;
19
+ child(fields: LogFields): ILogger;
20
+ }
21
+ export interface CreateLoggerOptions {
22
+ /** Minimum level written. Below this, records are dropped. */
23
+ level?: LogLevel;
24
+ /**
25
+ * Pretty-print via `pino-pretty` (human-readable, colorized) instead of JSON.
26
+ * For local development — production wants JSON for the collector. Silently
27
+ * ignored if `pino-pretty` isn't installed.
28
+ */
29
+ pretty?: boolean;
30
+ /** Fields stamped on every record (e.g. service name, release). */
31
+ base?: LogFields;
32
+ }
33
+ /**
34
+ * Build the app's root logger. Never throws and never returns `null`: a
35
+ * deployment with no pino installed gets {@link ConsoleLogger}, because losing
36
+ * warnings and errors is a worse outcome than losing JSON formatting.
37
+ */
38
+ export declare function createLogger(opts?: CreateLoggerOptions): Promise<ILogger>;
39
+ //# sourceMappingURL=PinoLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PinoLogger.d.ts","sourceRoot":"","sources":["../../src/logging/PinoLogger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAwDtE;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,OAAO;IAE3C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,KAAK,GAAE,SAAc,EACrB,QAAQ,GAAE,QAAiB;IAG7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAK3B;IAEF,OAAO,CAAC,KAAK;IAab,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI;IAGhD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI;IAG/C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI;IAG/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI;IAGhD,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO;CAGjC;AAqDD,MAAM,WAAW,mBAAmB;IACnC,8DAA8D;IAC9D,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,IAAI,CAAC,EAAE,SAAS,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBnF"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Field paths scrubbed before a record is written. Defense-in-depth only — call
3
+ * sites are required not to log secrets in the first place (see `LogFields`).
4
+ * This catches the accident where a whole object is spread into fields and
5
+ * happens to carry a token, which is exactly how credentials reach log indexes.
6
+ */
7
+ const REDACTED_PATHS = [
8
+ 'token',
9
+ 'sessionToken',
10
+ 'refreshToken',
11
+ 'apiKey',
12
+ 'api_key',
13
+ 'password',
14
+ 'authorization',
15
+ 'cookie',
16
+ '*.token',
17
+ '*.sessionToken',
18
+ '*.refreshToken',
19
+ '*.apiKey',
20
+ '*.password'
21
+ ];
22
+ /**
23
+ * Minimal `ILogger` over `console.*`, used when pino isn't installed.
24
+ *
25
+ * Renders as `LEVEL message {fields}` — readable in a terminal, greppable, and
26
+ * honest about not being machine-parseable. `child` fields are merged eagerly
27
+ * so correlation still works without pino.
28
+ */
29
+ export class ConsoleLogger {
30
+ bound;
31
+ minLevel;
32
+ constructor(bound = {}, minLevel = 'info') {
33
+ this.bound = bound;
34
+ this.minLevel = minLevel;
35
+ }
36
+ static ORDER = {
37
+ debug: 10,
38
+ info: 20,
39
+ warn: 30,
40
+ error: 40
41
+ };
42
+ write(level, message, fields) {
43
+ if (ConsoleLogger.ORDER[level] < ConsoleLogger.ORDER[this.minLevel])
44
+ return;
45
+ const merged = { ...this.bound, ...fields };
46
+ const suffix = Object.keys(merged).length > 0 ? ` ${safeStringify(merged)}` : '';
47
+ const line = `${level.toUpperCase()} ${message}${suffix}`;
48
+ // Route to the matching console method so stderr/stdout split as expected.
49
+ // `info` (not `log`) carries debug too — both go to stdout, and the level
50
+ // is already spelled out in the line's own prefix.
51
+ if (level === 'error')
52
+ console.error(line);
53
+ else if (level === 'warn')
54
+ console.warn(line);
55
+ else
56
+ console.info(line);
57
+ }
58
+ debug(message, fields) {
59
+ this.write('debug', message, fields);
60
+ }
61
+ info(message, fields) {
62
+ this.write('info', message, fields);
63
+ }
64
+ warn(message, fields) {
65
+ this.write('warn', message, fields);
66
+ }
67
+ error(message, fields) {
68
+ this.write('error', message, fields);
69
+ }
70
+ child(fields) {
71
+ return new ConsoleLogger({ ...this.bound, ...fields }, this.minLevel);
72
+ }
73
+ }
74
+ /** Fields can hold anything, including cycles. Never let rendering throw. */
75
+ function safeStringify(value) {
76
+ try {
77
+ return JSON.stringify(value) ?? String(value);
78
+ }
79
+ catch {
80
+ return '[unserializable]';
81
+ }
82
+ }
83
+ class PinoLogger {
84
+ pino;
85
+ constructor(pino) {
86
+ this.pino = pino;
87
+ }
88
+ // pino takes (fields, message); ILogger takes (message, fields) — the flip is
89
+ // deliberate, since the message is what a human scans for first.
90
+ debug(message, fields) {
91
+ try {
92
+ this.pino.debug(fields ?? {}, message);
93
+ }
94
+ catch {
95
+ /* logging must never throw */
96
+ }
97
+ }
98
+ info(message, fields) {
99
+ try {
100
+ this.pino.info(fields ?? {}, message);
101
+ }
102
+ catch {
103
+ /* logging must never throw */
104
+ }
105
+ }
106
+ warn(message, fields) {
107
+ try {
108
+ this.pino.warn(fields ?? {}, message);
109
+ }
110
+ catch {
111
+ /* logging must never throw */
112
+ }
113
+ }
114
+ error(message, fields) {
115
+ try {
116
+ this.pino.error(fields ?? {}, message);
117
+ }
118
+ catch {
119
+ /* logging must never throw */
120
+ }
121
+ }
122
+ child(fields) {
123
+ try {
124
+ return new PinoLogger(this.pino.child(fields));
125
+ }
126
+ catch {
127
+ return this;
128
+ }
129
+ }
130
+ }
131
+ /**
132
+ * Build the app's root logger. Never throws and never returns `null`: a
133
+ * deployment with no pino installed gets {@link ConsoleLogger}, because losing
134
+ * warnings and errors is a worse outcome than losing JSON formatting.
135
+ */
136
+ export async function createLogger(opts = {}) {
137
+ const level = opts.level ?? 'info';
138
+ try {
139
+ const factory = await loadPinoFactory();
140
+ if (!factory)
141
+ return new ConsoleLogger(opts.base ?? {}, level);
142
+ const pino = factory({
143
+ level,
144
+ base: opts.base,
145
+ redact: { paths: REDACTED_PATHS, censor: '[redacted]' },
146
+ transport: opts.pretty
147
+ ? { target: 'pino-pretty', options: { colorize: true, ignore: 'pid,hostname' } }
148
+ : undefined
149
+ });
150
+ return new PinoLogger(pino);
151
+ }
152
+ catch (err) {
153
+ // pino resolved but could not be constructed — a real misconfiguration
154
+ // (e.g. `pretty: true` with pino-pretty absent). Unlike a plain absent
155
+ // package, this one is worth complaining about: the operator asked for
156
+ // something they didn't get. Fall back rather than go quiet.
157
+ console.warn(`[Logger] pino was found but could not be initialized; falling back to console logging. ${String(err)}`);
158
+ return new ConsoleLogger(opts.base ?? {}, level);
159
+ }
160
+ }
161
+ /**
162
+ * Load pino's factory, or `null` when it isn't installed.
163
+ *
164
+ * The indirection through a variable specifier is load-bearing, not stylistic.
165
+ * A literal `import('pino')` is statically analyzable, so bundlers rewrite it —
166
+ * and Vite, applying browser-field mapping to this server build, resolved it to
167
+ * pino's `server_false` browser shim: a stub whose factory throws. That turned
168
+ * "use pino" into a silent fall back to the console. Computing the specifier
169
+ * defeats that resolution and leaves the import to Node at runtime, which is
170
+ * exactly what an optional peer dependency needs.
171
+ *
172
+ * `@vite-ignore` alone was NOT sufficient — it suppressed the warning while the
173
+ * rewrite happened anyway.
174
+ */
175
+ async function loadPinoFactory() {
176
+ const specifier = 'pino';
177
+ try {
178
+ const mod = await import(/* @vite-ignore */ specifier);
179
+ const factory = (mod.default ?? mod);
180
+ return typeof factory === 'function' ? factory : null;
181
+ }
182
+ catch {
183
+ // Not installed — the expected path on a base install, where the console
184
+ // fallback is the intended behavior. Staying quiet here on purpose: a
185
+ // boot-time complaint about an optional package nobody asked for is noise.
186
+ return null;
187
+ }
188
+ }
189
+ //# sourceMappingURL=PinoLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PinoLogger.js","sourceRoot":"","sources":["../../src/logging/PinoLogger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createLogger, ConsoleLogger, type CreateLoggerOptions } from './PinoLogger.js';
2
+ export { resolveRequestId, sanitizeRequestId, renderThrown, REQUEST_ID_HEADER } from './requestId.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logging/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EACN,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // Structured logging — pino-backed ILogger (optional `pino` peer, console
2
+ // fallback) plus request-id resolution for correlation.
3
+ export { createLogger, ConsoleLogger } from './PinoLogger.js';
4
+ export { resolveRequestId, sanitizeRequestId, renderThrown, REQUEST_ID_HEADER } from './requestId.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logging/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wDAAwD;AAExD,OAAO,EAAE,YAAY,EAAE,aAAa,EAA4B,MAAM,iBAAiB,CAAC;AACxF,OAAO,EACN,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Request-id resolution for log correlation.
3
+ *
4
+ * Every log record on a request path carries the same `requestId`, so an
5
+ * operator handed one id can reconstruct that request's whole story — which is
6
+ * the thing 199 uncorrelated `console.*` calls could never offer.
7
+ *
8
+ * Inbound ids are TRUSTED when present. Selva is documented as running behind a
9
+ * reverse proxy (Caddy/nginx), and those proxies mint a request id for their own
10
+ * access logs; generating a second one here would split a single request across
11
+ * two ids and make cross-tier correlation impossible. The trade is that a direct
12
+ * caller can choose their own id — acceptable, because a request id is a
13
+ * correlation hint, never an authorization or uniqueness input. It is used only
14
+ * as a log field and an echoed response header.
15
+ *
16
+ * That trust is exactly why {@link sanitizeRequestId} exists: an attacker-chosen
17
+ * id is untrusted *content*. Unbounded or newline-carrying values would let a
18
+ * caller forge log lines (log injection) or bloat every record on the request.
19
+ */
20
+ /** Header carrying a caller/proxy-supplied id. The de-facto standard spelling. */
21
+ export declare const REQUEST_ID_HEADER = "x-request-id";
22
+ /**
23
+ * Reduce an untrusted inbound id to something safe to stamp on every record.
24
+ * Returns `null` when nothing usable survives, so the caller generates instead.
25
+ */
26
+ export declare function sanitizeRequestId(raw: string | null | undefined): string | null;
27
+ /**
28
+ * Resolve the id for a request: reuse the proxy's when it survives
29
+ * sanitization, otherwise mint a fresh UUID.
30
+ *
31
+ * @param headers the inbound request headers
32
+ * @param generate id source; injectable so tests get deterministic ids
33
+ */
34
+ export declare function resolveRequestId(headers: Headers, generate?: () => string): string;
35
+ /**
36
+ * Render a thrown value into a log field.
37
+ *
38
+ * Not every rejection is an `Error` — provider adapters occasionally reject with
39
+ * a plain `{ message, status }` object, which would otherwise stringify to a
40
+ * useless `[object Object]` and destroy the only record of the failure. Errors
41
+ * keep their stack (that's the diagnostic); anything else is JSON-serialized,
42
+ * with `String()` as the last resort for cycles and exotic values.
43
+ */
44
+ export declare function renderThrown(error: unknown): string;
45
+ //# sourceMappingURL=requestId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestId.d.ts","sourceRoot":"","sources":["../../src/logging/requestId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAahD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAI/E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAE,MAAM,MAAiB,GAAG,MAAM,CAE5F;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOnD"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Request-id resolution for log correlation.
3
+ *
4
+ * Every log record on a request path carries the same `requestId`, so an
5
+ * operator handed one id can reconstruct that request's whole story — which is
6
+ * the thing 199 uncorrelated `console.*` calls could never offer.
7
+ *
8
+ * Inbound ids are TRUSTED when present. Selva is documented as running behind a
9
+ * reverse proxy (Caddy/nginx), and those proxies mint a request id for their own
10
+ * access logs; generating a second one here would split a single request across
11
+ * two ids and make cross-tier correlation impossible. The trade is that a direct
12
+ * caller can choose their own id — acceptable, because a request id is a
13
+ * correlation hint, never an authorization or uniqueness input. It is used only
14
+ * as a log field and an echoed response header.
15
+ *
16
+ * That trust is exactly why {@link sanitizeRequestId} exists: an attacker-chosen
17
+ * id is untrusted *content*. Unbounded or newline-carrying values would let a
18
+ * caller forge log lines (log injection) or bloat every record on the request.
19
+ */
20
+ /** Header carrying a caller/proxy-supplied id. The de-facto standard spelling. */
21
+ export const REQUEST_ID_HEADER = 'x-request-id';
22
+ /** Max retained length. Long enough for a UUID or a W3C trace-id, short enough to bound a record. */
23
+ const MAX_REQUEST_ID_LENGTH = 128;
24
+ /**
25
+ * Characters allowed through verbatim. Deliberately strict: UUIDs, ULIDs, hex
26
+ * trace-ids and nginx's `$request_id` all fit. Anything else (whitespace,
27
+ * control chars, quotes, CR/LF) is dropped rather than escaped — there is no
28
+ * legitimate id that needs them, and dropping can't be un-escaped downstream.
29
+ */
30
+ const UNSAFE_REQUEST_ID_CHARS = /[^A-Za-z0-9._:-]/g;
31
+ /**
32
+ * Reduce an untrusted inbound id to something safe to stamp on every record.
33
+ * Returns `null` when nothing usable survives, so the caller generates instead.
34
+ */
35
+ export function sanitizeRequestId(raw) {
36
+ if (!raw)
37
+ return null;
38
+ const cleaned = raw.replace(UNSAFE_REQUEST_ID_CHARS, '').slice(0, MAX_REQUEST_ID_LENGTH);
39
+ return cleaned.length > 0 ? cleaned : null;
40
+ }
41
+ /**
42
+ * Resolve the id for a request: reuse the proxy's when it survives
43
+ * sanitization, otherwise mint a fresh UUID.
44
+ *
45
+ * @param headers the inbound request headers
46
+ * @param generate id source; injectable so tests get deterministic ids
47
+ */
48
+ export function resolveRequestId(headers, generate = randomId) {
49
+ return sanitizeRequestId(headers.get(REQUEST_ID_HEADER)) ?? generate();
50
+ }
51
+ /**
52
+ * Render a thrown value into a log field.
53
+ *
54
+ * Not every rejection is an `Error` — provider adapters occasionally reject with
55
+ * a plain `{ message, status }` object, which would otherwise stringify to a
56
+ * useless `[object Object]` and destroy the only record of the failure. Errors
57
+ * keep their stack (that's the diagnostic); anything else is JSON-serialized,
58
+ * with `String()` as the last resort for cycles and exotic values.
59
+ */
60
+ export function renderThrown(error) {
61
+ if (error instanceof Error)
62
+ return error.stack ?? error.message;
63
+ try {
64
+ return JSON.stringify(error) ?? String(error);
65
+ }
66
+ catch {
67
+ return String(error);
68
+ }
69
+ }
70
+ /**
71
+ * `crypto.randomUUID` is available in every runtime Selva targets (Node 22+,
72
+ * workers, modern browsers). The fallback covers non-secure contexts where
73
+ * `randomUUID` is missing — ids only need to be collision-free enough to
74
+ * correlate logs, never unguessable.
75
+ */
76
+ function randomId() {
77
+ const c = globalThis.crypto;
78
+ if (c && typeof c.randomUUID === 'function')
79
+ return c.randomUUID();
80
+ return `req-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
81
+ }
82
+ //# sourceMappingURL=requestId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestId.js","sourceRoot":"","sources":["../../src/logging/requestId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,kFAAkF;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,qGAAqG;AACrG,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC;;;;;GAKG;AACH,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAA8B;IAC/D,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACzF,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,WAAyB,QAAQ;IACnF,OAAO,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;AACxE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IAC1C,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;IAChE,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ;IAChB,MAAM,CAAC,GAAuB,UAAU,CAAC,MAAM,CAAC;IAChD,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACnE,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACpF,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { IAuthProvider, IDataProvider, IStorageProvider, ISolveMetricSink, SelvaBranding, SelvaConfig, SelvaFlags, TenancyMode } from '@selvajs/platform';
2
+ import { type ILogger } from '@selvajs/platform';
2
3
  import { type EnvRecord } from '../compute/limits.js';
3
4
  export type ProviderFactory<T> = (env: EnvRecord) => T;
4
5
  /**
@@ -21,8 +22,17 @@ export interface CreateSelvaProvidersOptions {
21
22
  * export (a `SelvaConfig` or factory) replaces the env-driven wiring.
22
23
  */
23
24
  configPath?: string;
24
- /** Boot-summary sink, called once on first `resolve()`. Default: `console.info`. */
25
+ /**
26
+ * Boot-summary sink, called once on first `resolve()`. Kept for callers that
27
+ * want the rendered one-line string. Default: none — the summary goes to
28
+ * `logger` instead, so this library never writes to stdout unbidden.
29
+ */
25
30
  onBoot?: (summary: string) => void;
31
+ /**
32
+ * Structured logger. Receives the boot summary as fields on first `resolve()`
33
+ * when `onBoot` is not supplied. Defaults to `NoopLogger`.
34
+ */
35
+ logger?: ILogger;
26
36
  }
27
37
  export interface SelvaProviderRuntime {
28
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"create-selva-providers.d.ts","sourceRoot":"","sources":["../../src/providers/create-selva-providers.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,WAAW,EAEX,UAAU,EACV,WAAW,EACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,KAAK,CAAC,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACpC;;;;;OAKG;IACH,OAAO,IAAI,WAAW,CAAC;IACvB,OAAO,IAAI,WAAW,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC;IACpC,2DAA2D;IAC3D,IAAI,CAAC,IAAI,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC;IACtC,8EAA8E;IAC9E,eAAe,IAAI,gBAAgB,CAAC;CACpC;AAkGD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,2BAA2B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAkD/B"}
1
+ {"version":3,"file":"create-selva-providers.d.ts","sourceRoot":"","sources":["../../src/providers/create-selva-providers.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,WAAW,EAEX,UAAU,EACV,WAAW,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAkD,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,KAAK,CAAC,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACpC;;;;;OAKG;IACH,OAAO,IAAI,WAAW,CAAC;IACvB,OAAO,IAAI,WAAW,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC;IACpC,2DAA2D;IAC3D,IAAI,CAAC,IAAI,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC;IACtC,8EAA8E;IAC9E,eAAe,IAAI,gBAAgB,CAAC;CACpC;AAkGD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,2BAA2B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CA+D/B"}
@@ -21,7 +21,7 @@
21
21
  import { pathToFileURL } from 'node:url';
22
22
  import { resolve as resolvePath } from 'node:path';
23
23
  import { existsSync } from 'node:fs';
24
- import { isFlagEnabled, NoopSolveMetricSink } from '@selvajs/platform';
24
+ import { isFlagEnabled, NoopSolveMetricSink, NoopLogger } from '@selvajs/platform';
25
25
  import { readBool } from '../compute/limits.js';
26
26
  // Every SelvaFlags key, mapped from `SELVA_FLAG_<KEY>`. The `satisfies` +
27
27
  // exhaustiveness check below make adding a platform flag without listing it
@@ -107,7 +107,7 @@ async function loadConfigSource(options) {
107
107
  */
108
108
  export async function createSelvaProviders(env, options) {
109
109
  const raw = await loadConfigSource(options);
110
- const onBoot = options.onBoot ?? console.info;
110
+ const logger = options.logger ?? new NoopLogger();
111
111
  let config;
112
112
  let solveMetricSink;
113
113
  function resolve() {
@@ -118,12 +118,25 @@ export async function createSelvaProviders(env, options) {
118
118
  // wired without grepping env vars or reading the config file. Provider
119
119
  // names come from the IAuthProvider.name field; data/storage adapters
120
120
  // don't expose a name, so we infer from the constructor.
121
- onBoot(`[selva] providers wired: ` +
122
- `auth=${config.auth.name} ` +
123
- `data=${config.data.constructor.name} ` +
124
- `storage=${config.storage.constructor.name} ` +
125
- `tenancy=${config.tenancy ?? 'single'}` +
126
- (options.configPath ? ` config=${options.configPath}` : ''));
121
+ const wiring = {
122
+ component: 'selva',
123
+ auth: config.auth.name,
124
+ data: config.data.constructor.name,
125
+ storage: config.storage.constructor.name,
126
+ tenancy: config.tenancy ?? 'single',
127
+ ...(options.configPath ? { configPath: options.configPath } : {})
128
+ };
129
+ if (options.onBoot) {
130
+ options.onBoot(`[selva] providers wired: ` +
131
+ `auth=${wiring.auth} ` +
132
+ `data=${wiring.data} ` +
133
+ `storage=${wiring.storage} ` +
134
+ `tenancy=${wiring.tenancy}` +
135
+ (options.configPath ? ` config=${options.configPath}` : ''));
136
+ }
137
+ else {
138
+ logger.info('Providers wired', wiring);
139
+ }
127
140
  return config;
128
141
  }
129
142
  return {