@prosopo/puzzle-assets 0.2.3 → 0.2.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 (131) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +1 -1
  2. package/.turbo/turbo-build$colon$esm.log +24 -0
  3. package/.turbo/turbo-build$colon$tsc.log +4 -4
  4. package/.turbo/turbo-build$colon$types.log +1 -0
  5. package/CHANGELOG.md +14 -0
  6. package/dist/tsc/background.d.ts.map +1 -0
  7. package/dist/tsc/background.js +102 -0
  8. package/dist/tsc/background.js.map +1 -0
  9. package/dist/tsc/browser.d.ts.map +1 -0
  10. package/dist/tsc/browser.js +30 -0
  11. package/dist/tsc/browser.js.map +1 -0
  12. package/dist/tsc/compose.d.ts.map +1 -0
  13. package/dist/tsc/compose.js +136 -0
  14. package/dist/tsc/compose.js.map +1 -0
  15. package/dist/tsc/contrast.d.ts.map +1 -0
  16. package/dist/tsc/contrast.js +79 -0
  17. package/dist/tsc/contrast.js.map +1 -0
  18. package/dist/tsc/decoys.d.ts.map +1 -0
  19. package/dist/tsc/decoys.js +74 -0
  20. package/dist/tsc/decoys.js.map +1 -0
  21. package/dist/tsc/encode.d.ts.map +1 -0
  22. package/dist/tsc/encode.js +19 -0
  23. package/dist/tsc/encode.js.map +1 -0
  24. package/dist/tsc/index.d.ts.map +1 -0
  25. package/dist/tsc/index.js +44 -0
  26. package/dist/tsc/index.js.map +1 -0
  27. package/dist/tsc/notch.d.ts.map +1 -0
  28. package/dist/tsc/notch.js +114 -0
  29. package/dist/tsc/notch.js.map +1 -0
  30. package/dist/tsc/palette.d.ts.map +1 -0
  31. package/dist/tsc/palette.js +68 -0
  32. package/dist/tsc/palette.js.map +1 -0
  33. package/dist/tsc/prng.d.ts.map +1 -0
  34. package/dist/tsc/prng.js +41 -0
  35. package/dist/tsc/prng.js.map +1 -0
  36. package/dist/tsc/tests/pieceReadability.unit.test.d.ts.map +1 -0
  37. package/dist/tsc/tests/pieceReadability.unit.test.js.map +1 -0
  38. package/dist/tsc/tests/puzzleAssets.unit.test.d.ts.map +1 -0
  39. package/dist/tsc/tests/puzzleAssets.unit.test.js.map +1 -0
  40. package/dist/tsc/tests/renderReplay.unit.test.d.ts.map +1 -0
  41. package/dist/tsc/tests/renderReplay.unit.test.js.map +1 -0
  42. package/dist/tsc/types.d.ts.map +1 -0
  43. package/dist/tsc/types.js.map +1 -0
  44. package/dist/types/background.d.ts +4 -0
  45. package/dist/types/background.d.ts.map +1 -0
  46. package/dist/types/browser.d.ts +16 -0
  47. package/dist/types/browser.d.ts.map +1 -0
  48. package/dist/types/compose.d.ts +13 -0
  49. package/dist/types/compose.d.ts.map +1 -0
  50. package/dist/types/contrast.d.ts +9 -0
  51. package/dist/types/contrast.d.ts.map +1 -0
  52. package/dist/types/decoys.d.ts +5 -0
  53. package/dist/types/decoys.d.ts.map +1 -0
  54. package/dist/types/encode.d.ts +6 -0
  55. package/dist/types/encode.d.ts.map +1 -0
  56. package/dist/types/index.d.ts +15 -0
  57. package/dist/types/index.d.ts.map +1 -0
  58. package/dist/types/notch.d.ts +7 -0
  59. package/dist/types/notch.d.ts.map +1 -0
  60. package/dist/types/palette.d.ts +10 -0
  61. package/dist/types/palette.d.ts.map +1 -0
  62. package/dist/types/prng.d.ts +10 -0
  63. package/dist/types/prng.d.ts.map +1 -0
  64. package/dist/types/tests/pieceReadability.unit.test.d.ts +2 -0
  65. package/dist/types/tests/pieceReadability.unit.test.d.ts.map +1 -0
  66. package/dist/types/tests/puzzleAssets.unit.test.d.ts +2 -0
  67. package/dist/types/tests/puzzleAssets.unit.test.d.ts.map +1 -0
  68. package/dist/types/tests/renderReplay.unit.test.d.ts +2 -0
  69. package/dist/types/tests/renderReplay.unit.test.d.ts.map +1 -0
  70. package/dist/types/types.d.ts +29 -0
  71. package/dist/types/types.d.ts.map +1 -0
  72. package/package.json +12 -13
  73. package/vite.esm.config.ts +1 -1
  74. package/.turbo/turbo-build.log +0 -25
  75. package/dist/background.d.ts.map +0 -1
  76. package/dist/background.js.map +0 -1
  77. package/dist/browser.d.ts.map +0 -1
  78. package/dist/browser.js.map +0 -1
  79. package/dist/compose.d.ts.map +0 -1
  80. package/dist/compose.js.map +0 -1
  81. package/dist/contrast.d.ts.map +0 -1
  82. package/dist/contrast.js.map +0 -1
  83. package/dist/decoys.d.ts.map +0 -1
  84. package/dist/decoys.js.map +0 -1
  85. package/dist/encode.d.ts.map +0 -1
  86. package/dist/encode.js.map +0 -1
  87. package/dist/index.d.ts.map +0 -1
  88. package/dist/index.js.map +0 -1
  89. package/dist/notch.d.ts.map +0 -1
  90. package/dist/notch.js.map +0 -1
  91. package/dist/palette.d.ts.map +0 -1
  92. package/dist/palette.js.map +0 -1
  93. package/dist/prng.d.ts.map +0 -1
  94. package/dist/prng.js.map +0 -1
  95. package/dist/tests/pieceReadability.unit.test.d.ts.map +0 -1
  96. package/dist/tests/pieceReadability.unit.test.js.map +0 -1
  97. package/dist/tests/puzzleAssets.unit.test.d.ts.map +0 -1
  98. package/dist/tests/puzzleAssets.unit.test.js.map +0 -1
  99. package/dist/tests/renderReplay.unit.test.d.ts.map +0 -1
  100. package/dist/tests/renderReplay.unit.test.js.map +0 -1
  101. package/dist/types.d.ts.map +0 -1
  102. package/dist/types.js.map +0 -1
  103. /package/dist/{_virtual → esm/_virtual}/_rolldown/runtime.js +0 -0
  104. /package/dist/{background.js → esm/background.js} +0 -0
  105. /package/dist/{browser.js → esm/browser.js} +0 -0
  106. /package/dist/{compose.js → esm/compose.js} +0 -0
  107. /package/dist/{contrast.js → esm/contrast.js} +0 -0
  108. /package/dist/{decoys.js → esm/decoys.js} +0 -0
  109. /package/dist/{encode.js → esm/encode.js} +0 -0
  110. /package/dist/{index.js → esm/index.js} +0 -0
  111. /package/dist/{notch.js → esm/notch.js} +0 -0
  112. /package/dist/{palette.js → esm/palette.js} +0 -0
  113. /package/dist/{prng.js → esm/prng.js} +0 -0
  114. /package/dist/{background.d.ts → tsc/background.d.ts} +0 -0
  115. /package/dist/{browser.d.ts → tsc/browser.d.ts} +0 -0
  116. /package/dist/{compose.d.ts → tsc/compose.d.ts} +0 -0
  117. /package/dist/{contrast.d.ts → tsc/contrast.d.ts} +0 -0
  118. /package/dist/{decoys.d.ts → tsc/decoys.d.ts} +0 -0
  119. /package/dist/{encode.d.ts → tsc/encode.d.ts} +0 -0
  120. /package/dist/{index.d.ts → tsc/index.d.ts} +0 -0
  121. /package/dist/{notch.d.ts → tsc/notch.d.ts} +0 -0
  122. /package/dist/{palette.d.ts → tsc/palette.d.ts} +0 -0
  123. /package/dist/{prng.d.ts → tsc/prng.d.ts} +0 -0
  124. /package/dist/{tests → tsc/tests}/pieceReadability.unit.test.d.ts +0 -0
  125. /package/dist/{tests → tsc/tests}/pieceReadability.unit.test.js +0 -0
  126. /package/dist/{tests → tsc/tests}/puzzleAssets.unit.test.d.ts +0 -0
  127. /package/dist/{tests → tsc/tests}/puzzleAssets.unit.test.js +0 -0
  128. /package/dist/{tests → tsc/tests}/renderReplay.unit.test.d.ts +0 -0
  129. /package/dist/{tests → tsc/tests}/renderReplay.unit.test.js +0 -0
  130. /package/dist/{types.d.ts → tsc/types.d.ts} +0 -0
  131. /package/dist/{types.js → tsc/types.js} +0 -0
