@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 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
@@ -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;AAMD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;;EASnE"}
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
- // Advance the seed per call: deterministic across runs, but successive calls yield different
20
- // samples (like `generate` advancing its shared fast-check Random).
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 + schemaSamples++ }));
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJicy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcmJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUU1QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTNDLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFBO0FBQ3ZDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUNBQXFDLENBQUE7QUFDaEUsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFFbkUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFBO0FBQ2QsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ2hDLE1BQU0sR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBRTNCLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUVmLE1BQU0sVUFBVSxRQUFRLENBQUksR0FBMkI7SUFDckQsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQTtBQUNyQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFJLEdBQW1CO0lBQzFELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0FBQ2pDLENBQUM7QUFFRCw2RkFBNkY7QUFDN0Ysb0VBQW9FO0FBQ3BFLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQTtBQUVyQixNQUFNLFVBQVUsa0JBQWtCLENBQXlCLE1BQVM7SUFDbEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FDNUIsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FDN0YsQ0FBQTtJQUNELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN4QixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQTtBQUNsQixDQUFDIn0=
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.328",
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.328"
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
- // Advance the seed per call: deterministic across runs, but successive calls yield different
27
- // samples (like `generate` advancing its shared fast-check Random).
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 + schemaSamples++ })
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
  })