@selvajs/server 1.0.0-beta.9 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -20
- package/dist/access/project-access-input.d.ts +13 -16
- package/dist/access/project-access-input.d.ts.map +1 -1
- package/dist/access/project-access-input.js +2 -2
- package/dist/access/project-access-input.js.map +1 -1
- package/dist/compute/idempotency.d.ts +18 -22
- package/dist/compute/idempotency.d.ts.map +1 -1
- package/dist/compute/idempotency.js +10 -14
- package/dist/compute/idempotency.js.map +1 -1
- package/dist/compute/index.d.ts.map +1 -1
- package/dist/compute/index.js +3 -5
- package/dist/compute/index.js.map +1 -1
- package/dist/compute/limits.d.ts +70 -86
- package/dist/compute/limits.d.ts.map +1 -1
- package/dist/compute/limits.js +27 -56
- package/dist/compute/limits.js.map +1 -1
- package/dist/compute/rate-limit.d.ts +41 -53
- package/dist/compute/rate-limit.d.ts.map +1 -1
- package/dist/compute/rate-limit.js +27 -35
- package/dist/compute/rate-limit.js.map +1 -1
- package/dist/compute/remote-definition.d.ts +8 -22
- package/dist/compute/remote-definition.d.ts.map +1 -1
- package/dist/compute/remote-definition.js +9 -19
- package/dist/compute/remote-definition.js.map +1 -1
- package/dist/compute/safe-url.d.ts +7 -5
- package/dist/compute/safe-url.d.ts.map +1 -1
- package/dist/compute/safe-url.js +26 -28
- package/dist/compute/safe-url.js.map +1 -1
- package/dist/definitions/definition-service.d.ts +13 -38
- package/dist/definitions/definition-service.d.ts.map +1 -1
- package/dist/definitions/definition-service.js +25 -53
- package/dist/definitions/definition-service.js.map +1 -1
- package/dist/definitions/index.d.ts +2 -2
- package/dist/definitions/index.d.ts.map +1 -1
- package/dist/definitions/index.js +1 -5
- package/dist/definitions/index.js.map +1 -1
- package/dist/definitions/load-for-render.d.ts +23 -20
- package/dist/definitions/load-for-render.d.ts.map +1 -1
- package/dist/definitions/load-for-render.js +55 -41
- package/dist/definitions/load-for-render.js.map +1 -1
- package/dist/definitions/schema-extraction.d.ts +36 -16
- package/dist/definitions/schema-extraction.d.ts.map +1 -1
- package/dist/definitions/schema-extraction.js +65 -28
- package/dist/definitions/schema-extraction.js.map +1 -1
- package/dist/errors/SentryErrorReporter.d.ts +2 -3
- package/dist/errors/SentryErrorReporter.d.ts.map +1 -1
- package/dist/errors/SentryErrorReporter.js +10 -14
- package/dist/errors/SentryErrorReporter.js.map +1 -1
- package/dist/http/body-size.d.ts +8 -11
- package/dist/http/body-size.d.ts.map +1 -1
- package/dist/http/body-size.js +8 -11
- package/dist/http/body-size.js.map +1 -1
- package/dist/http/redirect.d.ts +3 -7
- package/dist/http/redirect.d.ts.map +1 -1
- package/dist/http/redirect.js +8 -8
- package/dist/http/redirect.js.map +1 -1
- package/dist/http/route-classifier.d.ts +20 -24
- package/dist/http/route-classifier.d.ts.map +1 -1
- package/dist/http/route-classifier.js +6 -7
- package/dist/http/route-classifier.js.map +1 -1
- package/dist/http/security-headers.d.ts +13 -15
- package/dist/http/security-headers.d.ts.map +1 -1
- package/dist/http/security-headers.js +10 -12
- package/dist/http/security-headers.js.map +1 -1
- package/dist/logging/PinoLogger.d.ts +8 -14
- package/dist/logging/PinoLogger.d.ts.map +1 -1
- package/dist/logging/PinoLogger.js +29 -35
- package/dist/logging/PinoLogger.js.map +1 -1
- package/dist/logging/requestId.d.ts +20 -28
- package/dist/logging/requestId.d.ts.map +1 -1
- package/dist/logging/requestId.js +29 -37
- package/dist/logging/requestId.js.map +1 -1
- package/dist/ops/index.d.ts.map +1 -1
- package/dist/ops/index.js +2 -1
- package/dist/ops/index.js.map +1 -1
- package/dist/ops/semver.d.ts +22 -24
- package/dist/ops/semver.d.ts.map +1 -1
- package/dist/ops/semver.js +22 -25
- package/dist/ops/semver.js.map +1 -1
- package/dist/providers/create-selva-providers.d.ts +19 -27
- package/dist/providers/create-selva-providers.d.ts.map +1 -1
- package/dist/providers/create-selva-providers.js +28 -34
- package/dist/providers/create-selva-providers.js.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -4
- package/dist/providers/index.js.map +1 -1
- package/dist/tokens/token-codec.d.ts +24 -27
- package/dist/tokens/token-codec.d.ts.map +1 -1
- package/dist/tokens/token-codec.js +18 -21
- package/dist/tokens/token-codec.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestId.js","sourceRoot":"","sources":["../../src/logging/requestId.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"requestId.js","sourceRoot":"","sources":["../../src/logging/requestId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,kFAAkF;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,gFAAgF;AAChF,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC;;;;;GAKG;AACH,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAEpD,oFAAoF;AACpF,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;;;;GAIG;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"}
|
package/dist/ops/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ops/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ops/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,WAAW,EACX,OAAO,EACP,WAAW,EACX,cAAc,EACd,KAAK,cAAc,EACnB,MAAM,aAAa,CAAC"}
|
package/dist/ops/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
// Deployment/ops helpers — channel-aware semver comparison.
|
|
1
|
+
// Deployment/ops helpers — channel-aware semver comparison and engines.node
|
|
2
|
+
// range checks.
|
|
2
3
|
export { parseSemver, isNewer, compareCore, satisfiesRange } from './semver.js';
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
package/dist/ops/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ops/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ops/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,gBAAgB;AAEhB,OAAO,EACN,WAAW,EACX,OAAO,EACP,WAAW,EACX,cAAc,EAEd,MAAM,aAAa,CAAC"}
|
package/dist/ops/semver.d.ts
CHANGED
|
@@ -1,53 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Channel-aware semver comparison for update checks. Understands exactly the
|
|
3
|
-
* two
|
|
4
|
-
* (`x.y.z`, npm `
|
|
5
|
-
*
|
|
6
|
-
* arbitrary pre-release identifiers.
|
|
3
|
+
* two lines Selva publishes under: stable (`x.y.z`, npm `latest`) and beta
|
|
4
|
+
* (`x.y.z-beta.N`, npm `beta`). Deliberately not general semver — no build
|
|
5
|
+
* metadata, no arbitrary pre-release identifiers.
|
|
7
6
|
*/
|
|
8
7
|
/** Which published line a deployment tracks. */
|
|
9
8
|
export type ReleaseChannel = 'stable' | 'beta';
|
|
10
9
|
/**
|
|
11
|
-
* Parse `x.y.z` plus an optional `-beta.N`
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* that doesn't lead with a numeric core.
|
|
10
|
+
* Parse `x.y.z` plus an optional `-beta.N` counter. `beta` comes back separate
|
|
11
|
+
* from the core so beta-channel comparisons can order successive betas of one
|
|
12
|
+
* core. Null when the string doesn't lead with a numeric core.
|
|
15
13
|
*/
|
|
16
14
|
export declare function parseSemver(v: string): {
|
|
17
15
|
core: [number, number, number];
|
|
18
16
|
beta: number | null;
|
|
19
17
|
} | null;
|
|
20
18
|
/**
|
|
21
|
-
* Compare two `x.y.z` cores
|
|
22
|
-
* about
|
|
19
|
+
* Compare two `x.y.z` cores, ignoring pre-release tails. Callers that care
|
|
20
|
+
* about those want `isNewer`, which layers the channel rules on top.
|
|
23
21
|
*/
|
|
24
22
|
export declare function compareCore(a: string, b: string): number;
|
|
25
23
|
/**
|
|
26
24
|
* Does `version` satisfy an `engines.node` range?
|
|
27
25
|
*
|
|
28
|
-
* Deliberately narrow: handles the
|
|
29
|
-
* forms Selva and its dependencies
|
|
30
|
-
* space-separated conjunctions (`>=18 <21`). Anything it
|
|
31
|
-
* `null`
|
|
32
|
-
* strand an operator
|
|
26
|
+
* Deliberately narrow: handles the `>=`, `>`, `<=`, `<`, `^`, `~`, `=` and
|
|
27
|
+
* bare-version forms Selva and its dependencies publish, plus `||` alternatives
|
|
28
|
+
* and space-separated conjunctions (`>=18 <21`). Anything it can't parse
|
|
29
|
+
* returns `null` for "unknown", never a false "incompatible" — a wrong block
|
|
30
|
+
* would strand an operator with no way to override the bad parse.
|
|
33
31
|
*
|
|
34
|
-
* A full `semver` dependency would subsume this
|
|
35
|
-
* handful of range forms in play
|
|
32
|
+
* A full `semver` dependency would subsume this, but isn't warranted for the
|
|
33
|
+
* handful of range forms in play.
|
|
36
34
|
*/
|
|
37
35
|
export declare function satisfiesRange(version: string, range: string): boolean | null;
|
|
38
36
|
/**
|
|
39
|
-
* True when `latest` is strictly newer than `current
|
|
37
|
+
* True when `latest` is strictly newer than `current`.
|
|
40
38
|
*
|
|
41
|
-
* Stable channel (default): pre-release suffixes are ignored
|
|
39
|
+
* Stable channel (default): pre-release suffixes are ignored, so only stable
|
|
42
40
|
* core bumps surface.
|
|
43
41
|
*
|
|
44
|
-
* Beta channel: pre-releases participate. A higher core wins; on an equal
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
42
|
+
* Beta channel: pre-releases participate. A higher core wins; on an equal core
|
|
43
|
+
* a higher `-beta.N` wins, and a stable (no suffix) outranks any -beta of that
|
|
44
|
+
* core (4.6.0 > 4.6.0-beta.9). An update UI can then show both "beta.1 →
|
|
45
|
+
* beta.2" and the promotion of a beta line to stable.
|
|
48
46
|
*
|
|
49
47
|
* Unparseable versions fall back to inequality: different strings count as
|
|
50
|
-
*
|
|
48
|
+
* newer, so an odd published version still surfaces; identical ones don't.
|
|
51
49
|
*/
|
|
52
50
|
export declare function isNewer(latest: string, current: string, channel?: ReleaseChannel): boolean;
|
|
53
51
|
//# sourceMappingURL=semver.d.ts.map
|
package/dist/ops/semver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/ops/semver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/ops/semver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,gDAAgD;AAChD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,WAAW,CAC1B,CAAC,EAAE,MAAM,GACP;IAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAOhE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CASxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAsE7E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAyB,GAChC,OAAO,CAYT"}
|
package/dist/ops/semver.js
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Channel-aware semver comparison for update checks. Understands exactly the
|
|
3
|
-
* two
|
|
4
|
-
* (`x.y.z`, npm `
|
|
5
|
-
*
|
|
6
|
-
* arbitrary pre-release identifiers.
|
|
3
|
+
* two lines Selva publishes under: stable (`x.y.z`, npm `latest`) and beta
|
|
4
|
+
* (`x.y.z-beta.N`, npm `beta`). Deliberately not general semver — no build
|
|
5
|
+
* metadata, no arbitrary pre-release identifiers.
|
|
7
6
|
*/
|
|
8
7
|
/**
|
|
9
|
-
* Parse `x.y.z` plus an optional `-beta.N`
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* that doesn't lead with a numeric core.
|
|
8
|
+
* Parse `x.y.z` plus an optional `-beta.N` counter. `beta` comes back separate
|
|
9
|
+
* from the core so beta-channel comparisons can order successive betas of one
|
|
10
|
+
* core. Null when the string doesn't lead with a numeric core.
|
|
13
11
|
*/
|
|
14
12
|
export function parseSemver(v) {
|
|
15
13
|
const m = /^(\d+)\.(\d+)\.(\d+)(?:-beta\.(\d+))?/.exec(v.trim());
|
|
@@ -21,8 +19,8 @@ export function parseSemver(v) {
|
|
|
21
19
|
};
|
|
22
20
|
}
|
|
23
21
|
/**
|
|
24
|
-
* Compare two `x.y.z` cores
|
|
25
|
-
* about
|
|
22
|
+
* Compare two `x.y.z` cores, ignoring pre-release tails. Callers that care
|
|
23
|
+
* about those want `isNewer`, which layers the channel rules on top.
|
|
26
24
|
*/
|
|
27
25
|
export function compareCore(a, b) {
|
|
28
26
|
const pa = parseSemver(a);
|
|
@@ -40,14 +38,14 @@ export function compareCore(a, b) {
|
|
|
40
38
|
/**
|
|
41
39
|
* Does `version` satisfy an `engines.node` range?
|
|
42
40
|
*
|
|
43
|
-
* Deliberately narrow: handles the
|
|
44
|
-
* forms Selva and its dependencies
|
|
45
|
-
* space-separated conjunctions (`>=18 <21`). Anything it
|
|
46
|
-
* `null`
|
|
47
|
-
* strand an operator
|
|
41
|
+
* Deliberately narrow: handles the `>=`, `>`, `<=`, `<`, `^`, `~`, `=` and
|
|
42
|
+
* bare-version forms Selva and its dependencies publish, plus `||` alternatives
|
|
43
|
+
* and space-separated conjunctions (`>=18 <21`). Anything it can't parse
|
|
44
|
+
* returns `null` for "unknown", never a false "incompatible" — a wrong block
|
|
45
|
+
* would strand an operator with no way to override the bad parse.
|
|
48
46
|
*
|
|
49
|
-
* A full `semver` dependency would subsume this
|
|
50
|
-
* handful of range forms in play
|
|
47
|
+
* A full `semver` dependency would subsume this, but isn't warranted for the
|
|
48
|
+
* handful of range forms in play.
|
|
51
49
|
*/
|
|
52
50
|
export function satisfiesRange(version, range) {
|
|
53
51
|
const v = parseSemver(version);
|
|
@@ -122,18 +120,18 @@ export function satisfiesRange(version, range) {
|
|
|
122
120
|
return anyParsed ? false : null;
|
|
123
121
|
}
|
|
124
122
|
/**
|
|
125
|
-
* True when `latest` is strictly newer than `current
|
|
123
|
+
* True when `latest` is strictly newer than `current`.
|
|
126
124
|
*
|
|
127
|
-
* Stable channel (default): pre-release suffixes are ignored
|
|
125
|
+
* Stable channel (default): pre-release suffixes are ignored, so only stable
|
|
128
126
|
* core bumps surface.
|
|
129
127
|
*
|
|
130
|
-
* Beta channel: pre-releases participate. A higher core wins; on an equal
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
128
|
+
* Beta channel: pre-releases participate. A higher core wins; on an equal core
|
|
129
|
+
* a higher `-beta.N` wins, and a stable (no suffix) outranks any -beta of that
|
|
130
|
+
* core (4.6.0 > 4.6.0-beta.9). An update UI can then show both "beta.1 →
|
|
131
|
+
* beta.2" and the promotion of a beta line to stable.
|
|
134
132
|
*
|
|
135
133
|
* Unparseable versions fall back to inequality: different strings count as
|
|
136
|
-
*
|
|
134
|
+
* newer, so an odd published version still surfaces; identical ones don't.
|
|
137
135
|
*/
|
|
138
136
|
export function isNewer(latest, current, channel = 'stable') {
|
|
139
137
|
const a = parseSemver(latest);
|
|
@@ -146,7 +144,6 @@ export function isNewer(latest, current, channel = 'stable') {
|
|
|
146
144
|
if (a.core[i] < b.core[i])
|
|
147
145
|
return false;
|
|
148
146
|
}
|
|
149
|
-
// Equal core. On the stable channel we don't compare pre-release tails.
|
|
150
147
|
if (channel !== 'beta')
|
|
151
148
|
return false;
|
|
152
149
|
// Stable (beta == null) ranks above any pre-release of the same core.
|
package/dist/ops/semver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/ops/semver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/ops/semver.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,7 @@ import type { IAuthProvider, IDataProvider, IStorageProvider, ISolveMetricSink,
|
|
|
2
2
|
import { type ILogger } from '@selvajs/platform';
|
|
3
3
|
import { type EnvRecord } from '../compute/limits.js';
|
|
4
4
|
export type ProviderFactory<T> = (env: EnvRecord) => T;
|
|
5
|
-
/**
|
|
6
|
-
* The provider implementations available to this deployment, keyed by the
|
|
7
|
-
* (lowercase) choice name used in `SELVA_AUTH_PROVIDER` / `SELVA_DATA_PROVIDER`
|
|
8
|
-
* / `SELVA_STORAGE_PROVIDER`.
|
|
9
|
-
*/
|
|
5
|
+
/** Keyed by the lowercased `SELVA_{AUTH,DATA,STORAGE}_PROVIDER` value. */
|
|
10
6
|
export interface ProviderRegistry {
|
|
11
7
|
auth: Record<string, ProviderFactory<IAuthProvider>>;
|
|
12
8
|
data: Record<string, ProviderFactory<IDataProvider>>;
|
|
@@ -17,47 +13,43 @@ export interface CreateSelvaProvidersOptions {
|
|
|
17
13
|
/** Fallback choice per slot when the env var is unset. Default: `'local'`. */
|
|
18
14
|
defaults?: Partial<Record<'auth' | 'data' | 'storage', string>>;
|
|
19
15
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* export (a `SelvaConfig` or factory) replaces the env-driven wiring.
|
|
16
|
+
* Override module (absolute or CWD-relative); its default export is a
|
|
17
|
+
* `SelvaConfig` or a factory.
|
|
23
18
|
*/
|
|
24
19
|
configPath?: string;
|
|
25
20
|
/**
|
|
26
|
-
* Boot-summary sink, called once on first `resolve()
|
|
27
|
-
*
|
|
28
|
-
*
|
|
21
|
+
* Boot-summary sink, called once on first `resolve()` — for callers that want
|
|
22
|
+
* the rendered string. Default: none, and the summary goes to `logger`
|
|
23
|
+
* instead, so this library never writes to stdout unbidden.
|
|
29
24
|
*/
|
|
30
25
|
onBoot?: (summary: string) => void;
|
|
31
26
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
27
|
+
* Receives the boot summary as fields when `onBoot` is unset. Defaults to
|
|
28
|
+
* `NoopLogger`.
|
|
34
29
|
*/
|
|
35
30
|
logger?: ILogger;
|
|
36
31
|
}
|
|
37
32
|
export interface SelvaProviderRuntime {
|
|
38
33
|
/**
|
|
39
|
-
* Memoized
|
|
40
|
-
*
|
|
41
|
-
* the cached config. Never call at build time — provider `fromEnv`
|
|
42
|
-
* factories validate required secrets.
|
|
34
|
+
* Memoized wiring. The first call instantiates providers from env and throws
|
|
35
|
+
* if a required secret is missing — never call it at build time.
|
|
43
36
|
*/
|
|
44
37
|
resolve(): SelvaConfig;
|
|
38
|
+
/** Defaults to `'single'` when the config omits it. */
|
|
45
39
|
tenancy(): TenancyMode;
|
|
46
|
-
/**
|
|
40
|
+
/** Every field defaulted, so the UI never null-checks. */
|
|
47
41
|
branding(): Required<SelvaBranding>;
|
|
48
|
-
/**
|
|
42
|
+
/** Omitted flags resolve to false. */
|
|
49
43
|
flag(name: keyof SelvaFlags): boolean;
|
|
50
|
-
/**
|
|
44
|
+
/** `NoopSolveMetricSink` when the config omits one. */
|
|
51
45
|
solveMetricSink(): ISolveMetricSink;
|
|
52
46
|
}
|
|
53
47
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* app require a full runtime env. Provider instantiation is deferred to the
|
|
60
|
-
* first `resolve()`.
|
|
48
|
+
* Loading the config source (default factory, or the `configPath` module) is
|
|
49
|
+
* cheap and secret-free. The factory is deliberately NOT invoked here: that
|
|
50
|
+
* runs the registry's `fromEnv` factories, which validate required secrets, so
|
|
51
|
+
* calling it at import time would make merely building the app require a full
|
|
52
|
+
* runtime env. Providers are instantiated on the first `resolve()`.
|
|
61
53
|
*/
|
|
62
54
|
export declare function createSelvaProviders(env: EnvRecord, options: CreateSelvaProvidersOptions): Promise<SelvaProviderRuntime>;
|
|
63
55
|
//# sourceMappingURL=create-selva-providers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-selva-providers.d.ts","sourceRoot":"","sources":["../../src/providers/create-selva-providers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-selva-providers.d.ts","sourceRoot":"","sources":["../../src/providers/create-selva-providers.ts"],"names":[],"mappings":"AAsBA,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,0EAA0E;AAC1E,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;;;OAGG;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;;;OAGG;IACH,OAAO,IAAI,WAAW,CAAC;IACvB,uDAAuD;IACvD,OAAO,IAAI,WAAW,CAAC;IACvB,0DAA0D;IAC1D,QAAQ,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC;IACpC,sCAAsC;IACtC,IAAI,CAAC,IAAI,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC;IACtC,uDAAuD;IACvD,eAAe,IAAI,gBAAgB,CAAC;CACpC;AAiGD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,2BAA2B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CA8D/B"}
|
|
@@ -1,29 +1,27 @@
|
|
|
1
|
-
// Configurable provider wiring
|
|
2
|
-
//
|
|
3
|
-
// env-driven provider selection, `selva.config.js` override hook, and lazy
|
|
4
|
-
// instantiation without copying it.
|
|
1
|
+
// Configurable provider wiring — the reusable core of an app's composition
|
|
2
|
+
// root.
|
|
5
3
|
//
|
|
6
|
-
//
|
|
4
|
+
// Provider IMPLEMENTATIONS are not bundled: the caller passes a
|
|
7
5
|
// `ProviderRegistry` mapping choice names (the `SELVA_*_PROVIDER` env values)
|
|
8
|
-
// to `fromEnv`-style factories. That keeps this package free of dependencies
|
|
9
|
-
//
|
|
10
|
-
//
|
|
6
|
+
// to `fromEnv`-style factories. That keeps this package free of dependencies on
|
|
7
|
+
// `@selvajs/local-provider` / `@selvajs/supabase-provider` — a consuming app
|
|
8
|
+
// registers exactly the providers it ships.
|
|
11
9
|
//
|
|
12
|
-
// Two wiring modes
|
|
10
|
+
// Two wiring modes:
|
|
13
11
|
//
|
|
14
|
-
// Default — providers
|
|
15
|
-
//
|
|
12
|
+
// Default — providers picked from env vars (SELVA_AUTH_PROVIDER etc.) via the
|
|
13
|
+
// registry. New deployments need only a .env file.
|
|
16
14
|
//
|
|
17
|
-
// Override —
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
15
|
+
// Override — `configPath` points at an external `selva.config.js` (absolute
|
|
16
|
+
// or CWD-relative), loaded dynamically at boot, replacing the env-driven
|
|
17
|
+
// wiring entirely. It must be an actual `.js` file — there's no TS compiler
|
|
18
|
+
// at runtime.
|
|
21
19
|
import { pathToFileURL } from 'node:url';
|
|
22
20
|
import { resolve as resolvePath } from 'node:path';
|
|
23
21
|
import { existsSync } from 'node:fs';
|
|
24
22
|
import { isFlagEnabled, NoopSolveMetricSink, NoopLogger } from '@selvajs/platform';
|
|
25
23
|
import { readBool } from '../compute/limits.js';
|
|
26
|
-
// Every SelvaFlags key,
|
|
24
|
+
// Every SelvaFlags key, read from `SELVA_FLAG_<KEY>`. The `satisfies` plus the
|
|
27
25
|
// exhaustiveness check below make adding a platform flag without listing it
|
|
28
26
|
// here a compile error.
|
|
29
27
|
const FLAG_KEYS = [
|
|
@@ -50,10 +48,10 @@ function pickTenancy(env) {
|
|
|
50
48
|
return choice;
|
|
51
49
|
}
|
|
52
50
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
51
|
+
* Supabase's data provider carries a `solveMetrics` sink built from its own
|
|
52
|
+
* client bundle — reuse it so timings persist without a second client. Backends
|
|
53
|
+
* with no metrics table return undefined, and `solveMetricSink()` falls back to
|
|
54
|
+
* `NoopSolveMetricSink`.
|
|
57
55
|
*/
|
|
58
56
|
function pickSolveMetrics(data) {
|
|
59
57
|
const candidate = data.solveMetrics;
|
|
@@ -90,20 +88,17 @@ async function loadConfigSource(options) {
|
|
|
90
88
|
if (!existsSync(abs)) {
|
|
91
89
|
throw new Error(`Config override path ${options.configPath} resolved to ${abs} which does not exist.`);
|
|
92
90
|
}
|
|
93
|
-
//
|
|
94
|
-
//
|
|
95
|
-
// ESM specifiers.
|
|
91
|
+
// @vite-ignore: a bundler must not pre-resolve this specifier at build time.
|
|
92
|
+
// pathToFileURL keeps Windows absolute paths valid as ESM specifiers.
|
|
96
93
|
const mod = (await import(/* @vite-ignore */ pathToFileURL(abs).href));
|
|
97
94
|
return mod.default;
|
|
98
95
|
}
|
|
99
96
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
* app require a full runtime env. Provider instantiation is deferred to the
|
|
106
|
-
* first `resolve()`.
|
|
97
|
+
* Loading the config source (default factory, or the `configPath` module) is
|
|
98
|
+
* cheap and secret-free. The factory is deliberately NOT invoked here: that
|
|
99
|
+
* runs the registry's `fromEnv` factories, which validate required secrets, so
|
|
100
|
+
* calling it at import time would make merely building the app require a full
|
|
101
|
+
* runtime env. Providers are instantiated on the first `resolve()`.
|
|
107
102
|
*/
|
|
108
103
|
export async function createSelvaProviders(env, options) {
|
|
109
104
|
const raw = await loadConfigSource(options);
|
|
@@ -114,10 +109,9 @@ export async function createSelvaProviders(env, options) {
|
|
|
114
109
|
if (config)
|
|
115
110
|
return config;
|
|
116
111
|
config = typeof raw === 'function' ? raw(env) : raw;
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
// names come from the
|
|
120
|
-
// don't expose a name, so we infer from the constructor.
|
|
112
|
+
// Boot summary so operators can confirm what got wired without grepping
|
|
113
|
+
// env vars. Auth exposes a `name` field; data/storage adapters don't, so
|
|
114
|
+
// their names come from the constructor.
|
|
121
115
|
const wiring = {
|
|
122
116
|
component: 'selva',
|
|
123
117
|
auth: config.auth.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-selva-providers.js","sourceRoot":"","sources":["../../src/providers/create-selva-providers.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"create-selva-providers.js","sourceRoot":"","sources":["../../src/providers/create-selva-providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,oBAAoB,EACpB,KAAK,2BAA2B,EAChC,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,MAAM,6BAA6B,CAAC"}
|
package/dist/providers/index.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
// Configurable provider wiring — env-driven
|
|
2
|
-
//
|
|
3
|
-
// instantiation. The app keeps its own getters (services, error reporting) as
|
|
4
|
-
// its composition root; this is the reusable core underneath.
|
|
1
|
+
// Configurable provider wiring — env-driven selection over a caller-supplied
|
|
2
|
+
// registry, with a `selva.config.js` override hook.
|
|
5
3
|
export { createSelvaProviders } from './create-selva-providers.js';
|
|
6
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,oDAAoD;AAEpD,OAAO,EACN,oBAAoB,EAKpB,MAAM,6BAA6B,CAAC"}
|
|
@@ -2,52 +2,49 @@
|
|
|
2
2
|
* HMAC token codec — the primitive behind capability-URL tokens (share links,
|
|
3
3
|
* invites, and anything shaped like them).
|
|
4
4
|
*
|
|
5
|
-
* ##
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* ## Format
|
|
6
|
+
* raw = `<prefix><base64url(32 random bytes)>`
|
|
7
|
+
* hash = base64url( HMAC-SHA256(secret, raw) )
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
* bytes, returned to the caller exactly once at mint time. Different
|
|
11
|
-
* every token. This is what end-users carry in `?token=…`.
|
|
9
|
+
* ## Two secrets per token
|
|
12
10
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* secret too, and it lives in env, not the database.
|
|
11
|
+
* 1. **Per-token entropy** — the 32 random bytes in `mintRawToken()`, handed
|
|
12
|
+
* back exactly once at mint time and never stored. This is what end-users
|
|
13
|
+
* carry in `?token=…`.
|
|
17
14
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
15
|
+
* 2. **Instance-wide HMAC secret** (`config.secret`) — hashes tokens for
|
|
16
|
+
* storage, so the store holds only `HMAC-SHA256(secret, raw)`. A DB-only
|
|
17
|
+
* leak can't be replayed: the attacker also needs the secret, and it lives
|
|
18
|
+
* in env, not the database.
|
|
21
19
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
20
|
+
* Resolution hashes the supplied token with the same secret and looks up an
|
|
21
|
+
* exact match against the stored hash.
|
|
24
22
|
*
|
|
25
|
-
* Rotating the secret invalidates every token minted under it — give each
|
|
26
|
-
*
|
|
23
|
+
* Rotating the secret invalidates every token minted under it — give each token
|
|
24
|
+
* family (each prefix) its own secret so they rotate independently.
|
|
27
25
|
*/
|
|
28
26
|
/**
|
|
29
|
-
* Minimum accepted secret length
|
|
30
|
-
* guidance
|
|
31
|
-
*
|
|
32
|
-
* let a 4-char secret through).
|
|
27
|
+
* Minimum accepted secret length, matching the "random ≥32-byte string"
|
|
28
|
+
* guidance these secrets are documented under. Enforced here because a
|
|
29
|
+
* presence-only check lets a 4-char dev secret reach production silently.
|
|
33
30
|
*/
|
|
34
31
|
export declare const MIN_TOKEN_SECRET_LENGTH = 32;
|
|
35
32
|
export interface TokenCodecConfig {
|
|
36
33
|
/** Token-family marker prepended to every raw token, e.g. `share_`. */
|
|
37
34
|
prefix: string;
|
|
38
|
-
/** Instance-wide HMAC secret
|
|
35
|
+
/** Instance-wide HMAC secret; one per token family so they rotate apart. */
|
|
39
36
|
secret: string;
|
|
40
37
|
}
|
|
41
38
|
export interface TokenCodec {
|
|
42
|
-
/**
|
|
39
|
+
/** Fresh raw token. Never persisted — show it to the user exactly once. */
|
|
43
40
|
mintRawToken(): string;
|
|
44
|
-
/**
|
|
41
|
+
/** Raw token to the hash stored in its place. */
|
|
45
42
|
hashToken(raw: string): string;
|
|
46
|
-
/** Constant-time
|
|
43
|
+
/** Constant-time compare, so a mismatch leaks no position information. */
|
|
47
44
|
hashesEqual(a: string, b: string): boolean;
|
|
48
|
-
/**
|
|
45
|
+
/** Prefix check — recognizes this family's tokens on inbound requests. */
|
|
49
46
|
looksLikeToken(value: string): boolean;
|
|
50
|
-
/**
|
|
47
|
+
/** For callers building URLs or error copy. */
|
|
51
48
|
readonly prefix: string;
|
|
52
49
|
}
|
|
53
50
|
export declare function createTokenCodec(config: TokenCodecConfig): TokenCodec;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-codec.d.ts","sourceRoot":"","sources":["../../src/tokens/token-codec.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"token-codec.d.ts","sourceRoot":"","sources":["../../src/tokens/token-codec.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,MAAM,WAAW,gBAAgB;IAChC,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IAC1B,2EAA2E;IAC3E,YAAY,IAAI,MAAM,CAAC;IACvB,iDAAiD;IACjD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,0EAA0E;IAC1E,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3C,0EAA0E;IAC1E,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CA2BrE"}
|