@takram/three-geospatial 0.0.1-alpha.5 → 0.0.1-alpha.6
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/build/index.cjs +1 -43
- package/build/index.cjs.map +1 -1
- package/build/index.js +328 -771
- package/build/index.js.map +1 -1
- package/build/shaders.cjs +276 -0
- package/build/shaders.cjs.map +1 -0
- package/build/shaders.js +286 -0
- package/build/shaders.js.map +1 -0
- package/package.json +7 -3
- package/src/DataLoader.ts +1 -0
- package/src/Texture3DLoader.ts +81 -0
- package/src/bufferGeometry.ts +2 -2
- package/src/constants.ts +3 -0
- package/src/index.ts +3 -10
- package/src/r3f/index.ts +1 -0
- package/src/r3f/types.ts +64 -0
- package/src/resolveIncludes.test.ts +21 -0
- package/src/resolveIncludes.ts +22 -0
- package/src/shaders/depth.glsl +3 -1
- package/src/shaders/generators.glsl +9 -0
- package/src/shaders/index.ts +17 -0
- package/src/shaders/math.glsl +52 -0
- package/src/shaders/poissonDisk.glsl +21 -0
- package/src/shaders/raySphereIntersection.glsl +134 -0
- package/src/shaders/turbo.glsl +9 -0
- package/src/types.ts +5 -51
- package/src/unrollLoops.ts +23 -0
- package/types/DataLoader.d.ts +4 -4
- package/types/Texture3DLoader.d.ts +5 -0
- package/types/TypedArrayLoader.d.ts +3 -3
- package/types/constants.d.ts +3 -0
- package/types/index.d.ts +3 -3
- package/types/r3f/index.d.ts +1 -0
- package/types/r3f/types.d.ts +22 -0
- package/types/resolveIncludes.d.ts +5 -0
- package/types/shaders/index.d.ts +8 -0
- package/types/types.d.ts +5 -20
- package/types/unrollLoops.d.ts +1 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
// Taken from: https://developer.download.nvidia.com/whitepapers/2008/PCSS_Integration.pdf
|
2
|
+
const vec2 poissonDisk[16] = vec2[16](
|
3
|
+
vec2(-0.94201624, -0.39906216),
|
4
|
+
vec2(0.94558609, -0.76890725),
|
5
|
+
vec2(-0.094184101, -0.9293887),
|
6
|
+
vec2(0.34495938, 0.2938776),
|
7
|
+
vec2(-0.91588581, 0.45771432),
|
8
|
+
vec2(-0.81544232, -0.87912464),
|
9
|
+
vec2(-0.38277543, 0.27676845),
|
10
|
+
vec2(0.97484398, 0.75648379),
|
11
|
+
vec2(0.44323325, -0.97511554),
|
12
|
+
vec2(0.53742981, -0.4737342),
|
13
|
+
vec2(-0.26496911, -0.41893023),
|
14
|
+
vec2(0.79197514, 0.19090188),
|
15
|
+
vec2(-0.2418884, 0.99706507),
|
16
|
+
vec2(-0.81409955, 0.9143759),
|
17
|
+
vec2(0.19984126, 0.78641367),
|
18
|
+
vec2(0.14383161, -0.1410079)
|
19
|
+
);
|
20
|
+
|
21
|
+
#define POISSON_DISK_COUNT (16)
|
@@ -0,0 +1,134 @@
|
|
1
|
+
float raySphereFirstIntersection(
|
2
|
+
const vec3 origin,
|
3
|
+
const vec3 direction,
|
4
|
+
const vec3 center,
|
5
|
+
const float radius
|
6
|
+
) {
|
7
|
+
vec3 a = origin - center;
|
8
|
+
float b = 2.0 * dot(direction, a);
|
9
|
+
float c = dot(a, a) - radius * radius;
|
10
|
+
float discriminant = b * b - 4.0 * c;
|
11
|
+
return discriminant < 0.0
|
12
|
+
? -1.0
|
13
|
+
: (-b - sqrt(discriminant)) * 0.5;
|
14
|
+
}
|
15
|
+
|
16
|
+
float raySphereFirstIntersection(const vec3 origin, const vec3 direction, const float radius) {
|
17
|
+
return raySphereFirstIntersection(origin, direction, vec3(0.0), radius);
|
18
|
+
}
|
19
|
+
|
20
|
+
vec4 raySphereFirstIntersection(
|
21
|
+
const vec3 origin,
|
22
|
+
const vec3 direction,
|
23
|
+
const vec3 center,
|
24
|
+
const vec4 radius
|
25
|
+
) {
|
26
|
+
vec3 a = origin - center;
|
27
|
+
float b = 2.0 * dot(direction, a);
|
28
|
+
vec4 c = dot(a, a) - radius * radius;
|
29
|
+
vec4 discriminant = b * b - 4.0 * c;
|
30
|
+
vec4 mask = step(discriminant, vec4(0.0));
|
31
|
+
return mix((-b - sqrt(max(vec4(0.0), discriminant))) * 0.5, vec4(-1.0), mask);
|
32
|
+
}
|
33
|
+
|
34
|
+
vec4 raySphereFirstIntersection(const vec3 origin, const vec3 direction, const vec4 radius) {
|
35
|
+
return raySphereFirstIntersection(origin, direction, vec3(0.0), radius);
|
36
|
+
}
|
37
|
+
|
38
|
+
float raySphereSecondIntersection(
|
39
|
+
const vec3 origin,
|
40
|
+
const vec3 direction,
|
41
|
+
const vec3 center,
|
42
|
+
const float radius
|
43
|
+
) {
|
44
|
+
vec3 a = origin - center;
|
45
|
+
float b = 2.0 * dot(direction, a);
|
46
|
+
float c = dot(a, a) - radius * radius;
|
47
|
+
float discriminant = b * b - 4.0 * c;
|
48
|
+
return discriminant < 0.0
|
49
|
+
? -1.0
|
50
|
+
: (-b + sqrt(discriminant)) * 0.5;
|
51
|
+
}
|
52
|
+
|
53
|
+
float raySphereSecondIntersection(const vec3 origin, const vec3 direction, const float radius) {
|
54
|
+
return raySphereSecondIntersection(origin, direction, vec3(0.0), radius);
|
55
|
+
}
|
56
|
+
|
57
|
+
vec4 raySphereSecondIntersection(
|
58
|
+
const vec3 origin,
|
59
|
+
const vec3 direction,
|
60
|
+
const vec3 center,
|
61
|
+
const vec4 radius
|
62
|
+
) {
|
63
|
+
vec3 a = origin - center;
|
64
|
+
float b = 2.0 * dot(direction, a);
|
65
|
+
vec4 c = dot(a, a) - radius * radius;
|
66
|
+
vec4 discriminant = b * b - 4.0 * c;
|
67
|
+
vec4 mask = step(discriminant, vec4(0.0));
|
68
|
+
return mix((-b + sqrt(max(vec4(0.0), discriminant))) * 0.5, vec4(-1.0), mask);
|
69
|
+
}
|
70
|
+
|
71
|
+
vec4 raySphereSecondIntersection(const vec3 origin, const vec3 direction, const vec4 radius) {
|
72
|
+
return raySphereSecondIntersection(origin, direction, vec3(0.0), radius);
|
73
|
+
}
|
74
|
+
|
75
|
+
void raySphereIntersections(
|
76
|
+
const vec3 origin,
|
77
|
+
const vec3 direction,
|
78
|
+
const vec3 center,
|
79
|
+
const float radius,
|
80
|
+
out float intersection1,
|
81
|
+
out float intersection2
|
82
|
+
) {
|
83
|
+
vec3 a = origin - center;
|
84
|
+
float b = 2.0 * dot(direction, a);
|
85
|
+
float c = dot(a, a) - radius * radius;
|
86
|
+
float discriminant = b * b - 4.0 * c;
|
87
|
+
if (discriminant < 0.0) {
|
88
|
+
intersection1 = -1.0;
|
89
|
+
intersection2 = -1.0;
|
90
|
+
return;
|
91
|
+
} else {
|
92
|
+
float Q = sqrt(discriminant);
|
93
|
+
intersection1 = (-b - Q) * 0.5;
|
94
|
+
intersection2 = (-b + Q) * 0.5;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
void raySphereIntersections(
|
99
|
+
const vec3 origin,
|
100
|
+
const vec3 direction,
|
101
|
+
const float radius,
|
102
|
+
out float intersection1,
|
103
|
+
out float intersection2
|
104
|
+
) {
|
105
|
+
raySphereIntersections(origin, direction, vec3(0.0), radius, intersection1, intersection2);
|
106
|
+
}
|
107
|
+
|
108
|
+
void raySphereIntersections(
|
109
|
+
const vec3 origin,
|
110
|
+
const vec3 direction,
|
111
|
+
const vec3 center,
|
112
|
+
const vec4 radius,
|
113
|
+
out vec4 intersection1,
|
114
|
+
out vec4 intersection2
|
115
|
+
) {
|
116
|
+
vec3 a = origin - center;
|
117
|
+
float b = 2.0 * dot(direction, a);
|
118
|
+
vec4 c = dot(a, a) - radius * radius;
|
119
|
+
vec4 discriminant = b * b - 4.0 * c;
|
120
|
+
vec4 mask = step(discriminant, vec4(0.0));
|
121
|
+
vec4 Q = sqrt(max(vec4(0.0), discriminant));
|
122
|
+
intersection1 = mix((-b - Q) * 0.5, vec4(-1.0), mask);
|
123
|
+
intersection2 = mix((-b + Q) * 0.5, vec4(-1.0), mask);
|
124
|
+
}
|
125
|
+
|
126
|
+
void raySphereIntersections(
|
127
|
+
const vec3 origin,
|
128
|
+
const vec3 direction,
|
129
|
+
const vec4 radius,
|
130
|
+
out vec4 intersection1,
|
131
|
+
out vec4 intersection2
|
132
|
+
) {
|
133
|
+
raySphereIntersections(origin, direction, vec3(0.0), radius, intersection1, intersection2);
|
134
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
// A fifth-order polynomial approximation of Turbo color map.
|
2
|
+
// See: https://observablehq.com/@mbostock/turbo
|
3
|
+
// prettier-ignore
|
4
|
+
vec3 turbo(const float x) {
|
5
|
+
float r = 0.1357 + x * (4.5974 - x * (42.3277 - x * (130.5887 - x * (150.5666 - x * 58.1375))));
|
6
|
+
float g = 0.0914 + x * (2.1856 + x * (4.8052 - x * (14.0195 - x * (4.2109 + x * 2.7747))));
|
7
|
+
float b = 0.1067 + x * (12.5925 - x * (60.1097 - x * (109.0745 - x * (88.5066 - x * 26.8183))));
|
8
|
+
return vec3(r, g, b);
|
9
|
+
}
|
package/src/types.ts
CHANGED
@@ -1,54 +1,8 @@
|
|
1
|
-
import {
|
2
|
-
type Matrix2,
|
3
|
-
type Matrix3,
|
4
|
-
type Matrix4,
|
5
|
-
type Vector2,
|
6
|
-
type Vector3,
|
7
|
-
type Vector4
|
8
|
-
} from 'three'
|
9
|
-
import { type ReadonlyTuple } from 'type-fest'
|
1
|
+
import { type Uniform } from 'three'
|
10
2
|
|
11
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
12
3
|
export type Callable = (...args: any) => any
|
13
4
|
|
14
|
-
export type
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
// Non-readonly version of ReadonlyTuple. This is not type-safe because mutable
|
19
|
-
// methods still exist in the type.
|
20
|
-
// See https://github.com/sindresorhus/type-fest/blob/main/source/readonly-tuple.d.ts
|
21
|
-
type BuildTupleHelper<
|
22
|
-
Element,
|
23
|
-
Length extends number,
|
24
|
-
Rest extends Element[]
|
25
|
-
> = Rest['length'] extends Length
|
26
|
-
? [...Rest]
|
27
|
-
: BuildTupleHelper<Element, Length, [Element, ...Rest]>
|
28
|
-
|
29
|
-
export type Tuple<T, Length extends number> = number extends Length
|
30
|
-
? readonly T[]
|
31
|
-
: BuildTupleHelper<T, Length, []>
|
32
|
-
|
33
|
-
export type Tuple2<T = number> = BuildTupleHelper<T, 2, []>
|
34
|
-
export type Tuple3<T = number> = BuildTupleHelper<T, 3, []>
|
35
|
-
export type Tuple4<T = number> = BuildTupleHelper<T, 4, []>
|
36
|
-
|
37
|
-
// Suppose return type of the mutable methods of classes like Vector3 is `this`.
|
38
|
-
// TODO: How can we specify `this` as a constraint?
|
39
|
-
type ReadonlyThreeInstance<T> = Readonly<{
|
40
|
-
[K in keyof T as T[K] extends Callable
|
41
|
-
? ReturnType<T[K]> extends T
|
42
|
-
? K extends 'clone'
|
43
|
-
? K
|
44
|
-
: never
|
45
|
-
: K
|
46
|
-
: K]: T[K]
|
47
|
-
}>
|
48
|
-
|
49
|
-
export type ReadonlyVector2 = ReadonlyThreeInstance<Vector2>
|
50
|
-
export type ReadonlyVector3 = ReadonlyThreeInstance<Vector3>
|
51
|
-
export type ReadonlyVector4 = ReadonlyThreeInstance<Vector4>
|
52
|
-
export type ReadonlyMatrix2 = ReadonlyThreeInstance<Matrix2>
|
53
|
-
export type ReadonlyMatrix3 = ReadonlyThreeInstance<Matrix3>
|
54
|
-
export type ReadonlyMatrix4 = ReadonlyThreeInstance<Matrix4>
|
5
|
+
export type UniformMap<T> = Omit<Map<string, Uniform>, 'get'> & {
|
6
|
+
get: <K extends keyof T>(key: K) => T[K]
|
7
|
+
set: <K extends keyof T>(key: K, value: T[K]) => void
|
8
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
// Based on: https://github.com/mrdoob/three.js/blob/r170/src/renderers/webgl/WebGLProgram.js#L294
|
2
|
+
|
3
|
+
const unrollLoopPattern =
|
4
|
+
/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*(?:i\s*\+\+|\+\+\s*i)\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g
|
5
|
+
|
6
|
+
function loopReplacer(
|
7
|
+
match: string,
|
8
|
+
start: string,
|
9
|
+
end: string,
|
10
|
+
snippet: string
|
11
|
+
): string {
|
12
|
+
let string = ''
|
13
|
+
for (let i = parseInt(start); i < parseInt(end); ++i) {
|
14
|
+
string += snippet
|
15
|
+
.replace(/\[\s*i\s*\]/g, '[' + i + ']')
|
16
|
+
.replace(/UNROLLED_LOOP_INDEX/g, `${i}`)
|
17
|
+
}
|
18
|
+
return string
|
19
|
+
}
|
20
|
+
|
21
|
+
export function unrollLoops(string: string): string {
|
22
|
+
return string.replace(unrollLoopPattern, loopReplacer)
|
23
|
+
}
|
package/types/DataLoader.d.ts
CHANGED
@@ -27,11 +27,11 @@ export declare function createDataTextureLoaderClass<T extends TypedArray>(parse
|
|
27
27
|
export declare function createData3DTextureLoader<T extends TypedArray>(parser: TypedArrayParser<T>, parameters?: Data3DTextureParameters): DataLoader<Data3DTexture, T>;
|
28
28
|
export declare function createDataTextureLoader<T extends TypedArray>(parser: TypedArrayParser<T>, parameters?: DataTextureParameters): DataLoader<DataTexture, T>;
|
29
29
|
/** @deprecated Use createDataTextureLoaderClass instead. */
|
30
|
-
export declare const Int16Data2DLoader: Class<DataLoader<DataTexture, Int16Array
|
30
|
+
export declare const Int16Data2DLoader: Class<DataLoader<DataTexture, Int16Array<ArrayBufferLike>>>;
|
31
31
|
/** @deprecated Use createDataTextureLoaderClass instead. */
|
32
|
-
export declare const Uint16Data2DLoader: Class<DataLoader<DataTexture, Uint16Array
|
32
|
+
export declare const Uint16Data2DLoader: Class<DataLoader<DataTexture, Uint16Array<ArrayBufferLike>>>;
|
33
33
|
/** @deprecated Use createDataTextureLoaderClass instead. */
|
34
|
-
export declare const Float32Data2DLoader: Class<DataLoader<DataTexture, Float32Array
|
34
|
+
export declare const Float32Data2DLoader: Class<DataLoader<DataTexture, Float32Array<ArrayBufferLike>>>;
|
35
35
|
/** @deprecated Use createData3DTextureLoaderClass instead. */
|
36
|
-
export declare const Float32Data3DLoader: Class<DataLoader<Data3DTexture, Float32Array
|
36
|
+
export declare const Float32Data3DLoader: Class<DataLoader<Data3DTexture, Float32Array<ArrayBufferLike>>>;
|
37
37
|
export {};
|
@@ -9,8 +9,8 @@ export declare abstract class TypedArrayLoader<T extends TypedArray> extends Loa
|
|
9
9
|
export declare function createTypedArrayLoaderClass<T extends TypedArray>(parser: TypedArrayParser<T>): Class<TypedArrayLoader<T>>;
|
10
10
|
export declare function createTypedArrayLoader<T extends TypedArray>(parser: TypedArrayParser<T>): TypedArrayLoader<T>;
|
11
11
|
/** @deprecated Use createTypedArrayLoaderClass instead. */
|
12
|
-
export declare const Int16ArrayLoader: Class<TypedArrayLoader<Int16Array
|
12
|
+
export declare const Int16ArrayLoader: Class<TypedArrayLoader<Int16Array<ArrayBufferLike>>>;
|
13
13
|
/** @deprecated Use createTypedArrayLoaderClass instead. */
|
14
|
-
export declare const Uint16ArrayLoader: Class<TypedArrayLoader<Uint16Array
|
14
|
+
export declare const Uint16ArrayLoader: Class<TypedArrayLoader<Uint16Array<ArrayBufferLike>>>;
|
15
15
|
/** @deprecated Use createTypedArrayLoaderClass instead. */
|
16
|
-
export declare const Float32ArrayLoader: Class<TypedArrayLoader<Float32Array
|
16
|
+
export declare const Float32ArrayLoader: Class<TypedArrayLoader<Float32Array<ArrayBufferLike>>>;
|
package/types/index.d.ts
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
export declare const depthShader: string;
|
2
|
-
export declare const packingShader: string;
|
3
|
-
export declare const transformShader: string;
|
4
1
|
export * from './ArrayBufferLoader';
|
5
2
|
export * from './assertions';
|
6
3
|
export * from './bufferGeometry';
|
4
|
+
export * from './constants';
|
7
5
|
export * from './DataLoader';
|
8
6
|
export * from './Ellipsoid';
|
9
7
|
export * from './EllipsoidGeometry';
|
@@ -11,9 +9,11 @@ export * from './Geodetic';
|
|
11
9
|
export * from './math';
|
12
10
|
export * from './PointOfView';
|
13
11
|
export * from './Rectangle';
|
12
|
+
export * from './resolveIncludes';
|
14
13
|
export * from './TileCoordinate';
|
15
14
|
export * from './TilingScheme';
|
16
15
|
export * from './typedArray';
|
17
16
|
export * from './TypedArrayLoader';
|
18
17
|
export * from './typedArrayParsers';
|
19
18
|
export * from './types';
|
19
|
+
export * from './unrollLoops';
|
package/types/r3f/index.d.ts
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
import { Callable } from '../types';
|
2
|
+
import { WritableKeysOf } from 'type-fest';
|
3
|
+
import { Vector2 as Vector2Impl, Vector3 as Vector3Impl, Vector4 as Vector4Impl } from 'three';
|
4
|
+
import { Color, ExtendedColors, NodeProps, Overwrite, Vector2, Vector3, Vector4 } from '@react-three/fiber';
|
5
|
+
|
6
|
+
export type ExtendedVectors<T> = {
|
7
|
+
[K in keyof T]: Vector2Impl extends T[K] ? Vector2 | T[K] : Vector3Impl extends T[K] ? Vector3 | T[K] : Vector4Impl extends T[K] ? Vector4 | T[K] : T[K];
|
8
|
+
};
|
9
|
+
export type ExtendedProps<T> = ExtendedColors<ExtendedVectors<T>>;
|
10
|
+
type NonFunctionKeys<T> = keyof {
|
11
|
+
[K in keyof T as Callable extends T[K] ? never : K]: any;
|
12
|
+
};
|
13
|
+
type WritableNonExtendableKeysOf<T> = WritableKeysOf<T> | keyof {
|
14
|
+
[K in keyof T as Vector2Impl extends T[K] ? K : Vector3Impl extends T[K] ? K : Vector4Impl extends T[K] ? K : Color extends T[K] ? K : never]: any;
|
15
|
+
};
|
16
|
+
export type PassThoughInstanceProps<RefType, Args extends readonly any[], Props> = Overwrite<ExtendedProps<{
|
17
|
+
[K in NonFunctionKeys<Props> as K extends WritableNonExtendableKeysOf<Props> ? K : never]: Props[K];
|
18
|
+
}>, NodeProps<RefType, Args>>;
|
19
|
+
export type ExpandNestedProps<T, Prop extends keyof T & string> = {
|
20
|
+
[K in keyof T[Prop] as K extends string ? `${Prop}-${K}` : never]: T[Prop][K];
|
21
|
+
};
|
22
|
+
export {};
|
@@ -0,0 +1,8 @@
|
|
1
|
+
export declare const depth: string;
|
2
|
+
export declare const generators: string;
|
3
|
+
export declare const math: string;
|
4
|
+
export declare const packing: string;
|
5
|
+
export declare const poissonDisk: string;
|
6
|
+
export declare const raySphereIntersection: string;
|
7
|
+
export declare const transform: string;
|
8
|
+
export declare const turbo: string;
|
package/types/types.d.ts
CHANGED
@@ -1,22 +1,7 @@
|
|
1
|
-
import {
|
2
|
-
import { Matrix2, Matrix3, Matrix4, Vector2, Vector3, Vector4 } from 'three';
|
1
|
+
import { Uniform } from 'three';
|
3
2
|
|
4
3
|
export type Callable = (...args: any) => any;
|
5
|
-
export type
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
export type Tuple<T, Length extends number> = number extends Length ? readonly T[] : BuildTupleHelper<T, Length, []>;
|
10
|
-
export type Tuple2<T = number> = BuildTupleHelper<T, 2, []>;
|
11
|
-
export type Tuple3<T = number> = BuildTupleHelper<T, 3, []>;
|
12
|
-
export type Tuple4<T = number> = BuildTupleHelper<T, 4, []>;
|
13
|
-
type ReadonlyThreeInstance<T> = Readonly<{
|
14
|
-
[K in keyof T as T[K] extends Callable ? ReturnType<T[K]> extends T ? K extends 'clone' ? K : never : K : K]: T[K];
|
15
|
-
}>;
|
16
|
-
export type ReadonlyVector2 = ReadonlyThreeInstance<Vector2>;
|
17
|
-
export type ReadonlyVector3 = ReadonlyThreeInstance<Vector3>;
|
18
|
-
export type ReadonlyVector4 = ReadonlyThreeInstance<Vector4>;
|
19
|
-
export type ReadonlyMatrix2 = ReadonlyThreeInstance<Matrix2>;
|
20
|
-
export type ReadonlyMatrix3 = ReadonlyThreeInstance<Matrix3>;
|
21
|
-
export type ReadonlyMatrix4 = ReadonlyThreeInstance<Matrix4>;
|
22
|
-
export {};
|
4
|
+
export type UniformMap<T> = Omit<Map<string, Uniform>, 'get'> & {
|
5
|
+
get: <K extends keyof T>(key: K) => T[K];
|
6
|
+
set: <K extends keyof T>(key: K, value: T[K]) => void;
|
7
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare function unrollLoops(string: string): string;
|