@lde/search 0.18.2 → 0.19.0
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/adapter.d.ts +1 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +1 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +28 -15
- package/dist/schema.d.ts +86 -27
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +45 -8
- package/package.json +1 -1
package/dist/adapter.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* deployment author declaring a schema and running searches needs none of
|
|
7
7
|
* this; the main entry point carries that (small) authoring surface.
|
|
8
8
|
*/
|
|
9
|
-
export { assertTypeInSchema, physicalFields, irAlias, displayFieldName, displayFieldPattern, displayLangOf, searchableFields, facetableFields, filterableFields, sortableFields, outputFields, isInternalField, isInlineReference, nestedReferenceType, nestedFieldName, referenceFields, referenceTypeNamed, inlineFramingDepth, fieldNamed, datasetField, ID_FIELD, AND_KEY, OR_KEY, labelFieldOf, isRangeFacet, isoToUnixSeconds, unixSecondsToIso, } from './schema.js';
|
|
9
|
+
export { assertTypeInSchema, physicalFields, irAlias, displayFieldName, displayFieldPattern, displayLangOf, searchableFields, facetableFields, filterableFields, sortableFields, outputFields, isInternalField, isInlineReference, nestedReferenceType, nestedFieldName, referenceFields, referenceTypeNamed, inlineFramingDepth, fieldNamed, datasetField, ID_FIELD, AND_KEY, OR_KEY, labelFieldOf, labelFieldNameOf, DEFAULT_LABEL_FIELD, isRangeFacet, isAbsoluteIri, isoToUnixSeconds, unixSecondsToIso, } from './schema.js';
|
|
10
10
|
export type { PhysicalFields } from './schema.js';
|
|
11
11
|
export { physicalNameTokens } from './physical-name.js';
|
|
12
12
|
export { filterOperatorFor, filterOperator, filterOn, isUnsatisfiable, validateQuery, assertValidQuery, pageForOffset, } from './query.js';
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,MAAM,EACN,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/adapter.js
CHANGED
|
@@ -6,6 +6,6 @@
|
|
|
6
6
|
* deployment author declaring a schema and running searches needs none of
|
|
7
7
|
* this; the main entry point carries that (small) authoring surface.
|
|
8
8
|
*/
|
|
9
|
-
export { assertTypeInSchema, physicalFields, irAlias, displayFieldName, displayFieldPattern, displayLangOf, searchableFields, facetableFields, filterableFields, sortableFields, outputFields, isInternalField, isInlineReference, nestedReferenceType, nestedFieldName, referenceFields, referenceTypeNamed, inlineFramingDepth, fieldNamed, datasetField, ID_FIELD, AND_KEY, OR_KEY, labelFieldOf, isRangeFacet, isoToUnixSeconds, unixSecondsToIso, } from './schema.js';
|
|
9
|
+
export { assertTypeInSchema, physicalFields, irAlias, displayFieldName, displayFieldPattern, displayLangOf, searchableFields, facetableFields, filterableFields, sortableFields, outputFields, isInternalField, isInlineReference, nestedReferenceType, nestedFieldName, referenceFields, referenceTypeNamed, inlineFramingDepth, fieldNamed, datasetField, ID_FIELD, AND_KEY, OR_KEY, labelFieldOf, labelFieldNameOf, DEFAULT_LABEL_FIELD, isRangeFacet, isAbsoluteIri, isoToUnixSeconds, unixSecondsToIso, } from './schema.js';
|
|
10
10
|
export { physicalNameTokens } from './physical-name.js';
|
|
11
11
|
export { filterOperatorFor, filterOperator, filterOn, isUnsatisfiable, validateQuery, assertValidQuery, pageForOffset, } from './query.js';
|
package/dist/project.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAYL,KAAK,eAAe,EAEpB,KAAK,QAAQ,EAEb,KAAK,YAAY,EACjB,KAAK,UAAU,EAEhB,MAAM,aAAa,CAAC;AAErB;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,MAAM,WAAW,iBAAkB,SAAQ,OAAO,CAChD,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAC1C;IACC,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAKD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,UAAU,EACtB,MAAM,CAAC,EAAE,YAAY,EACrB,OAAO,GAAE,iBAAyC,GACjD,cAAc,CAgBhB;AA2ED;;;;;;;;;;;;GAYG;AACH,wBAAuB,YAAY,CACjC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,QAAQ,EACpB,OAAO,GAAE,iBAAyC,GACjD,aAAa,CAAC,cAAc,CAAC,CAW/B"}
|
package/dist/project.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { fold } from '@lde/text-normalization';
|
|
2
2
|
import { buildSubjectIndex, frameSubjects, } from './frame-by-type.js';
|
|
3
|
-
import { assertTypeInSchema, displayFieldName, inlineFramingDepth, irAlias, isInternalField, isInlineReference, isoToUnixSeconds, physicalFields, referenceTypeNamed, } from './schema.js';
|
|
3
|
+
import { assertTypeInSchema, displayFieldName, inlineFramingDepth, irAlias, isAbsoluteIri, isInternalField, isInlineReference, isoToUnixSeconds, physicalFields, referenceTypeNamed, } from './schema.js';
|
|
4
4
|
/** The context a projection runs with when its caller supplied none. */
|
|
5
5
|
const NO_PROJECTION_CONTEXT = {};
|
|
6
6
|
/**
|
|
@@ -19,7 +19,7 @@ const NO_PROJECTION_CONTEXT = {};
|
|
|
19
19
|
*/
|
|
20
20
|
export function projectDocument(node, searchType, schema, context = NO_PROJECTION_CONTEXT) {
|
|
21
21
|
if (documentKey(node) === undefined) {
|
|
22
|
-
throw new Error(`Cannot project a “${searchType.name}” node
|
|
22
|
+
throw new Error(`Cannot project a “${searchType.name}” node whose @id is not an absolute IRI (got ${JSON.stringify(node['@id']) ?? 'none'}; a blank node label or a relative reference is not one): every search document needs a stable key, and an empty one would collide with other keyless nodes.`);
|
|
23
23
|
}
|
|
24
24
|
// The guard above is what makes this a SearchDocument: projectFields sets `id`
|
|
25
25
|
// for exactly the nodes documentKey resolves.
|
|
@@ -76,15 +76,17 @@ function projectFields(node, searchType, schema, context) {
|
|
|
76
76
|
return document;
|
|
77
77
|
}
|
|
78
78
|
/**
|
|
79
|
-
* The document key a framed node carries, if any
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
79
|
+
* The document key a framed node carries, if any – an {@link isAbsoluteIri
|
|
80
|
+
* absolute IRI}, the same rule {@link iriString} applies to a referent, so a
|
|
81
|
+
* root and a reference cannot disagree about what counts as identity. A blank
|
|
82
|
+
* node label (`_:b0`) is not one: framing mints it per call, so it recurs across
|
|
83
|
+
* documents and can change when unrelated triples do. A node bearing one is
|
|
84
|
+
* therefore projected as if framing had pruned its `@id` – which it does
|
|
85
|
+
* whenever the label occurs only once in the framing results.
|
|
84
86
|
*/
|
|
85
87
|
function documentKey(node) {
|
|
86
88
|
const id = node['@id'];
|
|
87
|
-
return typeof id === 'string' &&
|
|
89
|
+
return typeof id === 'string' && isAbsoluteIri(id) ? id : undefined;
|
|
88
90
|
}
|
|
89
91
|
/**
|
|
90
92
|
* Project a single type over a known set of `roots` – the per-type, roots-given
|
|
@@ -362,14 +364,25 @@ function literalString(value) {
|
|
|
362
364
|
}
|
|
363
365
|
return undefined;
|
|
364
366
|
}
|
|
367
|
+
/**
|
|
368
|
+
* The IRI a reference value carries, or `undefined` when it carries none. A
|
|
369
|
+
* value may arrive as a bare string – `schema:sameAs`, `contentUrl`,
|
|
370
|
+
* `thumbnailUrl` and `landingPage` all range on `schema:URL`, which a source may
|
|
371
|
+
* emit as a literal rather than a node – or as a node object.
|
|
372
|
+
*
|
|
373
|
+
* **A referent with no IRI yields nothing**, the same rule {@link documentKey}
|
|
374
|
+
* applies to a root and for the same reason: what a `labelOnly`/`idOnly`
|
|
375
|
+
* reference stores is a selection key, and a blank node label is not one.
|
|
376
|
+
* Framing mints it per call, so it recurs across documents and changes when
|
|
377
|
+
* unrelated triples do – indexing it would key a facet bucket on a value that
|
|
378
|
+
* neither groups what is equal nor separates what is not. An **inline**
|
|
379
|
+
* reference is untouched by this: it carries the referent’s fields rather than
|
|
380
|
+
* its identity ({@link applyInlineReference}), so a blank-node referent nests
|
|
381
|
+
* exactly as before.
|
|
382
|
+
*/
|
|
365
383
|
function iriString(value) {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
}
|
|
369
|
-
if (isObject(value) && typeof value['@id'] === 'string') {
|
|
370
|
-
return value['@id'];
|
|
371
|
-
}
|
|
372
|
-
return undefined;
|
|
384
|
+
const iri = isObject(value) ? value['@id'] : value;
|
|
385
|
+
return typeof iri === 'string' && isAbsoluteIri(iri) ? iri : undefined;
|
|
373
386
|
}
|
|
374
387
|
function toInteger(literal) {
|
|
375
388
|
return literal === undefined ? undefined : Math.trunc(Number(literal));
|
package/dist/schema.d.ts
CHANGED
|
@@ -182,34 +182,61 @@ export interface ReferenceField extends SearchFieldBase, Searchable {
|
|
|
182
182
|
/**
|
|
183
183
|
* The `name` of the {@link SearchType} whose collection resolves this
|
|
184
184
|
* reference’s labels – its ‘label source’. The named type must declare an
|
|
185
|
-
* `output`, `searchable` text field
|
|
185
|
+
* `output`, `searchable` text field under its
|
|
186
|
+
* {@link SearchTypeBase.labelField} name (`label` by default; validated by
|
|
186
187
|
* {@link searchSchema}), so an engine can both reconstruct the label and
|
|
187
188
|
* search it (typeahead). Omit for an id-only reference: no label
|
|
188
189
|
* resolution.
|
|
189
190
|
*/
|
|
190
191
|
readonly labelSource?: string;
|
|
191
|
-
/**
|
|
192
|
-
*
|
|
193
|
-
*
|
|
192
|
+
/**
|
|
193
|
+
* The referenced entity’s shape and how much of it to carry. Required when
|
|
194
|
+
* the field is `output` – the strategy is what decides the output shape, so
|
|
195
|
+
* a surfaced reference must state it; optional for a facet- or filter-only
|
|
196
|
+
* reference.
|
|
197
|
+
*
|
|
198
|
+
* A **discriminated union by `strategy`**, because `typeName` is load-bearing
|
|
199
|
+
* for two of the three and meaningless for the third: a `labelOnly` reference
|
|
200
|
+
* needs a name to emit its id-plus-label type under, an `inline` one needs a
|
|
201
|
+
* name that resolves to a declared {@link ReferenceType}, and an `idOnly` one
|
|
202
|
+
* carries a bare IRI that may belong to no declared type at all (`sameAs`
|
|
203
|
+
* points at a vocabulary nobody indexes). Declaring `typeName` on an `idOnly`
|
|
204
|
+
* reference is still useful where a target *is* nameable – an API surface can
|
|
205
|
+
* then tell IRIs of that target apart from IRIs at large.
|
|
206
|
+
*/
|
|
194
207
|
readonly ref?: {
|
|
195
208
|
/** Logical API type name of the referenced entity (PascalCase, e.g.
|
|
196
|
-
* `Organization`) – names the reference’s type in the API surfaces,
|
|
197
|
-
* way {@link SearchType.name} names a root type; fields sharing it
|
|
198
|
-
* one emitted type. For a `labelOnly
|
|
199
|
-
* not a key: it need not correspond to any indexed root type, and it
|
|
200
|
-
* name one (`creator` → `Person`, with the labels resolved from
|
|
201
|
-
* root’s collection via `labelSource`) – an API surface then
|
|
202
|
-
* reference under a derived name (GraphQL:
|
|
203
|
-
* type names unique. An `inline`
|
|
204
|
-
*
|
|
209
|
+
* `Organization`) – names the reference’s type in the API surfaces,
|
|
210
|
+
* the way {@link SearchType.name} names a root type; fields sharing it
|
|
211
|
+
* share one emitted type. For a `labelOnly` reference it is a name,
|
|
212
|
+
* not a key: it need not correspond to any indexed root type, and it
|
|
213
|
+
* may name one (`creator` → `Person`, with the labels resolved from
|
|
214
|
+
* that root’s collection via `labelSource`) – an API surface then
|
|
215
|
+
* serves the reference under a derived name (GraphQL:
|
|
216
|
+
* `‹Name›Reference`) to keep type names unique. An `inline`
|
|
217
|
+
* reference’s typeName instead resolves to a declared
|
|
218
|
+
* {@link ReferenceType}, so it can never name a root type. */
|
|
205
219
|
readonly typeName: string;
|
|
206
|
-
/**
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
* {@link
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
220
|
+
/** `labelOnly` carries the id plus a display label resolved from a
|
|
221
|
+
* label source; `inline` carries the referent’s own projected fields
|
|
222
|
+
* through a declared {@link ReferenceType} (see
|
|
223
|
+
* {@link isInlineReference}). */
|
|
224
|
+
readonly strategy: 'labelOnly' | 'inline';
|
|
225
|
+
} | {
|
|
226
|
+
/** Optional here, unlike the other strategies: an `idOnly` reference
|
|
227
|
+
* emits no type of its own, so a name is not needed to emit one under.
|
|
228
|
+
* Declare it when the referent’s IRIs form a nameable set an API
|
|
229
|
+
* surface should distinguish; omit it for IRIs that belong to no such
|
|
230
|
+
* set. */
|
|
231
|
+
readonly typeName?: string;
|
|
232
|
+
/** The IRI, and nothing else – no label resolution, no nested fields.
|
|
233
|
+
* Surfaces as a bare IRI rather than an object, which is what makes it
|
|
234
|
+
* the right strategy for a reference whose referent is not an entity
|
|
235
|
+
* this deployment describes: a canonical vocabulary URI, a licence, a
|
|
236
|
+
* content URL. A {@link ReferenceField.labelSource} is still honoured
|
|
237
|
+
* for facet bucket labels – the strategy governs the output shape, not
|
|
238
|
+
* whether a bucket can be labelled. */
|
|
239
|
+
readonly strategy: 'idOnly';
|
|
213
240
|
};
|
|
214
241
|
}
|
|
215
242
|
/**
|
|
@@ -258,6 +285,14 @@ export interface SearchTypeBase {
|
|
|
258
285
|
* than derived from the `class` IRI, so re-modelling the vocabulary cannot
|
|
259
286
|
* silently rename the public contract. */
|
|
260
287
|
readonly name: string;
|
|
288
|
+
/** The `name` of this type’s display field, when it serves as a
|
|
289
|
+
* {@link ReferenceField.labelSource} – the word the API surfaces a resolved
|
|
290
|
+
* label under. Defaults to `label`; declare another (e.g. `name`, for a
|
|
291
|
+
* profile that models display names as `schema:name`) so the surface word is
|
|
292
|
+
* the profile’s, not a role the type happens to play internally. The named
|
|
293
|
+
* field must be an `output`, `searchable` text field ({@link labelFieldOf}).
|
|
294
|
+
* Ignored for a type nothing resolves labels from. */
|
|
295
|
+
readonly labelField?: string;
|
|
261
296
|
readonly fields: readonly SearchField[];
|
|
262
297
|
}
|
|
263
298
|
/**
|
|
@@ -403,13 +438,19 @@ export declare function nestedFieldName(parent: string, name: string): string;
|
|
|
403
438
|
* memory bounded by the unit of work (ADR 12), not the graph.
|
|
404
439
|
*/
|
|
405
440
|
export declare function inlineFramingDepth(schema: SearchSchema, searchType: SearchType): number;
|
|
406
|
-
/**
|
|
407
|
-
*
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
*
|
|
411
|
-
|
|
412
|
-
|
|
441
|
+
/** The label field name a type falls back to when it declares no
|
|
442
|
+
* {@link SearchTypeBase.labelField}. */
|
|
443
|
+
export declare const DEFAULT_LABEL_FIELD = "label";
|
|
444
|
+
/** The `name` the type serves its label under: its declared
|
|
445
|
+
* {@link SearchTypeBase.labelField}, else `label`. */
|
|
446
|
+
export declare function labelFieldNameOf(searchType: SearchType): string;
|
|
447
|
+
/**
|
|
448
|
+
* The text field a label source serves labels from – the label convention in
|
|
449
|
+
* one place: an `output` (something to reconstruct a label from), `searchable`
|
|
450
|
+
* (something to type ahead against) text field named by
|
|
451
|
+
* {@link labelFieldNameOf}. Returns `undefined` when the type declares no such
|
|
452
|
+
* field; a schema built by {@link searchSchema} guarantees it for every type
|
|
453
|
+
* named as a {@link ReferenceField.labelSource}.
|
|
413
454
|
*/
|
|
414
455
|
export declare function labelFieldOf(searchType: SearchType): TextField | undefined;
|
|
415
456
|
/**
|
|
@@ -623,6 +664,24 @@ export declare function irAlias(searchType: SearchType, field: SearchField): str
|
|
|
623
664
|
export declare function isRangeFacet(field: SearchField): field is NumericField & {
|
|
624
665
|
readonly facetRanges: readonly FacetRange[];
|
|
625
666
|
};
|
|
667
|
+
/**
|
|
668
|
+
* Whether a value is an **absolute IRI**: a scheme, then anything with no
|
|
669
|
+
* whitespace. The single definition the projection (which
|
|
670
|
+
* drops a reference value failing it) and an API surface (which types such a
|
|
671
|
+
* value as an IRI, and rejects one that is not) both read, so the two cannot
|
|
672
|
+
* disagree about what a reference holds – the argument {@link physicalFields}
|
|
673
|
+
* makes for the physical fanout.
|
|
674
|
+
*
|
|
675
|
+
* Deliberately a **scheme check, not an `http(s)` one**. `urn:`, `doi:`, `ark:`,
|
|
676
|
+
* `tag:`, `mailto:` and a deployment’s own minted scheme (`urn:lde:…`) are
|
|
677
|
+
* ordinary Linked Data, and rejecting them would make this package refuse
|
|
678
|
+
* conformant data. What the check does exclude is what a reference must never
|
|
679
|
+
* hold: a blank node label (`_:b0` – a scheme must start with a letter), a bare
|
|
680
|
+
* token (`boerenbont`), and a relative reference. Full RFC 3987 parsing would
|
|
681
|
+
* buy nothing over that while starting to reject real data with a character
|
|
682
|
+
* someone forgot to percent-encode.
|
|
683
|
+
*/
|
|
684
|
+
export declare function isAbsoluteIri(value: string): boolean;
|
|
626
685
|
/**
|
|
627
686
|
* The engine storage codec for `date` fields: stored as Unix seconds (a
|
|
628
687
|
* sortable, range-filterable int64), ISO 8601 at the API edges. One pair for
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
CHANGED
|
@@ -255,16 +255,24 @@ const UNSERVICEABLE_NESTED_ROLES = [
|
|
|
255
255
|
'facetable',
|
|
256
256
|
'sortable',
|
|
257
257
|
];
|
|
258
|
+
/** The label field name a type falls back to when it declares no
|
|
259
|
+
* {@link SearchTypeBase.labelField}. */
|
|
260
|
+
export const DEFAULT_LABEL_FIELD = 'label';
|
|
261
|
+
/** The `name` the type serves its label under: its declared
|
|
262
|
+
* {@link SearchTypeBase.labelField}, else `label`. */
|
|
263
|
+
export function labelFieldNameOf(searchType) {
|
|
264
|
+
return searchType.labelField ?? DEFAULT_LABEL_FIELD;
|
|
265
|
+
}
|
|
258
266
|
/**
|
|
259
|
-
* The text field a label source serves labels from – the
|
|
260
|
-
*
|
|
261
|
-
*
|
|
262
|
-
* Returns `undefined` when the type declares no such
|
|
263
|
-
* {@link searchSchema} guarantees it for every type
|
|
264
|
-
* {@link ReferenceField.labelSource}.
|
|
267
|
+
* The text field a label source serves labels from – the label convention in
|
|
268
|
+
* one place: an `output` (something to reconstruct a label from), `searchable`
|
|
269
|
+
* (something to type ahead against) text field named by
|
|
270
|
+
* {@link labelFieldNameOf}. Returns `undefined` when the type declares no such
|
|
271
|
+
* field; a schema built by {@link searchSchema} guarantees it for every type
|
|
272
|
+
* named as a {@link ReferenceField.labelSource}.
|
|
265
273
|
*/
|
|
266
274
|
export function labelFieldOf(searchType) {
|
|
267
|
-
const field = fieldNamed(searchType,
|
|
275
|
+
const field = fieldNamed(searchType, labelFieldNameOf(searchType));
|
|
268
276
|
return field !== undefined &&
|
|
269
277
|
field.kind === 'text' &&
|
|
270
278
|
field.output === true &&
|
|
@@ -276,6 +284,11 @@ export function labelFieldOf(searchType) {
|
|
|
276
284
|
* Every {@link ReferenceField.labelSource} must name a declared type that can
|
|
277
285
|
* actually serve labels ({@link labelFieldOf}). Checked schema-wide, because
|
|
278
286
|
* a single declaration cannot see its siblings.
|
|
287
|
+
*
|
|
288
|
+
* That leaves only a {@link RootType}, without naming one: a label field is
|
|
289
|
+
* `searchable`, and {@link assertServiceableNestedFields} already rejects a
|
|
290
|
+
* `searchable` field on a Reference Type – so a Reference Type can never serve
|
|
291
|
+
* labels, and a resolved label always has a collection to come from.
|
|
279
292
|
*/
|
|
280
293
|
function assertResolvableLabelSources(types) {
|
|
281
294
|
const byName = new Map(types.map((searchType) => [searchType.name, searchType]));
|
|
@@ -294,7 +307,7 @@ function assertResolvableLabelSources(types) {
|
|
|
294
307
|
throw new Error(`Reference “${searchType.name}.${field.name}” names unknown label source “${field.labelSource}”; declare a SearchType with that name.`);
|
|
295
308
|
}
|
|
296
309
|
if (labelFieldOf(source) === undefined) {
|
|
297
|
-
throw new Error(`Reference “${searchType.name}.${field.name}” uses label source “${field.labelSource}”, which must declare an output, searchable text field
|
|
310
|
+
throw new Error(`Reference “${searchType.name}.${field.name}” uses label source “${field.labelSource}”, which must declare an output, searchable text field “${labelFieldNameOf(source)}”.`);
|
|
298
311
|
}
|
|
299
312
|
}
|
|
300
313
|
}
|
|
@@ -679,6 +692,30 @@ export function irAlias(searchType, field) {
|
|
|
679
692
|
export function isRangeFacet(field) {
|
|
680
693
|
return field.facetRanges !== undefined && field.facetRanges.length > 0;
|
|
681
694
|
}
|
|
695
|
+
/**
|
|
696
|
+
* Whether a value is an **absolute IRI**: a scheme, then anything with no
|
|
697
|
+
* whitespace. The single definition the projection (which
|
|
698
|
+
* drops a reference value failing it) and an API surface (which types such a
|
|
699
|
+
* value as an IRI, and rejects one that is not) both read, so the two cannot
|
|
700
|
+
* disagree about what a reference holds – the argument {@link physicalFields}
|
|
701
|
+
* makes for the physical fanout.
|
|
702
|
+
*
|
|
703
|
+
* Deliberately a **scheme check, not an `http(s)` one**. `urn:`, `doi:`, `ark:`,
|
|
704
|
+
* `tag:`, `mailto:` and a deployment’s own minted scheme (`urn:lde:…`) are
|
|
705
|
+
* ordinary Linked Data, and rejecting them would make this package refuse
|
|
706
|
+
* conformant data. What the check does exclude is what a reference must never
|
|
707
|
+
* hold: a blank node label (`_:b0` – a scheme must start with a letter), a bare
|
|
708
|
+
* token (`boerenbont`), and a relative reference. Full RFC 3987 parsing would
|
|
709
|
+
* buy nothing over that while starting to reject real data with a character
|
|
710
|
+
* someone forgot to percent-encode.
|
|
711
|
+
*/
|
|
712
|
+
export function isAbsoluteIri(value) {
|
|
713
|
+
return ABSOLUTE_IRI.test(value);
|
|
714
|
+
}
|
|
715
|
+
/** Scheme (RFC 3986 `ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )`), then any
|
|
716
|
+
* run of non-whitespace. Non-ASCII is deliberately allowed: an IRI is not
|
|
717
|
+
* restricted to ASCII. */
|
|
718
|
+
const ABSOLUTE_IRI = /^[A-Za-z][A-Za-z0-9+.-]*:\S*$/;
|
|
682
719
|
/**
|
|
683
720
|
* The engine storage codec for `date` fields: stored as Unix seconds (a
|
|
684
721
|
* sortable, range-filterable int64), ISO 8601 at the API edges. One pair for
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lde/search",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "Engine- and domain-agnostic core for RDF-backed search: a unified declarative field model (SearchField/SearchType/SearchSchema), a neutral query IR, the SearchEngine port with logical result types, and a streaming CONSTRUCT-to-document projection. Bakes in no engine, protocol, or domain.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "git+https://github.com/ldelements/lde.git",
|