@effect-app/infra 4.0.0-beta.328 → 4.0.0-beta.329
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/CHANGELOG.md +8 -0
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +5 -4
- package/package.json +2 -2
- package/src/arbs.ts +4 -3
- package/test/arbs-magnitude.test.ts +12 -0
- package/test/arbs.test.ts +20 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 4.0.0-beta.329
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 459697f: Restore native Arbitrary for the schemas that lost custom fast-check `toArbitrary`. `StringId` uses `toCodecArbitrary` (the native replacement): generate a 210-byte `Uint8Array` and run `customRandom(urlAlphabet, 21, …)` — same as the old `StringIdArb`. JSON stays a branded string via `toCodec`. `Url` is `https://…`. `RequestId` samples unique nanoid-shaped ids. `Finite` generation is capped at ±1e6. `generateFromSchema` jumps its master seed per call so successive `count: 1` draws do not collide on attempt-0 edge strings.
|
|
8
|
+
- Updated dependencies [459697f]
|
|
9
|
+
- effect-app@4.0.0-beta.329
|
|
10
|
+
|
|
3
11
|
## 4.0.0-beta.328
|
|
4
12
|
|
|
5
13
|
### Minor Changes
|
package/dist/arbs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arbs.d.ts","sourceRoot":"","sources":["../src/arbs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,CAAC,MAAM,mBAAmB,CAAA;AAG3C,OAAO,KAAK,SAAS,MAAM,YAAY,CAAA;AAUvC,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,sBAEtD;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAE3D;
|
|
1
|
+
{"version":3,"file":"arbs.d.ts","sourceRoot":"","sources":["../src/arbs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,CAAC,MAAM,mBAAmB,CAAA;AAG3C,OAAO,KAAK,SAAS,MAAM,YAAY,CAAA;AAUvC,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,sBAEtD;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAE3D;AAOD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;;EASnE"}
|
package/dist/arbs.js
CHANGED
|
@@ -16,15 +16,16 @@ export function generate(arb) {
|
|
|
16
16
|
export function generateFromArbitrary(arb) {
|
|
17
17
|
return generate(arb(FastCheck));
|
|
18
18
|
}
|
|
19
|
-
//
|
|
20
|
-
//
|
|
19
|
+
// Native `sampleEffect({ count: 1 })` always uses attempt 0 of the master seed (edge-biased).
|
|
20
|
+
// Integer `seed + n` stayed in that bucket and collided for StringId. Mix a per-call suffix
|
|
21
|
+
// so each call is a jump-before-toss, like successive `generate(rnd)` draws.
|
|
21
22
|
let schemaSamples = 0;
|
|
22
23
|
export function generateFromSchema(schema) {
|
|
23
|
-
const samples = Effect.runSync(Arbitrary.sampleEffect(Arbitrary.schema(schema), { count: 1, seed: seed
|
|
24
|
+
const samples = Effect.runSync(Arbitrary.sampleEffect(Arbitrary.schema(schema), { count: 1, seed: `${seed}:${schemaSamples++}` }));
|
|
24
25
|
const value = samples[0];
|
|
25
26
|
if (value === undefined) {
|
|
26
27
|
throw new Error("failed to sample schema");
|
|
27
28
|
}
|
|
28
29
|
return { value };
|
|
29
30
|
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJicy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcmJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUU1QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTNDLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFBO0FBQ3ZDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUNBQXFDLENBQUE7QUFDaEUsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFFbkUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFBO0FBQ2QsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ2hDLE1BQU0sR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBRTNCLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUVmLE1BQU0sVUFBVSxRQUFRLENBQUksR0FBMkI7SUFDckQsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQTtBQUNyQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFJLEdBQW1CO0lBQzFELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0FBQ2pDLENBQUM7QUFFRCw4RkFBOEY7QUFDOUYsNEZBQTRGO0FBQzVGLDZFQUE2RTtBQUM3RSxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckIsTUFBTSxVQUFVLGtCQUFrQixDQUF5QixNQUFTO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQzVCLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUNuRyxDQUFBO0lBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3hCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFBO0FBQ2xCLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.329",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"proper-lockfile": "^4.1.2",
|
|
17
17
|
"pure-rand": "8.4.0",
|
|
18
18
|
"query-string": "^9.4.0",
|
|
19
|
-
"effect-app": "4.0.0-beta.
|
|
19
|
+
"effect-app": "4.0.0-beta.329"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@azure/cosmos": "^4.9.3",
|
package/src/arbs.ts
CHANGED
|
@@ -23,13 +23,14 @@ export function generateFromArbitrary<T>(arb: S.Arbitrary<T>) {
|
|
|
23
23
|
return generate(arb(FastCheck))
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
//
|
|
27
|
-
//
|
|
26
|
+
// Native `sampleEffect({ count: 1 })` always uses attempt 0 of the master seed (edge-biased).
|
|
27
|
+
// Integer `seed + n` stayed in that bucket and collided for StringId. Mix a per-call suffix
|
|
28
|
+
// so each call is a jump-before-toss, like successive `generate(rnd)` draws.
|
|
28
29
|
let schemaSamples = 0
|
|
29
30
|
|
|
30
31
|
export function generateFromSchema<S extends S.Constraint>(schema: S) {
|
|
31
32
|
const samples = Effect.runSync(
|
|
32
|
-
Arbitrary.sampleEffect(Arbitrary.schema(schema), { count: 1, seed: seed
|
|
33
|
+
Arbitrary.sampleEffect(Arbitrary.schema(schema), { count: 1, seed: `${seed}:${schemaSamples++}` })
|
|
33
34
|
)
|
|
34
35
|
const value = samples[0]
|
|
35
36
|
if (value === undefined) {
|
|
@@ -14,8 +14,20 @@ describe("generateFromSchema number magnitudes", () => {
|
|
|
14
14
|
}
|
|
15
15
|
})
|
|
16
16
|
|
|
17
|
+
it("keeps Finite samples realistic", () => {
|
|
18
|
+
const schema = S.Struct({ amount: S.Finite, weight: S.Finite })
|
|
19
|
+
for (let i = 0; i < 200; i++) {
|
|
20
|
+
const { amount, weight } = generateFromSchema(schema).value
|
|
21
|
+
expect(Number.isFinite(amount)).toBe(true)
|
|
22
|
+
expect(Number.isFinite(weight)).toBe(true)
|
|
23
|
+
expect(Math.max(Math.abs(amount), Math.abs(weight))).toBeLessThanOrEqual(1_000_000)
|
|
24
|
+
expect(Number.isFinite(amount * weight)).toBe(true)
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
|
|
17
28
|
it("does not change the JSON Schema of the number schemas", () => {
|
|
18
29
|
expect(S.toJsonSchemaDocument(S.PositiveNumber).schema).not.toHaveProperty("maximum")
|
|
19
30
|
expect(S.toJsonSchemaDocument(S.NonNegativeNumber).schema).not.toHaveProperty("maximum")
|
|
31
|
+
expect(S.toJsonSchemaDocument(S.Finite).schema).not.toHaveProperty("maximum")
|
|
20
32
|
})
|
|
21
33
|
})
|
package/test/arbs.test.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from "@effect/vitest"
|
|
2
|
+
import { RequestId } from "effect-app/ids"
|
|
2
3
|
import * as S from "effect-app/Schema"
|
|
3
4
|
import { generateFromSchema } from "../src/arbs.js"
|
|
4
5
|
|
|
@@ -18,4 +19,23 @@ describe("generateFromSchema", () => {
|
|
|
18
19
|
expect(S.is(schema)(generateFromSchema(schema).value)).toBe(true)
|
|
19
20
|
}
|
|
20
21
|
})
|
|
22
|
+
|
|
23
|
+
it("successive StringId samples are unique (count:1 jump, not attempt-0 edge strings)", () => {
|
|
24
|
+
const Item = S.Struct({ id: S.StringId, amount: S.Finite })
|
|
25
|
+
const ids = Array.from({ length: 20 }, () => generateFromSchema(Item).value.id)
|
|
26
|
+
expect(new Set(ids).size).toBe(20)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
it("successive RequestId samples are unique", () => {
|
|
30
|
+
const ids = Array.from({ length: 20 }, () => generateFromSchema(RequestId).value)
|
|
31
|
+
expect(new Set(ids).size).toBe(20)
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
it("samples Url as https URLs", () => {
|
|
35
|
+
for (let i = 0; i < 10; i++) {
|
|
36
|
+
const url = generateFromSchema(S.Url).value
|
|
37
|
+
expect(url.startsWith("https://")).toBe(true)
|
|
38
|
+
expect(S.is(S.Url)(url)).toBe(true)
|
|
39
|
+
}
|
|
40
|
+
})
|
|
21
41
|
})
|