@@ -20,4 +20,4 @@ dist/cjs/notch.cjs 4.46 kB │ gzip: 1.81 kB
20
20
  dist/cjs/decoys.cjs 4.54 kB │ gzip: 1.94 kB
21
21
  dist/cjs/compose.cjs 10.60 kB │ gzip: 4.03 kB
22
22
 
23
- ✓ built in 88ms
23
+ ✓ built in 51ms
@@ -0,0 +1,24 @@
1
+ $ vite build --config vite.esm.config.ts --mode ${NODE_ENV:-development}
2
+ ViteEsmConfig: .
3
+ { tsConfigPaths: [] }
4
+ { externals: [] }
5
+ The plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the resolve.tsconfigPaths option. You can remove the plugin and set resolve.tsconfigPaths: true in your Vite config instead.
6
+ vite v8.1.6 building ssr environment for production...
7
+ Bundle build started
8
+ 
9
+ ✓ 11 modules transformed.
10
+ rendering chunks...
11
+ computing gzip size...
12
+ dist/esm/_virtual/_rolldown/runtime.js 0.04 kB │ gzip: 0.06 kB
13
+ dist/esm/prng.js 1.40 kB │ gzip: 0.73 kB
14
+ dist/esm/browser.js 1.66 kB │ gzip: 0.69 kB
15
+ dist/esm/encode.js 1.67 kB │ gzip: 0.82 kB
16
+ dist/esm/index.js 3.51 kB │ gzip: 1.41 kB
17
+ dist/esm/palette.js 3.99 kB │ gzip: 1.79 kB
18
+ dist/esm/contrast.js 4.03 kB │ gzip: 1.90 kB
19
+ dist/esm/background.js 4.25 kB │ gzip: 1.83 kB
20
+ dist/esm/notch.js 4.41 kB │ gzip: 1.81 kB
21
+ dist/esm/decoys.js 4.50 kB │ gzip: 1.93 kB
22
+ dist/esm/compose.js 10.51 kB │ gzip: 4.01 kB
23
+
24
+ ✓ built in 62ms
@@ -1,11 +1,11 @@
1
1
  $ tsc --build --verbose
