@openneuro/search 4.20.5 → 4.20.6-alpha.3
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/dist/auth.js +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/indexes/datasets.js +1 -1
- package/dist/names.js +1 -1
- package/dist/query.d.ts +2 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +1 -1
- package/package.json +3 -3
- package/src/__tests__/indexDatasets.spec.ts +25 -25
- package/src/__tests__/names.spec.ts +13 -13
- package/src/auth.ts +2 -2
- package/src/index.ts +5 -5
- package/src/indexes/datasets.ts +3 -3
- package/src/names.ts +2 -2
- package/src/query.ts +6 -6
package/dist/auth.js
CHANGED
|
@@ -8,7 +8,7 @@ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
|
8
8
|
/** Create a dataset:indexing scoped token for search indexing */
|
|
9
9
|
function indexingToken(secret) {
|
|
10
10
|
return jsonwebtoken_1.default.sign({
|
|
11
|
-
scopes: [
|
|
11
|
+
scopes: ["dataset:indexing"],
|
|
12
12
|
}, secret, { expiresIn: 60 * 60 * 3 });
|
|
13
13
|
}
|
|
14
14
|
exports.indexingToken = indexingToken;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DatasetsIndex } from
|
|
2
|
-
import { DatasetQueryResult, indexDataset, indexQuery, queryForIndex } from
|
|
3
|
-
import { indexingToken } from
|
|
4
|
-
export {
|
|
1
|
+
import { DatasetsIndex } from "./indexes/datasets";
|
|
2
|
+
import { DatasetQueryResult, indexDataset, indexQuery, queryForIndex } from "./query";
|
|
3
|
+
import { indexingToken } from "./auth";
|
|
4
|
+
export { DatasetQueryResult, DatasetsIndex, indexDataset, indexingToken, indexQuery, queryForIndex, };
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,aAAa,EACd,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EACL,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,aAAa,EACd,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,UAAU,EACV,aAAa,GACd,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.queryForIndex = exports.indexQuery = exports.indexingToken = exports.indexDataset = exports.DatasetsIndex = void 0;
|
|
4
4
|
const datasets_1 = require("./indexes/datasets");
|
|
5
5
|
Object.defineProperty(exports, "DatasetsIndex", { enumerable: true, get: function () { return datasets_1.DatasetsIndex; } });
|
|
6
6
|
const query_1 = require("./query");
|
package/dist/indexes/datasets.js
CHANGED
|
@@ -7,7 +7,7 @@ exports.DatasetsIndex = void 0;
|
|
|
7
7
|
const datasets_mapping_json_1 = __importDefault(require("../mappings/datasets-mapping.json"));
|
|
8
8
|
const names_1 = require("../names");
|
|
9
9
|
exports.DatasetsIndex = {
|
|
10
|
-
name: (0, names_1.elasticMappingName)(
|
|
10
|
+
name: (0, names_1.elasticMappingName)("datasets", datasets_mapping_json_1.default),
|
|
11
11
|
mapping: datasets_mapping_json_1.default,
|
|
12
12
|
};
|
|
13
13
|
exports.default = exports.DatasetsIndex;
|
package/dist/names.js
CHANGED
|
@@ -9,7 +9,7 @@ const crypto_1 = __importDefault(require("crypto"));
|
|
|
9
9
|
* Hash mapping objects to provide a stable index name if the mapping is unchanged
|
|
10
10
|
* @param mapping ElasticSearch mapping object
|
|
11
11
|
*/
|
|
12
|
-
const hashElasticMapping = (mapping) => crypto_1.default.createHash(
|
|
12
|
+
const hashElasticMapping = (mapping) => crypto_1.default.createHash("sha1").update(JSON.stringify(mapping)).digest("hex");
|
|
13
13
|
exports.hashElasticMapping = hashElasticMapping;
|
|
14
14
|
const elasticMappingName = (name, mapping) => `${name}-${(0, exports.hashElasticMapping)(mapping)}`;
|
|
15
15
|
exports.elasticMappingName = elasticMappingName;
|
package/dist/query.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Client as ElasticClient, RequestParams
|
|
2
|
-
import { ApolloClient, NormalizedCacheObject } from
|
|
1
|
+
import { ApiResponse, Client as ElasticClient, RequestParams } from "@elastic/elasticsearch";
|
|
2
|
+
import { ApolloClient, NormalizedCacheObject } from "@apollo/client";
|
|
3
3
|
export declare const INDEX_DATASET_FRAGMENT: import("@apollo/client").DocumentNode;
|
|
4
4
|
export declare const indexDatasetQuery: import("@apollo/client").DocumentNode;
|
|
5
5
|
export declare const indexQuery: import("@apollo/client").DocumentNode;
|
package/dist/query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,MAAM,IAAI,aAAa,EAEvB,aAAa,EACd,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAO,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAGzE,eAAO,MAAM,sBAAsB,uCA0ElC,CAAA;AAED,eAAO,MAAM,iBAAiB,uCAO7B,CAAA;AAED,eAAO,MAAM,UAAU,uCAoBtB,CAAA;AAGD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACnC,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,kBAAkB,GAC7B,aAAa,CAAC,KAAK,CASrB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC,EACjD,SAAS,EAAE,MAAM,4DAOlB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAUtB"}
|
package/dist/query.js
CHANGED
|
@@ -131,7 +131,7 @@ function queryForIndex(apolloClient, datasetId) {
|
|
|
131
131
|
return apolloClient.query({
|
|
132
132
|
query: exports.indexDatasetQuery,
|
|
133
133
|
variables: { datasetId },
|
|
134
|
-
errorPolicy:
|
|
134
|
+
errorPolicy: "all",
|
|
135
135
|
});
|
|
136
136
|
}
|
|
137
137
|
exports.queryForIndex = queryForIndex;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openneuro/search",
|
|
3
|
-
"version": "4.20.
|
|
3
|
+
"version": "4.20.6-alpha.3",
|
|
4
4
|
"description": "OpenNeuro search client functions.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"browser": "src/index.ts",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@apollo/client": "3.7.2",
|
|
19
19
|
"@elastic/elasticsearch": "7.15.0",
|
|
20
|
-
"graphql": "16.
|
|
20
|
+
"graphql": "16.8.1",
|
|
21
21
|
"jsonwebtoken": "^9.0.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"publishConfig": {
|
|
30
30
|
"access": "public"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "74d0a6d75494f382655482c563a52d6ed82477ec"
|
|
33
33
|
}
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import { extractDatasetDocument } from
|
|
1
|
+
import { extractDatasetDocument } from "../query"
|
|
2
2
|
|
|
3
|
-
describe(
|
|
4
|
-
describe(
|
|
5
|
-
it(
|
|
3
|
+
describe("indexDatasets", () => {
|
|
4
|
+
describe("extractDatasetDocument", () => {
|
|
5
|
+
it("filters __typename fields", () => {
|
|
6
6
|
expect(
|
|
7
7
|
extractDatasetDocument({
|
|
8
|
-
id:
|
|
8
|
+
id: "ds000005",
|
|
9
9
|
metadata: {
|
|
10
|
-
species:
|
|
10
|
+
species: "Human",
|
|
11
11
|
},
|
|
12
12
|
latestSnapshot: {
|
|
13
|
-
id:
|
|
14
|
-
tag:
|
|
15
|
-
name:
|
|
16
|
-
readme:
|
|
13
|
+
id: "ds000005:1.0.0",
|
|
14
|
+
tag: "1.0.0",
|
|
15
|
+
name: "a test dataset",
|
|
16
|
+
readme: "a longer description of this dataset",
|
|
17
17
|
description: {
|
|
18
|
-
Name:
|
|
19
|
-
Authors: [
|
|
18
|
+
Name: "a test dataset",
|
|
19
|
+
Authors: ["J. Doe", "A. Nonymous"],
|
|
20
20
|
},
|
|
21
|
-
__typename:
|
|
21
|
+
__typename: "Snapshot",
|
|
22
22
|
},
|
|
23
|
-
__typename:
|
|
23
|
+
__typename: "Dataset",
|
|
24
24
|
}),
|
|
25
25
|
).toEqual(
|
|
26
26
|
expect.objectContaining({
|
|
27
|
-
id:
|
|
27
|
+
id: "ds000005",
|
|
28
28
|
body: {
|
|
29
|
-
id:
|
|
29
|
+
id: "ds000005",
|
|
30
30
|
metadata: {
|
|
31
|
-
species:
|
|
31
|
+
species: "Human",
|
|
32
32
|
},
|
|
33
33
|
latestSnapshot: {
|
|
34
|
-
id:
|
|
35
|
-
tag:
|
|
36
|
-
name:
|
|
37
|
-
readme:
|
|
34
|
+
id: "ds000005:1.0.0",
|
|
35
|
+
tag: "1.0.0",
|
|
36
|
+
name: "a test dataset",
|
|
37
|
+
readme: "a longer description of this dataset",
|
|
38
38
|
description: {
|
|
39
|
-
Name:
|
|
40
|
-
Authors: [
|
|
39
|
+
Name: "a test dataset",
|
|
40
|
+
Authors: ["J. Doe", "A. Nonymous"],
|
|
41
41
|
},
|
|
42
|
-
__typename:
|
|
42
|
+
__typename: "Snapshot",
|
|
43
43
|
},
|
|
44
|
-
__typename:
|
|
44
|
+
__typename: "Dataset",
|
|
45
45
|
},
|
|
46
46
|
}),
|
|
47
47
|
)
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import { hashElasticMapping } from
|
|
1
|
+
import { hashElasticMapping } from "../names"
|
|
2
2
|
|
|
3
3
|
const simpleMapping = {
|
|
4
4
|
properties: {
|
|
5
|
-
id: { type:
|
|
6
|
-
created: { type:
|
|
5
|
+
id: { type: "keyword" },
|
|
6
|
+
created: { type: "date" },
|
|
7
7
|
},
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
describe(
|
|
11
|
-
describe(
|
|
12
|
-
it(
|
|
10
|
+
describe("createIndices", () => {
|
|
11
|
+
describe("hashElasticMapping()", () => {
|
|
12
|
+
it("works with an empty object", () => {
|
|
13
13
|
expect(hashElasticMapping({})).toEqual(
|
|
14
|
-
|
|
14
|
+
"bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f",
|
|
15
15
|
)
|
|
16
16
|
})
|
|
17
|
-
it(
|
|
17
|
+
it("works with a simple mapping", () => {
|
|
18
18
|
expect(hashElasticMapping(simpleMapping)).toEqual(
|
|
19
|
-
|
|
19
|
+
"21d2497ac57a2c5e2f258946c8efc2fcdb9221d2",
|
|
20
20
|
)
|
|
21
21
|
})
|
|
22
|
-
it(
|
|
22
|
+
it("returns only alphanumeric values", () => {
|
|
23
23
|
expect(hashElasticMapping(simpleMapping)).toMatch(/^[a-z0-9]+$/)
|
|
24
24
|
})
|
|
25
|
-
it(
|
|
25
|
+
it("produces different hashes for objects with same byte length", () => {
|
|
26
26
|
const similarMapping = {
|
|
27
27
|
properties: {
|
|
28
|
-
id: { type:
|
|
29
|
-
treated: { type:
|
|
28
|
+
id: { type: "keyword" },
|
|
29
|
+
treated: { type: "date" },
|
|
30
30
|
},
|
|
31
31
|
}
|
|
32
32
|
expect(hashElasticMapping(simpleMapping)).not.toEqual(
|
package/src/auth.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import jwt from
|
|
1
|
+
import jwt from "jsonwebtoken"
|
|
2
2
|
|
|
3
3
|
/** Create a dataset:indexing scoped token for search indexing */
|
|
4
4
|
export function indexingToken(secret: string): string {
|
|
5
5
|
return jwt.sign(
|
|
6
6
|
{
|
|
7
|
-
scopes: [
|
|
7
|
+
scopes: ["dataset:indexing"],
|
|
8
8
|
},
|
|
9
9
|
secret,
|
|
10
10
|
{ expiresIn: 60 * 60 * 3 }, // 3 hours
|
package/src/index.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { DatasetsIndex } from
|
|
1
|
+
import { DatasetsIndex } from "./indexes/datasets"
|
|
2
2
|
import {
|
|
3
3
|
DatasetQueryResult,
|
|
4
4
|
indexDataset,
|
|
5
5
|
indexQuery,
|
|
6
6
|
queryForIndex,
|
|
7
|
-
} from
|
|
8
|
-
import { indexingToken } from
|
|
7
|
+
} from "./query"
|
|
8
|
+
import { indexingToken } from "./auth"
|
|
9
9
|
export {
|
|
10
|
-
DatasetsIndex,
|
|
11
10
|
DatasetQueryResult,
|
|
11
|
+
DatasetsIndex,
|
|
12
12
|
indexDataset,
|
|
13
|
+
indexingToken,
|
|
13
14
|
indexQuery,
|
|
14
15
|
queryForIndex,
|
|
15
|
-
indexingToken,
|
|
16
16
|
}
|
package/src/indexes/datasets.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import datasetsMapping from
|
|
2
|
-
import { elasticMappingName } from
|
|
1
|
+
import datasetsMapping from "../mappings/datasets-mapping.json"
|
|
2
|
+
import { elasticMappingName } from "../names"
|
|
3
3
|
|
|
4
4
|
interface IndexDefinition {
|
|
5
5
|
name: string
|
|
@@ -7,7 +7,7 @@ interface IndexDefinition {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export const DatasetsIndex: IndexDefinition = {
|
|
10
|
-
name: elasticMappingName(
|
|
10
|
+
name: elasticMappingName("datasets", datasetsMapping),
|
|
11
11
|
mapping: datasetsMapping,
|
|
12
12
|
}
|
|
13
13
|
|
package/src/names.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import crypto from
|
|
1
|
+
import crypto from "crypto"
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Hash mapping objects to provide a stable index name if the mapping is unchanged
|
|
5
5
|
* @param mapping ElasticSearch mapping object
|
|
6
6
|
*/
|
|
7
7
|
export const hashElasticMapping = (mapping: Record<string, unknown>): string =>
|
|
8
|
-
crypto.createHash(
|
|
8
|
+
crypto.createHash("sha1").update(JSON.stringify(mapping)).digest("hex")
|
|
9
9
|
|
|
10
10
|
export const elasticMappingName = (
|
|
11
11
|
name: string,
|
package/src/query.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
|
+
// Interface of the generic API response
|
|
3
|
+
ApiResponse,
|
|
2
4
|
Client as ElasticClient,
|
|
3
5
|
// Object that contains the type definitions of every API method
|
|
4
6
|
RequestParams,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
} from
|
|
8
|
-
import { ApolloClient, gql, NormalizedCacheObject } from '@apollo/client'
|
|
9
|
-
import { DatasetsIndex } from './indexes/datasets'
|
|
7
|
+
} from "@elastic/elasticsearch"
|
|
8
|
+
import { ApolloClient, gql, NormalizedCacheObject } from "@apollo/client"
|
|
9
|
+
import { DatasetsIndex } from "./indexes/datasets"
|
|
10
10
|
|
|
11
11
|
export const INDEX_DATASET_FRAGMENT = gql`
|
|
12
12
|
fragment DatasetIndex on Dataset {
|
|
@@ -152,7 +152,7 @@ export function queryForIndex(
|
|
|
152
152
|
return apolloClient.query({
|
|
153
153
|
query: indexDatasetQuery,
|
|
154
154
|
variables: { datasetId },
|
|
155
|
-
errorPolicy:
|
|
155
|
+
errorPolicy: "all",
|
|
156
156
|
})
|
|
157
157
|
}
|
|
158
158
|
|