| 1925 | * @internal |
| 1926 | */ |
| 1927 | export function getIndexSignatureKeys( |
| 1928 | input: { readonly [x: PropertyKey]: unknown }, |
| 1929 | parameter: IndexSignatureParameter, |
| 1930 | options: ParseOptions = defaultParseOptions |
| 1931 | ): ReadonlyArray<PropertyKey> { |
| 1932 | let stringKeys: ReadonlyArray<string> | undefined |
| 1933 | let symbolKeys: ReadonlyArray<symbol> | undefined |
| 1934 | |
| 1935 | function go(parameter: AST): ReadonlyArray<PropertyKey> { |
| 1936 | switch (parameter._tag) { |
| 1937 | case "String": |
| 1938 | case "TemplateLiteral": |
| 1939 | return (stringKeys ??= Object.keys(input)).filter((k) => parameter.matchPart(k, options) !== undefined) |
| 1940 | case "Number": |
| 1941 | return (stringKeys ??= Object.keys(input)).filter((k) => parameter.matchKey(k, options) !== undefined) |
| 1942 | case "Symbol": |
| 1943 | return (symbolKeys ??= Object.getOwnPropertySymbols(input)).filter((k) => |
| 1944 | parameter.matchKey(k, options) !== undefined |
| 1945 | ) |
| 1946 | case "Union": |
| 1947 | return [...new Set(parameter.types.flatMap(go))] |
| 1948 | default: |
| 1949 | return [] |
| 1950 | } |
| 1951 | } |
| 1952 | return go(parameterFromPropertyKey(toEncoded(parameter))) |
| 1953 | } |
| 1954 | |
| 1955 | /** |
| 1956 | * Represents a named property within an {@link Objects} node. |