2
- 5:07:25 PM - Projects in this build:
2
+ 12:56:04 PM - Projects in this build:
3
3
  * ../../dev/config/tsconfig.json
4
4
  * tsconfig.json
5
5
 
6
- 5:07:25 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/webpack/webpack.config.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
6
+ 12:56:04 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/vite/vite.esm.config.ts' is older than output '../../dev/config/dist/tsc/tsconfig.tsbuildinfo'
7
7
 
8
- 5:07:25 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
8
+ 12:56:04 PM - Project 'tsconfig.json' is out of date because output file 'dist/tsc/tsconfig.tsbuildinfo' does not exist
9
9
 
10
- 5:07:25 PM - Building project '/home/runner/work/captcha/captcha/packages/puzzle-assets/tsconfig.json'...
10
+ 12:56:04 PM - Building project '/home/runner/work/captcha/captcha/packages/puzzle-assets/tsconfig.json'...
11
11
 
@@ -0,0 +1 @@
1
+ $ tsc --project tsconfig.types.json
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @prosopo/puzzle-assets
2
2
 
3
+ ## 0.2.5
4
+ ### Patch Changes
5
+
6
+ - 1966fc1: Bump the npm-minor-and-patch group across 1 directory with 15 updates
7
+
8
+ ## 0.2.4
9
+ ### Patch Changes
10
+
11
+ - 2086040: Each kind of build now writes to its own folder under dist: dist/esm (vite ESM), dist/cjs (vite CommonJS), dist/types (declarations), dist/tsc (plain tsc), dist/bundle and dist/bundle-webpack (bundles) and dist/native (the Rust addons). Turbo caches each folder separately, so building one variant no longer overwrites or invalidates another. Package exports point at the new folders; anything importing a file from dist by path has to add the variant folder.
12
+
13
+ The Rust addons are no longer committed. They are built into dist/native, in debug for development and tests and fully optimised when NODE_ENV=production, so building them now needs a Rust toolchain.
14
+
15
+ Code that found the repo root or its certificates by climbing a fixed number of folders up from its own file now starts from its package's folder instead (new `packageDir` in @prosopo/util/node). The fixed count stopped working once the build output moved one folder deeper.
16
+
3
17
  ## 0.2.3
4
18
  ### Patch Changes
