@lde/pipeline 0.19.0 → 0.21.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/README.md +28 -0
- package/dist/distribution/importResolver.d.ts.map +1 -1
- package/dist/distribution/importResolver.js +1 -0
- package/dist/distribution/resolver.d.ts +2 -0
- package/dist/distribution/resolver.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/pipeline.d.ts +6 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +26 -30
- package/dist/progressReporter.d.ts +5 -0
- package/dist/progressReporter.d.ts.map +1 -1
- package/dist/stage.d.ts +15 -0
- package/dist/stage.d.ts.map +1 -1
- package/dist/stage.js +59 -15
- package/dist/validator.d.ts +21 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -128,6 +128,34 @@ new Stage({
|
|
|
128
128
|
|
|
129
129
|
This keeps SPARQL doing the heavy lifting while TypeScript handles the edge cases. See [@lde/pipeline-void](../pipeline-void)'s `VocabularyExecutor` for a real-world example of this pattern.
|
|
130
130
|
|
|
131
|
+
### Validation
|
|
132
|
+
|
|
133
|
+
Stages can optionally validate their output quads against a `Validator`. Validation operates on the combined output of all executors per batch, so shapes that span multiple executors' output are validated correctly. Quads are buffered, validated, and then written or discarded based on the `onInvalid` policy. When no validator is configured, quads stream directly with zero overhead.
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import { ShaclValidator } from '@lde/pipeline-shacl-validator';
|
|
137
|
+
|
|
138
|
+
new Stage({
|
|
139
|
+
name: 'transform',
|
|
140
|
+
executors: await SparqlConstructExecutor.fromFile('transform.rq'),
|
|
141
|
+
validation: {
|
|
142
|
+
validator: new ShaclValidator({
|
|
143
|
+
shapesFile: './shapes.ttl',
|
|
144
|
+
reportDir: './validation',
|
|
145
|
+
}),
|
|
146
|
+
onInvalid: 'write', // 'write' (default) | 'skip' | 'halt'
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
| `onInvalid` | Behaviour |
|
|
152
|
+
| ----------- | -------------------------------------------------- |
|
|
153
|
+
| `'write'` | Write quads even if validation fails **(default)** |
|
|
154
|
+
| `'skip'` | Discard the batch silently |
|
|
155
|
+
| `'halt'` | Throw an error, stopping the pipeline |
|
|
156
|
+
|
|
157
|
+
`Validator` is an interface, so you can implement your own validation strategy. See [@lde/pipeline-shacl-validator](../pipeline-shacl-validator) for the SHACL implementation.
|
|
158
|
+
|
|
131
159
|
### Writer
|
|
132
160
|
|
|
133
161
|
Writes generated quads to a destination:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importResolver.d.ts","sourceRoot":"","sources":["../../src/distribution/importResolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,KAAK,oBAAoB,EAEzB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,qBAAa,cAAe,YAAW,oBAAoB;IAEvD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,qBAAqB;IAG3C,OAAO,CACX,GAAG,IAAI,EAAE,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,GACnD,OAAO,CAAC,oBAAoB,GAAG,uBAAuB,CAAC;YAgB5C,aAAa;
|
|
1
|
+
{"version":3,"file":"importResolver.d.ts","sourceRoot":"","sources":["../../src/distribution/importResolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,KAAK,oBAAoB,EAEzB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,qBAAa,cAAe,YAAW,oBAAoB;IAEvD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,qBAAqB;IAG3C,OAAO,CACX,GAAG,IAAI,EAAE,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,GACnD,OAAO,CAAC,oBAAoB,GAAG,uBAAuB,CAAC;YAgB5C,aAAa;IA0CrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -29,6 +29,7 @@ export class ImportResolver {
|
|
|
29
29
|
}
|
|
30
30
|
async importDataset(dataset, probeResults, callbacks) {
|
|
31
31
|
const importStart = Date.now();
|
|
32
|
+
callbacks?.onImportStart?.();
|
|
32
33
|
const importResult = await this.options.importer.import(dataset);
|
|
33
34
|
if (importResult instanceof ImportSuccessful) {
|
|
34
35
|
await this.options.server.start();
|
|
@@ -20,6 +20,8 @@ export declare class NoDistributionAvailable {
|
|
|
20
20
|
export interface ResolveCallbacks {
|
|
21
21
|
/** Called each time a single distribution probe completes. */
|
|
22
22
|
onProbe?: (distribution: Distribution, result: ProbeResultType) => void;
|
|
23
|
+
/** Called when a data-dump import begins. */
|
|
24
|
+
onImportStart?: () => void;
|
|
23
25
|
/** Called when importing a distribution fails. */
|
|
24
26
|
onImportFailed?: (distribution: Distribution, error: string) => void;
|
|
25
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/distribution/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,oBAAoB;IAE7B,QAAQ,CAAC,YAAY,EAAE,YAAY;IACnC,QAAQ,CAAC,YAAY,EAAE,eAAe,EAAE;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY;IACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM;gBAJpB,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,eAAe,EAAE,EAC/B,YAAY,CAAC,EAAE,YAAY,YAAA,EAC3B,cAAc,CAAC,EAAE,MAAM,YAAA,EACvB,WAAW,CAAC,EAAE,MAAM,YAAA;CAEhC;AAED,qBAAa,uBAAuB;IAEhC,QAAQ,CAAC,OAAO,EAAE,OAAO;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,YAAY,EAAE,eAAe,EAAE;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY;gBAH3B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,eAAe,EAAE,EAC/B,YAAY,CAAC,EAAE,YAAY,YAAA;CAEvC;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACxE,kDAAkD;IAClD,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtE;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CACL,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,qBAAa,0BAA2B,YAAW,oBAAoB;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,iCAAiC;IAIjD,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,oBAAoB,GAAG,uBAAuB,CAAC;CA6B3D"}
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/distribution/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,oBAAoB;IAE7B,QAAQ,CAAC,YAAY,EAAE,YAAY;IACnC,QAAQ,CAAC,YAAY,EAAE,eAAe,EAAE;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY;IACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM;gBAJpB,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,eAAe,EAAE,EAC/B,YAAY,CAAC,EAAE,YAAY,YAAA,EAC3B,cAAc,CAAC,EAAE,MAAM,YAAA,EACvB,WAAW,CAAC,EAAE,MAAM,YAAA;CAEhC;AAED,qBAAa,uBAAuB;IAEhC,QAAQ,CAAC,OAAO,EAAE,OAAO;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,YAAY,EAAE,eAAe,EAAE;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY;gBAH3B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,eAAe,EAAE,EAC/B,YAAY,CAAC,EAAE,YAAY,YAAA;CAEvC;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACxE,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,kDAAkD;IAClD,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtE;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CACL,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,qBAAa,0BAA2B,YAAW,oBAAoB;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,iCAAiC;IAIjD,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,oBAAoB,GAAG,uBAAuB,CAAC;CA6B3D"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/pipeline.d.ts
CHANGED
|
@@ -35,9 +35,14 @@ export declare class Pipeline {
|
|
|
35
35
|
constructor(options: PipelineOptions);
|
|
36
36
|
run(): Promise<void>;
|
|
37
37
|
private processDataset;
|
|
38
|
+
/**
|
|
39
|
+
* Run a stage with reporting and return whether it was supported.
|
|
40
|
+
* Returns `true` if the stage produced results, `false` if NotSupported.
|
|
41
|
+
*/
|
|
38
42
|
private runStage;
|
|
39
|
-
|
|
43
|
+
/** Run a stage in chained mode, throwing if the stage is not supported. */
|
|
40
44
|
private runChainedStage;
|
|
45
|
+
private runChain;
|
|
41
46
|
private readFiles;
|
|
42
47
|
}
|
|
43
48
|
//# sourceMappingURL=pipeline.d.ts.map
|
package/dist/pipeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,4BAA4B,CAAC;AAQpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAE/B,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,aAAa,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,EAAE;QACT,mBAAmB,EAAE,mBAAmB,CAAC;QACzC,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAsCD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAmB;gBAEjC,OAAO,EAAE,eAAe;IAgC9B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAeZ,cAAc;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,4BAA4B,CAAC;AAQpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAE/B,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,aAAa,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,EAAE;QACT,mBAAmB,EAAE,mBAAmB,CAAC;QACzC,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAsCD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAmB;gBAEjC,OAAO,EAAE,eAAe;IAgC9B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAeZ,cAAc;IAqD5B;;;OAGG;YACW,QAAQ;IAuCtB,2EAA2E;YAC7D,eAAe;YAcf,QAAQ;YAmDP,SAAS;CAUzB"}
|
package/dist/pipeline.js
CHANGED
|
@@ -88,6 +88,9 @@ export class Pipeline {
|
|
|
88
88
|
onProbe: (distribution, result) => {
|
|
89
89
|
this.reporter?.distributionProbed?.(mapProbeResult(distribution, result));
|
|
90
90
|
},
|
|
91
|
+
onImportStart: () => {
|
|
92
|
+
this.reporter?.importStarted?.();
|
|
93
|
+
},
|
|
91
94
|
onImportFailed: (distribution, error) => {
|
|
92
95
|
this.reporter?.importFailed?.(distribution, error);
|
|
93
96
|
},
|
|
@@ -118,12 +121,16 @@ export class Pipeline {
|
|
|
118
121
|
await this.writer.flush?.(dataset);
|
|
119
122
|
this.reporter?.datasetComplete?.(dataset);
|
|
120
123
|
}
|
|
121
|
-
|
|
124
|
+
/**
|
|
125
|
+
* Run a stage with reporting and return whether it was supported.
|
|
126
|
+
* Returns `true` if the stage produced results, `false` if NotSupported.
|
|
127
|
+
*/
|
|
128
|
+
async runStage(dataset, distribution, stage, writer = this.writer) {
|
|
122
129
|
this.reporter?.stageStart?.(stage.name);
|
|
123
130
|
const stageStart = Date.now();
|
|
124
131
|
let itemsProcessed = 0;
|
|
125
132
|
let quadsGenerated = 0;
|
|
126
|
-
const result = await stage.run(dataset, distribution,
|
|
133
|
+
const result = await stage.run(dataset, distribution, writer, {
|
|
127
134
|
onProgress: (items, quads) => {
|
|
128
135
|
itemsProcessed = items;
|
|
129
136
|
quadsGenerated = quads;
|
|
@@ -132,13 +139,24 @@ export class Pipeline {
|
|
|
132
139
|
});
|
|
133
140
|
if (result instanceof NotSupported) {
|
|
134
141
|
this.reporter?.stageSkipped?.(stage.name, result.message);
|
|
142
|
+
return false;
|
|
135
143
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
144
|
+
this.reporter?.stageComplete?.(stage.name, {
|
|
145
|
+
itemsProcessed,
|
|
146
|
+
quadsGenerated,
|
|
147
|
+
duration: Date.now() - stageStart,
|
|
148
|
+
});
|
|
149
|
+
if (stage.validator) {
|
|
150
|
+
const report = await stage.validator.report(dataset);
|
|
151
|
+
this.reporter?.stageValidated?.(stage.name, report);
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
/** Run a stage in chained mode, throwing if the stage is not supported. */
|
|
156
|
+
async runChainedStage(dataset, distribution, stage, writer) {
|
|
157
|
+
const supported = await this.runStage(dataset, distribution, stage, writer);
|
|
158
|
+
if (!supported) {
|
|
159
|
+
throw new Error(`Stage '${stage.name}' returned NotSupported in chained mode`);
|
|
142
160
|
}
|
|
143
161
|
}
|
|
144
162
|
async runChain(dataset, distribution, stage) {
|
|
@@ -173,28 +191,6 @@ export class Pipeline {
|
|
|
173
191
|
await stageOutputResolver.cleanup();
|
|
174
192
|
}
|
|
175
193
|
}
|
|
176
|
-
async runChainedStage(dataset, distribution, stage, stageWriter) {
|
|
177
|
-
this.reporter?.stageStart?.(stage.name);
|
|
178
|
-
const stageStart = Date.now();
|
|
179
|
-
let itemsProcessed = 0;
|
|
180
|
-
let quadsGenerated = 0;
|
|
181
|
-
const result = await stage.run(dataset, distribution, stageWriter, {
|
|
182
|
-
onProgress: (items, quads) => {
|
|
183
|
-
itemsProcessed = items;
|
|
184
|
-
quadsGenerated = quads;
|
|
185
|
-
this.reporter?.stageProgress?.({ itemsProcessed, quadsGenerated });
|
|
186
|
-
},
|
|
187
|
-
});
|
|
188
|
-
if (result instanceof NotSupported) {
|
|
189
|
-
this.reporter?.stageSkipped?.(stage.name, result.message);
|
|
190
|
-
throw new Error(`Stage '${stage.name}' returned NotSupported in chained mode`);
|
|
191
|
-
}
|
|
192
|
-
this.reporter?.stageComplete?.(stage.name, {
|
|
193
|
-
itemsProcessed,
|
|
194
|
-
quadsGenerated,
|
|
195
|
-
duration: Date.now() - stageStart,
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
194
|
async *readFiles(paths) {
|
|
199
195
|
for (const path of paths) {
|
|
200
196
|
const stream = createReadStream(path);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Dataset, Distribution } from '@lde/dataset';
|
|
2
|
+
import type { ValidationReport } from './validator.js';
|
|
2
3
|
export interface DistributionAnalysisResult {
|
|
3
4
|
distribution: Distribution;
|
|
4
5
|
type: 'sparql' | 'data-dump' | 'network-error';
|
|
@@ -12,6 +13,8 @@ export interface ProgressReporter {
|
|
|
12
13
|
datasetStart?(dataset: Dataset): void;
|
|
13
14
|
/** Called each time a single distribution probe completes. */
|
|
14
15
|
distributionProbed?(result: DistributionAnalysisResult): void;
|
|
16
|
+
/** Called when a data-dump import begins. */
|
|
17
|
+
importStarted?(): void;
|
|
15
18
|
/** Called when importing a distribution fails. */
|
|
16
19
|
importFailed?(distribution: Distribution, error: string): void;
|
|
17
20
|
distributionSelected?(dataset: Dataset, distribution: Distribution, importedFrom?: Distribution, importDuration?: number, tripleCount?: number): void;
|
|
@@ -26,6 +29,8 @@ export interface ProgressReporter {
|
|
|
26
29
|
duration: number;
|
|
27
30
|
}): void;
|
|
28
31
|
stageFailed?(stage: string, error: Error): void;
|
|
32
|
+
/** Called after a stage completes if it has a validator. */
|
|
33
|
+
stageValidated?(stage: string, report: ValidationReport): void;
|
|
29
34
|
stageSkipped?(stage: string, reason: string): void;
|
|
30
35
|
datasetComplete?(dataset: Dataset): void;
|
|
31
36
|
datasetSkipped?(dataset: Dataset, reason: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progressReporter.d.ts","sourceRoot":"","sources":["../src/progressReporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"progressReporter.d.ts","sourceRoot":"","sources":["../src/progressReporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,eAAe,CAAC;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,gBAAgB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACzD,YAAY,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,8DAA8D;IAC9D,kBAAkB,CAAC,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC9D,6CAA6C;IAC7C,aAAa,CAAC,IAAI,IAAI,CAAC;IACvB,kDAAkD;IAClD,YAAY,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/D,oBAAoB,CAAC,CACnB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,YAAY,CAAC,EAAE,YAAY,EAC3B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CAAC;IACR,UAAU,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,CAAC,MAAM,EAAE;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,IAAI,CAAC;IACT,aAAa,CAAC,CACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE;QACN,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,GACA,IAAI,CAAC;IACR,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAChD,4DAA4D;IAC5D,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/D,YAAY,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACnD,eAAe,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACzC,cAAc,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,gBAAgB,CAAC,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACvD"}
|
package/dist/stage.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Dataset, Distribution } from '@lde/dataset';
|
|
|
2
2
|
import type { Quad } from '@rdfjs/types';
|
|
3
3
|
import type { Executor, VariableBindings } from './sparql/executor.js';
|
|
4
4
|
import { NotSupported } from './sparql/executor.js';
|
|
5
|
+
import type { Validator } from './validator.js';
|
|
5
6
|
import type { Writer } from './writer/writer.js';
|
|
6
7
|
/** Transforms a quad stream, optionally using dataset metadata. */
|
|
7
8
|
export type QuadTransform = (quads: AsyncIterable<Quad>, dataset: Dataset) => AsyncIterable<Quad>;
|
|
@@ -15,6 +16,12 @@ export interface StageOptions {
|
|
|
15
16
|
maxConcurrency?: number;
|
|
16
17
|
/** Child stages that chain off this stage's output. */
|
|
17
18
|
stages?: Stage[];
|
|
19
|
+
/** Optional validation of the combined quads produced by all executors per batch. */
|
|
20
|
+
validation?: {
|
|
21
|
+
validator: Validator;
|
|
22
|
+
/** What to do when a batch fails validation. @default 'write' */
|
|
23
|
+
onInvalid?: 'write' | 'skip' | 'halt';
|
|
24
|
+
};
|
|
18
25
|
}
|
|
19
26
|
export interface RunOptions {
|
|
20
27
|
onProgress?: (itemsProcessed: number, quadsGenerated: number) => void;
|
|
@@ -26,9 +33,17 @@ export declare class Stage {
|
|
|
26
33
|
private readonly itemSelector?;
|
|
27
34
|
private readonly batchSize;
|
|
28
35
|
private readonly maxConcurrency;
|
|
36
|
+
private readonly validation?;
|
|
29
37
|
constructor(options: StageOptions);
|
|
38
|
+
/** The validator for this stage, if configured. */
|
|
39
|
+
get validator(): Validator | undefined;
|
|
30
40
|
run(dataset: Dataset, distribution: Distribution, writer: Writer, options?: RunOptions): Promise<NotSupported | void>;
|
|
31
41
|
private runWithSelector;
|
|
42
|
+
/**
|
|
43
|
+
* Validate a buffer of quads. Throws on halt, returns the quads to write
|
|
44
|
+
* (empty array when skipping invalid batches).
|
|
45
|
+
*/
|
|
46
|
+
private validateBuffer;
|
|
32
47
|
private executeAll;
|
|
33
48
|
}
|
|
34
49
|
/** Selects items (as variable bindings) for executors to process. Pagination is an implementation detail. */
|
package/dist/stage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../src/stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGjD,mEAAmE;AACnE,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAC1B,OAAO,EAAE,OAAO,KACb,aAAa,CAAC,IAAI,CAAC,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../src/stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGjD,mEAAmE;AACnE,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAC1B,OAAO,EAAE,OAAO,KACb,aAAa,CAAC,IAAI,CAAC,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,qFAAqF;IACrF,UAAU,CAAC,EAAE;QACX,SAAS,EAAE,SAAS,CAAC;QACrB,iEAAiE;QACjE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;KACvC,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;CACvE;AAED,qBAAa,KAAK;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAA6B;gBAE7C,OAAO,EAAE,YAAY;IAYjC,mDAAmD;IACnD,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAErC;IAEK,GAAG,CACP,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;YAqCjB,eAAe;IAuH7B;;;OAGG;YACW,cAAc;YAqBd,UAAU;CAqBzB;AAUD,6GAA6G;AAC7G,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;CACrE"}
|
package/dist/stage.js
CHANGED
|
@@ -8,6 +8,7 @@ export class Stage {
|
|
|
8
8
|
itemSelector;
|
|
9
9
|
batchSize;
|
|
10
10
|
maxConcurrency;
|
|
11
|
+
validation;
|
|
11
12
|
constructor(options) {
|
|
12
13
|
this.name = options.name;
|
|
13
14
|
this.stages = options.stages ?? [];
|
|
@@ -17,6 +18,11 @@ export class Stage {
|
|
|
17
18
|
this.itemSelector = options.itemSelector;
|
|
18
19
|
this.batchSize = options.batchSize ?? 10;
|
|
19
20
|
this.maxConcurrency = options.maxConcurrency ?? 10;
|
|
21
|
+
this.validation = options.validation;
|
|
22
|
+
}
|
|
23
|
+
/** The validator for this stage, if configured. */
|
|
24
|
+
get validator() {
|
|
25
|
+
return this.validation?.validator;
|
|
20
26
|
}
|
|
21
27
|
async run(dataset, distribution, writer, options) {
|
|
22
28
|
if (this.itemSelector) {
|
|
@@ -26,7 +32,23 @@ export class Stage {
|
|
|
26
32
|
if (streams instanceof NotSupported) {
|
|
27
33
|
return streams;
|
|
28
34
|
}
|
|
29
|
-
|
|
35
|
+
if (this.validation) {
|
|
36
|
+
const buffer = [];
|
|
37
|
+
for (const stream of streams) {
|
|
38
|
+
for await (const quad of stream) {
|
|
39
|
+
buffer.push(quad);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const accepted = await this.validateBuffer(buffer, dataset);
|
|
43
|
+
if (accepted.length > 0) {
|
|
44
|
+
await writer.write(dataset, (async function* () {
|
|
45
|
+
yield* accepted;
|
|
46
|
+
})());
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
await writer.write(dataset, mergeStreams(streams));
|
|
51
|
+
}
|
|
30
52
|
}
|
|
31
53
|
async runWithSelector(selector, dataset, distribution, writer, options) {
|
|
32
54
|
// Peek the first batch to detect an empty selector before starting the
|
|
@@ -68,30 +90,36 @@ export class Stage {
|
|
|
68
90
|
for await (const bindings of allBatches) {
|
|
69
91
|
if (firstError)
|
|
70
92
|
break;
|
|
71
|
-
for
|
|
93
|
+
// Respect maxConcurrency: wait for a slot to open.
|
|
94
|
+
if (inFlight.size >= this.maxConcurrency) {
|
|
95
|
+
await Promise.race(inFlight);
|
|
72
96
|
if (firstError)
|
|
73
97
|
break;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
track((async () => {
|
|
98
|
+
}
|
|
99
|
+
track((async () => {
|
|
100
|
+
const batchQuads = [];
|
|
101
|
+
for (const executor of this.executors) {
|
|
81
102
|
const result = await executor.execute(dataset, distribution, {
|
|
82
103
|
bindings,
|
|
83
104
|
});
|
|
84
105
|
if (!(result instanceof NotSupported)) {
|
|
85
106
|
hasResults = true;
|
|
86
107
|
for await (const quad of result) {
|
|
87
|
-
|
|
88
|
-
quadsGenerated++;
|
|
108
|
+
batchQuads.push(quad);
|
|
89
109
|
}
|
|
90
110
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
111
|
+
}
|
|
112
|
+
let accepted = batchQuads;
|
|
113
|
+
if (this.validation && batchQuads.length > 0) {
|
|
114
|
+
accepted = await this.validateBuffer(batchQuads, dataset);
|
|
115
|
+
}
|
|
116
|
+
for (const quad of accepted) {
|
|
117
|
+
await queue.push(quad);
|
|
118
|
+
quadsGenerated++;
|
|
119
|
+
}
|
|
120
|
+
itemsProcessed += bindings.length;
|
|
121
|
+
options?.onProgress?.(itemsProcessed, quadsGenerated);
|
|
122
|
+
})());
|
|
95
123
|
}
|
|
96
124
|
}
|
|
97
125
|
catch (err) {
|
|
@@ -121,6 +149,22 @@ export class Stage {
|
|
|
121
149
|
return new NotSupported('All executors returned NotSupported');
|
|
122
150
|
}
|
|
123
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Validate a buffer of quads. Throws on halt, returns the quads to write
|
|
154
|
+
* (empty array when skipping invalid batches).
|
|
155
|
+
*/
|
|
156
|
+
async validateBuffer(buffer, dataset) {
|
|
157
|
+
const validationResult = await this.validation.validator.validate(buffer, dataset);
|
|
158
|
+
const onInvalid = this.validation.onInvalid ?? 'write';
|
|
159
|
+
if (!validationResult.conforms && onInvalid === 'halt') {
|
|
160
|
+
throw new Error(`Validation failed: ${validationResult.violations} violation(s)${validationResult.message ? `. ${validationResult.message}` : ''}`);
|
|
161
|
+
}
|
|
162
|
+
if (validationResult.conforms || onInvalid === 'write') {
|
|
163
|
+
return buffer;
|
|
164
|
+
}
|
|
165
|
+
// 'skip': discard
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
124
168
|
async executeAll(dataset, distribution) {
|
|
125
169
|
const results = await Promise.all(this.executors.map((executor) => executor.execute(dataset, distribution)));
|
|
126
170
|
const streams = [];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Quad } from '@rdfjs/types';
|
|
2
|
+
import type { Dataset } from '@lde/dataset';
|
|
3
|
+
/** Validates RDF quads against a set of constraints. */
|
|
4
|
+
export interface Validator {
|
|
5
|
+
/** Validate a batch of quads. Accumulates results internally. */
|
|
6
|
+
validate(quads: Quad[], dataset: Dataset): Promise<ValidationResult>;
|
|
7
|
+
/** Return accumulated validation results for a dataset. */
|
|
8
|
+
report(dataset: Dataset): Promise<ValidationReport>;
|
|
9
|
+
}
|
|
10
|
+
/** Result of validating a single batch. */
|
|
11
|
+
export interface ValidationResult {
|
|
12
|
+
violations: number;
|
|
13
|
+
conforms: boolean;
|
|
14
|
+
/** Human-readable detail, e.g. path to the report file. Included in error messages on halt. */
|
|
15
|
+
message?: string;
|
|
16
|
+
}
|
|
17
|
+
/** Accumulated validation results for a dataset. */
|
|
18
|
+
export interface ValidationReport extends ValidationResult {
|
|
19
|
+
quadsValidated: number;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,wDAAwD;AACxD,MAAM,WAAW,SAAS;IACxB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAErE,2DAA2D;IAC3D,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACrD;AAED,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oDAAoD;AACpD,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,cAAc,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|