5
19
 
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../../src/background.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqF5C,eAAO,MAAM,kBAAkB,SACxB,IAAI,SACH,MAAM,UACL,MAAM,KACZ,SAmFF,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { drawPalette } from "./palette.js";
2
+ const GRAIN_AMPLITUDE = 5;
3
+ const VIGNETTE_STRENGTH = 0.16;
4
+ const clamp255 = (v) => (v < 0 ? 0 : v > 255 ? 255 : v);
5
+ const meshColourAt = (points, x, y) => {
6
+ let wSum = 0;
7
+ let r = 0;
8
+ let g = 0;
9
+ let b = 0;
10
+ for (const point of points) {
11
+ const dx = x - point.x;
12
+ const dy = y - point.y;
13
+ const w = Math.exp(-(dx * dx + dy * dy) / (2 * point.sigma * point.sigma));
14
+ wSum += w;
15
+ r += point.colour.r * w;
16
+ g += point.colour.g * w;
17
+ b += point.colour.b * w;
18
+ }
19
+ if (wSum < 1e-6) {
20
+ let best = points[0];
21
+ if (!best)
22
+ throw new Error("puzzle-assets: no mesh points");
23
+ let bestD = Number.POSITIVE_INFINITY;
24
+ for (const point of points) {
25
+ const d = (x - point.x) ** 2 + (y - point.y) ** 2;
26
+ if (d < bestD) {
27
+ bestD = d;
28
+ best = point;
29
+ }
30
+ }
31
+ return best.colour;
32
+ }
33
+ return { r: r / wSum, g: g / wSum, b: b / wSum };
34
+ };
35
+ export const generateBackground = (prng, width, height) => {
36
+ const pointCount = prng.int(4, 6);
37
+ const palette = drawPalette(prng, pointCount);
38
+ const blobPalette = drawPalette(prng, 3);
39
+ const minDimension = Math.min(width, height);
40
+ const points = [];
41
+ for (let i = 0; i < pointCount; i++) {
42
+ const colour = palette[i];
43
+ if (!colour)
44
+ throw new Error("puzzle-assets: palette underflow");
45
+ points.push({
46
+ x: prng.range(-0.15, 1.15) * width,
47
+ y: prng.range(-0.15, 1.15) * height,
48
+ colour,
49
+ sigma: prng.range(0.26, 0.48) * minDimension,
50
+ });
51
+ }
52
+ const blobs = [];
53
+ const blobCount = prng.int(2, 4);
54
+ for (let i = 0; i < blobCount; i++) {
55
+ const colour = blobPalette[i % blobPalette.length];
56
+ if (!colour)
57
+ throw new Error("puzzle-assets: palette underflow");
58
+ blobs.push({
59
+ x: prng.range(0.1, 0.9) * width,
60
+ y: prng.range(0.1, 0.9) * height,
61
+ sigma: prng.range(0.18, 0.38) * minDimension,
62
+ colour,
63
+ alpha: prng.range(0.16, 0.32),
64
+ });
65
+ }
66
+ const data = Buffer.alloc(width * height * 4);
67
+ const cx = width / 2;
68
+ const cy = height / 2;
69
+ const maxRadius = Math.sqrt(cx * cx + cy * cy);
70
+ for (let y = 0; y < height; y++) {
71
+ for (let x = 0; x < width; x++) {
72
+ const base = meshColourAt(points, x, y);
73
+ let r = base.r;
74
+ let g = base.g;
75
+ let b = base.b;
76
+ for (const blob of blobs) {
77
+ const dx = x - blob.x;
78
+ const dy = y - blob.y;
79
+ const a = blob.alpha *
80
+ Math.exp(-(dx * dx + dy * dy) / (2 * blob.sigma * blob.sigma));
81
+ r += (blob.colour.r - r) * a;
82
+ g += (blob.colour.g - g) * a;
83
+ b += (blob.colour.b - b) * a;
84
+ }
85
+ const dxc = x - cx;
86
+ const dyc = y - cy;
87
+ const vignette = 1 -
88
+ VIGNETTE_STRENGTH * ((dxc * dxc + dyc * dyc) / (maxRadius * maxRadius));
89
+ r *= vignette;
90
+ g *= vignette;
91
+ b *= vignette;
92
+ const grain = (prng.next() - 0.5) * 2 * GRAIN_AMPLITUDE;
93
+ const i = (y * width + x) * 4;
94
+ data[i] = clamp255(Math.round(r + grain));
95
+ data[i + 1] = clamp255(Math.round(g + grain));
96
+ data[i + 2] = clamp255(Math.round(b + grain));
97
+ data[i + 3] = 255;
98
+ }
99
+ }
100
+ return { data, width, height };
101
+ };
102
+ //# sourceMappingURL=background.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background.js","sourceRoot":"","sources":["../../src/background.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EACX,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,SAAS,EACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EACX,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,SAAS,GACT,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,gBAAgB,EAAE,cAI9B,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,oBAMrC,CAAC;AAEF,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,IAAI,EAAE,MAAM,CAAC;CACb;AAOD,eAAO,MAAM,kBAAkB,eAClB,SAAS,aACV,cAAc,aACf,cAAc,aACd,oBAAoB,SACxB,MAAM,KACV,kBAuBF,CAAC;AAEF,eAAO,MAAM,gBAAgB,cAClB,cAAc,SAClB,MAAM,KACV,SACmE,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { generateBackground } from "./background.js";
2
+ import { cutNotch } from "./compose.js";
3
+ import { paintDecoys } from "./decoys.js";
4
+ import { createNotchShape } from "./notch.js";
5
+ import { createPrng, createSeed } from "./prng.js";
6
+ export { createPrng, createSeed, SEED_BYTES } from "./prng.js";
7
+ export { generateBackground } from "./background.js";
8
+ export { paintDecoys, paintDecoyPiece } from "./decoys.js";
9
+ export const DEFAULT_GEOMETRY = {
10
+ width: 300,
11
+ height: 200,
12
+ notchSize: 44,
13
+ };
14
+ export const DEFAULT_RENDER_SETTINGS = {
15
+ decoyCount: 5,
16
+ decoyEdgeDarkness: 20,
17
+ decoyBodyBrightness: 4,
18
+ holeDarken: 0.55,
19
+ decoyHoleDarken: 0.7,
20
+ };
21
+ export const renderPuzzleToRgba = (background, placement, geometry = DEFAULT_GEOMETRY, settings = DEFAULT_RENDER_SETTINGS, seed = createSeed()) => {
22
+ const prng = createPrng(seed);
23
+ const pieceSize = geometry.pieceSize ?? geometry.notchSize;
24
+ paintDecoys(background, prng, settings.decoyCount, pieceSize, placement, settings.decoyEdgeDarkness, settings.decoyBodyBrightness, settings.decoyHoleDarken);
25
+ const shape = createNotchShape(prng, pieceSize);
26
+ const { background: cut, piece } = cutNotch(prng, background, shape, pieceSize, placement, settings.holeDarken);
27
+ return { background: cut, piece, pieceSize, seed };
28
+ };
29
+ export const createBackground = (geometry = DEFAULT_GEOMETRY, seed = createSeed()) => generateBackground(createPrng(seed), geometry.width, geometry.height);
30
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAQnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAS3D,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC/C,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;IACX,SAAS,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAyB;IAC5D,UAAU,EAAE,CAAC;IACb,iBAAiB,EAAE,EAAE;IACrB,mBAAmB,EAAE,CAAC;IACtB,UAAU,EAAE,IAAI;IAChB,eAAe,EAAE,GAAG;CACpB,CAAC;AAeF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,UAAqB,EACrB,SAAyB,EACzB,WAA2B,gBAAgB,EAC3C,WAAiC,uBAAuB,EACxD,OAAe,UAAU,EAAE,EACN,EAAE;IACvB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC;IAC3D,WAAW,CACV,UAAU,EACV,IAAI,EACJ,QAAQ,CAAC,UAAU,EACnB,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,iBAAiB,EAC1B,QAAQ,CAAC,mBAAmB,EAC5B,QAAQ,CAAC,eAAe,CACxB,CAAC;IACF,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,QAAQ,CAC1C,IAAI,EACJ,UAAU,EACV,KAAK,EACL,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,UAAU,CACnB,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC/B,WAA2B,gBAAgB,EAC3C,OAAe,UAAU,EAAE,EACf,EAAE,CACd,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/compose.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAsE5D,eAAO,MAAM,gBAAgB,SACtB,MAAM,KACV;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAalC,CAAC;AAmIF,MAAM,WAAW,SAAS;IAEzB,UAAU,EAAE,SAAS,CAAC;IAEtB,KAAK,EAAE,SAAS,CAAC;CACjB;AAQD,eAAO,MAAM,QAAQ,SACd,IAAI,cACE,SAAS,SACd,UAAU,QACX,MAAM,aACD,cAAc,cACb,MAAM,KAChB,SAyHF,CAAC"}
@@ -0,0 +1,136 @@
1
+ import { relativeLuminance } from "./contrast.js";
2
+ import { coverageFromDistance } from "./notch.js";
3
+ const PIECE_NOISE = 7;
4
+ const PIECE_BRIGHTNESS_RANGE = [-8, 8];
5
+ const SEAM_NOISE_RADIUS = 3;
6
+ const SEAM_NOISE = 4;
7
+ const HOLE_INNER_SHADOW = 0.45;
8
+ const PIECE_EDGE_LIGHT = 8;
9
+ const PIECE_RIM_PLATEAU_RATIO = 0.03;
10
+ const PIECE_RIM_WIDTH_RATIO = 0.065;
11
+ const PIECE_RIM_MIN_PLATEAU = 1;
12
+ const PIECE_RIM_MIN_WIDTH = 2.2;
13
+ export const pieceRimGeometry = (size) => {
14
+ const plateau = Math.max(PIECE_RIM_MIN_PLATEAU, size * PIECE_RIM_PLATEAU_RATIO);
15
+ return {
16
+ plateau,
17
+ width: Math.max(PIECE_RIM_MIN_WIDTH, size * PIECE_RIM_WIDTH_RATIO, plateau + 1),
18
+ };
19
+ };
20
+ const PIECE_RIM_TARGET_CONTRAST = 1.5;
21
+ const PIECE_RIM_MAX_STEP = 72;
22
+ const PIECE_RIM_DIRECTION_THRESHOLD = 0.4;
23
+ const clamp255 = (v) => (v < 0 ? 0 : v > 255 ? 255 : v);
24
+ const sampleBackground = (image, x, y) => {
25
+ if (x < 0 || y < 0 || x >= image.width || y >= image.height) {
26
+ return null;
27
+ }
28
+ const i = (y * image.width + x) * 4;
29
+ return [image.data[i] ?? 0, image.data[i + 1] ?? 0, image.data[i + 2] ?? 0];
30
+ };
31
+ const rimProfile = (d, plateau, width) => {
32
+ if (d <= -width)
33
+ return 0;
34
+ if (d >= -plateau)
35
+ return 1;
36
+ return (d + width) / (width - plateau);
37
+ };
38
+ const byteForLuminance = (luminance) => 255 * Math.max(0, Math.min(1, luminance)) ** (1 / 2.2);
39
+ const pieceRimDelta = (background, shape, size, left, top) => {
40
+ let total = 0;
41
+ let counted = 0;
42
+ for (let ly = 0; ly < size; ly += 4) {
43
+ for (let lx = 0; lx < size; lx += 4) {
44
+ if (coverageFromDistance(shape.distance(lx, ly)) <= 0)
45
+ continue;
46
+ const sample = sampleBackground(background, left + lx, top + ly);
47
+ if (sample === null)
48
+ continue;
49
+ total += relativeLuminance({ r: sample[0], g: sample[1], b: sample[2] });
50
+ counted++;
51
+ }
52
+ }
53
+ if (counted === 0)
54
+ return PIECE_RIM_MAX_STEP;
55
+ const pieceLuminance = total / counted;
56
+ const lighten = pieceLuminance <= PIECE_RIM_DIRECTION_THRESHOLD;
57
+ const target = lighten
58
+ ? PIECE_RIM_TARGET_CONTRAST * (pieceLuminance + 0.05) - 0.05
59
+ : (pieceLuminance + 0.05) / PIECE_RIM_TARGET_CONTRAST - 0.05;
60
+ const delta = byteForLuminance(target) - byteForLuminance(pieceLuminance);
61
+ const capped = Math.max(-PIECE_RIM_MAX_STEP, Math.min(PIECE_RIM_MAX_STEP, delta));
62
+ const floor = 24;
63
+ if (Math.abs(capped) < floor) {
64
+ return lighten ? floor : -floor;
65
+ }
66
+ return capped;
67
+ };
68
+ export const cutNotch = (prng, background, shape, size, placement, holeDarken) => {
69
+ const half = size / 2;
70
+ const left = Math.round(placement.targetX - half);
71
+ const top = Math.round(placement.targetY - half);
72
+ const pieceData = Buffer.alloc(size * size * 4);
73
+ const brightness = prng.range(PIECE_BRIGHTNESS_RANGE[0], PIECE_BRIGHTNESS_RANGE[1]);
74
+ const rimStep = pieceRimDelta(background, shape, size, left, top);
75
+ const rim = pieceRimGeometry(size);
76
+ for (let ly = 0; ly < size; ly++) {
77
+ for (let lx = 0; lx < size; lx++) {
78
+ const d = shape.distance(lx, ly);
79
+ const coverage = coverageFromDistance(d);
80
+ const pi = (ly * size + lx) * 4;
81
+ if (coverage <= 0) {
82
+ pieceData[pi + 3] = 0;
83
+ continue;
84
+ }
85
+ const sample = sampleBackground(background, left + lx, top + ly);
86
+ if (sample === null) {
87
+ pieceData[pi + 3] = 0;
88
+ continue;
89
+ }
90
+ const [r, g, b] = sample;
91
+ const edgeLight = d > -2 ? PIECE_EDGE_LIGHT * (1 + d / 2) : 0;
92
+ const rimDelta = rimStep * rimProfile(d, rim.plateau, rim.width);
93
+ const noise = (prng.next() - 0.5) * 2 * PIECE_NOISE;
94
+ const delta = brightness + edgeLight + rimDelta + noise;
95
+ pieceData[pi] = clamp255(Math.round(r + delta));
96
+ pieceData[pi + 1] = clamp255(Math.round(g + delta));
97
+ pieceData[pi + 2] = clamp255(Math.round(b + delta));
98
+ pieceData[pi + 3] = Math.round(coverage * 255);
99
+ }
100
+ }
101
+ for (let ly = -SEAM_NOISE_RADIUS; ly < size + SEAM_NOISE_RADIUS; ly++) {
102
+ for (let lx = -SEAM_NOISE_RADIUS; lx < size + SEAM_NOISE_RADIUS; lx++) {
103
+ const x = left + lx;
104
+ const y = top + ly;
105
+ if (x < 0 || y < 0 || x >= background.width || y >= background.height) {
106
+ continue;
107
+ }
108
+ const bi = (y * background.width + x) * 4;
109
+ const d = shape.distance(lx, ly);
110
+ const coverage = coverageFromDistance(d);
111
+ if (coverage > 0) {
112
+ const r = background.data[bi] ?? 0;
113
+ const g = background.data[bi + 1] ?? 0;
114
+ const b = background.data[bi + 2] ?? 0;
115
+ const edge = d > -3 ? HOLE_INNER_SHADOW * (1 + d / 3) : 0;
116
+ const factor = holeDarken * (1 - edge);
117
+ const mix = coverage;
118
+ background.data[bi] = clamp255(Math.round(r * (1 - mix) + r * factor * mix));
119
+ background.data[bi + 1] = clamp255(Math.round(g * (1 - mix) + g * factor * mix));
120
+ background.data[bi + 2] = clamp255(Math.round(b * (1 - mix) + b * factor * mix));
121
+ }
122
+ else if (d < SEAM_NOISE_RADIUS) {
123
+ const falloff = 1 - d / SEAM_NOISE_RADIUS;
124
+ const noise = (prng.next() - 0.5) * 2 * SEAM_NOISE * falloff;
125
+ background.data[bi] = clamp255(Math.round((background.data[bi] ?? 0) + noise));
126
+ background.data[bi + 1] = clamp255(Math.round((background.data[bi + 1] ?? 0) + noise));
127
+ background.data[bi + 2] = clamp255(Math.round((background.data[bi + 2] ?? 0) + noise));
128
+ }
129
+ }
130
+ }
131
+ return {
132
+ background,
133
+ piece: { data: pieceData, width: size, height: size },
134
+ };
135
+ };
136
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrast.d.ts","sourceRoot":"","sources":["../../src/contrast.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAmBxC,MAAM,MAAM,UAAU,GACnB,QAAQ,GACR,YAAY,GACZ,cAAc,GACd,YAAY,CAAC;AAEhB,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAK7C,CAAC;AAqBF,eAAO,MAAM,iBAAiB,WAAY,GAAG,KAAG,MAGpB,CAAC;AAQ7B,eAAO,MAAM,aAAa,MAAO,GAAG,KAAK,GAAG,KAAG,MAM9C,CAAC;AA8CF,eAAO,MAAM,cAAc,WAAY,GAAG,UAAU,UAAU,KAAG,GAahE,CAAC;AASF,eAAO,MAAM,iBAAiB,MAAO,GAAG,KAAK,GAAG,KAAG,MAYlD,CAAC;AAWF,eAAO,MAAM,gBAAgB,YAAa,SAAS,GAAG,EAAE,KAAG,MAc1D,CAAC"}
@@ -0,0 +1,79 @@
1
+ export const VISION_TYPES = [
2
+ "normal",
3
+ "protanopia",
4
+ "deuteranopia",
5
+ "tritanopia",
6
+ ];
7
+ const toLinear = (channel) => {
8
+ const c = channel / 255;
9
+ return c <= 0.040_45 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
10
+ };
11
+ const fromLinear = (value) => {
12
+ const c = value <= 0.003_130_8 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;
13
+ return Math.min(255, Math.max(0, Math.round(c * 255)));
14
+ };
15
+ export const relativeLuminance = (colour) => 0.2126 * toLinear(colour.r) +
16
+ 0.7152 * toLinear(colour.g) +
17
+ 0.0722 * toLinear(colour.b);
18
+ export const contrastRatio = (a, b) => {
19
+ const la = relativeLuminance(a);
20
+ const lb = relativeLuminance(b);
21
+ const lighter = Math.max(la, lb);
22
+ const darker = Math.min(la, lb);
23
+ return (lighter + 0.05) / (darker + 0.05);
24
+ };
25
+ const DICHROMACY_MATRICES = {
26
+ protanopia: [
27
+ 0.152_86, 1.175_79, -0.328_65, 0.114_75, 0.854_26, 0.030_99, -0.003_86,
28
+ -0.005_34, 1.009_2,
29
+ ],
30
+ deuteranopia: [
31
+ 0.367_7, 0.861_22, -0.228_92, 0.280_39, 0.672_01, 0.047_6, -0.011_8,
32
+ 0.041_64, 0.970_16,
33
+ ],
34
+ tritanopia: [
35
+ 1.255_28, -0.076_57, -0.178_71, -0.078_33, 0.930_87, 0.147_46, 0.004_91,
36
+ 0.221_4, 0.773_09,
37
+ ],
38
+ };
39
+ export const simulateVision = (colour, vision) => {
40
+ if (vision === "normal") {
41
+ return colour;
42
+ }
43
+ const m = DICHROMACY_MATRICES[vision];
44
+ const r = toLinear(colour.r);
45
+ const g = toLinear(colour.g);
46
+ const b = toLinear(colour.b);
47
+ return {
48
+ r: fromLinear(m[0] * r + m[1] * g + m[2] * b),
49
+ g: fromLinear(m[3] * r + m[4] * g + m[5] * b),
50
+ b: fromLinear(m[6] * r + m[7] * g + m[8] * b),
51
+ };
52
+ };
53
+ export const worstCaseContrast = (a, b) => {
54
+ let worst = Number.POSITIVE_INFINITY;
55
+ for (const vision of VISION_TYPES) {
56
+ const ratio = contrastRatio(simulateVision(a, vision), simulateVision(b, vision));
57
+ if (ratio < worst) {
58
+ worst = ratio;
59
+ }
60
+ }
61
+ return worst;
62
+ };
63
+ export const bestPairContrast = (colours) => {
64
+ let best = 1;
65
+ for (let i = 0; i < colours.length; i++) {
66
+ for (let j = i + 1; j < colours.length; j++) {
67
+ const a = colours[i];
68
+ const b = colours[j];
69
+ if (a === undefined || b === undefined)
70
+ continue;
71
+ const ratio = worstCaseContrast(a, b);
72
+ if (ratio > best) {
73
+ best = ratio;
74
+ }
75
+ }
76
+ }
77
+ return best;
78
+ };
79
+ //# sourceMappingURL=contrast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrast.js","sourceRoot":"","sources":["../../src/contrast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoys.d.ts","sourceRoot":"","sources":["../../src/decoys.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA+C5D,eAAO,MAAM,eAAe,eACf,SAAS,QACf,IAAI,QACJ,MAAM,MACR,MAAM,MACN,MAAM,gBACI,MAAM,kBACJ,MAAM,cACV,MAAM,KAChB,IAiDF,CAAC;AAkBF,eAAO,MAAM,WAAW,eACX,SAAS,QACf,IAAI,eACG,MAAM,aACR,MAAM,SACV,cAAc,gBACP,MAAM,kBACJ,MAAM,cACV,MAAM,KAChB,IAyCF,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { createNotchShape } from "./notch.js";
2
+ import { coverageFromDistance } from "./notch.js";
3
+ const NOTCH_CLEARANCE = 0;
4
+ const PLACEMENT_ATTEMPTS = 8;
5
+ const clamp255 = (v) => (v < 0 ? 0 : v > 255 ? 255 : v);
6
+ const distanceSquared = (cx, cy, other) => {
7
+ const dx = cx - other.cx;
8
+ const dy = cy - other.cy;
9
+ return dx * dx + dy * dy;
10
+ };
11
+ const DECOY_INNER_SHADOW = 0.35;
12
+ export const paintDecoyPiece = (background, prng, size, cx, cy, edgeDarkness, bodyBrightness, holeDarken) => {
13
+ const shape = createNotchShape(prng, size);
14
+ const half = size / 2;
15
+ const left = Math.round(cx - half);
16
+ const top = Math.round(cy - half);
17
+ for (let ly = 0; ly < size; ly++) {
18
+ for (let lx = 0; lx < size; lx++) {
19
+ const x = left + lx;
20
+ const y = top + ly;
21
+ if (x < 0 || y < 0 || x >= background.width || y >= background.height) {
22
+ continue;
23
+ }
24
+ const d = shape.distance(lx, ly);
25
+ const coverage = coverageFromDistance(d);
26
+ if (coverage <= 0)
27
+ continue;
28
+ const bi = (y * background.width + x) * 4;
29
+ const r = background.data[bi] ?? 0;
30
+ const g = background.data[bi + 1] ?? 0;
31
+ const b = background.data[bi + 2] ?? 0;
32
+ const edge = d > -3 ? DECOY_INNER_SHADOW * (1 + d / 3) : 0;
33
+ const factor = holeDarken * (1 - edge);
34
+ const dr = r * factor;
35
+ const dg = g * factor;
36
+ const db = b * factor;
37
+ const edgeDark = d > -3 ? edgeDarkness * (1 + d / 3) : 0;
38
+ const delta = bodyBrightness - edgeDark;
39
+ const mixR = r * (1 - coverage) + dr * coverage;
40
+ const mixG = g * (1 - coverage) + dg * coverage;
41
+ const mixB = b * (1 - coverage) + db * coverage;
42
+ background.data[bi] = clamp255(Math.round(mixR + delta * coverage));
43
+ background.data[bi + 1] = clamp255(Math.round(mixG + delta * coverage));
44
+ background.data[bi + 2] = clamp255(Math.round(mixB + delta * coverage));
45
+ }
46
+ }
47
+ };
48
+ const COUNT_JITTER = 0.3;
49
+ export const paintDecoys = (background, prng, targetCount, notchSize, notch, edgeDarkness, bodyBrightness, holeDarken) => {
50
+ if (targetCount <= 0)
51
+ return;
52
+ const jitter = 1 + prng.range(-COUNT_JITTER, COUNT_JITTER);
53
+ const count = Math.max(0, Math.round(targetCount * jitter));
54
+ if (count === 0)
55
+ return;
56
+ const notchClearanceSq = (notchSize * NOTCH_CLEARANCE) ** 2;
57
+ const minX = 0;
58
+ const maxX = background.width;
59
+ const minY = 0;
60
+ const maxY = background.height;
61
+ for (let i = 0; i < count; i++) {
62
+ for (let attempt = 0; attempt < PLACEMENT_ATTEMPTS; attempt++) {
63
+ const cx = prng.range(minX, maxX);
64
+ const cy = prng.range(minY, maxY);
65
+ if (distanceSquared(cx, cy, { cx: notch.targetX, cy: notch.targetY }) <
66
+ notchClearanceSq) {
67
+ continue;
68
+ }
69
+ paintDecoyPiece(background, prng, notchSize, cx, cy, edgeDarkness, bodyBrightness, holeDarken);
70
+ break;
71
+ }
72
+ }
73
+ };
74
+ //# sourceMappingURL=decoys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoys.js","sourceRoot":"","sources":["../../src/decoys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAa5C,eAAO,MAAM,gBAAgB,UAAW,SAAS,KAAG,OAAO,CAAC,MAAM,CAKrD,CAAC;AASd,eAAO,MAAM,WAAW,UAAW,SAAS,KAAG,OAAO,CAAC,MAAM,CAKhD,CAAC;AAGd,eAAO,MAAM,SAAS,UAAW,SAAS,KAAG,OAAO,CAAC,MAAM,CAK9C,CAAC;AAEd,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,MACW,CAAC"}
@@ -0,0 +1,19 @@
1
+ import sharp from "sharp";
2
+ const BACKGROUND_QUALITY = 95;
3
+ export const encodeBackground = (image) => sharp(image.data, {
4
+ raw: { width: image.width, height: image.height, channels: 4 },
5
+ })
6
+ .webp({ quality: BACKGROUND_QUALITY, alphaQuality: 100, effort: 4 })
7
+ .toBuffer();
8
+ export const encodePiece = (image) => sharp(image.data, {
9
+ raw: { width: image.width, height: image.height, channels: 4 },
10
+ })
11
+ .webp({ lossless: true, alphaQuality: 100, effort: 4 })
12
+ .toBuffer();
13
+ export const encodePng = (image) => sharp(image.data, {
14
+ raw: { width: image.width, height: image.height, channels: 4 },
15
+ })
16
+ .png()
17
+ .toBuffer();
18
+ export const toDataUri = (webp) => `data:image/webp;base64,${webp.toString("base64")}`;
19
+ //# sourceMappingURL=encode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAgB,EAAmB,EAAE,CACrE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;IACjB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;CAC9D,CAAC;KACA,IAAI,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;KACnE,QAAQ,EAAE,CAAC;AASd,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAmB,EAAE,CAChE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;IACjB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;CAC9D,CAAC;KACA,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;KACtD,QAAQ,EAAE,CAAC;AAGd,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAgB,EAAmB,EAAE,CAC9D,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;IACjB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;CAC9D,CAAC;KACA,GAAG,EAAE;KACL,QAAQ,EAAE,CAAC;AAEd,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CACjD,0BAA0B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACX,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/D,YAAY,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACN,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,KAAK,UAAU,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,oBAAoB,EACpB,WAAW,EACX,QAAQ,EACR,KAAK,GAAG,GACR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACN,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,SAAS,GACT,MAAM,aAAa,CAAC;AACrB,YAAY,EACX,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,SAAS,GACT,MAAM,YAAY,CAAC;AAOpB,eAAO,MAAM,gBAAgB,EAAE,cAI9B,CAAC;AAQF,eAAO,MAAM,uBAAuB,EAAE,oBAMrC,CAAC;AAQF,eAAO,MAAM,gBAAgB,cAClB,cAAc,SAClB,MAAM,KACV,SACmE,CAAC;AAOvE,eAAO,MAAM,YAAY,eACZ,SAAS,aACV,cAAc,aACf,cAAc,aACd,oBAAoB,SACxB,MAAM,KACV,OAAO,CAAC,cAAc,CAsCxB,CAAC;AASF,eAAO,MAAM,YAAY,cACb,cAAc,aACf,cAAc,aACd,oBAAoB,mBACd,MAAM,eACV,MAAM,KAChB,OAAO,CAAC,cAAc,CAOvB,CAAC"}